todos

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.

Connect

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" } } }

Watch it live

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":{}}}}'

What to try

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.

Boards

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