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
- oauth/server.ts: in-repo authorization-code AS (setupAuthServer) + RS
(createMcpHandler behind requireBearerAuth(demoTokenVerifier)) so
simpleOAuthClient.ts has an in-repo target (M2). README run-manually section.
- legacy-routing/: CORS exposedHeaders recipe (M8), explicit GET/DELETE routes
for the sessionful arm (M9), README section on direct
WebStandardStreamableHTTPServerTransport construction (M6).
- repl/server.ts: re-hosted on sessionful NodeStreamableHTTPServerTransport
with an InMemoryEventStore so the REPL client's reconnect/resumability
commands work (M7).
- elicitation/: plan_trip tool chains two form elicitations inside one tool
call on both eras (M4).
- oauth-client-credentials/README: PrivateKeyJwtProvider section pointing at
the client guide snippet (M3).
- examples/README: fix #backwards-compatibility -> #sse-fallback-for-legacy-servers
(docs:check broken anchor); update oauth/ row.
- CONTRIBUTING + root package.json: drop stale examples-server / oauth/
simpleStreamableHttpServer.ts references.
- stickynotes/client.ts: header says 2025-era (matches era pin).
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+8-5Lines changed: 8 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -112,16 +112,19 @@ Then:
112
112
113
113
### Running Examples
114
114
115
-
See [`examples/server/README.md`](examples/server/README.md)and [`examples/client/README.md`](examples/client/README.md)for a full list of runnable examples.
115
+
See [`examples/README.md`](examples/README.md) for the full list of runnable examples — one self-verifying client/server pair per directory.
|[`oauth/`](./oauth/README.md)| Interactive authorization-code OAuth flow (`simpleOAuthClient.ts`, `dualModeAuth.ts`, `simpleTokenProvider.ts`)| Opens a real browser and runs a callback server on `:8090`. The headless machine-to-machine grant is covered by [`oauth-client-credentials/`](./oauth-client-credentials/README.md). |
62
-
|[`repl/`](./repl/README.md)| Fully-featured HTTP playground server + readline client | Interactive — `client.ts` reads from stdin. Run manually in two terminals. |
63
-
|[`sse-polling/`](./sse-polling/README.md), [`standalone-get/`](./standalone-get/README.md)| Legacy sessionful-2025 SSE stories (SEP-1699 reconnect/replay; standalone GET stream) | Kept for reference; long-running reconnect/timer flows that need a longer per-leg readiness wait than the harness default. Self-verifying — flip the `excluded` flag once the harness has bounded-wait knobs. |
64
-
|[`guides/`](./guides/README.md)| Snippet collections synced into `docs/server.md` and `docs/client.md`| Typecheck-only; not a runnable pair. |
|[`oauth/`](./oauth/README.md)| Interactive authorization-code OAuth flow: in-repo protected `server.ts` (demo AS + RS) + browser `simpleOAuthClient.ts`| Opens a real browser and runs a callback server on `:8090`. The headless machine-to-machine grant is covered by [`oauth-client-credentials/`](./oauth-client-credentials/README.md). |
62
+
|[`repl/`](./repl/README.md)| Fully-featured HTTP playground server + readline client | Interactive — `client.ts` reads from stdin. Run manually in two terminals. |
63
+
|[`sse-polling/`](./sse-polling/README.md), [`standalone-get/`](./standalone-get/README.md)| Legacy sessionful-2025 SSE stories (SEP-1699 reconnect/replay; standalone GET stream) | Kept for reference; long-running reconnect/timer flows that need a longer per-leg readiness wait than the harness default. Self-verifying — flip the `excluded` flag once the harness has bounded-wait knobs. |
64
+
|[`guides/`](./guides/README.md)| Snippet collections synced into `docs/server.md` and `docs/client.md`| Typecheck-only; not a runnable pair. |
A client that needs to fall back from Streamable HTTP to the legacy HTTP+SSE transport (for servers that only implement the older transport) follows the [`connect_sseFallback`](../docs/client.md#backwards-compatibility) recipe in the client guide — try
168
+
A client that needs to fall back from Streamable HTTP to the legacy HTTP+SSE transport (for servers that only implement the older transport) follows the [`connect_sseFallback`](../docs/client.md#sse-fallback-for-legacy-servers) recipe in the client guide — try
169
169
`StreamableHTTPClientTransport` first, fall back to `SSEClientTransport` on a 4xx. There is no runnable pair for this in `examples/` (the legacy SSE server transport is deprecated); the snippet in `guides/clientGuide.examples.ts` is the complete pattern.
Copy file name to clipboardExpand all lines: examples/elicitation/README.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,8 @@ Server requests user input. One factory, both protocol eras: elicitation works o
8
8
|**url** (`link_account`) |`await ctx.mcpReq.elicitInput({ mode: 'url', url, elicitationId })` + `createElicitationCompletionNotifier(elicitationId)` for the out-of-band `notifications/elicitation/complete`|`return inputRequired({ inputRequests: { auth: inputRequired.elicitUrl(...) } })` — no `elicitationId` / complete notification on this era |
9
9
|**url, throw** (`confirm_payment`) |`throw new UrlElicitationRequiredError([...])` — the wire `-32042`; the client catches the typed error and reads `.elicitations`| n/a — a throw on this era fails loudly with a steer to `inputRequired.elicitUrl(...)`|
10
10
11
-
The form schema includes an `enumNames` field (display labels for the `plan` enum). For the secure `requestState` round-trip pattern see [`../mrtr/`](../mrtr/README.md).
11
+
`plan_trip` chains **two** form elicitations inside one tool call (destination → dates for that destination): two sequential `ctx.mcpReq.elicitInput` pushes on 2025, two `inputRequired` rounds with `requestState` carry-over on 2026. The `register_user` form schema includes an
12
+
`enumNames` field (display labels for the `plan` enum). For the secure `requestState` round-trip pattern see [`../mrtr/`](../mrtr/README.md).
12
13
13
14
**stdio-only** in the harness: push server→client requests need either a stdio connection or a sessionful HTTP transport (see `../legacy-routing/`); the harness's `--http` arm is the stateless per-request `createMcpHandler`.
Copy file name to clipboardExpand all lines: examples/legacy-routing/README.md
+21Lines changed: 21 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,4 +2,25 @@
2
2
3
3
`isLegacyRequest` routing: keep an **existing** sessionful 1.x Streamable HTTP deployment serving 2025-era clients, add a strict `createMcpHandler({ legacy: 'reject' })` for 2026-07-28 traffic, on the **same port**. The predicate decides per request which arm handles it.
4
4
5
+
`server.ts` also shows the browser-client CORS `exposedHeaders` recipe and explicit `GET` (standalone SSE stream) / `DELETE` (session termination per the MCP spec) routes for the sessionful arm.
6
+
5
7
**HTTP-only** by definition; see also `dual-era/` for the simple case where you don't have a sessionful deployment to keep.
8
+
9
+
## Direct transport construction (without `createMcpHandler`)
10
+
11
+
If you need full control over the per-request transport on a web-standards runtime (Hono, Cloudflare Workers, …) instead of `createMcpHandler`, construct `WebStandardStreamableHTTPServerTransport` directly:
0 commit comments