Commit graph typescript-sdk/src/server
Author SHA1 Message Date
Paul Carleton
a05be176ca
Merge commit from fork
* fix: add transport isolation guards to prevent cross-client data leaks

When a single McpServer or stateless transport is reused across multiple
client connections, responses can be routed to the wrong client due to
message ID collisions. This is a data leak vulnerability (CWE-362).

Two guards added:
- Protocol.connect() throws if already connected to a transport
- Stateless transport.handleRequest() throws if called more than once

Also fixes three examples that shared a single McpServer across sessions:
- standaloneSseWithGetStreamableHttp.ts
- ssePollingExample.ts
- elicitationFormExample.ts

Related: #820, #204, #243

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix: correct misleading test name and add per-request cleanup

- Rename 'should reject second SSE stream even in stateless mode' to
  'should allow multiple SSE streams in stateless mode with per-request
  transports' since the test now asserts both streams succeed (status 200)
- Add mcpServer.close() after per-request handling in
  stateManagementStreamableHttp.test.ts to prevent resource leaks,
  matching the pattern used in streamableHttp.test.ts
- Remove unused mcpServers array that collected but never cleaned up
  per-request server instances

* thread abort through sendRequest and notification to prevent crosstalk

* test: remove dummy objects from stateless setupServer return

In stateless mode, setupServer() was creating unused McpServer and
StreamableHTTPServerTransport instances solely to satisfy the return
type. Make mcpServer/serverTransport optional in the return type and
simplify the stateless beforeEach/afterEach to only track server and
baseUrl.

* fix: use McpError for sendRequest abort guard and fix Hono example reuse

- sendRequest abort guard now throws McpError(ErrorCode.ConnectionClosed)
  instead of plain Error for consistency with the rest of the codebase
- Hono example updated to create fresh transport and server per request,
  fixing breakage from the stateless transport reuse guard

* fix: use separate resolvers per protocol in transport isolation test

