EncySoftware.DmcMcp 0.5.0

dotnet tool install --global EncySoftware.DmcMcp --version 0.5.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local EncySoftware.DmcMcp --version 0.5.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=EncySoftware.DmcMcp&version=0.5.0
                    
nuke :add-package EncySoftware.DmcMcp --version 0.5.0
                    

dmc-mcp

MCP server for publishing post-processors to Digital Machine Center from Cursor or Claude Code — the DMC counterpart of ency-extension-mcp.

Tool What it does
publish_post Uploads a .sppx / .dll / .stnci / .zip as a draft. The backend unpacks the archive; AI fills in the description, control, machine and cover. Looks for similar names in DMC first and stops if it finds any (force=true uploads anyway). Returns the card link.
check_import The result of an import that publish_post / publish_folder did not wait out — by the importId they returned.
audit_drafts Your drafts against the moderation rules: ready, or what each one still lacks (name, machine maker, machine type, archive); no cover / no description as a note.
submit_drafts Sends several drafts for moderation at once — ids, or ALL for every ready draft; the rest are listed with what they lack.
describe_post The whole card: full description, control and machine, cover, files, price and trial, links — to judge what the AI wrote.
inspect_archive What is inside a component archive — locally, no server, no AI: machine name, axes and travels, equipment, picture, posts, controls mentioned. The facts an agent needs to write the description itself.
set_cover Your own cover picture — from the author or from the agent — uploaded and set on the card. No server AI involved.
update_post Fixes what the AI guessed wrong: name, description, control, machine, machine type, axes.
submit_post Sends the draft for moderation. If something is missing, it says what.
check_post_status Draft / under review / published, with the link.
find_posts Before uploading: components already in the catalogue and your own (drafts included) by text, control maker or machine maker — so the agent asks "update this one?" instead of creating a duplicate. Posts by default; contentType = MACHINE_SCHEMA, INTERPRETER, DIGITAL_MACHINE_KIT or ANY.
replace_post_file A new version of an existing post: uploads the archive and updates the card; the old archive is removed and licensed copies refreshed. A published post's new archive goes live at once, without re-moderation.
publish_folder Every component in a folder in one import, each its own draft: post files, and subfolders holding a machine schema (xml + osd) or a kit. An optional CSV manifest supplies exact names and fields instead of the AI's guesses; nameHint / descriptionHint steer the AI. dryRun=true shows the plan and uploads nothing; similar names in DMC stop the upload unless force=true.
search_schemas Machine schemas in the catalogue by text or machine maker — to link a post to them.
link_post_to_machines "Made for" links from a post to the schemas of the machines it targets; the cards then show "made for" / "recommended posts".
list_my_posts Your posts with their statuses, optionally filtered by status — what is still a draft, what is already in the catalogue. contentType = ANY lists every component you own, with its type.
delete_post Removes your own draft (or a rejected post) uploaded by mistake. Never a published one — unpublishing is a deliberate act in the cabinet.
generate_description An AI description from the card's fields, saved to the card (or only shown with save=false).
regenerate_cover A new cover: archive — the picture inside the component archive (no AI), ai — an AI render.
generate_sample_code / generate_codes_list AI-generated sample NC output and the supported G/M-code list, attached to the card.

Publishing does not submit for moderation by itself: the author looks at what the AI filled in first.

Two ways to fill in a card

Server AI (default). publish_post / publish_folder with ai=true: the backend reads the archive and fills the description, control, machine, axes and cover with its own AI — the company's keys, one house style, nothing for the author to write.

Your own agent. publish_post(..., ai=false) uploads the archive and nothing more. Then inspect_archive(file) hands the agent the facts — machine name, axes and travels, equipment, controls mentioned, whether there is a picture inside — and the agent writes the description itself, sets the fields with update_post, and puts a cover with set_cover (its own picture) or regenerate_cover(source: "archive") (the picture from the archive, no AI). The author sees the text before it is saved, and pays for no AI but their own.

Manifest for publish_folder

A CSV next to the files; only the file column is required, the rest are optional and only override what they name:

file,name,controllerManufacturer,controllerSeries,controllerModel,machineManufacturer,machineModel,machineType,numberOfAxes
fanuc-0i.sppx,"Fanuc 0i-MF for Haas VF-2",Fanuc,0i,MF,Haas,VF-2,MILLING,3
siemens.sppx,Siemens 828D for DMG,Siemens,828D,,DMG MORI,,MILLING,3

Columns: file, name, description, controllerManufacturer, controllerSeries, controllerModel, machineManufacturer, machineSeries, machineModel, machineType (MILLING, TURNING, MILL_TURN, WIRE_EDM, LASER, PLASMA, WATERJET, GRINDING, ROBOT, EDM, ROUTER, SWISS, GAS_PLASMA_LASER, ADDITIVE, OTHER), numberOfAxes. An unknown column is an error, not a silently dropped one.

Install (Cursor, Claude Code)

Requires the .NET 8 SDK.

dotnet tool install -g EncySoftware.DmcMcp
dmc-mcp setup

Until the package is on nuget.org, install from the .nupkg attached to the latest release: dotnet tool install -g EncySoftware.DmcMcp --add-source <folder with the .nupkg>.

setup writes the dmc server into ~/.cursor/mcp.json (merging with your other servers), registers it in Claude Code when its CLI is installed, and signs you in. Restart the editor afterwards. --no-login skips the sign-in.

Sign-in — dmc-mcp login — opens the sign-in page in your browser (licsys account); the tool keeps only a refresh token in %APPDATA%\dmc-mcp\auth.json and never sees the password. --password is the fallback for a machine without a browser. A publisher role in DMC is required.

Something not working? dmc-mcp doctor checks the sign-in, whether DMC accepts the token and grants the publisher role, and whether the server is registered in Cursor and Claude Code — one line per check. setup and doctor also mention a newer version on nuget.org when there is one.

Long imports report progress into the editor (MCP progress notifications) while they run.

By hand instead of setuplogin, plus in ~/.cursor/mcp.json:

{ "mcpServers": { "dmc": { "command": "dmc-mcp" } } }

What it looks like

  1. "publish the post C:\posts\fanuc-0i.sppx, it's Fanuc 0i-MF for a Haas VF-2"publish_post — a draft link and what the AI filled in.
  2. "the control is Siemens 828D, not Fanuc"update_post.
  3. "submit it for review"submit_post.
  4. "is it published?"check_post_status.

Settings

Variable Purpose
DMC_API another API address (staging); default from src/Brand.cs
DMC_SITE site address for card links
DMC_TOKEN a ready token instead of the stored sign-in (debugging, CI)
DMC_CLIENT_ID, DMC_BROWSER_CLIENT_ID, DMC_KEYCLOAK_TOKEN_ENDPOINT another client or Keycloak

Everything that ties the tool to DMC lives in one file — src/Brand.cs.

Development

dotnet test tests/DmcMcp.Tests.csproj   # logic; DMC is faked, no network
dotnet run --project src                 # stdio server, talk JSON-RPC to it
dotnet pack src -c Release -o pkg        # the tool's .nupkg

Releases

Push a version tag (v0.1.1): publish-tool.yml runs the tests, packs the tool with that version, attaches the .nupkg to the GitHub release and publishes it to nuget.org through trusted publishing — no key is stored in this repository.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
0.5.0 54 9/16/2026
0.4.1 47 9/16/2026
0.4.0 43 9/16/2026
0.3.1 54 9/16/2026
0.3.0 46 9/16/2026
0.2.0 48 9/16/2026
0.1.0 54 9/16/2026