@draw-my-architecture/mcp-server
v0.1.9
Published
A [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server that exposes Draw My Architecture tooling — DSL validation, icon catalogs, and cloud service mapping — to AI assistants and developer tools.
Downloads
1,533
Readme
@draw-my-architecture/mcp-server
A Model Context Protocol (MCP) server that exposes Draw My Architecture tooling — DSL validation, icon catalogs, and cloud service mapping — to AI assistants and developer tools.
How it works
The server runs as a stdio-based MCP server using @modelcontextprotocol/sdk. It communicates over stdin/stdout, making it compatible with any MCP client (VS Code Copilot, Claude Desktop, MCP Inspector, etc.).
All tool inputs are validated with Zod schemas. Optional request/response logging is controlled via environment variables.
Available tools
| Tool | Description |
|---|---|
| ping | Health check — returns pong |
| server.version | Returns MCP server/package version metadata for client verification |
| dsl.getSyntaxReference | Returns the DSL grammar (including note annotations), option enums, rules, and an optional example |
| dsl.validate | Parses, validates, and normalizes a DSL string using @draw-my-architecture/diagram-dsl |
| icons.catalog | Browse and search the icon catalog across Azure, AWS, and GCP providers |
| icons.resolve | Resolve a service name to a canonical icon, asset URL, and component path |
| cloud.mapService | Map equivalent services across cloud providers using tier-based matching |
Architecture
index.ts — entry point, wires StdioServerTransport
server.ts — creates McpServer, registers all tools
dsl-tools.ts — dsl.getSyntaxReference + dsl.validate implementations
cloud-map.ts — cloud.mapService implementation + tier mapping tablesThe dsl.validate tool reuses the same parseAzureDsl → validateAzureDsl → normalizeAzureDsl pipeline from packages/diagram-dsl, so its behaviour is always consistent with the web app.
Environment variables
| Variable | Default | Description |
|---|---|---|
| MCP_SERVER_LOG_IO | false | Enable request/response logging to stderr |
| MCP_SERVER_LOG_INCLUDE_PAYLOADS | false | Include full input/output payloads in logs |
| MCP_SERVER_LOG_MAX_CHARS | 1000 | Max characters per payload in logs |
When AI_MCP_ENABLED=true is set on the API, the AI workflow calls this server as a prompt-prep context source during diagram generation.
Publishing for external users
To make the MCP server available outside the repo, publish these packages to npm in this order:
@draw-my-architecture/diagram-dsl@draw-my-architecture/shared@draw-my-architecture/mcp-server
Suggested release commands from the repo root:
npm run build -w @draw-my-architecture/diagram-dsl
npm run build -w @draw-my-architecture/shared
npm run build -w @draw-my-architecture/mcp-server
npm publish -w @draw-my-architecture/diagram-dsl --access public
npm publish -w @draw-my-architecture/shared --access public
npm publish -w @draw-my-architecture/mcp-server --access publicThe published MCP server can then be launched from Copilot with:
{
"servers": {
"draw-my-architecture": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@draw-my-architecture/mcp-server"]
}
}
}Running the server
Development (hot reload):
npm run dev -w @draw-my-architecture/mcp-serverProduction (after build):
npm run build -w @draw-my-architecture/mcp-server
npm run start -w @draw-my-architecture/mcp-serverDemoing with MCP Inspector
MCP Inspector provides a browser UI for calling tools interactively — no code required.
Step 1 — Build dependencies
npm run build -w @draw-my-architecture/diagram-dsl
npm run build -w @draw-my-architecture/sharedStep 2 — Launch the Inspector
npx @modelcontextprotocol/inspector npx tsx apps/mcp-server/src/index.tsOpen the printed URL (typically http://localhost:5173) in your browser.
Step 3 — Connect
Click Connect in the top-left. The status indicator turns green when connected.
Note: The Inspector has a built-in Ping button that sends a protocol-level
ping(MCP handshake). This always returns{}and is separate from thepingtool listed under the Tools tab.
Step 4 — Try the tools
ping
Click ping → Run Tool. Returns pong (or pong: <message> if a message is provided).
server.version
Click server.version → Run Tool. Returns JSON including serverName, serverVersion, and package identity so you can confirm the MCP release currently connected.
dsl.getSyntaxReference
Set includeExample → true → Run Tool. Returns the full DSL grammar with a working example diagram.
dsl.validate
Paste a DSL string into the dsl field. Example valid DSL with a note:
diagram main label="My App" provider=azure
group rg groupKind=resourceGroup
node api appService group=rg
node db sqlDatabase group=rg
edge api -> db kind=dataFlow
note n1 label="Primary data store" attachTo=dbSet includeNormalized → true → Run Tool. Returns isValid: true and the normalized DSL.
To test error handling, introduce a typo — for example, change edge to dge:
diagram main label="My App" provider=azure
group rg groupKind=resourceGroup
node api appService group=rg
node db sqlDatabase group=rg
dge api -> db kind=dataFlowThe tool call itself succeeds (the MCP tool ran without crashing), but the response contains isValid: false with:
{
"isValid": false,
"errors": [
{
"severity": "error",
"code": "UNKNOWN_STATEMENT",
"message": "Unknown statement 'dge'. Expected one of: diagram, group, node, edge, meta.",
"location": { "line": 5, "column": 1, "length": 3 }
}
],
"warnings": []
}Tool success vs DSL validity are separate. A successful tool call means the tool ran correctly. Check
isValidin the response to know whether the DSL itself is valid.
icons.catalog
Set provider → azure and query → storage → Run Tool. Returns matching icon entries with serviceKey, componentName, and modulePath.
cloud.mapService
Map Azure Functions to its AWS equivalent:
sourceProvider→azuretargetProvider→awsserviceKey→functionApp
Returns mappedServiceKey: "lambda" with confidence: "high".
Using with VS Code Copilot
Step 1 — Add the MCP config
If you are setting this up from scratch, create these two files:
.mcp.jsonat the repo root for Copilot CLI.vscode/mcp.jsonfor VS Code Copilot Chat
For this repository, the MCP config is committed in both places:
.mcp.jsonat the repo root for Copilot CLI.vscode/mcp.jsonfor VS Code Copilot Chat
Both files use the same local dev server entry:
{
"servers": {
"draw-my-architecture": {
"type": "stdio",
"command": "npx",
"args": ["tsx", "apps/mcp-server/src/index.ts"]
}
}
}For external users, publish the MCP server and point the config at the package instead:
{
"servers": {
"draw-my-architecture": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@draw-my-architecture/mcp-server"]
}
}
}Copilot CLI uses .mcp.json (or .github/mcp.json) for MCP server configuration, while VS Code Copilot Chat reads .vscode/mcp.json in this repo.
In both cases, the client starts the MCP server automatically when Copilot needs it.
Step 2 — Reload VS Code
Run Developer: Reload Window (Ctrl+Shift+P → type "Reload Window") to pick up the new MCP config.
Step 3 — Confirm the tools are available
Open Copilot Chat (Ctrl+Alt+I). Click the tools icon (🔧) in the chat input bar — you should see the draw-my-architecture server and its tools listed.
Step 4 — Use it in chat
Copilot will invoke the tools automatically when relevant. You can also prompt it directly:
Validate DSL:
"Validate this DSL:
diagram main provider=azure \n node api appService"
Get the DSL syntax:
"Show me the Draw My Architecture DSL syntax reference"
Look up an icon:
"What icons are available for Azure storage?"
Map a service across clouds:
"What is the AWS equivalent of Azure Function Apps?"
Note: Just like the MCP Inspector, a successful tool invocation means the tool ran — check
isValidin the response to know whether the DSL itself passed validation.
Quick tutorial — test in GitHub Copilot Chat (VS Code)
Use these steps to verify the MCP server in VS Code:
- Make sure both config files exist:
.mcp.jsonat the repo root.vscode/mcp.jsonin the.vscodefolder
- Reload VS Code with Developer: Reload Window.
- Open Copilot Chat (
Ctrl+Alt+I). - Click the tools icon (🔧) and confirm
draw-my-architectureappears. - Send a simple health check:
Ping the draw-my-architecture MCP server
- Ask for the DSL syntax:
Show me the Draw My Architecture DSL syntax reference
- Ask it to validate DSL:
Validate this DSL: diagram main provider=azure node api appService
- Ask for an icon lookup:
Use the draw-my-architecture MCP server to list icons for Azure storage
- Ask for a cloud mapping:
Use the draw-my-architecture MCP server to map Azure Function Apps to AWS
Expected results:
- The server appears in the tools list.
pingreturnspong.dsl.validatereturnsisValid: truefor valid DSL andisValid: falsewith errors for invalid DSL.icons.catalogandcloud.mapServicereturn matching results instead of errors.
Tip: If Copilot answers from general knowledge instead of calling the tool, make the request more explicit by naming the server or tool, for example:
Use draw-my-architecture to list Azure storage iconsorUse draw-my-architecture to map Azure Function Apps to AWS.
