首页/新闻资讯/正文详情

一文带大家了解关于MCP的完整Hello World示例:用TaoToken统一Key跑通JSON-RPC全链路

发布时间:2026/9/27 19:23:27 来源:云帆数科 栏目:资讯中心
一文带大家了解关于MCP的完整Hello World示例:用TaoToken统一Key跑通JSON-RPC全链路
1. 从零跑通 MCP Hello World为什么你总在第一步卡住MCPModel Context Protocol这两年被聊得很多但真正动手写一个最小可运行示例时很多人会卡在几个很具体的地方JSON-RPC 的握手格式写错、工具注册后客户端找不到、本地 Server 起来了但 AI 工具侧连不上。我自己第一次搭的时候光是把initialize请求的protocolVersion字段对齐就折腾了半小时。这篇内容面向 Python 开发者目标很明确从零搭一个本地 MCP Server 和 Client走通 JSON-RPC 握手、工具注册、工具调用这条完整链路最后用 TaoToken 的统一 Key 把 AI 工具侧接进来。你会拿到可复制的config.toml和settings.json骨架以及每一步的启动命令和验证动作。适合谁适合已经知道 MCP 大概是什么、但还没亲手跑通过一个 Hello World 的人。如果你连 MCP 的基本概念都还没建立建议先补一下协议层的背景再回来跟着敲代码。整条链路其实就三件事Server 暴露工具、Client 按 JSON-RPC 2.0 发请求、AI 工具侧通过统一通道调用。下面按这个顺序拆开讲每一步都给可复制的代码和验证方式。2. TaoToken 前置准备统一 Key 与 API 通道在写代码之前先把 AI 工具侧的接入通道准备好。MCP 的 Server 和 Client 是本地跑但真正让模型去调用工具时需要一个稳定的 API 通道。TaoToken 在这里的角色是提供统一的 Key 和 API 入口省去你在多个模型供应商之间来回切换配置的麻烦。你需要做两件事拿到 API Key确认 API 地址。API 地址是https://taotoken.net/api这个不加任何参数直接作为 base URL 用。Key 的获取在控制台的 API Keys 页面登录后新建一个即可。注意Key 只显示一次复制后存到环境变量里别硬编码进代码提交到仓库。拿到 Key 之后建议先做一次最小验证确认通道是通的。用 curl 发一个最简单的请求export TAOTOKEN_API_KEY你的Key curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY如果返回模型列表的 JSON说明 Key 和通道都没问题。这一步别跳过后面 MCP Client 调不通时你能快速判断是协议层的问题还是通道层的问题。对于长期做编码或 Agent 场景的可以考虑 Coding Plan它在调用频次和额度上更适合持续开发。如果只是验证模型对话用模型对话页面直接测就行。接入文档里有完整的参数说明遇到字段不确定时对着查。3. 可复制配置MCP Server 与 Client 骨架这一节给完整的可运行代码。先装依赖pip install jsonrpcserver requestsPython 3.7 即可。下面分 Server 和 Client 两部分。3.1 MCP Server工具注册与 JSON-RPC 握手Server 的核心是用method装饰器注册工具然后通过serve启动监听。这里我加了一个initialize方法用来模拟 MCP 的握手流程因为真实场景下 Client 第一步就是发initialize。# mcp_server.py from jsonrpcserver import method, Success, Result, serve method def initialize(context: dict) - Result: MCP 握手返回协议版本与能力声明 return Success({ protocolVersion: 2024-11-05, capabilities: {tools: {}}, serverInfo: {name: hello-mcp, version: 0.1.0} }) method def hello_world(context: dict) - Result: MCP 工具返回 Hello World return Success({message: Hello, MCP World!}) method def list_tools(context: dict) - Result: 动态工具发现列出可用工具 return Success({ tools: [{ name: hello_world, description: 返回欢迎信息, params: {} }] }) if __name__ __main__: print(MCP 服务端已启动监听端口 5000...) serve(port5000, methods[initialize, hello_world, list_tools])三个方法各司其职initialize负责握手hello_world是业务工具list_tools支持动态发现。返回结构必须用Success({...})包一层这是jsonrpcserver库的要求直接返回 dict 会导致序列化失败。3.2 MCP Client按 JSON-RPC 2.0 发请求Client 侧严格遵循 JSON-RPC 2.0 格式请求体包含jsonrpc、method、params、id四个字段。# mcp_client.py import requests MCP_ENDPOINT http://localhost:5000 def call_mcp(method_name: str, params: dict None, req_id: int 1) - dict: payload { jsonrpc: 2.0, method: method_name, params: params or {}, id: req_id } resp requests.post( MCP_ENDPOINT, jsonpayload, headers{Content-Type: application/json} ).json() if result in resp: return resp[result] return {error: resp.get(error, {}).get(message, unknown)} if __name__ __main__: # 第一步握手 init call_mcp(initialize, {context: {client: demo}}, 1) print(握手结果:, init) # 第二步发现工具 tools call_mcp(list_tools, {context: {}}, 2) print(可用工具:, tools) # 第三步调用工具 result call_mcp(hello_world, {context: {user: demo}}, 3) print(工具调用结果:, result)call_mcp做了统一封装id递增用来区分请求。实际协议里id用于匹配请求和响应这里简单递增即可。3.3 config.toml 与 settings.json 骨架如果你用的是支持 MCP 的编辑器或工具通常需要一份配置文件。config.toml骨架[mcp] enabled true endpoint http://localhost:5000 protocol_version 2024-11-05 [mcp.tools] hello_world { enabled true, description 返回欢迎信息 } [ai] provider taotoken api_base https://taotoken.net/api api_key_env TAOTOKEN_API_KEYsettings.json骨架{ mcpServers: { hello-mcp: { url: http://localhost:5000, transport: http, tools: [hello_world, list_tools] } }, ai: { baseUrl: https://taotoken.net/api, apiKeyEnv: TAOTOKEN_API_KEY } }这两份配置的作用是把本地 MCP Server 注册到工具侧同时把 AI 通道指向 TaoToken。api_key_env指向环境变量名避免明文写 Key。4. 验证请求启动命令与成功结果配置和代码都齐了现在按顺序跑一遍。先启动 Serverpython mcp_server.py # 输出MCP 服务端已启动监听端口 5000...另开一个终端跑 Clientpython mcp_client.py预期输出握手结果: {protocolVersion: 2024-11-05, capabilities: {tools: {}}, serverInfo: {name: hello-mcp, version: 0.1.0}} 可用工具: {tools: [{name: hello_world, description: 返回欢迎信息, params: {}}]} 工具调用结果: {message: Hello, MCP World!}看到Hello, MCP World!就说明整条 JSON-RPC 链路通了。如果只想快速验证单个工具也可以用 curlcurl -X POST http://localhost:5000 \ -H Content-Type: application/json \ -d {jsonrpc:2.0,method:hello_world,params:{context:{user:demo}},id:1}返回{jsonrpc: 2.0, result: {message: Hello, MCP World!}, id: 1}即为成功。这一步验证的是协议层。通道层的验证在前面第 2 节已经做过。两层都通说明 MCP 的 Hello World 完整流程跑通了。5. 本篇常见错排查跑不通的时候按下面几个方向查基本能覆盖 90% 的问题。握手失败返回 method not found。检查 Server 是否注册了initialize方法。有些教程只注册业务工具Client 第一步握手就会失败。methods列表里要把initialize加进去。返回 400 或解析错误。大概率是请求体格式问题。JSON-RPC 2.0 要求jsonrpc字段必须是字符串2.0不是数字2.0。另外params如果是空对象也要写成{}不能省略。Client 报 Connection refused。Server 没起来或者端口被占用。先确认python mcp_server.py的输出再用lsof -i :5000看端口状态。端口冲突就换一个Client 侧的MCP_ENDPOINT同步改。工具调用返回 error 但握手正常。检查方法名是否和 Server 注册的一致。method装饰器默认用函数名作为方法名如果你在 Client 里写的是helloWorld而 Server 是hello_world就会找不到。AI 工具侧连不上 MCP Server。确认settings.json里的url和 Server 实际监听地址一致。如果工具跑在容器里localhost可能指向容器内部需要换成宿主机的实际地址。TaoToken 通道返回 401。Key 没设置或环境变量名对不上。确认TAOTOKEN_API_KEY已经 export且api_base是https://taotoken.net/api不要多加路径。提示排查时先分层。协议层的问题看 Server 日志和 curl 返回通道层的问题看 Key 和 base URL。两层分开查比混在一起猜快得多。6. 把 Hello World 扩展成真实工具Hello World 跑通之后扩展方式很直接在 Server 侧加新的method方法在list_tools里补上元数据Client 侧改方法名和参数即可。比如加一个查询工具method def query_data(context: dict, sql: str) - Result: if context.get(auth_token) ! SECRET_123: return Success({status: error, message: Permission denied}) # 这里替换成你的真实查询逻辑 return Success({status: success, data: [{id: 1, name: demo}]})Client 调用时把method换成query_dataparams里带上sql和context。AI 模型侧只需要生成标准化的参数不用关心底层连接细节。长期做编码或 Agent 场景的话Coding Plan 在持续调用上更合适配合接入文档把参数对齐基本就能把 MCP 工具链稳定跑起来。验证模型对话行为时用模型对话页面直接测比在代码里反复改快。Key 管理在 API Keys 页面建议按项目分 Key方便排查和轮换。整条链路的核心就一句话Server 注册工具Client 按 JSON-RPC 2.0 调用AI 工具侧通过统一通道接入。把 Hello World 跑通剩下的就是替换工具逻辑。

