| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[Server] Validate Host and Origin independently (#589) * Validate Host and Origin independently * Normalize allowedOrigins entries and clarify wildcard hosts --------- Co-authored-by: Christopher Hertel <mail@christopher-hertel.de> | 1 天前 | |
Add a way to stop the stdioTransport in a graceful way (#195) * Add a way to stop the stdioTransport in a graceful way * fix cs * fix: minors * move around files * add changelog | 9 个月前 | |
[Server] Fix parallel elicitations on one session getting each other's answers (#581) * [Server] Fix parallel elicitations on one session getting each other's answers * [Server] Address review: cap client request ids at PHP_INT_MAX on 32-bit PHP * [Server] Read the random client request ids in the tests of #580 and #585 * [Server] Address review: send requests to the client with UUID ids * [Server] Address review: pass client request ids as Uuid instances * [Server] Address review: answer the second stream's request by its UUID in the test * [Server] Address review: don't send a client request the session could not store on a fiber yield * [Server] Read the client request ids in the tests of #584 | 11 小时前 | |
Throw package specific exceptions in CallbackStream (#233) | 8 个月前 | |
Decouple Server from TransportInterface for reusability (#160) | 10 个月前 | |
[Server] Fix parallel elicitations on one session getting each other's answers (#581) * [Server] Fix parallel elicitations on one session getting each other's answers * [Server] Address review: cap client request ids at PHP_INT_MAX on 32-bit PHP * [Server] Read the random client request ids in the tests of #580 and #585 * [Server] Address review: send requests to the client with UUID ids * [Server] Address review: pass client request ids as Uuid instances * [Server] Address review: answer the second stream's request by its UUID in the test * [Server] Address review: don't send a client request the session could not store on a fiber yield * [Server] Read the client request ids in the tests of #584 | 11 小时前 | |
[Server] Close the conformance gaps in the modern lifecycle (#447) * [Server] Let the client gateway see modern-era capabilities The six supports*() probes read session state only InitializeHandler wrote, so every request served statelessly reported no client capabilities at all — a tool guarding on them took the unsupported branch without a signal. StatelessProtocol now writes the request's declaration under the same keys. * [Server] Reject the RPCs 2026-07-28 removed resources/subscribe and resources/unsubscribe were still dispatched and answered 200 OK, recording subscriptions the modern era never reads. They join initialize, ping and logging/setLevel in the era guard; the handlers stay registered because the handshake era still serves them. * [Server] Decode a wrapped Mcp-Name before comparing it The Base64 sentinel was only unwrapped for Mcp-Param-*, so any resource URI or tool name outside the header-safe ASCII set — which the spec explicitly tells clients to wrap — was compared encoded and refused with -32020. * [Server] Require the MCP-Protocol-Version header It was only checked for contradicting the body, so omitting it entirely passed — leaving the value intermediaries route on unenforced. Tied to the header validator's presence, since that is what a header-bearing transport installs and stdio carries its metadata inline. * [Server] Read the modern-era request body whole A single read() takes whatever the stream cares to give — 64 bytes from a chunked transfer is legal — so an oversized-but-valid POST came back as a parse error. Shares the legacy transport's incremental read as a trait. * [Schema][Server] Answer a notification with a status, not a response A body with no id was dispatched as a request and came back as a JSON-RPC error carrying "id": "" — an id nobody issued, and on a path a client uses to tell a modern server from a legacy one. Notifications now get 202 and no body, and Error omits an id it could not read instead of emptying it. * [Server] Stop emitting the error codes 2026-07-28 reserved resources/read answered -32002, which this revision forbids; prompts/get and completion/complete answered it for an unknown *name*, which it never meant; tools/call answered -32601, which belongs to an unknown method. Only the resources/read code is revision-gated — older peers expect -32002 there, and nowhere else. Also routes the -32021 capability exception out of the prompt and resource handlers, which were swallowing it into -32603. | 1 个月前 | |
[Server] Serve both protocol eras over stdio (#546) * [Server] Echo the request id when refusing a request without a session * [Server] Answer modern-era messages from a transport without headers * [Server] Serve both protocol eras over stdio * [Server] Name the served revisions when refusing a bare initialize * [Server] Cover subscriptions/listen over stdio * [Server] Keep string and integer request ids apart on stdio * [Docs] Document both protocol eras over stdio * [Server] Write a stream frame before resuming its handler on stdio * [Server] Leave the stdio era open after refusing an unserved revision * [Server] Settle the stdio era on a request, not a response * [Docs] Say what notifications/cancelled stops over stdio * [Server] Refuse a request with a malformed id on stdio without settling the era * [Server] Keep a stdio listen stream open until it is cancelled * [Server] Cover listen notifications over stdio * [Server] Ignore a response on stdio before the era is settled * [Server] Ignore a malformed cancellation of a stdio stream * [Server] Name only the negotiated handshake revisions when refusing a modern request * [Server] Ignore a response on a modern stdio connection * [Docs] Say the subscription lifetime does not apply over stdio * [Server] Trim the stdio comments to one line each | 5 天前 | |
[Server] Narrow authorization to the resource server role (#532) * [Server] Narrow authorization to the resource server role * Remove OAuthProxyMiddleware, ClientRegistrationMiddleware and their interfaces (ADR 0002) * Replace OAuthRequestMetaMiddleware with RequestContext::getAccessToken() * Add ScopePolicy to AuthorizationMiddleware for 403 insufficient_scope step-up * JwtTokenValidator: final, CachedKeySet with refetch on unknown kid, alg allowlist, token type, leeway * ProtectedResourceMetadata: require resource, derive metadata path and challenge URL from it, enforce https * Expose WWW-Authenticate via CORS * [Server] Answer unresolvable token signing keys with 401 * [Server] Reject access tokens without exp * [Server] Discover issuer keys lazily, one key set per algorithm Keys without alg are tagged with the token's algorithm instead of the first allowed one. * [Server] Document the access token parameter BC breaks * [Server] Dedupe scopes on insert in ScopePolicy * [Server] Hand on implied scopes with the access token * [Server] Challenge other authorization schemes without error code * [Server] Explain bearer parsing and header escaping * [Server] Keep the resource query in the protected resource metadata URL * [Server] Cover SecureUrl and forbidden batch requests * [Docs] Document the AccessToken request attribute as integration seam * [Examples] Note that Entra step-up needs the prefixed scope * [Server] Require a numeric exp in access tokens * [Server] Expand the scope hierarchy once per request * [Server] Share scope validation between policy and metadata * [Server] Back off briefly after a failed OIDC discovery * [Server] Note the global leeway swap in JwtTokenValidator * [Server] Accept only https, or http on loopback hosts, in SecureUrl * [Server] Serve metadata of a queryless resource only without query * [Server] Restrict scopes to the RFC 6749 scope-token grammar * [Server] Keep the resource path verbatim in the metadata URL * [Server] Resolve the signing key before swapping the JWT leeway | 7 天前 | |
[Server] Send a stdio call's notifications before its response (#601) When a handshake-era handler's last notification and its return happened in the same resume, the response was written before the queued notification. A client returning on the response could miss it, which made NotificationTest::testLoggingReachesTheClient flaky in CI. | 10 小时前 | |
[Server] Answer a request as SSE when the session has queued messages (#602) A JSON answer bundled the session's queued messages with the request's response into one array, which clients on 2025-06-18 and later reject. The queued messages now go out on an SSE answer ahead of the responses, and a JSON answer holds the response alone. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude <noreply@anthropic.com> | 9 小时前 | |
[Server] Fix parallel elicitations on one session getting each other's answers (#581) * [Server] Fix parallel elicitations on one session getting each other's answers * [Server] Address review: cap client request ids at PHP_INT_MAX on 32-bit PHP * [Server] Read the random client request ids in the tests of #580 and #585 * [Server] Address review: send requests to the client with UUID ids * [Server] Address review: pass client request ids as Uuid instances * [Server] Address review: answer the second stream's request by its UUID in the test * [Server] Address review: don't send a client request the session could not store on a fiber yield * [Server] Read the client request ids in the tests of #584 | 11 小时前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 天前 | ||
| 9 个月前 | ||
| 11 小时前 | ||
| 8 个月前 | ||
| 10 个月前 | ||
| 11 小时前 | ||
| 1 个月前 | ||
| 5 天前 | ||
| 7 天前 | ||
| 10 小时前 | ||
| 9 小时前 | ||
| 11 小时前 |