Repository navigation
[1.1.0] — 2026-11-12
Implements AHP 1.1.0.
Added
- Optional typed
InitializeResult.environment.pathStylemetadata for authoritative host path semantics. - Optional
CreateChatParams.titlefor a client-selected initial display title. - Optional
SessionModelInfo.vendorfor the model vendor as the provider reports it. (#503) - Experimental subscription-negotiated flow-control types using UTF-16 byte accounting, framed delivery and consumption credit notifications, and independent
reconnect.windowsmetadata. (#492) EmptyStatevariant ofSnapshot.statefor channels whose state has no fields, such as telemetry. Every experimental windowed subscription starts withchannel/snapshot.- Experimental TCP channel:
createTcpConnectionopens a TCP connection on the host's network and returns an emptyCreateTcpConnectionResult. The client forwards it over a windowed subscription withtcp/data,tcp/eof, andtcp/reset. TCP channels do not survive the loss of the AHP connection. (#488) - Each client exposes the notification methods that do not count against the window on a windowed subscription (
WINDOW_EXEMPT_METHODSandcountsAgainstWindowin TypeScript, with equivalents in the other clients), generated from the new@windowExemptannotation. ChatState.config, thechat/configChangedaction, andchatMutableon session config properties give each chat its own config for selected settings, such as tool auto-approval, so changing them in one chat no longer changes every chat in the session.ChatConfigState.valuesholds the chat'schatMutableproperties and does not inherit from the session; missing keys take the schema default. OptionalChatConfigState.schemareplaces the session's schema for a chat whose agent differs from the session's.- Optional per-chat agent provider:
CreateChatParams.providerandChatSummary.provider(mirrored onChatStateandSessionChatSummary), gated by the host-levelInitializeResult.multipleChatProviderscapability, let one session contain chats backed by different agent providers. Absentprovidermeans the session's agent provider; forks and side chats keep their source chat's agent provider. - Optional
ChangesetFile.status, a bitset ofChangesetFileStatusflags (initiallyEditing), reports per-file activity through existing changeset snapshots and actions without requiring provider-specific metadata. (#538) - Optional changeset file and operation-target nonces let hosts reject operations on superseded changes without requiring a capability or a nonce from every client. (#538)
- Adds
chat/moved, dispatched on a chat's channel after a cross-session move with its new session,providerandconfig.schema. - Optional producer-recorded
startedAtanddurationfields on reasoning response parts andchat/reasoningupdates preserve each contiguous reasoning run's timing across state snapshots and history restoration. - Optional
ToolCallResult.resultMetadatacarries MCPCallToolResult._metaseparately from host/provider tool-call metadata and is preserved through result confirmation. - Optional
ResourceReadParams.positionandResourceReadParams.lengthrequest a byte range fromresourceRead, and optionalResourceReadResult.sizereports the total size of the resource when the receiver honored the range. A result withoutsizeis the whole resource, and a rangedutf-8result does not split a UTF-8 sequence. (#554) resourceReadguidance: a peer SHOULD serve reads of the URIs it publishes as content, including HTTP(S) URLs that the other peer might not be able to reach.- Optional
McpServerCustomization.childrenfor MCP-served skills (SEP-2640), toggleable by id withsession/customizationToggled. - Optional
authenticate.accountIdcarries an opaque client-local account-selection hint without changing token validation or legacy authentication. - Add
Equatableconformance to generated Swift protocol models, including associated-value enums and conditional conformance for generic JSON-RPC wrappers. (#591) - Generated
AHPCommandconformances and typedrequest(_:)APIs for every Swift protocol command, including null results. (#588)
Changed
- Experimental windowed subscriptions count every data notification against the window, whether sent whole or in
channel/framenotifications. Frames carry messages larger thanmaxFrameBytesand let subscriptions share the connection. Snapshot.statecan be anEmptyState({}) for channels whose state has no fields, such as telemetry. With ordinary delivery, a server may send such a snapshot or omit it, so clients must accept both. Clients must not fail on a snapshot state that they do not recognize.- Experimental windowed delivery removes
maximumMessageBytesand uses one size for everything: the UTF-16 size of each JSON-RPC data message as sent, includingchannel/frameenvelopes. Each message and frame counts againstwindowBytes, which is a soft target;maxFrameBytesremains a hard limit on each message, and receivers can return credit for stored frames. - Store steering and queued input in one
queuedMessageslist with optionalPendingMessage.kind(absent means queued), using the existing per-ID pending actions. New IDs append, kind changes replace in place, and UIs group steering first without changing raw order. Mirror the latest steering update in the deprecatedsteeringMessageslot for older clients. - Experimental windowed subscriptions no longer carry byte counters across
reconnect. Their counters start at zero on the new connection, and eachreconnect.windowsitem offers new limits inflowControl, which the result accepts as insubscribe. RemovesChannelReceiveProgressand theclientReceive/hostReceivecounters from reconnect. - Remove the User-only restriction on client-submitted messages in
chat/turnStartedandchat/pendingMessageSet. (#542) - Experimental
CanvasState.urlis renamed toCanvasState.uriand holds an absolute content URI, typically HTTP(S). A client that can't load it directly reads it, and the relative references in its content, withresourceRead. - Preserve unknown members on automation patch objects and nested shared types (
extrain Rust/Swift/Kotlin,Extrain Go/.NET). Rust struct literals must initializeextraand exhaustive patterns need..; Go map-bearing structs lose==comparability; .NET record equality comparesExtraby reference; Swift/Kotlin consumers must recompile. (#592) - Annotations channels use
ahp-annotations:/<uuid>with the owning session's id; clients should useAnnotationsSummary.resourcerather than derive the URI.
Fixed
- Decoding a snapshot whose state has an unrecognized form no longer fails. The state is kept as an
Unknownvariant with its raw JSON, and state mirrors ignore it. Go no longer decodes such a state as an emptyRootState. - State mirrors leave confirmed state unchanged when an action envelope carries a rejection reason. (#586)
- Swift and Rust select snapshot state types from
Snapshot.resource, propagating errors for malformed known-channel states and preserving unrecognized schemes as raw JSON. (#590) - Swift subscriptions and client events now report undecodable action envelopes as
SubscriptionEvent.actionDecodingFailed(a new case, so exhaustive switches must handle it) and advance the reconnect cursor past them. (#589) - Generate
clientDispatchableActionsandisClientDispatchable(_:)from canonical action annotations, including all 48 client-dispatchable actions. (#587)
Security
- Add an optional
authenticate.targetidentifying an MCP server by session URI and customization ID, preventing tokens from reaching other consumers that share a protected resource and scopes.