为 Claude / OpenAI 代理打造生产级工具?这开源 SDK 专治各种不服
专为后端/全栈开发者、AI 代理构建者和初创团队设计
你是否正在为 AI 代理(如 Claude、ChatGPT 或自定义 Agent)集成外部工具而烦恼?定义工具 schema 不难,但一到生产环境,就要面对认证、多租户、用户交互(elicitation)、审计日志等一系列复杂问题。结果往往是:原型几天搞定,上线却遥遥无期。
2025 年底,Model Context Protocol (MCP) 协议生态已经非常成熟。Anthropic 主推,OpenAI Agent Kit 默认支持,最新 spec 还引入了更强的安全规范和 UI 扩展。但官方实现偏底层,生产级特性需要自己从零造。这时,LeanMCP 的开源 TypeScript SDK(leanmcp-sdk)就脱颖而出——它以极致的开发者体验为核心,提供类型安全装饰器、开箱即用的认证和 CLI 工具,帮助你快速构建可靠的 MCP 服务器。
这个仓库(github.com/LeanMCP/lea…) 截至 2025 年 12 月 15 日仍有活跃 commit,采用 MIT 许可,完全免费开源。下面我们一步步来看它到底能为你带来什么价值。
MCP 协议快速背景
MCP(Model Context Protocol)是一种让 AI 代理安全、双向连接外部工具、提示和资源的开源协议。它为 AI 提供“标准化接口”:工具的调用方式、参数 schema、描述、甚至用户交互流程都清晰定义。
2025 年,MCP 已成为 AI 工具集成的事实标准:
- Anthropic 的 Claude 默认支持
- OpenAI 的 Agent Kit 内置兼容
- 支持流式响应、elicitation(工具执行中征求用户输入)、structured outputs 等高级特性
但生产环境远不止定义几个工具。认证、权限、多租户、日志、可观测性……这些才是真正耗时的部分。LeanMCP SDK 正是针对这些痛点设计的。
LeanMCP SDK 核心价值:谁能受益?
这个 SDK 专为 TypeScript/Node.js 开发者打造,强调 DX first(开发者体验优先)、类型安全 和 生产就绪。
后端/全栈工程师
如果你正在为 AI 应用连接数据库、外部 API 或 SaaS 服务(Stripe、Notion 等),LeanMCP 的装饰器风格能让你少写 80% 样板代码。类型安全 + 自动 schema 生成,编译期就能捕获错误。
AI 代理构建者
想让自己的工具被 OpenAI、Anthropic 等大模型调用?SDK 支持最新 MCP spec,直接暴露工具、提示和资源,支持 elicitation 和流式响应。
企业级应用开发者
内置 @leanmcp/auth 包,支持 Auth0、Supabase、Cognito、Firebase 等主流认证提供商。开箱即用多租户、API keys、权限控制和审计日志。
初创团队或独立开发者
通过 CLI 几分钟搭建项目原型,支持快速迭代。leanmcp create 和 leanmcp add 命令自动生成 boilerplate,适合 MVP 开发。
核心特性一览:
- 类型安全装饰器(
@Tool、@Prompt、@Resource) - 自动服务发现(放在
mcp/目录即可) - 内置 HTTP 服务器(健康检查、CORS、日志)
- 认证装饰器
@Authenticated - Elicitation、审计、可观测性支持
- CLI 驱动开发流程
实战演示:10 分钟搭建你的第一个 MCP 服务器
我们用真实代码(直接来自仓库 README)来演示。整个过程无需虚构,所有示例均来自官方。
1. 安装 CLI 并创建项目
npx @leanmcp/cli create my-mcp-server
cd my-mcp-server
npm install
这会生成标准项目结构:
my-mcp-server/
├── main.ts # 入口文件
├── package.json
├── tsconfig.json
└── mcp/ # 服务目录
└── example/
└── index.ts # 示例服务
2. 定义一个带 schema 验证的工具(情感分析示例)
在 mcp/example/index.ts 中(仓库生成的 boilerplate):
import { Tool, Optional, SchemaConstraint } from "@leanmcp/core";
// 输入 schema
class AnalyzeSentimentInput {
@SchemaConstraint({
description: 'Text to analyze',
minLength: 1
})
text!: string;
@Optional()
@SchemaConstraint({
description: 'Language code',
enum: ['en', 'es', 'fr', 'de'],
default: 'en'
})
language?: string;
}
// 输出 schema
class AnalyzeSentimentOutput {
@SchemaConstraint({ enum: ['positive', 'negative', 'neutral'] })
sentiment!: string;
@SchemaConstraint({ minimum: -1, maximum: 1 })
score!: number;
@SchemaConstraint({ minimum: 0, maximum: 1 })
confidence!: number;
}
export class SentimentService {
@Tool({
description: 'Analyze sentiment of text',
inputClass: AnalyzeSentimentInput
})
async analyzeSentiment(args: AnalyzeSentimentInput): Promise<AnalyzeSentimentOutput> {
const sentiment = this.detectSentiment(args.text);
return {
sentiment: sentiment > 0 ? 'positive' : sentiment < 0 ? 'negative' : 'neutral',
score: sentiment,
confidence: Math.abs(sentiment)
};
}
private detectSentiment(text: string): number {
const positiveWords = ['good', 'great', 'excellent', 'amazing', 'love'];
const negativeWords = ['bad', 'terrible', 'awful', 'horrible', 'hate'];
let score = 0;
const words = text.toLowerCase().split(/\s+/);
words.forEach(word => {
if (positiveWords.includes(word)) score += 0.3;
if (negativeWords.includes(word)) score -= 0.3;
});
return Math.max(-1, Math.min(1, score));
}
}
3. 简单工具示例(加法计算)
class AddInput {
@SchemaConstraint({ description: 'First number' })
a!: number;
@SchemaConstraint({ description: 'Second number' })
b!: number;
}
@Tool({
description: 'Calculate sum of two numbers',
inputClass: AddInput
})
async add(input: AddInput): Promise<{ result: number }> {
return { result: input.a + input.b };
}
4. 带认证的生产级工具(Slack 发送消息 + Cognito)
import { Tool, SchemaConstraint } from "@leanmcp/core";
import { AuthProvider, Authenticated } from "@leanmcp/auth";
const authProvider = new AuthProvider('cognito', {
region: process.env.AWS_REGION,
userPoolId: process.env.COGNITO_USER_POOL_ID,
clientId: process.env.COGNITO_CLIENT_ID
});
await authProvider.init();
class SendMessageInput {
@SchemaConstraint({
description: 'Channel to send message to',
minLength: 1
})
channel!: string;
@SchemaConstraint({
description: 'Message text',
minLength: 1
})
text!: string;
}
@Authenticated(authProvider)
export class SlackService {
@Tool({
description: 'Send message to Slack channel',
inputClass: SendMessageInput
})
async sendMessage(args: SendMessageInput) {
return {
success: true,
channel: args.channel,
timestamp: Date.now().toString()
};
}
}
5. 启动服务器(main.ts)
import { createHTTPServer } from "@leanmcp/core";
await createHTTPServer({
name: "my-mcp-server",
version: "1.0.0",
port: 8080,
cors: true,
logging: true
});
运行 npm run dev,你的 MCP 服务器就在 /mcp 端点就绪,支持健康检查 /health。
用 MCP Inspector 或直接连接 Claude/ChatGPT 测试工具调用即可。
与其他方案对比
官方 MCP TypeScript 实现更底层,需要手动处理认证、流式等。LeanMCP SDK 在此基础上增加了生产特性(auth、CLI、auto-discovery),开发者体验大幅提升。LeanMCP SDK 是当前最注重开发者体验的 MCP 构建工具,尤其适合需要快速上线生产级工具的后端团队和初创开发者。
现在就试试:
- Star 仓库:github.com/LeanMCP/lea…
- 运行
npx @leanmcp/cli create test-mcp搭建你的第一个服务器 - 有问题欢迎提 Issue 或贡献代码
MCP 生态正在快速演进,LeanMCP 值得你关注。动手试试吧,生产级 MCP 服务器其实没那么难!