相关推荐

2026年05月22日最热门的开源项目(Github):用TaoToken统一Key跑通TypeScript/Python/Rust三语言Demo
2026年05月22日最热门的开源项目(Github):用TaoToken统一Key跑通TypeScript/Python/Rust三语言Demo

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

Claude Code接DeepSeek后,缺的那块Web搜索我补上了:TaoToken统一Key配置与MCP搜索验证
Claude Code接DeepSeek后,缺的那块Web搜索我补上了:TaoToken统一Key配置与MCP搜索验证

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

大模型项目从Demo到上线:TaoToken统一Key通道下的权限与日志配置骨架
大模型项目从Demo到上线: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/27 19:22:56

新手专属:OpenClaw 一键部署,几分钟搭建运行环境(TaoToken 配置版)
新手专属:OpenClaw 一键部署,几分钟搭建运行环境(TaoToken 配置版)

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

如何改wordpress文章模板:避免被黑挂马的完整流程
如何改wordpress文章模板:避免被黑挂马的完整流程

如何改wordpress文章模板:避免被黑挂马的完整流程 网站突然打不开,或者页面底部多了几个奇怪的弹窗链接,点开全是博彩广告?别慌,这通常不是运气差,而是你的WordPress文章模板存在严重的安全漏洞,导致被黑挂马。很多老板发现网站被黑… · 2026/9/27 19:54:30

