手把手搭建自定义 MCP 本地服务:stdio 与 sse 模式接入 TaoToken 统一通道
1. 从零理解 MCP 本地服务stdio 与 sse 到底差在哪MCPModel Context Protocol是让大模型调用外部工具的通信协议你可以把它理解成「AI 世界的 USB 接口」——只要按协议把服务端写好任何支持 MCP 的客户端都能即插即用。而自定义 MCP 本地服务就是你自己写一个跑在本机的工具进程让 AI 通过它完成官方工具做不到的个性化计算、数据查询或流程编排。很多人第一次接触 MCP 会卡在传输模式的选择上stdio 和 sse 到底该用哪个简单说stdio 走标准输入输出服务端和客户端在同一台机器上通过管道通信启动快、零网络配置适合本地单机调试sse 走 HTTP 长连接服务端监听端口客户端通过 URL 接入适合多客户端共享、跨进程甚至跨设备调用。两者代码逻辑几乎一样差别只在启动参数和客户端配置。这篇教程面向想自己动手搭 MCP 服务的开发者尤其是用 AI 编程工具做个性化扩展的人。我会从环境准备讲到代码编写再分别演示 stdio 和 sse 两种模式的完整配置最后用 TaoToken 统一通道把 Key 和 API 管起来让 AI 工具调用更省心。全程命令可直接复制踩过的坑我也会标出来。核心检索词先明确MCP 本地服务、stdio 传输、sse 传输、AI 工具个性化调用、TaoToken 统一通道。下面每一步都围绕这几个点展开你跟着做就能跑通。2. 环境准备与 TaoToken 统一通道前置配置动手写代码前先把工具链和 API 通道准备好。MCP 服务本身不依赖大模型但你要让 AI 真正调用它就得有一个能发请求的模型通道。TaoToken 在这里的作用是统一管理 Key 和 API 地址避免你在多个客户端里反复填不同厂商的配置。2.1 安装 uv 包管理工具uv 是新一代 Python 包管理器比 pip 快很多还能统一管理 Python 版本。Windows 下用 PowerShell 执行powershell -ExecutionPolicy Bypass -c irm https://github.com/astral-sh/uv/releases/download/0.9.27/uv-installer.ps1 | iex装完验证uv --version能输出版本号就说明环境变量已自动配好。macOS 或 Linux 用户可以用curl -LsSf https://astral.sh/uv/install.sh | sh逻辑一样。2.2 安装 Python 3.13 并初始化项目MCP SDK 对 Python 3.13 兼容性更好用 uv 一键装uv python install 3.13 uv python list然后建项目目录。我习惯按「根目录 - 项目目录」分层方便后面放多个 MCP 服务mkdir -p D:\AiMcpProject\mcp_server cd D:\AiMcpProject\mcp_server uv init . -p 3.13初始化成功会提示Initialized project mcp-server。接着装 MCP SDKuv add mcp[cli]如果环境特殊用 pip 也行pip install mcp[cli]但 uv 更快且不会有依赖冲突。2.3 配置 TaoToken 统一 Key 与 API 通道TaoToken 的 API 地址是https://taotoken.net/api官网入口在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。你需要先在控制台创建一个 API Key然后把它作为环境变量注入到 MCP 服务或客户端里。推荐做法是在项目根目录建一个.env文件不要提交到 git内容形如TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在 MCP 服务代码里用os.getenv读取。这样 stdio 和 sse 两种模式都能复用同一套 Key切换客户端时不用改代码。如果你用的是 Claude Code 或 Cline 这类工具它们的配置文件里也要填 Base URL、Key、Model ID 三件套后面章节会给出具体片段。注意Key 只存在本地环境变量或客户端配置里不要硬编码进main.py提交到公开仓库。3. 编写 MCP 服务代码stdio 与 sse 可复制配置这一章是核心我会给出完整的main.py然后分别说明 stdio 和 sse 的启动差异。代码里故意把加法结果「多加 1」这样联调时一眼就能看出 AI 是不是真的调用了你的服务而不是模型自己算的。3.1 完整服务端代码from mcp.server import FastMCP import os # 初始化 MCP 服务Demo 是服务标识客户端里会显示这个名字 mcp FastMCP(Demo) # 1. 自定义加法工具ab 后多加 1用于验证服务是否被真实调用 mcp.tool() def add(a: int, b: int) - int: Add two numbers return a b 1 # 2. 动态问候资源通过自定义协议返回个性化内容 mcp.resource(greeting://{name}) def get_greeting(name: str) - str: Get a personalized greeting return fHello, {name}! # 3. 多风格问候提示词为 AI 生成指定风格的问候语提供模板 mcp.prompt() def greet_user(name: str, style: str friendly) - str: Generate a greeting prompt styles { friendly: Please write a warm, friendly greeting, formal: Please write a formal, professional greeting, casual: Please write a casual, relaxed greeting, } return f{styles.get(style, styles[friendly])} for someone named {name}. if __name__ __main__: # 默认 stdio 模式切 sse 时改下面两行 mcp.settings.port 8001 mcp.run(transportstdio)三个装饰器的含义mcp.tool()标记可被 AI 直接调用的函数mcp.resource()标记资源通过自定义 URI 协议访问mcp.prompt()标记提示词模板给 AI 生成内容时提供风格参考。3.2 stdio 模式配置stdio 模式下服务端通过标准输入输出和客户端通信不需要监听端口。启动就是mcp.run(transportstdio)。客户端配置通常是一个 JSON 片段以 Cline 或 Claude Code 的 MCP 配置为例{ mcpServers: { mcp-stdio-add: { command: python, args: [ D:\\AiMcpProject\\mcp_server\\main.py ], env: { TAOTOKEN_API_KEY: sk-你的实际Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }关键点command是启动命令args是脚本路径env里注入 TaoToken 的 Key 和 Base URL。Windows 路径要用双反斜杠或正斜杠。stdio 的优点是启动即用缺点是只能本机、单客户端。3.3 sse 模式配置sse 模式需要监听端口把main.py末尾改成if __name__ __main__: mcp.settings.port 8001 mcp.run(transportsse)启动后服务端会在http://localhost:8001/sse提供 SSE 端点。客户端配置改成 URL 形式{ mcpServers: { mcp-sse-add: { url: http://localhost:8001/sse, env: { TAOTOKEN_API_KEY: sk-你的实际Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }sse 适合多客户端共享同一个服务比如你同时用 Cherry Studio 和另一个 IDE 插件都连同一个端口即可。代价是要管端口占用和防火墙。3.4 两种模式对照维度stdiosse通信方式标准输入输出管道HTTP 长连接是否监听端口否是默认 8001适用场景本地单机调试多客户端共享客户端配置command argsurl启动速度快略慢需等端口就绪跨设备不支持支持需网络可达选哪个取决于你的使用方式自己一个人调试用 stdio团队或多工具共用选 sse。4. 连通性验证从请求到成功结果代码写完不算完得验证 AI 真的调用了你的服务。这一步我会用「13 等于多少」这个经典测试因为正常加法是 4而我们的服务返回 5结果对不上就说明没走你的 MCP。4.1 stdio 模式验证先确认客户端里 MCP 服务已加载。以支持 MCP 的客户端为例添加完上面的 JSON 配置后重启客户端在工具列表里应该能看到mcp-stdio-add和它暴露的add工具。然后输入使用 mcp-stdio-add 工具计算 13 的和如果返回 5说明调用成功。返回 4 则说明模型自己算了没走 MCP。这时候检查三点服务是否真的启动、客户端配置路径是否正确、工具名是否拼对。4.2 sse 模式验证先手动启动服务端cd D:\AiMcpProject\mcp_server uv run main.py看到类似Uvicorn running on http://0.0.0.0:8001的输出就说明端口起来了。然后用 curl 探一下 SSE 端点curl -N http://localhost:8001/sse能持续收到事件流就说明服务正常。接着在客户端里配置url为http://localhost:8001/sse同样输入「使用 mcp-sse-add 工具计算 13 的和」返回 5 即成功。Python 端会打印出接口请求日志方便你确认请求真的到达了服务端。4.3 用 TaoToken 模型对话做二次确认如果你想确认模型通道也正常可以打开 TaoToken 的模型对话页面https://taotoken.net/api对话入口在控制台内发一条普通消息看是否正常返回。模型对话能通说明 Key 和 Base URL 没问题MCP 工具能返回 5说明本地服务没问题。两者都通整条链路就打通了。提示验证阶段建议先用小请求量测试确认无误再接入正式工作流。5. 常见报错排查401、local proxy failed、reading choices、OAuth搭 MCP 服务最容易在配置和网络环节翻车下面这几个报错我基本都遇到过按顺序排查能省不少时间。5.1 401 Unauthorized这是 Key 问题。先检查.env或客户端env里的TAOTOKEN_API_KEY是否填对有没有多余空格或换行。然后确认 Base URL 是https://taotoken.net/api不要漏掉/api或写成带 UTM 的官网地址。如果 Key 是在控制台新建的确认它没有被禁用或过期。401 基本就是「Key 不对或没带上」跟 MCP 代码无关。5.2 local proxy failed这个报错通常出现在客户端尝试连接本地 MCP 服务时。stdio 模式下检查command和args路径是否正确Windows 路径分隔符是否转义sse 模式下检查端口 8001 是否被占用用netstat -ano | findstr 8001看一下。如果服务端没启动客户端自然连不上。另外确认 Python 解释器路径是 uv 环境里的那个而不是系统里另一个版本。5.3 reading choices 相关报错这类报错一般出现在模型返回结构不符合预期时常见原因是 Base URL 配错导致请求打到了非预期端点或者 Model ID 填了一个不存在的模型。检查客户端里 Model ID 是否与 TaoToken 控制台里可用的模型一致。如果用的是 Claude Code 或 Codex 这类工具它们的auth.json或settings.json里要同时写全 Base URL、Key、Model ID 三件套缺一个都可能报解析错误。5.4 OAuth 相关报错部分客户端在首次连接时会走 OAuth 流程如果本地 MCP 服务没有实现对应端点就会失败。解决办法是确认客户端配置里用的是 stdio 或 sse 直连模式而不是需要 OAuth 的托管模式。如果你用的是 Claude Code 的 Anthropic 接入方式确保配置的是本地 MCP 服务地址而非云端 OAuth 地址。遇到 OAuth 报错先看客户端文档里该模式是否需要额外授权步骤。5.5 工具调用返回 4 而不是 5这不是报错但很常见。说明模型没走你的 MCP而是自己算了。排查客户端工具列表里有没有你的服务、工具名是否被正确识别、提示词里是否明确指定了工具名。有时候模型会「偷懒」你需要在提示里强调「必须使用 mcp-stdio-add 工具」。6. 接入 TaoToken 统一通道让 AI 工具个性化调用服务跑通后最后一步是把 TaoToken 统一通道接进来让 Key 和 API 管理更省心。TaoToken 的价值在于一个 Key 走通多个客户端不用每个工具单独配。6.1 统一 Key 的注入方式前面已经在 MCP 配置的env里注入了TAOTOKEN_API_KEY和TAOTOKEN_BASE_URL。如果你有多个 MCP 服务可以把这两个变量放到系统环境变量里所有服务共享。Windows 下用setx TAOTOKEN_API_KEY sk-...macOS/Linux 写进~/.zshrc或~/.bashrc。6.2 在 Claude Code 中接入Claude Code 的 MCP 配置通常在~/.claude/settings.json或项目级配置里。三件套写法{ mcpServers: { mcp-stdio-add: { command: python, args: [D:\\AiMcpProject\\mcp_server\\main.py], env: { TAOTOKEN_API_KEY: sk-你的实际Key, TAOTOKEN_BASE_URL: https://taotoken.net/api } } } }如果你用的是 Anthropic 兼容接入Base URL 填https://taotoken.net/apiModel ID 填控制台里可用的模型名。Claude Code 的 OAuth 模式不适用于本地 MCP直连即可。6.3 在 Cline MCP 中接入Cline 的 MCP 配置在设置面板的 MCP Servers 里格式和上面类似。stdio 用commandargssse 用url。Cline 支持同时挂多个 MCP 服务你可以把 stdio 和 sse 两个都配上按场景切换。6.4 长期编码与 Agent 场景如果你打算把 MCP 服务用于长期编码或 Agent 工作流建议走 Coding Plan 通道配合 TaoToken 的 API Key 做统一鉴权。这样多个 Agent 共享同一套 Key额度和管理都在一个地方。具体入口在控制台的 Coding Plan 页面配置时同样填 Base URL、Key、Model ID 三件套。6.5 验证整条链路最后做一次端到端验证启动 sse 服务端客户端连上输入「使用 mcp-sse-add 工具计算 13 的和」返回 5再打开模型对话页面发一条普通消息正常返回。两条都通说明 MCP 本地服务 TaoToken 统一通道全部就绪。之后你要加新工具只需在main.py里加一个mcp.tool()函数重启服务即可Key 和通道不用动。到这里stdio 和 sse 两种模式的 MCP 本地服务就完整跑通了。实际用下来stdio 适合快速迭代sse 适合多端共享TaoToken 统一通道则帮你把 Key 管理这件事从「每个客户端填一遍」变成「一处配置处处可用」。

