klaridian() changelog
Release notes, newest first. Also on GitHub Releases.
Fixed
- The npm package failed to start (
Cannot find module '.../dist/package.json') fornpx klaridianandnpm install -g klaridian, in every release since 0.2.0. The file--versionreads was left out of the published package. The PyPI, Homebrew, and direct-download binaries weren't affected. Every build now installs the packed npm package into an empty directory and runs it, and a release can't publish to npm unless that check passes.
Added
- An Agent Skill for the klaridian CLI, so coding agents such as Claude Code, Codex, or Cursor curate tools, read
--jsonresults, and run the generated server correctly. Install it withnpx skills add klaridian/klaridian. --architecture code-modenow works with--language python. The model still writes TypeScript, run by the same Deno sandbox as the TypeScript target. Deno is installed bypip(the officialdenopackage), so a Python project needs no separate install step:pip install -r requirements.txt, thenpython sandbox_runner.py --installonce.- Observability plugins now see inside code mode's
execute_code.--plugin oteladds one child span per API call the script made (GET /pet/{petId}, with operation, host, port, and status).posthog,amplitude, andmixpaneladdapi_call_countandapi_operationsto the event. Arguments and bodies are never recorded. TypeScript and Python targets at parity. - Code-mode scripts are now limited to 30 seconds and a 256 MB heap by default (
KLARIDIAN_SANDBOX_TIMEOUT,KLARIDIAN_SANDBOX_MAX_HEAP_MB), so one script can't hang or exhaust the server. klaridian generatenow warns when a server would have more than 128 tools, the limit VS Code (GitHub Copilot) and OpenAI-backed agents enforce, and points at curation and code mode. The warning is also in--jsonoutput. See Large APIs.- The order of tools in
tools/listis now documented and covered by tests: paths in spec order, then GET, PUT, POST, DELETE, OPTIONS, HEAD, PATCH, TRACE. It was already stable; a future engine change can no longer reshuffle it unnoticed. See Tool order.
Changed
- Generated Python servers now pin the official
mcpSDK to 2.3.0 (was 2.1.1). Regenerate to pick it up. Python 3.14 is supported.
Fixed
- The macOS wheels on PyPI claimed to support macOS 11 (Apple Silicon) and 10.12 (Intel), but the binary inside needs macOS 13 or later, so on older systems
pip installsucceeded andklaridianthen failed to start. The wheels are now tagged for macOS 13, the Homebrew formula requires macOS 13 (Ventura), and the installation guide lists each platform's minimum. - Code mode's
execute_codealways claimed it was not destructive, even when the API had DELETE or PUT operations. Its annotations are now derived from the operations it exposes: destructive if any operation is, read-only only when all are. - A TypeScript server built with
--plugin otelcrashed at startup when run asnpm start(the esbuild bundle). The bundle now providesrequireto the CommonJS OpenTelemetry packages. The TypeScript OTel plugin also logged a "duplicate registration" error on every start, and the Python one could lose a tool's span when the server exited right after the call. Both are fixed. klaridian deploy --target docker(andfly) produced a broken image for a code-mode server: the image had no Deno and no compiled client, so the firstexecute_codecall failed. Code-mode images now include both.- The code-mode sandbox could still load modules from Deno's default import hosts (such as
esm.shandjsr.io), which--allow-netdoes not cover, so model code could send data to those hosts in an import URL. Remote imports are now disabled.
Added
--server-version <semver>: sets the generated server's version. By default it's now derived from the spec'sinfo.versionwhen that's valid SemVer, falling back to1.0.0, instead of always1.0.0. The version is identical inpackage.json/pyproject.toml,server.json, and the version the running server reports. A non-SemVer value stops generation with an error, because the MCP Registry mis-ranks versions it can't parse.- Binary and download responses (files, images, audio, PDF documents) are returned MCP-native instead of being decoded into text. A pre-signed redirect becomes a
resource_link(your API credentials are never sent to the storage host). Small images and audio come back inline. Anything else becomes a link to the upstream URL. TypeScript and Python targets at parity. - The Python target now emits a registry-ready
server.json(PyPI package,uvxruntime hint) and the PyPI ownership proof (mcp-name:in the generated README), so a Python server can be published to the MCP Registry like a TypeScript one. - Every generated code file now starts with a DO-NOT-EDIT header, including the TypeScript entry point, server factory, and Cloudflare Worker.
scripts/verify-no-phone-home.sh: runsklaridian generatefrom a local spec with no network access and checks that a server is still produced. You can run it yourself. CI runs it on every build.
Changed
- Generated servers now require Node.js 22+ or Python 3.11+ (were Node 20+ and Python 3.10+). Node 20 is past end of life and Python 3.10 reaches it on 2026-10-31. klaridian's CI now runs the full end-to-end suite on both the oldest and newest supported line of each runtime.
klaridian deployimages move tonode:24-slimandpython:3.13-slim, and generated TypeScript projects use esbuild 0.28. - The generated
package.jsonis markedprivateandserver.jsonomitspackages[]unless you pass--registry-name. The two files no longer disagree about whether the server is publishable. - The npm and PyPI package pages now describe both generation targets (TypeScript and Python), and the PyPI page shows the full project README, derived from the root README like the npm one, instead of a short stub. PyPI metadata gains OS classifiers, an SPDX license expression, and Documentation/Changelog/Issues links.
Added
- The generated server now serves the modern MCP protocol revision
2026-07-28(negotiated viaserver/discover) while keeping2025-11-25legacy clients supported (the classicinitializehandshake). The two revisions coexist on one server: a modern client that probesserver/discovernegotiates2026-07-28, and a legacy client'sinitializestill negotiates2025-11-25. Verified end to end on both stdio and streamable-http. TypeScript opts in via the@modelcontextprotocol/serverfactory'ssupportedProtocolVersions; the PythonmcpSDK is2026-07-28-native and coexists with no per-server opt-in. - Structured tool output: when an OpenAPI operation's success response is a JSON object, the generated tool advertises a matching
outputSchemaand returnsstructuredContent(the parsed response body) alongside the text result. klaridian reads and dereferences the response schema from the spec itself (including$refs intocomponents.schemas). Array, primitive, and no-body responses stay text-only. TypeScript and Python targets at parity. - Tool
inputSchemaandoutputSchemaare now emitted as JSON Schema 2020-12, the default dialect for MCP schema definitions (spec revisions 2025-11-25 and 2026-07-28), replacing draft-07. - Built-in HTML test client: a
--transport streamable-httpserver now serves a test client atGET /that speaks MCP over HTTP (initialize, tools/list, tools/call), so you can exercise a generated server in the browser. For stdio servers, the generated README documents the MCP Inspector (npx @modelcontextprotocol/inspector). klaridian deploy --target docker | cloudflare | fly: emits a Dockerfile, a Cloudflare Worker, or a Fly.io app, then hands off to the platform's own CLI. The streamable-http server's port and allowed hosts are environment-driven.- OpenTelemetry spans now continue the caller's trace: the OTel plugin propagates W3C trace context from the MCP request
_meta. --jsonfailures carry a stable machine-readablecodeand a specificstage, for scripts and agents that branch on the error.- Per-scheme upstream authentication: the generated server now authenticates to the upstream API according to the OpenAPI
securitySchemesit declares, instead of always sending a bearer token. Supported schemes:apiKey(in header, query, or cookie),httpbearer,httpbasic, andoauth2/openIdConnect(bearer token from the environment). Each scheme reads its credential from aKLARIDIAN_*environment variable;KLARIDIAN_AUTH_TOKENstill works for bearer. An operation whose only scheme ismutualTLSfails loudly rather than emitting silent, wrong auth. TypeScript and Python targets at parity. --header-passthrough <names>: forward named inbound request headers to the upstream API (streamable-http), so a client can supply per-user credentials.--auth-hook: emit an editable auth hook (src/auth-hook.tsorauth_hook.py) that runs before the built-in auth and can short-circuit it, as an escape hatch for schemes klaridian doesn't emit natively.
Security
- Remote
http(s)external$refpointers in a spec are no longer resolved by default. A malicious or compromised spec could otherwise make the parser fetch attacker-controlled or internal-network URLs at generation time (SSRF). Local-file$refs still resolve. Pass--allow-external-refsto opt back in to remote resolution; a spec that needs a remote$refunder the default fails loudly, naming the reference and the flag.
Changed
- klaridian now owns the full OpenAPI-to-tool-data pipeline. Parsing,
$refdereferencing, validation, and Swagger 2.0 conversion run on the standard@apidevtools/swagger-parserandswagger2openapilibraries; the operation-to-tool mapping is klaridian's own code. Output is unchanged: the new engine is verified byte-for-byte against the previous one across Stripe, GitHub, Kubernetes, OpenAI, Twilio, and DigitalOcean specs (about 4,200 real operations, OpenAPI 2.0, 3.0, and 3.1).
Removed
- The
openapi-mcp-generatorruntime dependency. Its role (tool-data extraction) is now handled by klaridian's own engine described above.@apidevtools/swagger-parserandswagger2openapiare kept.
Added
- OAuth 2.1 resource-server support on the Python target (
--language python --transport streamable-http --oauth-*), reaching parity with the TypeScript target: RFC 9728 Protected Resource Metadata discovery, JWKS-backed JWT validation (signature, expiry, issuer, RFC 8707 audience), a spec-shaped 401 Bearer challenge, and required-scope enforcement. - Author-supplied tool annotations via the
x-klaridianOpenAPI extension, including object-form hints (mapped onto MCPToolAnnotations:readOnly,destructive,openWorld) and anexpose: falseflag to exclude an operation from the generated server. - Tool-title precedence:
x-klaridian.title→ OpenAPIsummary→operationId, so generated tools carry human-readable titles instead of raw operation IDs. - An annotated example spec (
examples/annotated/openapi.json) demonstrating hints,expose, and a title override.
Changed
- klaridian now owns its internal tool-data model (
ToolIR) behind a single adapter seam, decoupling the emitters fromopenapi-mcp-generator's tool type. No change to generated output; this is the groundwork for phasing out that dependency.
Fixed
- The npm package page now renders a README (derived from the root README at publish time, with repo-relative links rewritten to absolute, tag-pinned GitHub URLs).
- The favicon and app icons now use the site's accent green, matching the wordmark instead of the previous cyan drift.
Fixed
klaridian --versionnow reads the real version frompackage.jsoninstead of a hardcoded literal that had drifted to0.0.1; a regression test keeps them in sync. The standalone binary reports the correct version on every channel.- The Homebrew formula renderer (
render-formula.sh) is now portable to the stock macOS bash 3.2, replacing adeclare -A(bash 4+) associative array that silently emitted an empty formula.
Added
- Multi-channel binary distribution: platform-tagged PyPI wheels (install with
pip/pipx, no Node required) and a Homebrew tap (brew tap klaridian/klaridian && brew install klaridian), alongside npm. - Tag-triggered release automation (
release.yml): npm, PyPI, and a GitHub Release with attached standalone binaries, publishing to PyPI via OIDC trusted publishing.
Changed
- The project moved to the
klaridianGitHub organization (github.com/klaridian/klaridian); oldricardocvasconcelos/klaridianURLs still redirect.
Fixed
- Dropped the retired
macos-13runner from the wheel matrix (a retired runner label queues indefinitely instead of failing) and made the npm publish step idempotent so re-firing a tag can complete a partial release. - Stabilized a flaky stderr assertion in the launch test, and removed a redundant test re-run from
prepublishOnlyso publishing no longer re-runs the full suite.
First public release.
Added
- Generate a Model Context Protocol (MCP) server from an OpenAPI spec, targeting TypeScript or Python (
--language) with full feature parity, built directly from the spec's tool data (SDK v2, protocol 2025-11-25). - Transports: stdio (default) and
--transport streamable-http. - Observability plugins wired in at the
registerToolboundary: OpenTelemetry, plus product-analytics plugins (Amplitude, Mixpanel, PostHog). - Native MCP conformance with a two-tier error model (unknown tool → protocol error
-32602; invalid arguments → tool-error result withisError: true). klaridian initonboarding wizard,klaridian startlauncher for a generated project, config-file support forgenerate, andplugins list/licenses listintrospection commands.- A documentation site structured around the Diátaxis framework (tutorials, how-to, reference), with an auto-generated CLI reference.