Address review feedback: each protocol handler now has its own resolver
returning distinct data (responseForA vs responseForB), so the test
properly demonstrates that responses route to the correct transport.
Uses explicit 'handler entered' promises for deterministic synchronization.

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 18:23:03 +00:00
Matt
6e8f7e1a43
fix: prevent Hono from overriding global Response object (v1.x) (#1411) 2026-01-20 11:17:15 +00:00
Matt
67ba7adbb7
feat: fetch transport (#1209)
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-12-15 17:28:10 +00:00
Felix Weinberger
9941294df9
Fix Zod v4 schema description extraction (#1296) 2025-12-15 17:46:11 +02:00
Konstantin Konstantinov
a606fb1790
SPEC COMPLIANCE: Remove loose/passthrough types not allowed/defined by MCP spec + Task types (#1242) 2025-12-09 11:52:23 +00:00
Matt
fbf5fc9b02
Protocol date validation (#1247) 2025-12-08 17:46:34 +00:00
Konstantin Konstantinov
5a9de1c638
Relocate tests under /test (#1220) 2025-12-05 23:56:12 +00:00
V
316906aeb8
fix: Support updating output schema (#1048)
Co-authored-by: Konstantin Konstantinov <konstantin@mach5technology.com>
2025-12-05 11:20:29 +02:00
Cliff Hall
a57303c335
No automatic completion support unless needed - Revisited yet again (#1237) 2025-12-05 06:12:16 +02:00
Felix Weinberger
2f76ac8856
fix: skip priming events and closeSSEStream for old protocol versions (#1233) 2025-12-04 15:19:14 +02:00
Wuma
7c9257cdf5
refactor: make Server class framework-agnostic by moving express to separate module (#1223) 2025-12-03 11:58:42 +00:00
Vincent Horvath
4b5c25d592
feat: add optional resource annotations (#954)
Co-authored-by: Konstantin Konstantinov <konstantin@mach5technology.com>
2025-12-03 07:22:20 +02:00
Paul Carleton
09623e2aa5
Merge commit from fork
* Add secure default for DNS rebinding, use in examples

* Update README examples to use createMcpExpressApp, bump to 1.23.0

- Update all server examples to use createMcpExpressApp() for secure defaults
- Rewrite DNS Rebinding Protection section to document new middleware approach
- Bump version from 1.23.0-beta.0 to 1.23.0

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Add IPv6 support, allowedHosts option, and warning for unprotected servers

- Use native URL API to parse Host headers (handles IPv6 correctly)
- Add [::1] (IPv6 localhost) to localhostHostValidation
- Add ::1 to list of localhost hosts that get automatic protection
- Add allowedHosts option to createMcpExpressApp for custom host validation
- Warn when binding to 0.0.0.0 or :: without allowedHosts configured
- Add tests for IPv6 and allowedHosts functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Update remaining examples to use createMcpExpressApp and add DNS rebinding docs

- Update simpleTaskInteractive.ts, ssePollingExample.ts, and elicitationUrlExample.ts
  to use createMcpExpressApp() instead of express() + express.json()
- Add DNS rebinding protection section to docs/server.md explaining how to use
  createMcpExpressApp() and hostHeaderValidation middleware

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-12-02 13:23:06 +00:00
Felix Weinberger
cf51343cc1
feat: backwards-compatible createMessage overloads for SEP-1577 (#1212) 2025-12-02 13:18:22 +00:00
Matt
82041262dc
fix: allow zod 4 transformations (#1213) 2025-12-02 12:56:38 +00:00
Jacopo Cappellato
608360047d
Modify Origin header validation in validateRequestHeaders (streamableHttp.ts and sse.ts) to allow requests without an Origin, as they are not relevant to server DNS rebinding protection. (#1205) 2025-12-02 09:56:09 +00:00
Felix Weinberger
4b651b8fe1
feat: add closeStandaloneSSEStream for GET stream polling (#1203) 2025-12-01 17:01:20 +00:00
Felix Weinberger
fab7e1e9b3
feat: add closeSSEStream callback to RequestHandlerExtra (#1166) 2025-12-01 16:18:29 +00:00
Koichi ITO
6c863c8e75
[Docs] Fix typo (#1067)
Co-authored-by: Matt <77928207+mattzcarey@users.noreply.github.com>
2025-12-01 16:05:48 +00:00
Matt
ace9b62d3c
fix hanging stdio servers (#1200)
Co-authored-by: Johnny Santos <johnnyadsantos@gmail.com>
Co-authored-by: TomasRup <tomasr@wix.com>
2025-12-01 14:56:48 +00:00
Filip Bartuska
5aaf6ee67e
Fix optional argument handling in prompts for Zod V4 (#1199)
Co-authored-by: Matt <77928207+mattzcarey@users.noreply.github.com>
2025-12-01 12:10:52 +00:00
Konstantin Konstantinov
4fb4d4d55e
SEP-1046: Client credentials flow for M2M without user interaction (#1157)
Co-authored-by: Paul Carleton <paulc@anthropic.com>
2025-11-28 17:01:15 +00:00
Matt
b37f08ae3a
fix: update registerTool signature for proper typed ToolCallback (#1188)
Co-authored-by: Gavin <gching@users.noreply.github.com>
Co-authored-by: Konstantin Konstantinov <KKonstantinov@users.noreply.github.com>
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-11-28 16:14:26 +00:00
Jerome
5e0302fa77
Allow HTTP issuer URLs when MCP_DEV_MODE is enabled (#1189)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-28 15:53:03 +00:00
Eduardo Gomes
5e97e1a479
Add invalid_target oauth error (rfc 8707) (#1183)
Co-authored-by: Eduardo Gomes <egomes@cloudflare.com>
Co-authored-by: Matt <77928207+mattzcarey@users.noreply.github.com>
2025-11-28 11:59:59 +00:00
Matt
cca6ba05b5
feat: eslint rule to prefer node protocols (#1187) 2025-11-28 11:37:25 +00:00
Luca Chang
b9538a222a
SEP-1686: Tasks (#1041)
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
Co-authored-by: Felix Weinberger <fweinberger@anthropic.com>
2025-11-27 20:11:25 +00:00
Eduardo Gomes
466483f25d
Make sure to consume HTTP error response bodies (#1173)
Co-authored-by: Eduardo Gomes <egomes@cloudflare.com>
Co-authored-by: Felix Weinberger <fweinberger@anthropic.com>
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-11-26 15:52:56 +00:00
Felix Weinberger
3c50d07e9f
feat: implement SEP-1699 SSE polling via server-side disconnect (#1129) 2025-11-25 17:19:40 +00:00
Felix Weinberger
b59a2bde7d
fix: React to upstream RC schema changes for form mode elicitation requests (#1164)
Co-authored-by: Nate Barbettini <nate@arcade.dev>
2025-11-25 11:21:07 +00:00
Olivier Chafik
2a55dfd5f2
sampling: validate tools, tool_use, tool_result constraints (#1156) 2025-11-22 23:56:59 -05:00
Nate Barbettini
9df0972774
chore: Add deprecated marker to old elicitInput overload (#1142) 2025-11-20 18:26:22 +00:00
Konstantin Konstantinov
43189335a3
Follow up: unify v3 and v4 zod types via describe matrix and a test helper (#1141) 2025-11-20 10:10:15 +00:00
Devin Clark
418b7f9b85
feat: zod v4 with backwards compatibility for v3.25+ (#1040) 2025-11-19 20:24:53 +00:00
Paul Carleton
2e67eb552e
[auth] Adjust scope management to line up with SEP-835 (#1133)
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-11-18 17:30:50 +00:00
Michael
7e44b10401
add none to test and the router. (#1116) 2025-11-18 15:34:31 +00:00
Nate Barbettini
4debc740a5
SEP-1036: URL Elicitation (#1105) 2025-11-18 10:53:15 +00:00
Matt
98df118a4c
Migrate to vitest from jest (#1074)
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
Co-authored-by: Felix Weinberger <fweinberger@anthropic.com>
2025-11-14 14:08:00 +00:00
Kent C. Dodds
29cb08071a
Implementation of SEP-986: Specify Format for Tool Names (#900)
Co-authored-by: Felix Weinberger <fweinberger@anthropic.com>
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-11-11 18:45:31 +00:00
Konstantin Konstantinov
9f06b6b499
SEP-1330: Compatibility with SEP-1034 (#1100)
Co-authored-by: cliffhall <cliff@futurescale.com>
2025-11-11 17:03:28 +00:00
Konstantin Konstantinov
ce420f8f94
DRAFT: SEP-1034: Default values for Elicitation Schemas (#1096) 2025-11-11 14:11:42 +00:00
Konstantin Konstantinov
f59996ae66
SEP-1319: Decouple Request Payloads, Remove passthrough iteration, Typecheck fixes (#1086) 2025-11-07 16:50:20 +00:00
Kenneth Sinder
806d7cf9c0
registerTool: accept ZodType<object> for input and output schema (#816) 2025-11-07 16:22:58 +00:00
Matt
11f04e1b0b
Check script which typechecks using Typescripts new Go port (#1075) 2025-11-06 18:23:37 +00:00
Chip
ee9fed28cc
fix: Support WWW-Authenticate scope param for SEP-835 (#983)
Co-authored-by: OtotheA <oscar@otothea.com>
2025-11-03 15:24:42 +00:00
adam jones
216604720b
Add @deprecated annotations to legacy APIs (#1018)
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-03 15:21:18 +00:00
Konstantin Konstantinov
7387c44bf5
Fix: Non-existent tool, disabled tool and inputSchema validation return MCP protocol level instead of CallToolResult with isError: true (#1044) 2025-10-28 15:00:04 +00:00
Paul Carleton
e74a358728
Update metadata.ts (#1010)
Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
2025-10-27 17:40:23 +00:00
Matt
5a8fb39430
feat: pluggable JSON schema validator providers (#1012) 2025-10-25 11:56:42 -04:00
Pierre-Élie Fauché
c543095985
fix: Zod to JSONSchema pipe strategies (#962) 2025-10-18 08:12:42 +01:00