Releases: cyanheads/mcp-ts-core
Releases · cyanheads/mcp-ts-core
Release list
v0.12.3: measured region, shutdown paths, and bind failures
measured region, shutdown paths, and bind failures
- Telemetry records a post-handler failure — output-schema validation,
format(), the enrichment merge, the trailer render — as a failed call, not a successful one (#346) - Stdin EOF runs the shutdown a signal runs, then exits explicitly, so the OTel export leaves the process (#322)
Logger.close()bounds each pino flush, so a callback that never arrives no longer hangs shutdown (#342)- An async HTTP bind failure reaches the retry ladder instead of crashing after a success log (#315)
api-telemetry1.7 andapi-config1.13 document the new behavior;package.jsondescription synced to the README tagline- deps: Bun base-image and
packageManagerpins1.3.14→1.4.0(#361)
v0.12.2: cache hints and x-mcp-header input designation
cache hints and x-mcp-header input designation
createApp({ cacheHints })and a per-resourcecacheHintsetttlMs/cacheScopeon the 2026-07-28 cacheable results (#359)headerParam(schema, 'Name')mirrors a tool input property onto anMcp-Param-Namerequest header; an illegal placement is rejected at definition time and by the newheader-param-designationlint rule (#360)transport.sessionModeadvertises the resolved mode instead of the configuredauto, and narrows to'stateful' | 'stateless'(#357)- Shipped skills:
add-resource1.5,add-tool2.20,api-config1.12,api-linter1.12 - deps:
openai^7.4.0 → ^7.5.0 (dev)
v0.12.1: SDK v2 migration Phase 2
SDK v2 migration Phase 2
- Tool
inputaccepts az.discriminatedUnion()of object variants — mutually exclusive argument sets advertise asoneOfbranches, each with its ownrequiredlist andconstdiscriminator (#142) ctx.notify*routes per protocol era, andcore.notify/createApp({ eventBus })carry out-of-request emission to 2026-07-28subscriptions/listenstreams (#193)- Stateful HTTP replays a dropped SSE stream on
Last-Event-IDfrom a bounded per-session event store; on by default,MCP_HTTP_RESUMABILITY=falsedisables it (#215) - Handler
ctx.traceId/ctx.spanIdname thetool_execution:*/resource_read:*span the handler runs in, on every transport (#296) - New strict-mode linter rule
schema-root-oneof-portability; seven shipped skills bumped
v0.12.0: MCP SDK v2 and protocol revision 2026-07-28
MCP SDK v2 and protocol revision 2026-07-28
@modelcontextprotocol/server+@modelcontextprotocol/clientreplace@modelcontextprotocol/sdkand@hono/mcp; every HTTP endpoint serves revision 2026-07-28 alongside the negotiated 2025 era (#305)ctx.requestInput(spec)andctx.inputsreplacectx.elicit— one handler serves both eras, withexpectInputRequiredandcreateMockContext({ inputResponses, requestState })for driving the re-entry roundContext extends RequestContextandRequestContextis closed —extrapluswithExtra(ctx, fields)replace the removed index signature (#110)- The experimental tasks surface is gone upstream:
task: true,TaskManager,ctx.progress, thetaskscapability, the./taskssubpath, andTASK_STORE_* - Tool inputs are strict — an undeclared argument key is rejected by name, and
inputSchemaadvertisesadditionalProperties: false(#232) - The advertised
outputSchemadeclares the error envelope, andtool()rejects anerrorfield onoutputorenrichment(#241) resources: { subscribe: true }is advertised and backed, andctx.notifyResourceUpdated(uri)reaches 2026-era clients (#354)ctx.logalso emitsnotifications/message, gated by the client'slogging/setLevel- Advertised JSON Schema is 2020-12, and
prompt()argument requiredness follows the emitted schema (#258) - A handler
ctxno longer leaks through service errors — both the error and log sinks project toRequestContextvia the newtoCanonicalContextbefore serializing - Also fixed: flat
path: messagevalidation text (#66),-32602for an unknown tool,415on a non-JSONContent-Type, a refined output schema registering again,operationandextracarried onto the handler context, aninput_requiredround no longer counted as a failure, and handler notifications reaching every transport - Internal: skills and telemetry docs refreshed for SDK v2, the task-handler duck-type dropped from definition discovery, Biome config schema synced to 2.5.8
- Upgrading: swap the SDK imports, delete task tools, rewrite
ctx.elicitcalls, rename anyerroroutput field — the changelog entry lists the ordered steps - deps:
openaipeer widens to^6.48.0 || ^7.0.0,nanoidpinned inoverrides, and dev-dep bumps clear the transitiveundiciadvisory
v0.11.5: server requests across stateful HTTP sessions
server requests across stateful HTTP sessions
ctx.elicitcompletes over stateful Streamable HTTP: server-initiated requests carry a session-unique wire ID, so a response arriving on a later POST reaches theServerawaiting it- A terminated or stale HTTP session settles its pending server requests with a
ConnectionClosederror .github/community-health files (CONTRIBUTING.md,CODE_OF_CONDUCT.md,SECURITY.md) now scaffold withinitbun run test:packagetypechecks, builds, and tests a scaffold installed offline from the packed tarball- Skills:
api-canvas2.1 (dataframe trio ships together),design-mcp-server2.21 (name-scope honesty),git-wrapup1.10 and the changelog template (authoring length ceiling) - Repo hygiene: linter and mock-context test coverage, blank issues enabled, security contact moved to security@caseyjhand.com
v0.11.4: linter false-negative closures, trailer layout, scaffold gates
linter false-negative closures, trailer layout, scaffold gates
- Linter findings are build-time only — a server carrying a latent gap goes red on its next
lint:mcp/devcheck; nothing already deployed changes behavior - New
schema-unsatisfiableerror rule: an emitted schema node with an empty value set, commonlyz.enum()handed a non-string array (#310) - format-parity now reaches definitions it skipped — multi-value
z.literal([...])walks, the string sentinel survives markdown escaping, enum/literal/boolean leaves must render as a delimited token, and a subtree past depth 8 warns instead of passing (#310 #337 #282 #280) capped-list-no-truncationmatches cap names by shape, somaxRecords-style caps are evaluated for the first time (#278)- Enrichment trailer fields after a notice or a bullet render as their own block rather than folding into it (#308)
outlineOnOverflow's default notice names the largest section that fits the budget, with its size inline;OutlineOptions.noticetakes(sections, budget)(#328)- Scaffold and image:
tsconfigsplits typecheck from emit sotests/is checked,fast-checkjoins the devDependencies, and both Docker installs carry--omit=peer(#316 #317) scripts/tree.tshonors directory-only gitignore patterns, and the fuzz leak heuristic no longer flags the input echoed back in error data (#304)
v0.11.3: Opt-in input ceilings, an exchange-wide fetch deadline, and a mock context on real storage
Opt-in input ceilings, an exchange-wide fetch deadline, and a mock context on real storage
- Input ceilings are opt-in again: parsers unbounded without
maxBytes,sqliteMirrorStoreenforcing only declaredlimits,StorageServicebatch caps dropped (#338) - Parse failures carry the library diagnostic beside the stable
data.reason(#339) fetchWithTimeouttimeoutMsbounds the whole exchange — a 2xx body streams under the deadline through a passthrough wrapper (#341)- Over-budget error bodies are captured head and tail around an elision marker, with an
errorBodyLimitoption (#298) /utilscontext parameters accept the handlerContext(#297)createMockContextstate runs the productionStorageService, and it andcreateMockSessionare generic over a definition's error contract (#329) (#331)normalizeLogLevelAliasremoved from/config;.github/workflows/ci.ymlremoved (#340)
v0.11.2: HTTP protocol session, input hardening, package verification
HTTP protocol session, input hardening, package verification
- Elicitation and cancellation work over Streamable HTTP — client capabilities and in-flight requests are carried on the session rather than the per-request SDK server (#312, #311)
MCP_HTTP_MAX_BODY_BYTESis stream-enforced, so a body with noContent-Lengthis cut off at the cap instead of buffered whole (#244)- SSRF blocking replaces its pattern tables with full non-global IPv4/IPv6 range checks;
::was previously reachable (#314) - Parsers bound their input (1 MiB text, 25 MiB binary) and no longer echo library messages, stacks, or content samples into client-facing error data (#306)
- Storage batches, mirror queries, and DuckDB query bounds are capped; DuckDB exports reject symlinked destinations
- New verification lanes: hermetic published-tarball check, public-export contract, shuffled-order and assertion-required runs, and a GitHub Actions matrix
- Smaller fixes: shutdown and startup rollback,
WWW-Authenticatepublic URL, Worker log-level aliases and error rethrow, in-memory tenant accounting, fuzz leak reporting - deps:
hono^4.12.32→^4.13.1; overrides pinfast-uri^3.1.5and addip-address^10.3.1, clearing three advisories (#325)
v0.11.1: test kit, fuzz generator fixes
test kit, fuzz generator fixes
createMockSession,createFetchMock, andrunToolContractin/testing;toolContractSuiteplussessionandfetchMockfixtures in/testing/vitestzodToArbitraryexpands finite nesting in full instead of replacing nodes past depth six withnull(#319)zodToArbitraryhonors.min(),.max(),.length(), and.nonempty()on Zod 4 arrays (#320)fuzzToolandfuzzResourcetreat a thrownMcpErroras a handled outcome, still leak-checkedinitscaffolds smoke, integration, and fuzz suites with the matching vitest projects and atest:coveragescript- coverage thresholds 94/94/87/94;
api-testingandsecurity-passskills at 1.6; package description synced with the README - deps:
@modelcontextprotocol/sdk^1.29.0 → ^1.30.0 (plus hono, jose, and dev-dep bumps)
v0.11.0: typescript 7, raised peer floors
typescript 7, raised peer floors
- Breaking: optional
peerDependenciesfloors move to the versions this release resolves — a consuming server that installs an affected peer must raise its own range - TypeScript 7 drives
typecheck,typecheck:scripts, and the build;templates/package.jsonscaffolds new servers on it scripts/audit-open-index-signatures.tsholds the TypeScript 6 parser through atypescript-v6alias — TypeScript 7 dropped the programmatic compiler APIcheck-dependency-specifiersscansoverridesunder the strict rule, so a pin cannot silently re-resolvedocs:generateis non-functional until typedoc supports TypeScript 7- new
overridesblock pins six transitives;biome.json$schemafollows the CLI to 2.5.5 - deps:
typescript^6.0.3 → ^7.0.2,better-sqlite3^12.11.1 → ^13.0.1,execa^9.6.1 → ^10.0.0,@opentelemetry/*^0.220.0 → ^0.221.0 (full arrows in the changelog)