Title: Claude Code silently drops all tools due to MCP SDK 1.26.0 fields (instructions, annotations, execution) · Issue #220 · getsentry/XcodeBuildMCP · GitHub
Open Graph Title: Claude Code silently drops all tools due to MCP SDK 1.26.0 fields (instructions, annotations, execution) · Issue #220 · getsentry/XcodeBuildMCP
X Title: Claude Code silently drops all tools due to MCP SDK 1.26.0 fields (instructions, annotations, execution) · Issue #220 · getsentry/XcodeBuildMCP
Description: Description XcodeBuildMCP v2.0.7 tools are completely invisible in Claude Code 2.1.39 despite the server showing as "Connected" in claude mcp list. Zero tools appear — no error, no warning. This is caused by fields added by @modelcontext...
Open Graph Description: Description XcodeBuildMCP v2.0.7 tools are completely invisible in Claude Code 2.1.39 despite the server showing as "Connected" in claude mcp list. Zero tools appear — no error, no warning. This is...
X Description: Description XcodeBuildMCP v2.0.7 tools are completely invisible in Claude Code 2.1.39 despite the server showing as "Connected" in claude mcp list. Zero tools appear — no error, no warnin...
Opengraph URL: https://github.com/getsentry/XcodeBuildMCP/issues/220
X: @github
Domain: patch-diff.githubusercontent.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Claude Code silently drops all tools due to MCP SDK 1.26.0 fields (instructions, annotations, execution)","articleBody":"## Description\n\nXcodeBuildMCP v2.0.7 tools are completely invisible in Claude Code 2.1.39 despite the server showing as \"Connected\" in `claude mcp list`. Zero tools appear — no error, no warning.\n\nThis is caused by fields added by **@modelcontextprotocol/sdk v1.26.0** that Claude Code's MCP client doesn't handle gracefully.\n\n## Affected Fields\n\n**In `initialize` response:**\n- `instructions` — large documentation string (~1500 chars)\n- `capabilities.tools.listChanged: true`\n- `capabilities.resources` and `capabilities.logging`\n\n**In `tools/list` response (per-tool):**\n- `execution: { taskSupport: \"forbidden\" }`\n- `annotations: { title: \"...\", readOnlyHint: true/false }`\n- `inputSchema.$schema: \"http://json-schema.org/draft-07/schema#\"`\n\n## How We Diagnosed\n\n1. Created a minimal canary MCP server with bare `{name, description, inputSchema}` and `capabilities: {tools: {}}` — **tools loaded** ✅\n2. XcodeBuildMCP proxy stripping only tool-level fields — **still dropped** ❌\n3. Proxy also normalizing the `initialize` response (removing `instructions`, simplifying capabilities) — **tools loaded** ✅\n\nThe `instructions` field and/or extra capabilities in the `initialize` response appear to be the primary trigger. Tool-level `annotations` and `execution` may also contribute.\n\n## Workaround\n\nNode.js proxy that normalizes MCP responses:\n\n```javascript\n#!/usr/bin/env node\nconst { spawn } = require('child_process');\n\nconst proc = spawn('xcodebuildmcp', ['mcp'], {\n stdio: ['pipe', 'pipe', process.stderr],\n cwd: process.env.XCODEBUILDMCP_CWD || process.cwd(),\n});\n\nlet buffer = '';\nproc.stdout.on('data', (data) =\u003e {\n buffer += data.toString();\n const lines = buffer.split('\\n');\n buffer = lines.pop();\n for (const line of lines) {\n if (!line.trim()) { process.stdout.write('\\n'); continue; }\n try {\n const msg = JSON.parse(line);\n // Clean initialize response\n if (msg.result \u0026\u0026 msg.result.protocolVersion) {\n delete msg.result.instructions;\n if (msg.result.capabilities) {\n msg.result.capabilities = { tools: {} };\n }\n }\n // Clean tools/list response\n if (msg.result \u0026\u0026 msg.result.tools \u0026\u0026 Array.isArray(msg.result.tools)) {\n msg.result.tools = msg.result.tools.map(tool =\u003e {\n const { execution, annotations, ...rest } = tool;\n if (rest.inputSchema) delete rest.inputSchema['$schema'];\n return rest;\n });\n }\n process.stdout.write(JSON.stringify(msg) + '\\n');\n } catch (e) {\n process.stdout.write(line + '\\n');\n }\n }\n});\n\nprocess.stdin.pipe(proc.stdin);\nproc.on('exit', (code) =\u003e process.exit(code || 0));\nprocess.on('SIGTERM', () =\u003e proc.kill('SIGTERM'));\nprocess.on('SIGINT', () =\u003e proc.kill('SIGINT'));\n```\n\nSave as a proxy script, then in `.mcp.json`:\n```json\n{\n \"XcodeBuildMCP\": {\n \"type\": \"stdio\",\n \"command\": \"node\",\n \"args\": [\"/path/to/xcodebuildmcp-proxy.js\"],\n \"env\": { \"XCODEBUILDMCP_CWD\": \"/path/to/your/project\" }\n }\n}\n```\n\n## Suggested Fix\n\nConsider one or more of:\n\n1. **Make `instructions` opt-in** via config (e.g. `enableInstructions: false` in `.xcodebuildmcp/config.yaml`)\n2. **Strip `instructions` from initialize** when the client doesn't advertise support\n3. **Make `annotations` and `execution` optional** per MCP spec — only include them if the client negotiates support during `initialize`\n\n## Related\n\n- Claude Code issue: https://github.com/anthropics/claude-code/issues/25081\n- Issue #210 in this repo (connection failures — may be same root cause)\n\n## Environment\n\n- XcodeBuildMCP: 2.0.7\n- @modelcontextprotocol/sdk: 1.26.0\n- Claude Code: 2.1.39\n- macOS: Darwin 24.6.0 (Apple Silicon)","author":{"url":"https://github.com/greenstevester","@type":"Person","name":"greenstevester"},"datePublished":"2026-02-12T22:43:33.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},"url":"https://github.com/220/XcodeBuildMCP/issues/220"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5199955d-c9b4-532f-94b9-f09600f7c5a4 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BEE6:5CB1F:5E05C7:7B7CF1:6991EA51 |
| html-safe-nonce | b78093189ed13bfa07132a2c58abd53dbd4f6306531d329375b6302b0a18d8c6 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCRUU2OjVDQjFGOjVFMDVDNzo3QjdDRjE6Njk5MUVBNTEiLCJ2aXNpdG9yX2lkIjoiNTY0NzYwMDIwMzIwNjg3OTgyNSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 7e786fa67e0a76993dec16f6cd16e00cc99be8b2fbc4cb7803f87825f00c6d93 |
| hovercard-subject-tag | issue:3934382330 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/getsentry/XcodeBuildMCP/220/issue_layout |
| twitter:image | https://opengraph.githubassets.com/705484b4c956a99c4fc8cf9d1c5c1727505a05508863822dbadcc95d5e009f97/getsentry/XcodeBuildMCP/issues/220 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/705484b4c956a99c4fc8cf9d1c5c1727505a05508863822dbadcc95d5e009f97/getsentry/XcodeBuildMCP/issues/220 |
| og:image:alt | Description XcodeBuildMCP v2.0.7 tools are completely invisible in Claude Code 2.1.39 despite the server showing as "Connected" in claude mcp list. Zero tools appear — no error, no warning. This is... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | greenstevester |
| hostname | github.com |
| expected-hostname | github.com |
| None | 42c603b9d642c4a9065a51770f75e5e27132fef0e858607f5c9cb7e422831a7b |
| turbo-cache-control | no-preview |
| go-import | github.com/getsentry/XcodeBuildMCP git https://github.com/getsentry/XcodeBuildMCP.git |
| octolytics-dimension-user_id | 1396951 |
| octolytics-dimension-user_login | getsentry |
| octolytics-dimension-repository_id | 945551361 |
| octolytics-dimension-repository_nwo | getsentry/XcodeBuildMCP |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 945551361 |
| octolytics-dimension-repository_network_root_nwo | getsentry/XcodeBuildMCP |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 848bc6032dcc93a9a7301dcc3f379a72ba13b96e |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width