今天在 GitHub Trending 上看到一个有意思的项目:NitroStack,一个面向企业的 TypeScript 框架,用于构建生产级 MCP(Model Context Protocol)服务器,用一套统一的设计解决了 MCP 服务器开发中常见的样板代码、认证、缓存等问题。
一、项目概述
NitroStack 是什么?官方的定位非常清晰——The enterprise-grade TypeScript framework for building production-ready MCP servers。它为 MCP 服务器开发提供了一套完整 Opinionated 的解决方案,核心理念是"Decorators. Dependency Injection. Widgets. One framework to ship AI-native backends."
核心特性一览
- 装饰器驱动(Decorator-driven):用 TypeScript 装饰器声明式定义 Tools、Resources、Prompts,告别传统命令式写法
- 依赖注入(Dependency Injection):内置 DI 容器,支持 Singleton、Transient、Scoped 三种生命周期
- 认证内置(Auth built in):开箱即用的 JWT、OAuth 2.1、API Key 认证方案
- 中间件管道:Guards、Interceptors、Pipes、Exception Filters,完整的企业级中间件体系
- UI Widgets:可将 React 组件附加到 Tool 输出端,实现富交互响应
- Zod 验证:从 Schema 定义到运行时验证的全链路类型安全
- NitroStudio:配套桌面应用,用于测试、调试和可视化开发 MCP 服务器
二、技术原理
装饰器堆叠:零样板代码的秘密
NitroStack 最大的设计亮点在于"装饰器堆叠"(Decorator Stack)。一个 @Tool 装饰器下面,可以同时叠加 @UseGuards、@Cache、@Widget 等多个注解,一次声明同时获得:API 定义 + Zod 验证 + 认证鉴权 + 缓存 + UI 渲染。以下是官方 README 中的典型示例:
import { McpApp, Module, ToolDecorator as Tool, z, ExecutionContext } from '@nitrostack/core';
@McpApp({
module: AppModule,
server: { name: 'my-server', version: '1.0.0' }
})
@Module({ imports: [] })
export class AppModule {}
export class SearchTools {
@Tool({
name: 'search_products',
description: 'Search the product catalog',
inputSchema: z.object({
query: z.string().describe('Search query'),
maxResults: z.number().default(10)
})
})
@UseGuards(ApiKeyGuard)
@Cache({ ttl: 300 })
@Widget('product-grid')
async search(input: { query: string; maxResults: number }, ctx: ExecutionContext) {
ctx.logger.info('Searching products', { query: input.query });
return this.productService.search(input.query, input.maxResults);
}
}
这一行装饰器链背后,实际上完成了以下工作:
- @Tool 注册 MCP Tool 元信息(名称、描述、输入 Schema)
- @UseGuards(ApiKeyGuard) 在执行前注入 API Key 鉴权中间件
- @Cache({ ttl: 300 }) 自动为请求结果加 300 秒缓存
- @Widget(‘product-grid’) 将返回数据与 React 组件绑定,渲染为商品网格 UI
依赖注入容器
NitroStack 的 DI 容器借鉴了 Angular/NestJS 的成熟设计,提供了类级别的依赖管理。AppModule 作为根模块,通过 @Module 声明其导入关系,框架在启动时自动解析依赖图并实例化对象。这种设计使得测试也变得异常简单——只需替换 Mock 服务即可。
模块化生态
NitroStack 采用 monorepo 结构,核心包与功能包完全解耦:
| 包 | 职责 | 安装命令 |
|---|---|---|
| @nitrostack/core | 框架核心:装饰器、DI、运行时 | npm i @nitrostack/core |
| @nitrostack/cli | 脚手架、开发服务器、代码生成器 | npm i -g @nitrostack/cli |
| @nitrostack/widgets | React SDK:Tool 输出端 UI 渲染 | npm i @nitrostack/widgets |
三、安装与快速开始
环境要求
- Node.js >= 20.18
- npm >= 9
三步上手
第一步:创建项目(脚手架)
npx @nitrostack/cli init my-server
CLI 会自动生成标准项目结构,包含配置文件和开发服务器。
第二步:安装依赖并启动
cd my-server
npm install
npm run dev
服务器启动后自动运行在本地 MCP 兼容端口,可接入任意 MCP 客户端。
第三步:使用 NitroStudio 可视化调试
下载 NitroStudio(https://nitrostack.ai/studio),打开项目文件夹,即可:实时执行 Tools 并查看请求/响应详情;内置 AI Chat 面板直接与服务器对话;预览 Widget UI 渲染效果;Hot Reload 实时刷新。
四、使用方法与实战
定义一个 Tool
在任意 Service 或 Class 上使用 @Tool 装饰器:
import { Tool } from '@nitrostack/core';
import { z } from 'zod';
export class WeatherTools {
@Tool({
name: 'get_weather',
description: '获取指定城市的天气预报',
inputSchema: z.object({
city: z.string().describe('城市名称'),
days: z.number().default(3).describe('预报天数')
})
})
async getWeather(input: { city: string; days: number }) {
const data = await this.weatherService.fetch(input.city);
return { city: input.city, forecast: data };
}
}
Widget 渲染示例
通过 @Widget 装饰器将 Tool 输出绑定为 React 组件:
@Widget('weather-card')
async getWeather(input, ctx) {
const data = await this.weatherService.fetch(input.city);
return data;
}
前端接入时只需:
import { NitroWidget } from '@nitrostack/widgets';
<NitroWidget tool="weather-card" initialData={{ city: '北京' }} />
五、常见问题与解决方案
Q1:Node.js 版本不满足要求? NitroStack 需要 Node.js >= 20.18,建议使用 nvm 管理多版本 Node.js 环境。
Q2:认证失败(401 Unauthorized)? 检查是否正确注册了 @UseGuards,以及 Token 是否在请求 Header 中正确传递。
Q3:Widget 不渲染? 确保前端项目已安装 @nitrostack/widgets 并正确导入样式,同时检查 Tool 返回的数据结构是否符合 Widget 组件的预期字段。
Q4:生产环境部署? 框架提供 Docker 支持,官方文档有 Production Checklist(https://docs.nitrostack.ai/deployment/checklist),推荐配合 PM2 或 Docker Compose 使用。
六、总结
NitroStack 代表了 MCP 服务器开发的一种新范式——从手写样板到装饰器声明,从散落配置到统一框架。它不是简单封装了 MCP 协议,而是将企业级后端开发的最佳实践(DI、中间件、认证、缓存)完整迁移到了 AI Native 场景。对于正在构建 AI Agent 工具生态的团队,NitroStack 值得深入了解。
如果你对 AI + TypeScript 方向感兴趣,推荐关注其官方文档中的 Architecture Deep Dive(https://docs.nitrostack.ai/sdk/typescript/server-concepts)和 Widgets Guide(https://docs.nitrostack.ai/sdk/typescript/ui-widgets-guide)。
项目地址:https://github.com/nitrocloudofficial/nitrostack
官网:https://nitrostack.ai