EncySoftware.DmcMcp
0.5.0
dotnet tool install --global EncySoftware.DmcMcp --version 0.5.0
dotnet new tool-manifest
dotnet tool install --local EncySoftware.DmcMcp --version 0.5.0
#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 setup — login, plus in ~/.cursor/mcp.json:
{ "mcpServers": { "dmc": { "command": "dmc-mcp" } } }
What it looks like
- "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. - "the control is Siemens 828D, not Fanuc" →
update_post. - "submit it for review" →
submit_post. - "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 | Versions 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. |
This package has no dependencies.