anthropics / anthropics/claude-code

[BUG] Custom remote MCP connector: tools/call result with embedded binary resource (`type: "resource"` + `blob`) fails schema validation

Đang mở
#93,946 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
area:claude-code-web area:mcp bug platform:web platform:windows
Ngôn ngữ chính
Python
Star
145k
Fork
23.1k
Chỉ số merge pull request
Chỉ số pull request đang chờ

Mô tả

### Preflight Checklist

- [x] I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) 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?

When a custom remote MCP connector's tool returns an embedded binary resource
(content: [{ type: "resource", resource: { uri, mimeType, blob } }]), the
tools/call result fails client-side schema validation with
"MCP error -32602: Invalid tools/call result", even though the server's raw
HTTP response is verified to be well-formed and contains a valid non-empty
base64 `blob`.

Two issues were found while debugging:

1. `_meta` handling: Initially our `resource` object had no `_meta` key at
all (omitted). The validation error reported `_meta: expected record,
received null` — implying some client-side normalization step defaults
an absent `_meta` to `null` rather than leaving it `undefined`, which
then fails an `.optional()`-style Zod check. Explicitly adding
`"_meta": {}` to our `resource` object resolved this specific error.

2. `blob` disappearing: After fixing (1), validation still fails, now
reporting both `text` and `blob` as `undefined` inside the `resource`
union — even though:
- Calling our backend directly (bypassing the connector) with the same
request returns a well-formed JSON body with a correctly populated
`blob` string.
- Our reverse-proxy's access log confirms a reasonably-sized response
(several KB, matching the expected base64 payload) was actually
returned — not truncated to near-zero bytes.

This suggests the `blob` field is being dropped somewhere between our
server's response and the client-side schema validation, specific to
custom/remote connectors.

Non-binary tool results (type: "text") from the same server, over the same
connector, work correctly.

### What Should Happen?

The tool result should validate successfully and the binary content
(resource + blob) should be available to Claude, per the MCP specification
for embedded resources.

### Error Messages/Logs

```shell
MCP error -32602: Invalid tools/call result: [
{
"code": "invalid_union",
"errors": [
[{"code":"invalid_type","path":["text"],"message":"Invalid input: expected string, received undefined"}],
[{"code":"invalid_type","path":["data"],"message":"Invalid input: expected string, received undefined"},
{"code":"invalid_type","path":["mimeType"],"message":"Invalid input: expected string, received undefined"}],
...
[
{"code":"invalid_union","errors":[
[{"code":"invalid_type","path":["text"],"message":"Invalid input: expected string, received undefined"}],
[{"code":"invalid_type","path":["blob"],"message":"Invalid input: expected string, received undefined"}]
],"path":["resource"],"message":"Invalid input"}
]
],
"path": ["content", 0],
"message": "Invalid input"
}
]
```

### Steps to Reproduce

1. Register a custom remote MCP connector whose server implements
JSON-RPC 2.0 over Streamable HTTP (protocolVersion "2024-11-05").
2. Implement a tool whose tools/call result returns:
{
"content": [{
"type": "resource",
"resource": {
"uri": "example://some/path",
"mimeType": "application/zip",
"blob": "",
"_meta": {}
}
}]
}
3. From a Claude.ai chat, call this tool through the connector.
4. Observe MCP error -32602 (see Error Messages/Logs).
5. Verify (e.g. via curl directly to the backend, bypassing the connector)
that the server's actual HTTP response contains a correctly populated
`blob` string of reasonable size — ruling out a server-side bug.

### Claude Model

Sonnet (default)

### Is this a regression?

I don't know

### Last Working Version

_No response_

### Claude Code Version

2.1.243 (Claude Code)

### Platform

Anthropic API

### Operating System

Windows

### Terminal/Shell

Windows Terminal

### Additional Information

This issue occurred using a custom remote MCP connector (self-hosted PHP
backend, not one of Anthropic's first-party connectors) registered via
Claude.ai's custom connector feature. The connector correctly handles
JSON/text tool results; only embedded binary resource content (blob) is
affected.

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.