相关新闻

链表算法题刷题笔记:虚拟头节点与双指针技巧详解

链表算法题刷题笔记:虚拟头节点与双指针技巧详解

这段时间在跟代码随想录算法训练营的打卡进度,前面几天的内容都整理得还算顺利,结果到第四天这里卡了一下——任务量倒不算大,但恰好撞上春节前后的杂事,硬是把原定1月31日要完成的几道链表题拖到了现在。这篇就当是补卡记录&…

2026/10/15 18:24:38 阅读更多 →
LGAlertView快速上手:10行代码打造你的第一个自定义弹窗(Objective-C与Swift)

LGAlertView快速上手:10行代码打造你的第一个自定义弹窗(Objective-C与Swift)

【免费下载链接】LGAlertView Customizable implementation of UIAlertViewController, UIAlertView and UIActionSheet. All in one. You can customize every detail. Make AlertView of your dream! :) 项目地址: https://gitcode.com/gh_mirrors/lg/LGAlertView…

2026/10/15 18:24:38 阅读更多 →
银行卡BIN码为什么用JSON格式?轻量级金融数据方案

银行卡BIN码为什么用JSON格式?轻量级金融数据方案

简介:本资源是一份面向前端开发者与支付系统工程师的银行卡BIN码验证工具集,解决银行卡号前端实时识别、发卡行匹配及卡类型判断等实际问题。压缩包内含1个核心JSON文件(bankbin.json),以标准键值对结构存储超千条国内…

