Repository navigation
libgopher-mcp v0.1.16
Build Information
| Field | Value |
|---|---|
| Version | 0.1.16 |
| Date | 2026-08-29 23:06:27 UTC |
| Commit | a47b553 |
| Branch | br_release |
| Build Type | Release |
Platforms
- Linux: x64, ARM64
- Windows: x64, ARM64
- macOS: x64, ARM64
What's Changed
Added
McpServer::askClientsends a request to a client mid-request and delivers
its answer to a callback, bounded by a deadline.ResponseStream::sendRequest
carries the question down the stream the answer will arrive on.McpServer::registerAsyncRequestHandlerregisters a handler that answers
after its dispatch has returned, which is what a handler asking the client
something needs: every connection is on one dispatcher thread, so a handler
that waited for the reply would be waiting for the thread that has to accept
it.McpServer::dropSessionStreamcloses the stream a session is holding without
ending the session, so a client reconnects and is given what it missed.- Interop suite running this project's server against the official MCP
TypeScript SDK's client, alongside the existing suite for the other
direction. Both run frommake test-interop.
Changed
-
Breaking:
HttpSseFilterChainFactory::setSessionManagernow takes a
std::shared_ptr<transport::StreamableSessionManager>rather than a raw
pointer, andStreamableSessionManagermust be owned by ashared_ptr.
A session visit that crosses dispatcher threads holds the manager for the
length of the visit, which a borrowed pointer cannot express: without it
the manager could be destroyed mid-visit. Callers sharing one manager
between factories should use the newsessionManagerShared(). A manager
that is not shared-owned refuses cross-thread visits loudly rather than
reporting sessions as missing. -
A
GETon the Streamable HTTP endpoint with noAcceptheader is answered
406rather than served an event stream. A missing header used to read as
accepting anything; aGEThere has exactly one kind of answer, and the
spec requires a client to ask for it by name.POSTis unchanged — a
missingAcceptthere only leaves the framing of an ordinary answer to the
server.
Fixed
tools/listdeclares aninputSchemafor every tool, including one
registered without one. A peer validating the list against the schema
rejects the whole list over a single omission, putting every other tool on
the server out of reach.resources/subscribeandresources/unsubscribeanswer with an empty
object rather than a null result, which is not a valid JSON-RPC result and
which a validating peer cannot parse as a response at all.prompts/getpasses the arguments it was called with to the prompt handler.
They arrive as serialized JSON, because nested objects do not fit in the
flat map a request's params are held in, and nothing parsed them back — so
every prompt was rendered with no arguments.