1. 零基础也能跑通的 MCP 本地工具服务
MCP(Model Context Protocol)说白了就是给大模型装一个「标准插座」:模型不用关心你的工具是 Python 写的还是 Go 写的,只要按协议暴露能力,它就能调用。这篇要带你从零搭一个能被 Cline 调用的本地工具服务,技术栈是 Python + FastAPI + uvicorn + pydantic,最后在 Cline 的 settings.json 里接入 TaoToken 统一 Key,让整条调用链真正跑起来。
适合谁看:写过一点 Python、听说过 MCP 但没动手、想让 AI 编辑器调用自己本地接口的人。全程不需要你懂协议细节,我会把可复制的骨架、配置片段、验证动作一条条列出来,你照着敲就能看到结果。
整条链路是这样的:Cline 作为 MCP 客户端,读取 settings.json 里的服务配置,启动你本地的 FastAPI 服务,通过 stdio 或 HTTP 把工具列表告诉模型;模型决定调用哪个工具后,请求打到你的 FastAPI 接口,接口返回 JSON,模型再组织成人话回复你。理解这条链路,后面每一步就都有位置感了。
2. 前置准备:TaoToken 统一 Key 与 API 通道
在写代码之前,先把「模型侧」的通道准备好。Cline 本身只是个客户端,它需要一个大模型来驱动,这里用 TaoToken 的统一 Key 来打通,好处是一个 Key 走通对话、编码、Agent 多种场景,不用在多个平台之间来回切。
你需要做两件事:注册并拿到 API Key,然后记住两个地址。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基地址是 https://taotoken.net/api (这个不加 UTM)。拿到 Key 后先别急着填,后面配置 Cline 时会用到。
提示:Key 属于敏感信息,建议放在环境变量或本地配置文件里,不要直接提交到 Git 仓库。Cline 的 settings.json 如果放在项目目录,记得加进 .gitignore。
如果你还没创建 Key,可以进控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 生成;想先看看模型对话效果,也可以直接在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 里试几句,确认通道是通的,再回来搭本地服务。
3. 可复制配置:FastAPI 工具服务骨架
3.1 环境与依赖
先建目录、建虚拟环境,把依赖钉在 requirements.txt 里。版本不用完全一致,但建议 Python 3.10 以上。
mkdir mcp-local-tool && cd mcp-local-tool python -m venv .venv # Windows .venv\Scripts\activate # Mac/Linux source .venv/bin/activatefastapi==0.110.0 uvicorn==0.29.0 pydantic==2.6.4 httpx==0.27.0pip install -r requirements.txt3.2 FastAPI 服务骨架
下面这个 server.py 是一个最小可用工具服务,暴露两个接口:一个查当前时间,一个做加法。别小看这两个,它们足够验证「模型 → MCP → 本地接口」整条链路。
from fastapi import FastAPI from pydantic import BaseModel from datetime import datetime app = FastAPI(title="MCP Local Tool Server") class AddRequest(BaseModel): a: float b: float class AddResponse(BaseModel): result: float @app.get("/tools") def list_tools(): return { "tools": [ {"name": "get_current_time", "description": "获取当前本地时间"}, {"name": "add_numbers", "description": "计算两个数字之和"}, ] } @app.get("/tools/get_current_time") def get_current_time(): return {"time": datetime.now().isoformat()} @app.post("/tools/add_numbers", response_model=AddResponse) def add_numbers(req: AddRequest): return AddResponse(result=req.a + req.b)启动命令:
uvicorn server:app --host 127.0.0.1 --port 8000 --reload看到Uvicorn running on http://127.0.0.1:8000就说明服务起来了。这里用 pydantic 做请求体校验,参数类型不对会直接返回 422,省得你在接口里手写一堆 if。
3.3 Cline settings.json 配置片段
Cline 的 MCP 配置在 settings.json 里,找到mcpServers字段,加入你的本地服务。下面这段是 HTTP 方式的写法,把 URL 指向你刚启动的 FastAPI:
{ "mcpServers": { "local-tool": { "url": "http://127.0.0.1:8000", "disabled": false, "autoApprove": ["get_current_time", "add_numbers"] } } }同时在 Cline 的模型配置里填入 TaoToken 的通道信息,API Base 用 https://taotoken.net/api ,Key 填你控制台生成的那串。这样模型请求走 TaoToken,工具请求走本地 FastAPI,两条线互不干扰。
注意:如果你的 Cline 版本要求 stdio 方式,需要额外写一个 stdio 适配脚本,把 HTTP 接口包一层。新手先用 HTTP 方式验证,跑通后再考虑 stdio。
4. 验证请求:逐条确认调用链
服务起来、配置填好后,按下面顺序逐条验证,每一步都有明确的预期结果,哪一步不对就停在那排查。
第一步,直接 curl 工具列表,确认服务本身没问题:
curl http://127.0.0.1:8000/tools预期返回包含get_current_time和add_numbers的 JSON。如果这里就失败,说明 FastAPI 没起来或端口被占。
第二步,测加法接口,确认 pydantic 校验和返回结构:
curl -X POST http://127.0.0.1:8000/tools/add_numbers \ -H "Content-Type: application/json" \ -d '{"a": 3, "b": 4}'预期返回{"result":7.0}。如果返回 422,检查字段名和类型是否对得上。
第三步,回到 Cline,在对话里问一句「现在几点了」,观察它是否触发get_current_time工具调用。正常情况你会看到 Cline 显示工具调用过程,然后返回一个时间。这一步成功,说明整条链路通了。
第四步,问「帮我算一下 12.5 加 7.3」,确认模型能选中add_numbers并传对参数。到这里,一个能被 Cline 调用的本地工具服务就完整跑通了。
5. 本篇常见错排查
服务启动报端口占用:8000 被别的进程占了,换--port 8001,同时把 settings.json 里的 URL 一起改掉,两边必须一致。
Cline 里看不到工具:先确认 settings.json 的 JSON 格式没写错,多一个逗号都会导致整个配置失效。再看disabled是不是 true,以及 Cline 是否需要重启才加载新配置。
调用返回 422:pydantic 校验没过。检查请求体字段名、类型,数字别传成字符串。用 curl 单独测接口能快速定位是服务问题还是模型传参问题。
模型不调用工具:确认模型通道是通的,可以在模型对话里先聊两句验证 Key 有效。另外工具描述写清楚一点,模型更容易判断什么时候该调用。
改了代码没生效:uvicorn 加了--reload会自动重载,但如果是改 settings.json,需要重启 Cline 或重新加载 MCP 配置。
6. 把 Key 和工具链固定下来
跑通一次之后,建议把常用配置固化:TaoToken 的 Key 放进环境变量,FastAPI 服务写个启动脚本,settings.json 纳入版本管理但排除敏感字段。这样下次开新项目,复制粘贴就能复用。
如果你后面要做长期编码或 Agent 类任务,可以了解下 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,配合本地 MCP 工具服务,模型能调用的能力会越来越顺手。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,需要的时候直接去对应页面操作就行。
真正踩过的坑是:一开始我把工具描述写得太笼统,模型经常选错工具,后来把 description 改成「获取当前本地时间,返回 ISO 格式字符串」这种具体描述,命中率立刻上来了。工具描述不是写给人看的注释,是写给模型看的说明书,值得多花两分钟。