2026/10/15 18:23:37 阅读更多 →

最新新闻

LED流水灯+蜂鸣器

LED流水灯+蜂鸣器

1、GPIO最常用时钟:RCC_AHBPeriphClockCmd() ; RCC_AHBP2eriphClockCmd() ; RCC_AHBP1eriphClockCmd()GPIO的功能GPIO_DeInit :所有外设都会被复位 GPIO_AFIODeInit :也是复位,是复位AFIO的外设GPIO_Init :用结构体…

2026/10/15 19:06:56 阅读更多 →
售货机屏幕接广告每月多赚800元,但接错了反而亏钱~YH

售货机屏幕接广告每月多赚800元,但接错了反而亏钱~YH

2026年Q2,一个运营商在30台设备的屏幕上接入了广告——每天播放某饮料品牌的促销视频。一个月后,运营商收到了800元/台的广告分成,看起来不错。但同期,这30台设备的销售额平均下降了12%。一、现象:广告收入增加&#x…

2026/10/15 19:06:56 阅读更多 →
教育 AI 小程序开发分析

教育 AI 小程序开发分析

教育 AI 小程序依托微信小程序免安装、即用即走、社交传播便捷的特性,结合大语言模型、OCR 识别、语音评测等 AI 能力,打造轻量化线上学习工具。区别于传统在线教育 APP,教育 AI 小程序降低用户使用门槛,覆盖课前预习、习题解答、…

