MCP

MCP SDK 对比:TypeScript vs Python 实现全解析

对比 Model Context Protocol 官方 TypeScript 和 Python SDK 的功能差异、性能表现和适用场景,帮你选择最适合的开发语言。

MCP 官方提供了 TypeScript 和 Python 两个 SDK。选择哪个?这取决于你的技术栈、团队能力和项目需求。这篇文章将从 API 设计、性能、生态系统三个维度进行详细对比。

SDK 概览

TypeScript SDK

npm install @modelcontextprotocol/sdk

TypeScript SDK 是 MCP 的参考实现,API 设计更加成熟和稳定。它充分利用了 TypeScript 的类型系统,提供了优秀的开发体验。

Python SDK

pip install mcp

Python SDK 紧跟 TypeScript SDK 的功能,同时融入了 Python 的异步编程范式。对于 Python 生态的开发者来说更加自然。

Server 端 API 对比

定义 Tool

TypeScript 方式:

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';

const server = new McpServer({ name: 'demo', version: '1.0.0' });

server.tool(
  'calculate',
  '执行数学计算',
  {
    expression: z.string().describe('数学表达式'),
  },
  async ({ expression }) => {
    const result = eval(expression);  // 生产环境应使用安全的表达式解析器
    return {
      content: [{ type: 'text', text: String(result) }],
    };
  }
);

Python 方式:

from mcp.server import Server
from mcp.types import Tool, TextContent

server = Server("demo")

@server.list_tools()
async def list_tools():
    return [
        Tool(
            name="calculate",
            description="执行数学计算",
            inputSchema={
                "type": "object",
                "properties": {
                    "expression": {
                        "type": "string",
                        "description": "数学表达式"
                    }
                },
                "required": ["expression"]
            }
        )
    ]

@server.call_tool()
async def call_tool(name, arguments):
    if name == "calculate":
        result = eval(arguments["expression"])
        return [TextContent(type="text", text=str(result))]

TypeScript 版本更简洁,Zod schema 同时定义了类型和验证规则。Python 版本需要手动定义 JSON Schema,但更加灵活。

定义 Resource

TypeScript:

server.resource(
  'config',
  'config://app',
  async (uri) => ({
    contents: [{
      uri: uri.href,
      text: JSON.stringify({ theme: 'dark', lang: 'zh' }),
    }],
  })
);

Python:

@server.list_resources()
async def list_resources():
    return [
        Resource(
            uri="config://app",
            name="config",
            description="应用配置"
        )
    ]

@server.read_resource()
async def read_resource(uri):
    if uri == "config://app":
        return json.dumps({"theme": "dark", "lang": "zh"})

传输层

TypeScript 支持 stdio 和 SSE:

import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';

// stdio
const transport = new StdioServerTransport();
await server.connect(transport);

Python 同样支持:

from mcp.server.stdio import stdio_server
from mcp.server.sse import SseServerTransport

async with stdio_server() as (read, write):
    await server.run(read, write)

Client 端 API 对比

连接 Server

TypeScript:

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';

const client = new Client({ name: 'app', version: '1.0.0' });
await client.connect(new StdioClientTransport({
  command: 'node',
  args: ['server.js'],
}));

const { tools } = await client.listTools();
const result = await client.callTool({
  name: 'calculate',
  arguments: { expression: '2 + 2' },
});

Python:

from mcp.client import ClientSession
from mcp.client.stdio import stdio_client

async with stdio_client("python", "server.py") as (read, write):
    async with ClientSession(read, write) as session:
        await session.initialize()
        tools = await session.list_tools()
        result = await session.call_tool(
            "calculate",
            arguments={"expression": "2 + 2"}
        )

Python 使用 async context manager 管理连接生命周期,更加 Pythonic。

性能对比

启动时间

TypeScript(Node.js)的冷启动时间通常在 100-200ms,Python 在 200-500ms。对于长期运行的 Server 来说,这个差异可以忽略。

内存占用

TypeScript Server 的基础内存占用约 30-50MB,Python 约 20-40MB。在加载大量依赖后,两者差距不大。

并发性能

两者都基于异步 I/O 模型,理论上并发性能接近。在实际测试中,TypeScript 在高频请求场景下略占优势,主要得益于 V8 引擎的优化。

JSON 处理

TypeScript 原生支持 JSON,处理速度更快。Python 需要通过 json 模块进行序列化/反序列化,在大量数据场景下可能成为瓶颈。

生态系统对比

TypeScript 生态

  • 丰富的 npm 包,与 Web 生态无缝集成
  • Zod 提供优秀的运行时验证
  • 与前端框架(React、Vue)集成方便
  • 类型安全贯穿整个开发流程

Python 生态

  • 数据科学和 ML 库无可替代(pandas、numpy、scikit-learn)
  • 与 FastAPI、Django 等 Web 框架集成成熟
  • 异步生态(asyncio、aiohttp)日益完善
  • 在 AI/ML 领域有天然优势

选择建议

选 TypeScript 的场景

  • Web 全栈开发团队
  • 需要与前端应用深度集成
  • 追求类型安全和开发体验
  • 构建 MCP 生态工具和库

选 Python 的场景

  • 数据科学和 ML 项目
  • 需要使用 Python 生态的库
  • 团队以 Python 开发为主
  • 构建与 AI 模型集成的 Server

混合方案

你也可以混合使用——用 TypeScript 构建通用的 MCP Server,用 Python 构建数据处理相关的 Server,两者通过 MCP 协议无缝协作。

常见问题(FAQ)

两个 SDK 的功能完全一致吗?

核心功能一致,但 TypeScript SDK 通常先实现新特性,Python SDK 紧随其后。两者之间的差距通常在几个小版本内。

可以用其他语言实现 MCP 吗?

可以。MCP 基于 JSON-RPC 协议,任何支持 JSON 处理的语言都可以实现。社区已有 Go、Rust、Java 等语言的实现。

SDK 的更新频率如何?

官方 SDK 跟随 MCP 协议规范更新,通常每月有 1-2 次更新。建议定期升级以获取最新的安全修复和功能改进。

总结

TypeScript 和 Python SDK 都是成熟可靠的 MCP 实现。选择的关键在于你的技术栈和项目需求,而非 SDK 本身的优劣。在大多数场景下,选择团队最熟悉的语言就是最好的选择。