Changelog
New features, improvements, and fixes in every NitroStack release, newest first.
Every release of the TypeScript SDK (@nitrostack/core), the CLI (@nitrostack/cli), and the Python SDK (nitrostack), newest first. To move a project to the latest release, see Upgrade at the end of the page.
Universal app mode by default
APP_MODE now defaults to universal. A server built with NitroStack serves widgets to both Claude and ChatGPT without any configuration: tools carry the metadata each host expects, and widget resources use the MCP Apps MIME type. Set APP_MODE=openai or APP_MODE=mcp-app only when you target a single host. See Application mode.
Python: environment variables and upgrades
Two small Python releases on the same day.
Fixes
- Configuration.
ConfigServicenow gives the process environment priority over values in.env, so a variable set by your shell, container, or host is never overridden by a local file. (0.4.1) - Upgrade.
nitrostack-py upgradeworks in projects created byinit, which keep a vendored copy of the SDK. (0.4.2) - Init. The note
initprints about NitroStudio is corrected. (0.4.2)
Project names flow through new projects
nitrostack-cli init now writes your project name into the scaffolded server's name and into the widget package's name, so a new project no longer starts with the template's names.
Fixes
- CLI. Project names are sanitized before they're written into templates: newlines, control characters, and characters that have a special meaning in replacements are handled safely.
- CLI. The OAuth template's startup message no longer names a specific server.
- Core.
resolveServerIdentityandreadLocalPackageManifestare exported from the package entry point. - Core. Widget entry code generation escapes and normalizes file paths correctly.
Transforms, data spillover, and two new templates
1.1.0 is about servers with a lot of tools and a lot of data. Transforms change which tools a client sees and how it calls them, data spillover keeps large results out of the model's context, and two new templates show both at work.
Search and code-mode transforms
A transform sits between your tools and the client. The search transform replaces a long tool list with a search tool, using BM25 or regex matching, so the model discovers tools as it needs them. Without a query, it lists the catalog. The code-mode transform lets the model write a short script that calls several tools in one step; scripts run in a QuickJS sandbox with memory limits. You can give both transforms custom tool descriptions.
Data spillover
The DataSpilloverInterceptor catches tool results that are too large to send to a model. It returns a preview and a resource link, and stores the full result in memory or on the filesystem until the client reads it.
Session-based tool visibility
Tools can be shown or hidden for each session through ExecutionContext, and clients are notified when the list changes. Visibility explains how to use it as a transform.
New templates
init adds two templates: Enterprise search, with finance, inventory, and support controllers behind the search transform, and Code mode. Both include widgets built with Next.js.
Improvements
- Transports. HTTP clients that don't accept
text/event-streamget plain JSON responses. - Health checks. The health resource includes transform pipeline and spillover metrics.
- Pipeline. Tools and decorators accept interceptor instances that are already configured.
- Tools. Synthetic tools accept arguments sent as a serialized JSON string.
- Templates. The new templates pin
@modelcontextprotocol/ext-appsandzod, so installs stay on Zod 3.
Fixes
- Transforms. A
CallToolResultis no longer wrapped twice, and atools/callthat arrives before indexing finishes is handled. - Search. Regex matching has a longer worker timeout and no longer leaks worker slots under load.
Python: a vendored SDK and a landing page
Projects created by nitrostack-py init now include their own copy of the SDK in vendor/nitrostack, added at init and refreshed by pack, so a deployed project carries exactly the SDK it was built with. install keeps using uv sync for everything else.
A Python server now answers GET / with a page that describes its MCP endpoint, like the TypeScript SDK.
Fixes
- HTTP. A
GET /mcprequest that carries a session ID is rejected before an SSE stream opens.
Dependency updates
Improvements
- Core.
zodis updated to 3.25, and@modelcontextprotocol/ext-appsis no longer a peer dependency. - Templates. Templates pin
@modelcontextprotocol/ext-appsto 1.x, so new projects install the Zod 3 build.
Python SDK, rebuilt on its own MCP server
0.3.5 is the largest Python release so far. The SDK no longer builds on FastMCP: it runs its own low-level MCP server, which brings it level with the TypeScript SDK.
MCP 2026-07-28
Python servers support the stateless 2026-07-28 revision of MCP. One /mcp endpoint serves both 2025 and 2026 clients, and the protocol era defaults to auto. In stateless mode, requests must carry the Mcp-Method header, and tools/call must also carry Mcp-Name; both must match the JSON-RPC body.
What's new
- Transports. Streamable HTTP and legacy SSE, alongside STDIO.
- Tasks. The MCP tasks protocol, with a pluggable task store and per-tenant task authorization.
- Auth. OAuth 2.1, including Client ID Metadata Document resolution with SSRF protection.
- Widgets. Interactive widgets that talk to the host through bridge RPCs.
- CLI.
initinstalls agent skills and creates the project's.venv, and templates useuv.
Improvements
- HTTP. Servers bind to
127.0.0.1by default, and trust a forwarded host only from trusted proxies. - Tools. Tool schemas must use JSON Schema 2020-12; other drafts are rejected when the tool is registered.
MCP 2026-07-28 and tasks
NitroStack servers support the stateless 2026-07-28 revision of MCP, and keep serving clients on the earlier revision. The default protocol era is auto.
Tasks
Long-running tool calls can run as tasks. Task storage is pluggable through a TaskStore, with an in-memory store by default. Tasks are authorized per tenant, cancelled tasks can't be updated, and only finished tasks expire. Status updates reach clients over SSE, the modern transport, or STDIO.
Improvements
- Auth. A standard
OAuthGuard, and stricter Client ID Metadata Document resolution: HTTPS only, no redirects, a 5 KiB response limit, a timeout, and protection against private network addresses. - Tools. Input schemas allow additional properties, so contextual parameters don't fail validation.
- Server. Start options are configurable, and
PORTtakes priority when the HTTP port is resolved.
Fixes
- Transports. The modern adapter answers
ping, and passes an already parsed request body through, so Express JSON middleware works. - Widgets. Widget metadata is kept when tools are registered, custom widget resource URIs work, and bundled widget files resolve by their clean filename.
Request details in the execution context
Fixes
- Context. The HTTP
Authorizationheader andparams._metaare passed into the tool'sExecutionContext. - Transports. Session context is passed through transport registrations.
Package your project with pack
nitrostack-cli pack creates a zip of your project, ready to deploy. It follows your .gitignore and handles symlinks safely.
Python templates match TypeScript
The Python templates and widgets now match the TypeScript ones.
Agent skills, controllers, and lifecycle hooks
init now installs NitroStack agent skills for the coding agents it finds on your machine, in the project or globally, and upgrade keeps them current. Coding agents then know how NitroStack works.
What's new
- Controllers. The
@Controllerdecorator registers a class and prefixes its tool names. See Controllers. - Lifecycle hooks. Modules and services can run code when the server starts and stops. See Server lifecycle.
- Core.
getInitialToolMetadatais exported.
Cursor support and a new server landing page
What's new
- CLI. A
cursorcommand configures Cursor to use your server. - CLI.
upgradefetches the latest version of each package from npm. - Transports. Each Streamable HTTP session can get its own server instance, and Cursor can connect through
GET /mcpwith a legacy SSE fallback. - Auth. OAuth supports dynamic client registration and JWKS.
- Landing page. The page a server shows at its HTTP address is redesigned, with light and dark modes.
Fixes
- Transports. Sessions that never finish initializing no longer leak memory.
Dual transport by default
Servers serve STDIO and HTTP at the same time by default. See Dual transport.
Python: interactive project setup
nitrostack-py init asks for your project's details interactively, and the CLI can generate an OAuth setup guide for your project. Text encoding on Windows is fixed.
OAuth and prompt fixes
Fixes
- Auth. JWKS token validation is stricter.
- Server. Dependency injection registration is fixed, and a transport set in configuration is kept.
- Prompts. A prompt that returns a single message is handled as a list of one.
The Python SDK
The first release of nitrostack for Python, followed by 0.2.0 and 0.2.1 on 23 Jun. See the Python quick start.
App modes for Claude and ChatGPT
APP_MODE chooses how widgets are delivered: for ChatGPT, for Claude, or for both at once. (6 Apr)
Fixes
- Widgets. Widgets render over HTTP, and a race condition while rendering is fixed. (6 and 8 Apr)
Widgets in ChatGPT
What's new
- Transports. A legacy
/sseendpoint for clients that need it. - Widgets. Widget CSP settings for OpenAI apps. See Configure widget CSP.
Fixes
- CLI. Middleware created by
generatelogs withcontext.logger, which doesn't interfere with STDIO.
Earlier releases
Releases before April 2026 have no notes on this page. Their versions and dates are listed under All releases.
Upgrade
From your project folder, preview the changes, then apply them:
npx nitrostack-cli upgrade --dry-run
npx nitrostack-cli upgradeupgrade updates the @nitrostack/* packages in your project and refreshes the agent skills. See Manage Dependencies for every option. To update a global install of the CLI, run npm install -g @nitrostack/cli.
pip install -U nitrostack
nitrostack-py upgrade --dry-run
nitrostack-py upgradeIn a project created by init, upgrade replaces the vendored copy of the SDK in vendor/nitrostack with the target release, downloading the wheel from PyPI and checking it against its published sha256. In other projects it updates the nitrostack entry in pyproject.toml, and requirements.txt when it already pins it; run nitrostack-py install afterwards. Use --version X to pick a release. A target older than the current version is rejected unless you pass --allow-downgrade. See Manage Dependencies.
All releases
| Released | @nitrostack/core | @nitrostack/cli |
|---|---|---|
| 17 Oct 2026 | 1.1.2 | 1.1.2 |
| 15 Oct 2026 | 1.1.1 | 1.1.1 |
| 8 Oct 2026 | 1.1.0 | 1.1.0 |
| 24 Sep 2026 | 1.0.17 | 1.0.17 |
| 7 Sep 2026 | 1.0.16 | 1.0.16 |
| 25 Aug 2026 | 1.0.15 | |
| 24 Jul 2026 | 1.0.14 | 1.0.15 |
| 14 Jul 2026 | 1.0.13 | 1.0.14 |
| 10 Jul 2026 | 1.0.12 | 1.0.13 |
| 1 Jul 2026 | 1.0.11 | |
| 30 Jun 2026 | 1.0.10 | |
| 18 Jun 2026 | 1.0.9 | |
| 8 Apr 2026 | 1.0.8 | |
| 6 Apr 2026 | 1.0.7 | 1.0.12 |
| 5 Apr 2026 | 1.0.6 | 1.0.11 |
| 2 Mar 2026 | 1.0.10 | |
| 25 Feb 2026 | 1.0.3 | 1.0.9 |
| 23 Feb 2026 | 1.0.2 | 1.0.7, 1.0.8 |
| 2 Feb 2026 | 1.0.1 | 1.0.6 |
| 31 Jan 2026 | 1.0.0 | |
| 12 Jan 2026 | 1.0.4 | |
| 11 Jan 2026 | 1.0.0, 1.0.1, 1.0.3 |
| Released | nitrostack |
|---|---|
| 16 Oct 2026 | 0.4.1, 0.4.2 |
| 1 Oct 2026 | 0.4.0 |
| 10 Sep 2026 | 0.3.5 |
| 22 Jul 2026 | 0.3.3, 0.3.4 |
| 25 Jun 2026 | 0.3.2 |
| 24 Jun 2026 | 0.3.0, 0.3.1 |
| 23 Jun 2026 | 0.2.0, 0.2.1 |
| 17 Jun 2026 | 0.1.0 |
