You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
1.1.0 (2026-07-04)
Breaking Changes
Tasks API rewritten to conform to MCP 2025-11-25. The previous implementation
targeted a tasks/create method that does not exist in the specification.
Removed Client#create_task. To create a task, augment a tools/call via the new Client#call_tool_as_task(name, arguments, ttl:), which returns a MCPClient::Task.
MCPClient::Task fields renamed and reduced to the spec set: id→task_id, state→status; added status_message, created_at, last_updated_at, ttl, poll_interval; removed progress, total, message, result, progress_token,
and progress_percentage. Statuses are now working, input_required, completed, failed, cancelled (was pending/running/…).
Client#get_task and Client#cancel_task now send the taskId parameter (was id)
and return a Task with the new field set.
New Features
Client#call_tool_as_task — create a task by augmenting tools/call (gated on the
server's tasks.requests.tools.call capability and the tool's execution.taskSupport).
Client#get_task_result (tasks/result) — retrieve the underlying task result.
The client handles notifications/tasks/status server notifications. (It does not
declare a client tasks capability: that marks a task receiver for
sampling/elicitation, which is not implemented — the client is a task requestor for tools/call only.)
Automatic pagination: list_tools and list_prompts now follow the server's nextCursor and return the complete set across all pages, with a per-call safety
bound and an identical-cursor loop guard. No manual cursor handling is required (#148).
Bug Fixes
Tool annotations: corrected readOnlyHint/destructiveHint defaults to match the
MCP 2025-11-25 ToolAnnotations schema — an un-annotated tool is treated as writable,
potentially destructive, and open-world (#140).
Ping utility: the stdio and SSE transports now respond to a server-initiated ping
with an empty result (#141).
stdio deadlock: drain the subprocess's stderr so a server that writes heavily to
stderr can no longer block the pipe (#142).
MCP lifecycle: HTTP and Streamable HTTP transports now send notifications/initialized after initialize, as the specification requires (#143).
stdio memory leak: bound the pending-response map so responses to abandoned
requests can no longer accumulate (#144).
Logger: stop overwriting a caller-supplied logger's formatter (#145).
Ruby 3.4+: declare base64 as a runtime dependency to avoid a LoadError (#146).
Retry safety: application-level ServerErrors are no longer retried; only transport
errors and transient HTTP 5xx responses (TransientServerError) are retried, so
non-idempotent requests are not executed twice (#149).
SSE reconnection: repaired the auto-reconnect path that could never fire because the
monitor thread killed itself (#150).
OAuth discovery: authorization-server and protected-resource metadata discovery now
follows RFC 8414 and RFC 9728 (#151).
Examples & Tooling
Added examples/run_all_examples.sh, a pre-release harness that boots each example's
server, runs every example, and reports PASS/FAIL/SKIP, plus an examples/README.md
index. Fixed stale examples (removed the retired Playwright browser_install call,
robust first-tool selection in streamable_http_example.rb, updated the Gemini model)
and wired the Zapier/OAuth examples through a gitignored examples/secrets.env (#153).
Documentation
Fixed the README OAuth snippet require and corrected method names in the changelog (#147).
Dependencies
Bumped faraday to 2.14.3, plus routine development-dependency updates.