[BUG] Live Artifacts (CoworkArtifacts.callMcpTool) reject local stdio MCP servers on cold start — claude.ai relay rejects server name as non-UUID
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Live Artifacts in Claude Desktop fail to call local stdio MCP servers configured in claude_desktop_config.json after a cold start of Claude Desktop. Every tool call returns a 400 from claude.ai's remote
MCP relay because the request URL embeds the server name (e.g. macbook-mcp) where the API expects a server UUID. The local MCP server is never reached — its stderr log shows only initialize andtools/list, never tools/call.
After a direct tool invocation through Claude Chat, the artifact path starts working for the rest of the session — strongly suggesting a lazy-registration bug.
This appears to be a code path missed by #20377's fix: local stdio MCPs work in Cowork chat post-#20377, but the [CoworkArtifacts] path still routes through claude.ai's remote endpoint instead of the local stdio bridge.
What Should Happen?
Live Artifacts should invoke local stdio MCPs immediately on cold start — the same way Claude Chat and the Cowork chat tab do post-#20377. Either:
- Local stdio servers should be registered with the relay at startup, or
- CoworkArtifacts.callMcpTool should fall back to the local stdio bridge for servers that have no claude.ai-side UUID.
Error Messages/Logs
~/Library/Logs/Claude/main.log:
[info] [CoworkArtifacts] callMcpTool() cache bypass (artifactId=daily-attention tool=mcp__macbook-mcp__list_events ...)
[info] Making remote MCP tool call: list_events
[error] Remote tool call failed {
serverUuid: 'macbook-mcp',
toolName: 'list_events',
status: 400,
errorText: '{"type":"error","error":{"type":"invalid_request_error","message":"path.server_uuid: Input should be a valid UUID, invalid character: expected an optional prefix of `urn:uuid:` followed by
[0-9a-fA-F-], found `m` at 1"},"request_id":"req_011CafkutM43FaxLew16tWZS"}',
url: 'https://claude.ai/api/organizations/<ORG_UUID>/mcp/servers/macbook-mcp/tools/call'
}
The serverUuid field is being populated with the literal claude_desktop_config.json key (`macbook-mcp`) — not a real UUID — and that name is being substituted into the path of an endpoint that performs
strict UUID validation.
Local MCP server's own stderr (~/Library/Logs/Claude/mcp-server-macbook-mcp.log): only initialize + tools/list arrive, never tools/call. The 400 happens at claude.ai's relay, before the local server is
contacted.
Steps to Reproduce
- Configure any local stdio MCP server in
claude_desktop_config.json, for example:
```json
"macbook-mcp": {
"command": "/path/to/macbook-mcp",
"env": { "MACBOOK_MCP_CONFIG": "/path/to/config.yaml" }
}
- Cold start Claude Desktop (full quit + relaunch).
- Open a Live Artifact that calls one of the MCP's tools, fails with Tool call failed: 400.
- In a Claude Chat conversation, invoke any tool from that MCP directly (e.g. ask "list my calendar events for today").
- Reload the Live Artifact, it now works.
The bug only manifests on cold start before the MCP has been used directly via Chat. Once Claude Desktop has dispatched at least one tool call to the local stdio MCP, the Live Artifact path starts succeeding for the rest of the session which is why I suspect lazy registration of local stdio servers with claude.ai's remote MCP relay.
Claude Model
None
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
Claude Desktop version: 1.5354.0
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Other
Additional Information
Why this is distinct from #20377
- #20377 fixed local stdio MCPs in the Cowork chat tab, confirmed working in 1.1.1890+ and still working in 1.5354.0.
- This bug is in Live Artifacts (the
[CoworkArtifacts]module) which seems to use an entirely different code path:callMcpTool()→https://claude.ai/api/.../mcp/servers/{server_uuid}/tools/call(a remote
relay) instead of the local stdio bridge.
This issue has 8 comments on GitHub. Read the full discussion on GitHub ↗