快速手搓一个MCP服务指南(九):FastMCP 服务器组合技术:构建模块化AI应用的终极方案
1. 为什么要把多个 MCP 服务拼成一个入口如果你已经手搓过几个 MCP 服务大概率会遇到一个尴尬局面天气服务一个进程、数据库查询一个进程、文本处理又一个进程每个都要单独配一遍客户端、单独填一遍 Key、单独维护一份启动脚本。客户端那边更麻烦Claude Desktop 或 Cline 里要挂四五个 server 条目改一个端口就得全量重启。FastMCP 的服务器组合Server Composition就是来解决这件事的。它提供两种把子服务器拼进主服务器的方式import_server做静态复制mount做动态链接。拼完之后你对外只暴露一个 MCP 入口客户端只认一个地址、一份配置内部却可以按功能域拆成任意多个模块。适合谁适合已经把 MCP 玩到第二个、第三个服务开始觉得「配置比代码还多」的开发者也适合团队里不同人负责不同工具域最后要合成一个统一入口的场景。我试过把三个独立服务合成一个主服务器客户端配置从 60 行缩到 12 行重启次数直接砍半。这篇就按「先讲清两种组合的差别 → 给出可复制的骨架 → 用 TaoToken 统一通道验证工具列表和调用」的顺序走每一步都能跟着敲。核心检索词先摆出来FastMCP 服务器组合、import_server 静态导入、mount 动态挂载、MCP 统一入口。这四个词贯穿全文你照着搜也能找到对应文档。在动手之前先把两种机制的边界划清楚否则很容易选错import_server是「复制」。调用那一刻子服务器的工具、资源、提示词被拷贝进主服务器之后子服务器再怎么改主服务器都不受影响。工具名会加上前缀比如weather_get_forecast。它适合固化的、不常变的组件比如封装好的第三方 API、稳定的算法工具。mount是「链接」。主服务器只保留一个引用运行时收到带前缀的请求再转发给子服务器。子服务器新增工具主服务器立刻能看到。它适合需要持续迭代、或者跨进程跨实例的模块。一句话决策组件稳定用 import组件会活用 mount。下面进入实操。2. TaoToken 前置一份 Key 打通组合后的统一通道组合完服务器下一个问题就是「谁来调用」。本地调试可以用 stdio但一旦你想让组合后的主服务器对外提供 HTTP 入口或者想让多个客户端共用一套鉴权就需要一个统一的 API 通道。TaoToken 在这里扮演的角色是给你一个统一的 Base URL 和一把 Key模型对话、工具调用都走同一个出口不用每个子服务单独配一套凭证。先把地址记清楚后面配置里要用官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 根地址https://taotoken.net/api 这个不加 UTM配置里填这个你需要提前准备两样东西一把 API Key以及确认你要用的 Model ID。Key 在控制台的 API Keys 页面生成路径是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。生成后先复制存好页面刷新就不再完整显示。Model ID 这块要注意不同客户端填法不一样。如果你用的是 Claude Code 这类 Anthropic 协议客户端走的是 https://taotoken.net/api 这个根地址加对应模型名如果是 OpenAI 兼容协议的客户端同样填这个根地址模型名按你实际开通的填。别把两个协议的路径混用这是后面 401 和 404 的高发区。为什么组合服务器要配 TaoToken因为组合后的主服务器往往要同时处理「模型推理」和「工具调用」两类请求。如果工具走本地、模型走另一个通道鉴权和日志就分裂了。统一到一套 Base URL Key Model ID排障时只看一个出口日志一条线省心很多。这里给一个最小验证思路先用模型对话页面确认 Key 和模型名是通的地址是 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。确认能正常返回再去配 MCP 服务器。顺序反了的话你会分不清是 Key 错还是服务器组合错。如果你打算长期跑编码类 Agent或者要把组合后的服务器接到自动化流程里可以看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它解决的是「长期、高频、多工具」场景下的额度与稳定性不是必须但组合服务器一旦上量就会用到。前置准备就这些一把 Key、一个确认可用的 Model ID、一个根地址。接下来进配置。3. 可复制配置import_server 与 mount 骨架 config.toml这一节是全文最该动手的部分。我按「子服务器 → 主服务器 → 客户端配置」三层给你骨架路径和字段名保持和 FastMCP 一致你直接改名字就能用。先看两个子服务器。第一个是天气服务第二个是文本处理服务都放在servers/目录下# servers/weather_server.py from fastmcp import FastMCP weather_mcp FastMCP(nameWeatherService) weather_mcp.tool def get_forecast(city: str) - dict: 返回指定城市的天气预报 return {city: city, forecast: Sunny, temp_c: 26} weather_mcp.tool def get_alert(city: str) - dict: 返回指定城市的天气预警 return {city: city, alert: none}# servers/text_server.py from fastmcp import FastMCP text_mcp FastMCP(nameTextService) text_mcp.tool def word_count(text: str) - dict: 统计文本词数 return {words: len(text.split())} text_mcp.tool def to_upper(text: str) - dict: 转大写 return {result: text.upper()}现在写主服务器。这里同时演示两种组合方式天气服务用import_server静态导入它稳定文本服务用mount动态挂载它可能加新工具# main_server.py import asyncio from fastmcp import FastMCP from servers.weather_server import weather_mcp from servers.text_server import text_mcp main_mcp FastMCP(nameMainApp) async def build(): # 静态导入工具名变成 weather_get_forecast / weather_get_alert await main_mcp.import_server(weather_mcp, prefixweather) # 动态挂载工具名变成 text_word_count / text_to_upper main_mcp.mount(text_mcp, prefixtext) return main_mcp if __name__ __main__: app asyncio.run(build()) app.run(transporthttp, host127.0.0.1, port8765)注意import_server是 async 的必须 awaitmount是同步的直接调。这是新手最容易踩的一个坑漏了 await 会得到一个协程对象而不是导入结果。接下来是客户端侧的config.toml。如果你用的是支持 TOML 配置的 MCP 客户端把组合后的主服务器和 TaoToken 通道一起写进去# config.toml [mcp_servers.main_app] command python args [main_server.py] transport http url http://127.0.0.1:8765 [llm.taotoken] base_url https://taotoken.net/api api_key sk-你的Key model 你的ModelID如果你用的是 JSON 配置的客户端比如某些 IDE 插件等价片段是这样{ mcpServers: { main_app: { url: http://127.0.0.1:8765, transport: http } }, llm: { baseUrl: https://taotoken.net/api, apiKey: sk-你的Key, model: 你的ModelID } }三件套再强调一次Base URL 填https://taotoken.net/apiKey 填控制台生成的那把Model ID 填你确认可用的那个。这三个字段在 Claude Code、Cline、Codex 的 auth.json 里都是必填项缺一个就连不上。资源前缀格式也顺手配一下。FastMCP 支持两种前缀格式推荐用 path 格式避免 URI 协议限制# 全局配置 import fastmcp fastmcp.settings.resource_prefix_format path # 或者单服务器配置 main_mcp FastMCP(nameMainApp, resource_prefix_formatpath)也可以用环境变量FASTMCP_RESOURCE_PREFIX_FORMATpath。新项目直接上 path 格式老系统迁移再考虑协议格式。配置写完先别急着接客户端下一节先本地验证工具列表能不能拉出来。4. 验证请求拉取工具列表并完成一次调用配置对不对跑一次就知道。分两步先拉工具列表确认组合生效再实际调用一个工具确认前缀和路由都对。启动主服务器python main_server.py看到监听 8765 的日志后另开一个终端用 curl 拉工具列表。MCP over HTTP 的列表请求大致长这样curl -s http://127.0.0.1:8765/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:1,method:tools/list,params:{}}预期返回里应该能看到四个工具名字带前缀{ jsonrpc: 2.0, id: 1, result: { tools: [ {name: weather_get_forecast}, {name: weather_get_alert}, {name: text_word_count}, {name: text_to_upper} ] } }如果weather_和text_两个前缀都在说明 import 和 mount 都生效了。这一步是整个组合技术的验收点前缀没出来后面全白搭。接着调用一个工具验证路由curl -s http://127.0.0.1:8765/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,id:2,method:tools/call,params:{name:weather_get_forecast,arguments:{city:Hangzhou}}}预期返回{ jsonrpc: 2.0, id: 2, result: { content: [{type: text, text: {\city\: \Hangzhou\, \forecast\: \Sunny\, \temp_c\: 26}}] } }到这里组合服务器本身已经通了。再验证动态挂载的「实时性」不重启主服务器往text_server.py里加一个新工具to_lower然后重新拉一次工具列表。因为mount是动态链接理论上新工具应该出现。实测下来直接挂载模式下同进程内确实能立刻看到如果你用的是as_proxyTrue的代理挂载需要子服务器那边也刷新。最后把 TaoToken 通道接进来做一次端到端验证。用模型对话页面发一条会触发工具调用的指令比如「帮我查一下 Hangzhou 的天气并统计这句话的词数」。如果模型能正确调用weather_get_forecast和text_word_count并返回结果说明「组合服务器 统一通道」整条链路是通的。模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。验证顺序建议固定成本地 tools/list → 本地 tools/call → 接 TaoToken 端到端。哪一步断了就停在哪一步排查别跳。5. 常见报错排查401、local proxy failed、reading choices、OAuth组合服务器 统一通道这套组合报错集中在四个地方。我按真实遇到的顺序列出来对照着查。401 Unauthorized。九成是 Key 的问题。先确认config.toml或 JSON 里的api_key没有多余空格再确认这把 Key 是在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 生成的、且没过期。还有一种情况是 Base URL 写成了带路径的完整地址正确写法是根地址https://taotoken.net/api不要自己拼/v1/chat/completions之类。401 出现时先用模型对话页面单独测 Key能通就说明是 MCP 配置里字段名写错了。local proxy failed。这个通常出现在代理挂载as_proxyTrue或者客户端走本地代理转发时。排查三步一看子服务器进程是否还活着代理挂载依赖子服务器生命周期二看端口有没有被占用lsof -i :8765确认三看mount时前缀是否和请求里的前缀一致前缀对不上会走到空路由。如果是跨进程代理挂载还要确认子服务器的启动命令路径是绝对路径相对路径在代理模式下经常找不到。reading choices 相关报错。这类报错一般出现在模型返回体解析阶段根因是返回结构和你客户端预期的协议不一致。比如你用 Anthropic 协议的客户端去请求了 OpenAI 兼容格式的返回或者 Model ID 填错导致返回体里没有choices字段。解决方式确认客户端协议和 Base URL 匹配确认 Model ID 是实际开通的。如果返回体里字段名对不上先别改代码先用模型对话页面看原始返回长什么样。OAuth 报错。如果你在 Claude Code 或类似客户端里看到 OAuth 相关提示多半是客户端在尝试走它默认的登录流程而不是用你配的 Key。这时候要检查配置里是否显式写了apiKey字段以及是否把认证方式设成了 API Key 模式。有些客户端需要你在设置里手动切换认证方式光填 Key 不够。Codex 的auth.json里要确保OPENAI_API_KEY或对应字段填的是 TaoToken 的 Key而不是残留的旧值。再补一个组合技术特有的坑import_server漏写await。表现是工具列表里完全没有子服务器的工具但也不报错。看到「导入成功但工具没出现」第一反应就是检查 await。排查完记得回到验证顺序tools/list 通了再测 tools/call本地通了再接 TaoToken。跳步排查会浪费大量时间。6. 组合策略怎么选以及统一入口的长期价值把两种机制的选择标准再收拢一下方便你以后直接查场景推荐方式原因第三方 API 封装、稳定算法import_server静态复制不受子服务变更影响实时数据服务、频繁加工具mount动态链接子服务更新即时可见跨进程、跨节点集成mount as_proxyTrue保留子服务生命周期走客户端接口通信需要统一鉴权和日志组合 TaoToken 通道一个 Base URL、一把 Key、一条日志线前缀命名建议按功能域来比如weather_、text_、db_、ml_别用s1_、s2_这种无语义前缀。import 的时候记一下子服务器的版本方便回溯。同进程高频调用用直接挂载跨进程用代理挂载这是性能上的分水岭。长期看组合服务器的价值不只是「少配几个条目」。它把 MCP 从「一个服务一个入口」推进到「一个入口多个模块」这才是模块化 AI 应用该有的样子。你后面要加新工具域只需要写一个新的子服务器import 或 mount 进主服务器客户端那边一行都不用改。配合 TaoToken 的统一通道鉴权、模型、日志都收敛到一个出口维护成本会随着服务数量增加而摊薄而不是线性上涨。如果你还没生成 Key现在就可以去 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 拿一把把上面那份config.toml里的占位符替换掉跑一遍 tools/list。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到协议细节可以对照查。先把一个主服务器 两个子服务器跑通再往上叠模块这条路会顺很多。

