1. 为什么要在 Cline 里接本地 MCP Server
MCP(Model Context Protocol)说白了就是一套“模型怎么调用外部工具”的约定。它把工具名、参数结构、返回格式都标准化,模型负责判断该用哪个工具,Cline 这类 Agent 负责真正发起调用,再把结果回传给模型。你不需要改模型本身,只要把本地写好的 Server 注册进客户端,就能让 DeepSeek 这类模型“长出手脚”。
我这次要跑通的链路是:本地用 uvx + fastmcp 起一个 MCP Server,Cline 作为客户端读取cline_mcp_settings.json,模型通道统一走 TaoToken 的 Key/API,这样模型调用和工具调用各走各的、互不干扰。适合已经在用 Cline 写代码、想让模型读本地文件或调本地脚本的人,也适合刚接触 MCP、想先跑通一条最小链路再扩展的开发者。
整条链路分三段:Server 端(fastmcp 写工具)、客户端配置(Cline 的 json 骨架)、模型通道(TaoToken 统一 Key)。下面按可复制的顺序来。
2. TaoToken 前置:把模型通道先固定下来
在配 MCP 之前,先把模型通道固定,否则后面排错时分不清是工具没起来还是模型没通。TaoToken 在这里的作用是统一 Key 和 API 入口,Cline 里填一次,模型对话和后续 coding 都复用同一个通道。
先到控制台建一个 Key:打开 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,在 API Keys 页面点创建,复制出来形如sk-xxxx的字符串。这个 Key 只显示一次,先存到本地临时文件里。
API 入口用 https://taotoken.net/api ,注意这个地址不带任何查询参数,Cline 的 Base URL 就填它。模型名按你实际要用的填,比如deepseek-chat或deepseek-reasoner,具体以文档页为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
注意:Key 不要写进会提交到 Git 的配置文件。Cline 的 settings 存在用户目录下,一般不会进仓库,但 MCP 的 json 如果放在项目里就要小心。
如果你后面要长期跑编码任务或 Agent 循环,可以看下 Coding Plan 的额度说明:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,按调用量选比单次充值更稳。
3. 可复制配置:uvx + fastmcp 起 Server,Cline 读 json
3.1 装 uv 和 uvx
uvx 是 uv 自带的子命令,作用类似 npx:在临时隔离环境里跑一个 PyPI 包提供的命令行工具,不污染你现有的 Python 环境。先装 uv:
pip install uv -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple验证 uvx 可用:
uvx pycowsay 'hello world'能打印出一头牛说明 uvx 正常。如果提示uv: command not found,多半是 pip 装的脚本目录没进 PATH,用python -m uv --version先确认包在,再把~/.local/bin加进 PATH。
3.2 写一个最小 fastmcp Server
新建目录mcp_demo,在里面写server.py。这个 Server 只暴露一个工具,返回传入文本的长度,方便验证链路:
from fastmcp import FastMCP mcp = FastMCP("demo") @mcp.tool() async def text_length(text: str) -> str: """返回输入文本的字符数。 Args: text: 要统计的文本 """ return f"length={len(text)}" if __name__ == "__main__": mcp.run(transport="stdio")@mcp.tool()装饰器会把函数转成 MCP 协议里的 tool 描述,包含 name、description、inputSchema。Cline 启动时会向 Server 要tools/list,拿到的就是这些结构。
3.3 Cline 的 MCP 配置骨架
在 Cline 面板点 MCP Servers,再点 Configure MCP Servers,会打开cline_mcp_settings.json。第一次是空的,填入:
{ "mcpServers": { "demo": { "command": "uv", "args": [ "--directory", "/绝对路径/mcp_demo", "run", "server.py" ], "transportType": "stdio", "timeout": 60, "disabled": false } } }字段含义:command是启动命令,args是参数数组,--directory指定工作目录,run server.py表示执行脚本,transportType用 stdio 走标准输入输出,timeout是握手超时。等价于 Cline 在后台执行:
uv --directory /绝对路径/mcp_demo run server.py3.4 Cline 的 settings.json 片段
模型通道在 Cline 的 Settings 里配,对应settings.json的关键片段如下(字段名以你装的 Cline 版本为准,思路一致):
{ "apiProvider": "openai", "openAiBaseUrl": "https://taotoken.net/api", "openAiApiKey": "sk-你的Key", "openAiModelId": "deepseek-chat" }Base URL 用 TaoToken 的 API 入口,Key 用第 2 步建的,模型 ID 按文档填。这样模型请求走 TaoToken,MCP 工具请求走本地 stdio,两条链路分开,排错时能快速定位是哪一段出问题。
4. 验证请求:从握手到工具返回
4.1 先手动跑 Server
在终端直接执行:
uv --directory /绝对路径/mcp_demo run server.py如果卡住不退出、没有报错,说明 Server 正常在等 stdio 输入。按 Ctrl+C 退出。这一步能过,说明 uvx/fastmcp 环境没问题。
4.2 在 Cline 里重连
回到 Cline 的 MCP Servers 面板,找到demo,点 Reconnect。两个指示灯变绿表示连接成功。如果显示 Error,先看第 5 节的排查。
4.3 发一条自然语言请求
在 Cline 对话框输入:
请用 demo 工具统计 "hello mcp" 的字符数正常流程是:Cline 把问题和工具列表一起发给模型,模型判断要调text_length,Cline 发起tools/call,Server 返回length=9,模型再组织成自然语言回复。你最终看到类似“hello mcp 共 9 个字符”。
4.4 用测试客户端确认协议层
如果想确认协议层没问题,可以写个最小客户端直接发 JSON-RPC:
import subprocess, json proc = subprocess.Popen( ["uv", "--directory", "/绝对路径/mcp_demo", "run", "server.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True, ) def call(obj): proc.stdin.write(json.dumps(obj) + "\n") proc.stdin.flush() return json.loads(proc.stdout.readline()) call({"method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {}, "clientInfo": {"name": "test", "version": "1.0"}}, "jsonrpc": "2.0", "id": 0}) proc.stdin.write(json.dumps({"method": "notifications/initialized", "jsonrpc": "2.0"}) + "\n") proc.stdin.flush() print(call({"method": "tools/list", "jsonrpc": "2.0", "id": 1})) print(call({"method": "tools/call", "params": {"name": "text_length", "arguments": {"text": "hello mcp"}}, "jsonrpc": "2.0", "id": 2})) proc.terminate()能打印出 tools 列表和length=9的结果,说明 Server 端完全正常,问题只可能在 Cline 配置或模型通道。
5. 本篇常见错排查
spawn uv ENOENT:Cline 找不到 uv 命令。原因是 GUI 启动的 VSCode 没继承终端 PATH。解决办法是在终端里用code .启动 VSCode,让环境变量正确加载,再点 Reconnect。
uvx 下载工具失败:临时环境拉包超时。手动预装一次:
uvx mcp-server-fetch --index-url https://pypi.tuna.tsinghua.edu.cn/simpletools/list 返回空:检查@mcp.tool()是否加在函数上,函数是否是 async,mcp.run是否在__main__里。少一个都会导致工具注册不上。
模型不调用工具:先确认 Cline 的模型通道能正常对话(发个 “hi” 看有没有回复)。如果模型通了但不用工具,多半是工具 description 太模糊,把 docstring 写清楚参数含义。
Key 报 401:检查 Base URL 是否误加了路径后缀,TaoToken 的 API 入口就是https://taotoken.net/api,Key 是否复制完整、有没有多余空格。
stdio 卡死:Server 里如果有print调试语句,会污染 stdout 导致协议解析失败。调试信息一律走 stderr。
6. 把链路固定下来,再往上加工具
跑通这条最小链路后,你可以把text_length换成真正要用的工具,比如读本地文件、查数据库、调内部接口。配置骨架不用动,只改server.py里的工具函数和cline_mcp_settings.json里的路径。
模型通道这边,Key 和 Base URL 建一次就复用,后续加工具不用重新配。需要新建或轮换 Key 时到 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 操作;接入细节和字段说明看 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ;想先在网页里验证模型是否正常,用模型对话页 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 发一条消息即可。长期跑编码和 Agent 任务的话,Coding Plan 的额度比单次充值更省心:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
一个实用习惯:每加一个新工具,先在终端手动跑一次 Server,再用测试客户端发tools/list确认注册成功,最后才去 Cline 点 Reconnect。这样出问题时你能立刻知道是 Server 端还是客户端配置,省掉大量来回试的时间。