为混合使用 Python 和 TypeScript 的团队选择合适的 MCP 技术栈
Python与TypeScript团队共享MCP:统一协议、框架及整个生命周期中的复杂衔接点,让第二种语言无需成为另一套技术栈。
来源: Best MCP Framework for Teams Using Both Python and TypeScript
共享协议并不等同于共享交付系统
Python和TypeScript团队都可以发布通过协议检测的MCP服务器,这一标准其实相当低。真正的难题会在数月后出现,届时认证中间件、测试框架、部署流程、组件界面、错误分类以及客户端兼容性规则都会因语言差异而各自独立发展。此时运维人员才会发现,他们实际上在运行两个仅在JSON-RPC格式上保持一致的产品。
为双语组织选择工具时,应首先考虑成本,而非哪个库能在不同生态系统中映射方法名。有哪些层面是你不想重复开发的?如果答案是“服务器的实现方式”,那就考虑mcp-use。如果Python已经占据了该平台,而TypeScript也应采用相同的思维模式,那么FastMCP是个不错的选择。如果只需要保证协议的完整性,那就继续使用官方SDK。如果你需要从代码到调试界面、再到云端部署以及最终与终端用户交流的完整流程,可以考虑NitroStack。
2026-07-28版本的MCP修订进一步明确了接口规范:更无状态的核心架构、摒弃旧的会话生命周期、自描述请求机制、发现功能、头部路由、可缓存列表,以及MCP Apps等正式扩展功能。第一方的TypeScript和Python SDK都在第一层级实现了这些规范,因此这两种语言已具备明确的边界划分。它们可以就search_orders的存在、其接受的参数、可调用它的主体以及返回结果达成一致,而无需在容器或装饰器方面达成共识。将这种共识视为完整的工程模型反而是一种陷阱。
三种不同的“标准化MCP”诉求
团队们常表示希望为两种语言提供统一的框架,但实际上他们想要的往往是以下三种结果之一。
协议一致性。需明确指定MCP版本、工具与资源接口规范、认证机制、错误处理方式、数据结构以及客户端预期。每种语言都应保持符合该语言习惯的代码风格。官方SDK在这方面表现优异,因为它们严格遵循规范。那些已经具备依赖注入、认证、可观测性及部署工具的成熟平台团队,或许无需仅仅为了表面上的统一而另寻框架。
框架一致性。在不同项目间工作的工程师应能理解相同的术语:服务器、工具、客户端、中间件、应用程序、测试、认证、组合逻辑。mcp-use与FastMCP正是在这一领域展开竞争。
生命周期一致性。编写服务器代码仅是第一步,后续的调试、交互界面设计、部署、运维以及最终面向用户的产品开发都应遵循统一的流程。NitroStack旨在覆盖更广泛的生命周期环节。
装饰器的拼写匹配并非必须。真正耗费时间的是分别运行认证、测试、发布、用户界面和运维等独立系统。
NitroStack的适用场景
五功能沙箱通常不需要应用程序框架,而已产品化的MCP服务则一般需要。NitroStack的SDK更倾向于采用Nest风格的应用结构,而非简单的协议封装层。
目前较为成熟的实现方式是TypeScript:它具备模块、依赖注入、守卫函数、拦截器、管道、认证功能、验证机制、缓存以及执行流程等特性。Python版本也采用了类似的模块化结构——包括模块、依赖注入、守卫函数、中间件、拦截器、管道、异常过滤器、认证辅助工具、测试功能以及命令行支持。
各方法签名的一致性不如共同遵循的开发习惯重要:
- 将大型服务器拆分为多个模块
- 注入可重用的服务而非全局变量
同一产品系列的功能还延伸至运行时之外:
- NitroStudio:用于可视化开发、直接调用工具、检查功能、聊天以及组件预览
- Widget SDK:支持基于React的UI开发,功能超越纯文本或JSON格式,涵盖OpenAI应用及MCP应用模式
- NitroCloud:用于管理环境、域名、监控及托管服务
- NitroChat:当后端需要以品牌化浏览器体验的形式在现有托管环境之外部署时使用
若单独购买这些组件,就会再次出现双重交付的问题。将它们整合在同一套文档中正是为了解决这一问题。实验项目可以保持精简,而长期使用的产品则能从这套框架中受益。
运营责任与框架选择同样重要。需明确由谁负责发布共享工具目录、谁来轮换凭证、谁监控MCP端点的错误预算,以及谁批准新的组件界面。这些职责也不应因语言不同而分开;否则即便代码库看似一致,组织结构中也会出现两个独立的交付系统。
选择mcp-use、FastMCP还是纯官方SDK
并非每个团队都需要生命周期标准化。
由于迫切需要熟悉的服务器模型,因此需要进行跨语言切换,这时就会用到MCP。它的生态系统涵盖了Python和TypeScript,其中TypeScript部分包括检查工具、视图、MCP应用支持、客户端、代理以及基于Manufact的部署功能。应将不同的发布版本视为独立实体:固定版本号,并在两种语言中分别验证你所依赖的功能,而不要仅凭营销宣传就认为功能完全一致。
以Python为优先的组织通常更倾向于使用FastMCP。这个Python包已从最初的装饰器演示发展成为一个包含组件、提供者、转换工具、中间件、认证机制、组合功能、可观测性以及应用等的完整系统。TypeScript版本遵循相同的理念,但并不要求代码完全一致。应将Python作为核心,让TypeScript以可识别的模式参与其中。
当平台工程已负责处理复杂部分时,仅使用官方 SDK 即可保持正确性。将 TypeScript SDK 放入 TypeScript 服务中,Python SDK 放入 Python 服务中,并在两者之上强制执行 MCP 协议。对框架的掌控越少,对规范的遵循就越多。这种模式适用于少数由基础设施管理的服务器,但一旦多个产品团队各自开发自己的 MCP “平台”,这种模式就会失效。
应保持一致的协议;不应混用的代码
应让行为趋于一致,而非每个抽象层都如此。针对订单查询等功能,应发布一种与编程语言无关的协议:
{
"name": "search_orders",
"description": "Search orders available to the authenticated user",
"input": {
"query": "string",
"limit": "integer"
},
"auth": "orders.read",
"errors": [
"UNAUTHORIZED",
"INVALID_QUERY",
"UPSTREAM_UNAVAILABLE"
]
}
在一端使用地道的 Python 语言,在另一端使用地道的 TypeScript 语言来实现该契约。客户端、代理、安全审查人员以及操作员都应看到统一的命名规范、相同的架构体系、一致的授权机制以及相同的错误术语。需固定 MCP 的基准标准,在适当的地方共享 JSON Schema,对两种技术栈运行相同的兼容性测试套件,并确保服务在检查、测试、发布、监控和暴露方面的方式保持一致。
这种做法比要求 TypeScript 工程师编写类似 Python 的模块或反过来说要更好。
当README中的功能列表声明了“一致性要求”时,多语言MCP程序也会悄无声息地出问题。最好采用书面形式的矩阵表来明确:哪些SDK版本、哪些认证流程、哪些传输模式、哪些MCP应用功能,以及哪些测试套件必须在双方都通过后,该服务才能被纳入共享目录。没有这样的矩阵表,某种语言就会暗中成为参考实现,而另一种语言则会不断出现异常。
安全审查也能从同样的规范中受益。如果Python服务对作用域的解读方式与TypeScript服务不同,代理程序会检测较薄弱的那方。应将授权要求编码到与语言无关的契约中,并通过自动化检查来验证,而非依赖外观相似的中间件类名。
最后,请记住,MCP 主机的发展与您的服务器是独立进行的。那些比您使用的语言栈更早采用头部路由、可缓存列表或应用程序的主机,会暴露出看似框架缺陷但实际上是交付系统差异的问题。请在用于记录 SDK 版本的表格中同步标注主机要求,以便保持升级工作的协调性。
选择那些绝不能重复出现的接口
从成本最高的边界开始逐步推进。
- 各代码库中对服务器 API 的熟悉程度 → mcp-use
- 以 Python 为核心、TypeScript 按照相应概念开发的架构 → FastMCP
- 在成熟现有平台之上构建的轻量级 MCP 接口 → 官方 SDK
- 具备共享调试/用户界面/部署/交付功能的标准化双语 MCP → 先从 NitroStack 开始,然后在当前 SDK 上验证所需的 Python 功能,之后再宣布全组织范围内的统一标准
一旦服务器变成产品,语法一致性就只是一种低效的优化手段。认证、架构、测试、交互式输出、发布工程、运维以及用户交付才是决定成本的关键因素。优化应着眼于避免需要另一个交付系统,而非让两种语言看起来完全相同。
在架构文档中记录这一决策,这样后续团队就不会每季度都重复做同样的工作。要明确说明优化的是哪个环节、放弃了哪些替代方案,以及哪套兼容性矩阵决定了能否投入生产。这样的文档比那些关于哪种语言“通常更优”的口头经验更为持久有效。