Skip to content

Releases: cyanheads/mcp-ts-core

v0.12.3: measured region, shutdown paths, and bind failures

Choose a tag to compare

@cyanheads cyanheads released this 21 Aug 07:52
v0.12.3
8b14ca6

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-telemetry 1.7 and api-config 1.13 document the new behavior; package.json description synced to the README tagline
  • deps: Bun base-image and packageManager pins 1.3.141.4.0 (#361)

CHANGELOG v0.12.3

v0.12.2: cache hints and x-mcp-header input designation

Choose a tag to compare

@cyanheads cyanheads released this 20 Aug 20:25
v0.12.2
68d396e

cache hints and x-mcp-header input designation

  • createApp({ cacheHints }) and a per-resource cacheHint set ttlMs / cacheScope on the 2026-07-28 cacheable results (#359)
  • headerParam(schema, 'Name') mirrors a tool input property onto an Mcp-Param-Name request header; an illegal placement is rejected at definition time and by the new header-param-designation lint rule (#360)
  • transport.sessionMode advertises the resolved mode instead of the configured auto, and narrows to 'stateful' | 'stateless' (#357)
  • Shipped skills: add-resource 1.5, add-tool 2.20, api-config 1.12, api-linter 1.12
  • deps: openai ^7.4.0 → ^7.5.0 (dev)

CHANGELOG v0.12.2

v0.12.1: SDK v2 migration Phase 2

Choose a tag to compare

@cyanheads cyanheads released this 20 Aug 18:07
v0.12.1
d6b8f89

SDK v2 migration Phase 2

  • Tool input accepts a z.discriminatedUnion() of object variants — mutually exclusive argument sets advertise as oneOf branches, each with its own required list and const discriminator (#142)
  • ctx.notify* routes per protocol era, and core.notify / createApp({ eventBus }) carry out-of-request emission to 2026-07-28 subscriptions/listen streams (#193)
  • Stateful HTTP replays a dropped SSE stream on Last-Event-ID from a bounded per-session event store; on by default, MCP_HTTP_RESUMABILITY=false disables it (#215)
  • Handler ctx.traceId / ctx.spanId name the tool_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

CHANGELOG v0.12.1

v0.12.0: MCP SDK v2 and protocol revision 2026-07-28

Choose a tag to compare

@cyanheads cyanheads released this 20 Aug 10:24
v0.12.0
378ddf4

MCP SDK v2 and protocol revision 2026-07-28

  • @modelcontextprotocol/server + @modelcontextprotocol/client replace @modelcontextprotocol/sdk and @hono/mcp; every HTTP endpoint serves revision 2026-07-28 alongside the negotiated 2025 era (#305)
  • ctx.requestInput(spec) and ctx.inputs replace ctx.elicit — one handler serves both eras, with expectInputRequired and createMockContext({ inputResponses, requestState }) for driving the re-entry round
  • Context extends RequestContext and RequestContext is closed — extra plus withExtra(ctx, fields) replace the removed index signature (#110)
  • The experimental tasks surface is gone upstream: task: true, TaskManager, ctx.progress, the tasks capability, the ./tasks subpath, and TASK_STORE_*
  • Tool inputs are strict — an undeclared argument key is rejected by name, and inputSchema advertises additionalProperties: false (#232)
  • The advertised outputSchema declares the error envelope, and tool() rejects an error field on output or enrichment (#241)
  • resources: { subscribe: true } is advertised and backed, and ctx.notifyResourceUpdated(uri) reaches 2026-era clients (#354)
  • ctx.log also emits notifications/message, gated by the client's logging/setLevel
  • Advertised JSON Schema is 2020-12, and prompt() argument requiredness follows the emitted schema (#258)
  • A handler ctx no longer leaks through service errors — both the error and log sinks project to RequestContext via the new toCanonicalContext before serializing
  • Also fixed: flat path: message validation text (#66), -32602 for an unknown tool, 415 on a non-JSON Content-Type, a refined output schema registering again, operation and extra carried onto the handler context, an input_required round 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.elicit calls, rename any error output field — the changelog entry lists the ordered steps
  • deps: openai peer widens to ^6.48.0 || ^7.0.0, nanoid pinned in overrides, and dev-dep bumps clear the transitive undici advisory

CHANGELOG v0.12.0

v0.11.5: server requests across stateful HTTP sessions

Choose a tag to compare

@cyanheads cyanheads released this 13 Aug 02:15
v0.11.5
b51ea25

server requests across stateful HTTP sessions

  • ctx.elicit completes over stateful Streamable HTTP: server-initiated requests carry a session-unique wire ID, so a response arriving on a later POST reaches the Server awaiting it
  • A terminated or stale HTTP session settles its pending server requests with a ConnectionClosed error
  • .github/ community-health files (CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md) now scaffold with init
  • bun run test:package typechecks, builds, and tests a scaffold installed offline from the packed tarball
  • Skills: api-canvas 2.1 (dataframe trio ships together), design-mcp-server 2.21 (name-scope honesty), git-wrapup 1.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

CHANGELOG v0.11.5

v0.11.4: linter false-negative closures, trailer layout, scaffold gates

Choose a tag to compare

@cyanheads cyanheads released this 10 Aug 11:42
v0.11.4
cff088d

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-unsatisfiable error rule: an emitted schema node with an empty value set, commonly z.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-truncation matches cap names by shape, so maxRecords-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.notice takes (sections, budget) (#328)
  • Scaffold and image: tsconfig splits typecheck from emit so tests/ is checked, fast-check joins the devDependencies, and both Docker installs carry --omit=peer (#316 #317)
  • scripts/tree.ts honors directory-only gitignore patterns, and the fuzz leak heuristic no longer flags the input echoed back in error data (#304)

CHANGELOG v0.11.4

v0.11.3: Opt-in input ceilings, an exchange-wide fetch deadline, and a mock context on real storage

Choose a tag to compare

@cyanheads cyanheads released this 10 Aug 09:55
v0.11.3
139ec52

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, sqliteMirrorStore enforcing only declared limits, StorageService batch caps dropped (#338)
  • Parse failures carry the library diagnostic beside the stable data.reason (#339)
  • fetchWithTimeout timeoutMs bounds 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 errorBodyLimit option (#298)
  • /utils context parameters accept the handler Context (#297)
  • createMockContext state runs the production StorageService, and it and createMockSession are generic over a definition's error contract (#329) (#331)
  • normalizeLogLevelAlias removed from /config; .github/workflows/ci.yml removed (#340)

CHANGELOG v0.11.3

v0.11.2: HTTP protocol session, input hardening, package verification

Choose a tag to compare

@cyanheads cyanheads released this 10 Aug 07:03
v0.11.2
2d5fc58

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_BYTES is stream-enforced, so a body with no Content-Length is 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-Authenticate public URL, Worker log-level aliases and error rethrow, in-memory tenant accounting, fuzz leak reporting
  • deps: hono ^4.12.32^4.13.1; overrides pin fast-uri ^3.1.5 and add ip-address ^10.3.1, clearing three advisories (#325)

CHANGELOG v0.11.2

v0.11.1: test kit, fuzz generator fixes

Choose a tag to compare

@cyanheads cyanheads released this 02 Aug 18:07
v0.11.1
777ee5b

test kit, fuzz generator fixes

  • createMockSession, createFetchMock, and runToolContract in /testing; toolContractSuite plus session and fetchMock fixtures in /testing/vitest
  • zodToArbitrary expands finite nesting in full instead of replacing nodes past depth six with null (#319)
  • zodToArbitrary honors .min(), .max(), .length(), and .nonempty() on Zod 4 arrays (#320)
  • fuzzTool and fuzzResource treat a thrown McpError as a handled outcome, still leak-checked
  • init scaffolds smoke, integration, and fuzz suites with the matching vitest projects and a test:coverage script
  • coverage thresholds 94/94/87/94; api-testing and security-pass skills 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)

CHANGELOG v0.11.1

v0.11.0: typescript 7, raised peer floors

Choose a tag to compare

@cyanheads cyanheads released this 26 Jul 11:05
v0.11.0
3a1305b

typescript 7, raised peer floors

  • Breaking: optional peerDependencies floors 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.json scaffolds new servers on it
  • scripts/audit-open-index-signatures.ts holds the TypeScript 6 parser through a typescript-v6 alias — TypeScript 7 dropped the programmatic compiler API
  • check-dependency-specifiers scans overrides under the strict rule, so a pin cannot silently re-resolve
  • docs:generate is non-functional until typedoc supports TypeScript 7
  • new overrides block pins six transitives; biome.json $schema follows 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)

CHANGELOG v0.11.0