蓝牙芯片驱动开发-第9章第4题-在RTOS下驱动移植中如何实现硬件抽象层的可靠性
蓝牙芯片驱动开发-第9章第4题-在RTOS下驱动移植中如何实现硬件抽象层的可靠性

蓝牙面试题解析:在 RTOS 下驱动移植中,如何实现硬件抽象层的可靠性? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、RTOS 驱动移植 | 高频:🔥🔥🔥🔥 标准答案 RTOS 下的 HAL 可靠性通过 线程安全封装 + 超时保护 + 错误恢复 + 统一接口 实现: ① 线程安全封装 /… · 2026/9/27 19:54:24

蓝牙芯片驱动开发-第9章第5题-Android蓝牙HAL层对接中初始化流程的关键步骤是什么
蓝牙芯片驱动开发-第9章第5题-Android蓝牙HAL层对接中初始化流程的关键步骤是什么

蓝牙面试题解析:Android 蓝牙 HAL 层对接中,初始化流程的关键步骤是什么? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、Android 蓝牙开发 | 高频:🔥🔥🔥🔥 标准答案 Android 蓝牙 HAL 初始化流程遵循 加载 HAL → 打开设备 → 设置回调 → 初始化协议栈 四步: … · 2026/9/27 19:54:24

蓝牙芯片驱动开发-第9章第2题-如何设计Linux蓝牙子系统中的硬件抽象层接口
蓝牙芯片驱动开发-第9章第2题-如何设计Linux蓝牙子系统中的硬件抽象层接口

蓝牙面试题解析:如何设计 Linux 蓝牙子系统中的硬件抽象层接口? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、Linux 驱动开发 | 高频:🔥🔥🔥🔥 标准答案 HAL 接口设计遵循 统一抽象、最小化、可扩展 原则,定义一组通用的硬件操作回调: ① 接口设计原则 // HAL… · 2026/9/27 19:54:18

蓝牙芯片驱动开发-第9章第3题-BlueZ内核模块集成的关键步骤有哪些
蓝牙芯片驱动开发-第9章第3题-BlueZ内核模块集成的关键步骤有哪些

蓝牙面试题解析:BlueZ 内核模块集成的关键步骤有哪些? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、Linux 蓝牙驱动集成 | 高频:🔥🔥🔥🔥 标准答案 BlueZ 内核模块集成遵循 内核配置 → 模块编译 → 设备绑定 → 验证 四步流程: ① 完整集成流程 // Step 1: 内… · 2026/9/27 19:54:18

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码