相关新闻

WorkBuddy+网安——用AI辅助搭建漏洞挖掘学习环境

WorkBuddy+网安——用AI辅助搭建漏洞挖掘学习环境

WorkBuddy网安——用AI辅助搭建漏洞挖掘学习环境 很多想学网络安全的朋友,上来就被厚厚的专业书和一堆看不懂的命令劝退了。网上的教程又多又杂,根本不知道从哪开始——这就是典型的信息差。 其实WorkBuddy不仅能写文案、做办公,还能当网安…

2026/9/30 23:54:26 阅读更多 →
GitHub Copilot 实战指南:在 VS Code 中配 TaoToken 统一 API 通道的 settings.json 骨架

GitHub Copilot 实战指南:在 VS Code 中配 TaoToken 统一 API 通道的 settings.json 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 23:54:26 阅读更多 →
OpenClaw 常用命令手册:TaoToken 统一 Key 接入与 config.toml 配置骨架

OpenClaw 常用命令手册:TaoToken 统一 Key 接入与 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 23:53:26 阅读更多 →

最新新闻

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱

游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱

游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱Bilibili 同步视频游戏逻辑 vs 游戏引擎,剧本和摄影机的区别现代游戏引擎都包含哪些模块?游戏编辑器:游戏开发者的工作台数学,游戏引擎的内功根基需要重点掌握的数学知…

