A live deployment of the MCP TypeScript SDK's reference server, examples/todos-server — a small todo board where every server-side MCP feature has a real job: tools, resources, prompts, sampling, elicitation, progress, logging, and subscriptions.
The MCP endpoint is https://todos-demo-ts.fweinberger-test.workers.dev/mcp (Streamable HTTP). It serves both protocol revisions at once —
2026-07-28 and 2025-11-25 are negotiated per connection, so both current hosts and 2.0 SDK clients connect to the same URL. In
an mcpServers-style host config:
{ "mcpServers": { "todos": { "url": "https://todos-demo-ts.fweinberger-test.workers.dev/mcp" } } }
Boards on /mcp are anonymous: keyed by your network address, or by an X-Todos-Board header you choose.
For a private board, connect to https://todos-demo-ts.fweinberger-test.workers.dev/oauth/mcp instead — your client discovers the OAuth
endpoints automatically (RFC 9728), registers itself (dynamic registration or a URL-format client id), and walks the
authorization-code flow with PKCE. Approving consent creates a fresh board bound to that grant: the token is the board. No
accounts; boards still expire after ~2 hours idle.
{ "mcpServers": { "todos": { "url": "https://todos-demo-ts.fweinberger-test.workers.dev/oauth/mcp" } } }
https://todos-demo-ts.fweinberger-test.workers.dev/board is a read-only live view: tasks appear and complete in real time as connected agents work. Anonymous
boards: open https://todos-demo-ts.fweinberger-test.workers.dev/board?b=<name> and connect your client with X-Todos-Board: <name>.
OAuth boards: after approving consent, open https://todos-demo-ts.fweinberger-test.workers.dev/board in the same browser — it shows your grant's board (no
token or board id in any URL).
Or raw, in the 2026-07-28 wire format (there is no initialize — try server/discover):
curl -X POST https://todos-demo-ts.fweinberger-test.workers.dev/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-H 'mcp-protocol-version: 2026-07-28' \
-H 'mcp-method: server/discover' \
-d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
"io.modelcontextprotocol/clientInfo":{"name":"my-client","version":"1.0"},
"io.modelcontextprotocol/clientCapabilities":{}}}}'
add_task, list_tasks, complete_task — plain CRUD; add_task returns
structuredContent against an output schema.
brainstorm_tasks — multi-round input_required: a form, an optional follow-up round, then a
sampling round that borrows your model.
clear_done — elicitation: the server asks you to confirm via a schema-driven form.work_through_tasks — paced progress notifications; cancel mid-run and watch it stop early.todos://board — a subscribable resource; every mutation announces itself.plan-my-day — a prompt with completable arguments.
All of it works on both revisions: 2026-07-28 clients run the interactive tools as stateless
input_required round trips, while 2025-era clients get a real session at initialize
(Mcp-Session-Id) with push-style elicitation/sampling over its streams. Sessions are in-memory — if the server
recycles, a conformant client just re-initializes; your board is durable either way. Session-less 2025-era requests are still
answered statelessly — one-shot calls work, but the interactive tools need the session, so a client that connected before
sessions existed here should simply reconnect.
Every visitor gets their own board, keyed by connecting address — or send an
X-Todos-Board: any-name header to use a board of your own naming (recommended if your network egress rotates IPs,
e.g. CGNAT — otherwise consecutive requests may land on different boards). Boards are capped at 200 tasks and expire about two
hours after the last change. Treat board content as untrusted: it was written by whoever shares your visitor
key. Don't give an agent connected here unattended write authority elsewhere, and don't store anything sensitive.
No availability promises — this exists so you can kick the tires of a real 2026-07-28 server without running one. Source: typescript-sdk · SDK docs · MCP spec