2026/10/15 19:06:56 阅读更多 →
客户都在问AI“哪家好”了,答案里却没有你:一文讲清AI搜索优化是什么

客户都在问AI“哪家好”了,答案里却没有你:一文讲清AI搜索优化是什么

一、AI搜索优化是什么——让大模型在答案里主动提到你,而不是让用户翻到你的官网AI搜索优化(AIO/GEO),指的是通过内容、信源和数据监测,让豆包、DeepSeek、通义千问、腾讯元宝等生成式引擎在回答用户问题时主动检索、理…

2026/10/15 19:06:56 阅读更多 →
Flutter鸿蒙化适配实践:sql_crdt离线数据同步

Flutter鸿蒙化适配实践:sql_crdt离线数据同步

从“离线优先”这个思路第一次出现在我们内部讨论会上,到最终把 Flutter 三方库 sql_crdt 成功跑通在鸿蒙设备上,整整花了三周。期间踩过的坑、查过的源码、推翻过的方案,我觉得比最终能跑通的结论更有价值。这篇东西不是官方文档翻译&#x…

2026/10/15 19:06:56 阅读更多 →
SAP系统拆分:注意事项与规避做法(下篇)

SAP系统拆分:注意事项与规避做法(下篇)

上篇梳理了拆分项目的风险:模块集成带来的牵连、数据关联被切断、自开发处理工作量被低估、停机窗口受交易时间表约束、合规敞口放大、跨部门协同吃紧、测试被压缩,以及源系统遗留数据的处理。 本篇说明相应的规避做法,按启动前、执行中、上线…

2026/10/15 19:05:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/15 9:49:14 阅读更多 →