2026/9/30 23:59:29 阅读更多 →
中科院青藏高原所李新团队提出 READY 框架|地学数据光“开放共享”还不够,得先过“AI 就绪”这道关

中科院青藏高原所李新团队提出 READY 框架|地学数据光“开放共享”还不够,得先过“AI 就绪”这道关

近日,中国科学院青藏高原研究所、国家青藏高原科学数据中心联合国内多个地学数据中心科研人员,系统提出了“人工智能就绪地球科学数据(AI-ready geoscience data)”的定义框架与实现路径。当前,“人工智能就绪数据&…

2026/9/30 23:59:29 阅读更多 →
智能车竞赛芯片选型指南:从主频、资源到双核与生态的决策链

智能车竞赛芯片选型指南:从主频、资源到双核与生态的决策链

1. 为什么第十五届的“芯片选型”忽然成了所有人绕不开的话题从第十五届备赛周期开始,智能车竞赛里的一个趋势变得非常明显:你打开官方通知后,第一件事不再是去翻上届学长传下来的代码,而是先去看“主控芯片”那一栏还能不能沿用老…

2026/9/30 23:59:29 阅读更多 →
MCP Kubernetes Server 实战:用 TaoToken 统一 Key 打通集群管理工具链

MCP Kubernetes Server 实战:用 TaoToken 统一 Key 打通集群管理工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 23:59:29 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →