MCP 2.0
- Support MCP protocol revision
2026-07-28— the stateless core,server/discovernegotiation, per-request identity, and multi round-trip requests — while continuing to speak every legacy revision from2024-10-07to2025-11-25. - Negotiate each server automatically: probe with
server/discover, fall back to the legacyinitializehandshake, and keep stdio probing in-process instead of spawning a second server. - Add per-server
protocolVersion/protocol_versionoverrides forauto,legacy, and pinned2026-07-28connections, surfaced bymcporter list <server> --verbose. - Bridge both generations at once through
mcporter serve: a single endpoint answers 2026-07-28 and 2025-era clients, preserving primitive tool output schemas and projecting structured results per era. - Support interactive form and URL elicitation in terminals across legacy and 2026-07-28 multi-round-trip servers, with immediate declines and a terminal hint in headless or daemon-managed contexts.
- Attribute elicitation prompts and public handler callbacks to their requesting server, and neutralize terminal control sequences in server-supplied prompt text.
- Migrate the runtime and serve bridges to the MCP TypeScript SDK v2 client and server packages, keeping SDK v1 only as a legacy test fixture.
CLI
- Keep legacy SSE fallback on legacy negotiation and preserve pinned modern-version negotiation errors instead of masking them with a secondary SSE failure.
- Recover legacy stdio servers that exit on modern discovery by retrying initialization once with a fresh legacy-mode process.
- Use the SDK's 60-second stdio discovery timeout for slow-starting modern servers, configurable with
MCPORTER_STDIO_PROBE_TIMEOUT_MS. - Keep listing and calling usable when a server advertises the same tool name twice or two names that map to one proxy method.
- Follow
resources/listcursors automatically so paginated MCP resources are returned in full, and stop when a server repeats its cursor instead of churning duplicate pages. - Raise Node's untouched Happy-Eyeballs connect-attempt timeout from 250 ms to 1500 ms while preserving explicit user overrides, including quoted
NODE_OPTIONSvalues. - Restore bounded stdio process-tree teardown with pre-close PID capture, SIGTERM/SIGKILL escalation, and explicit stream destruction.
- Cancel in-flight connection handshakes during
runtime.close()instead of waiting for the full negotiation timeout. - Close bridge subscription handlers before the HTTP listener so active
subscriptions/listenstreams cannot deadlock shutdown. - Canonicalize decoded bridge server paths so percent-encoded aliases share one handler instead of allocating permanent duplicates.
- Preserve protocol-version pins and supported snake_case config aliases when generating or regenerating standalone CLIs.
- Normalize
--compilebundle targets consistently instead of returning a platform-native path only when an extension was supplied. - Resolve bundled dependency roots for packages whose
package.jsonis hidden behind export maps, avoiding an unnecessary npm fallback.
Daemon
- Treat the daemon socket timeout as an idle liveness budget refreshed by progress frames, so interactive OAuth can outlive 30 seconds without restarting the daemon and opening a duplicate prompt. (PR #241, thanks @umutkeltek)
- Keep daemon protocol v1 and v2 interoperable while returning daemon-owned operation timeouts as non-retryable errors. (PR #241, thanks @umutkeltek)
Record and replay
- Keep replay recordings usable across MCP protocol-version and mcporter client-version changes.
- Preserve transport capabilities and request metadata through recording wrappers so modern HTTP cancellation remains stream-based.
- Replay accepted modern elicitation rounds with the caller's handler instead of unconditionally declining them.
- Re-emit recorded progress, logging, and list-change notifications during replay in their recorded order relative to responses.
OAuth
- Validate RFC 9207 authorization-response issuers before redeeming callback codes, with server-specific mismatch errors, and preserve that validation while OAuth traffic is wrapped in recording mode.
- Bind persisted tokens and client registrations to their authorization-server issuer across interactive and silent refresh flows, discarding mismatches before credentials are transmitted and stamping successful refreshes.
- Add per-server
oauthClientMetadataUrl/oauth_client_metadata_urlconfiguration for Client ID Metadata Documents, with SDK-managed DCR fallback. - Reject invalid Client ID Metadata Document configuration before binding the loopback OAuth callback listener.
- Stop reflecting authorization-server callback errors into executable HTML or terminal-facing error messages.
- Validate imported and persisted OAuth credential shapes so malformed issuer stamps trigger reauthorization instead of runtime crashes.
TypeScript API
- Export connection metadata and the named option/result types reachable through the package-root API.
Testing
- Add committed MCP 2025-11-25 and 2026-07-28 fixture servers with end-to-end CLI and bridge coverage over stdio and Streamable HTTP.
- Add an opt-in live conformance suite covering four protocol revisions against public servers, scheduled weekly rather than gating pull requests.
- Enforce coverage thresholds in CI, publishing the summary and report from the Linux job.
- Stop the test suite writing into the developer's real
~/.mcporterby isolatingHOMEand every XDG root.
Docs
- Rewrite the README around a verified quick start and move protocol and daemon details into focused guides.
Tooling / Dependencies
- Refresh Acorn, Rolldown, Vite, Oxlint, Oxfmt, Node types, and security overrides within the repository's release-age policy.
- Resolve notarization profiles from the dedicated managed release keychain when packaging signed standalone binaries.