From d8bae920ca3f9450389916df348f473d3a257147 Mon Sep 17 00:00:00 2001 From: Vamil Gandhi Date: Sun, 1 Feb 2026 14:47:55 -0500 Subject: [PATCH] Fix MCP tool naming and bump to 0.2.2 --- CHANGELOG.md | 4 ++++ README.md | 2 +- bindings/python/pyproject.toml | 2 +- bindings/rust/Cargo.toml | 2 +- package.json | 2 +- packages/adapters/package.json | 4 ++-- packages/cli/package.json | 8 ++++---- packages/cli/src/cli.ts | 24 ++++++++++++++++++++++-- packages/core/package.json | 2 +- packages/render/package.json | 4 ++-- 10 files changed, 39 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dfaa89..8965e47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.2.2] - 2026-02-01 + +- Fix MCP tool naming for Claude Desktop + ## [0.2.1] - 2026-02-01 - Fix MCP notifications handling diff --git a/README.md b/README.md index 16121e4..c06602b 100644 --- a/README.md +++ b/README.md @@ -209,7 +209,7 @@ mermkit ships an MCP server over stdio. Any MCP-compatible host (Claude Desktop, } ``` -Once connected, the host gains access to the same five tools listed above (`mermkit.render`, `mermkit.renderBatch`, `mermkit.extract`, `mermkit.term`, `mermkit.schema`). The MCP server reuses the same rendering and extraction logic as `serve` — it is a format translation layer (JSON-RPC 2.0) with no additional dependencies. +Once connected, the host gains access to the same five tools listed above. In MCP hosts that restrict tool names, they are exposed as `mermkit_render`, `mermkit_renderBatch`, `mermkit_extract`, `mermkit_term`, and `mermkit_schema`. The MCP server reuses the same rendering and extraction logic as `serve` — it is a format translation layer (JSON-RPC 2.0) with no additional dependencies. ## Preview server diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index 19f7cad..f7a792a 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "mermkit" -version = "0.2.1" +version = "0.2.2" description = "Python bindings for mermkit (Mermaid rendering toolkit)" readme = "README.md" requires-python = ">=3.8" diff --git a/bindings/rust/Cargo.toml b/bindings/rust/Cargo.toml index ae0ae6b..bcb6360 100644 --- a/bindings/rust/Cargo.toml +++ b/bindings/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mermkit" -version = "0.2.1" +version = "0.2.2" edition = "2021" description = "Rust bindings for mermkit (Mermaid rendering toolkit)" license = "MIT" diff --git a/package.json b/package.json index 8cc50a5..a9cf026 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mermkit", "private": true, - "version": "0.2.1", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/MermaidKit/mermkit.git" diff --git a/packages/adapters/package.json b/packages/adapters/package.json index e96cca3..f7379b9 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -1,6 +1,6 @@ { "name": "@mermkit/adapters", - "version": "0.2.1", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/MermaidKit/mermkit.git" @@ -18,6 +18,6 @@ "build": "tsc -b" }, "dependencies": { - "@mermkit/core": "0.2.1" + "@mermkit/core": "0.2.2" } } diff --git a/packages/cli/package.json b/packages/cli/package.json index ebc11d8..e7e4af3 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@mermkit/cli", - "version": "0.2.1", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/MermaidKit/mermkit.git" @@ -19,8 +19,8 @@ "build": "tsc -b" }, "dependencies": { - "@mermkit/core": "0.2.1", - "@mermkit/render": "0.2.1", - "@mermkit/adapters": "0.2.1" + "@mermkit/core": "0.2.2", + "@mermkit/render": "0.2.2", + "@mermkit/adapters": "0.2.2" } } diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index ed13d75..d97720b 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -761,9 +761,29 @@ function maybeWriteMcpResponse( writeMcpResponse({ ...response, id }); } +const MCP_TOOL_NAME_MAP = new Map(); + +function toMcpToolName(name: string): string { + return name.replace(/\./g, "_"); +} + +function getMcpToolNameMap(): Map { + if (MCP_TOOL_NAME_MAP.size === 0) { + for (const tool of buildToolDefinitions()) { + MCP_TOOL_NAME_MAP.set(toMcpToolName(tool.name), tool.name); + } + } + return MCP_TOOL_NAME_MAP; +} + +function resolveMcpToolName(name: string): string { + if (name.includes(".")) return name; + return getMcpToolNameMap().get(name) ?? name; +} + function buildMcpToolDefinitions(): Array<{ name: string; description: string; inputSchema: Record }> { return buildToolDefinitions().map((tool) => ({ - name: tool.name, + name: toMcpToolName(tool.name), description: tool.description, inputSchema: tool.parameters })); @@ -806,7 +826,7 @@ async function cmdMcp(): Promise { if (request.method === "tools/call") { const params = request.params ?? {}; - const toolName = params.name as string; + const toolName = resolveMcpToolName(params.name as string); const toolInput = (params.input ?? {}) as Record; try { diff --git a/packages/core/package.json b/packages/core/package.json index 741a458..a5dcbd7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@mermkit/core", - "version": "0.2.1", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/MermaidKit/mermkit.git" diff --git a/packages/render/package.json b/packages/render/package.json index b0c0e94..357d221 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -1,6 +1,6 @@ { "name": "@mermkit/render", - "version": "0.2.1", + "version": "0.2.2", "repository": { "type": "git", "url": "https://github.com/MermaidKit/mermkit.git" @@ -18,7 +18,7 @@ "build": "tsc -b" }, "dependencies": { - "@mermkit/core": "0.2.1" + "@mermkit/core": "0.2.2" }, "optionalDependencies": { "dompurify": "^3.1.5",