☰
MCP服务搭建流程实战:用fastmcp在Claude Desktop跑通第一个Python工具
2026/10/9 19:29:02 网站建设 项目流程

1. 从零理解 MCP 服务搭建:fastmcp 到底解决了什么问题

如果你最近在折腾 Claude Desktop,大概率会看到一个词反复出现:MCP。它的全称是 Model Context Protocol,简单说就是一套让大模型能调用外部工具的通信规范。以前你想让 Claude 读一个本地文件,只能手动复制粘贴;有了 MCP 之后,Claude 可以自己决定去调用你写的工具函数,把结果拿回来继续推理。

而 fastmcp 是这套协议在 Python 生态里最省心的实现。它把协议层的握手、序列化、stdio 通信全部封装掉,你只需要写普通的 Python 函数,加一个装饰器,就能变成一个 Claude Desktop 能识别的工具。对于零基础读者来说,这意味着你不需要理解 JSON-RPC 的报文格式,也不需要手写 schema,专注在业务逻辑上就行。

这篇内容面向的是完全没接触过 MCP 的人。我会带你从环境准备开始,写一个能列出目录、读取文件的 Python 工具服务,然后配置到 Claude Desktop 里,最后用真实对话验证它被正确调用。整个过程你都可以直接复制粘贴,遇到报错我也会把排查路径写清楚。

先明确一下我们要做的东西:一个本地运行的 Python 脚本,通过 stdio 和 Claude Desktop 通信,对外暴露两个工具——list_directory和read_file。Claude 在对话中判断需要读文件时,会自动调用这两个函数。你不需要开端口,不需要部署服务器,一切都在本机完成。

在开始之前,你需要确认三件事:本机装了 Python 3.10 或更高版本、装了 Claude Desktop 客户端、有一个能编辑文本的编辑器。Python 版本很关键,fastmcp 依赖的一些类型注解特性在 3.9 以下会报错。你可以用python --version确认一下。

我试过在 Windows 和 macOS 上各跑一遍,流程基本一致,差异主要在配置文件路径和 Python 可执行文件的写法上。下面我会把两个系统的差异都标出来,你按自己的系统对号入座即可。

2. TaoToken 前置准备:给 MCP 工具接上模型能力

在正式写 MCP 服务之前,有一个容易被忽略的前置环节:你的 Claude Desktop 本身需要能正常调用模型。如果你用的是官方客户端并且已经登录,这一步可以跳过;但如果你希望通过 API 的方式接入,或者想在自己的脚本里测试工具逻辑,就需要先准备好模型访问凭证。

TaoToken 在这里的角色是提供统一的模型接入入口。它的 API 地址是https://taotoken.net/api,你可以在控制台里创建 API Key,然后用在支持自定义 Base URL 的客户端里。对于 MCP 场景来说,这个前置准备的意义在于:当你想脱离 Claude Desktop 单独调试工具函数时,可以用一个最小的 Python 脚本来模拟模型调用,确认工具返回的数据格式是对的。

具体操作上,你先访问控制台创建一个 Key,然后在需要的地方填入三件套:Base URL、API Key、Model ID。Base URL 填https://taotoken.net/api,Model ID 根据你实际要用的模型填写。如果你只是想让 Claude Desktop 调用本地 MCP 工具,这一步不是必须的,因为 Claude Desktop 自己会处理模型调用;但如果你打算写自动化脚本或者做批量测试,提前把 Key 准备好会省很多事。

这里要提醒一点:MCP 服务和模型 API 是两回事。MCP 服务负责“提供工具”,模型负责“决定调用哪个工具”。两者通过 Claude Desktop 这个宿主连接起来。所以你在配置 MCP 的时候,不需要在 MCP 脚本里写任何 API Key,Key 是给宿主或者你自己的测试脚本用的。

如果你后续想用 Coding Plan 来做长期的编码辅助,或者想把 MCP 工具接入到自己的 Agent 流程里,可以先把 Key 创建好放着。接入文档里有不同客户端的配置示例,包括 Claude Code、Cline 这些,你可以对照着看。模型对话页面也可以直接测试 Key 是否可用,省得在配置文件里反复试错。

3. 可复制配置:fastmcp 服务模板与 Claude Desktop 接入片段

这一节是核心,我会给出完整的文件结构和配置内容。你新建一个文件夹,比如叫mcp-demo,在里面创建两个文件:requirements.txt和file_server.py。

先看依赖文件。内容很简单,一行就够:

fastmcp>=0.1.0

然后在终端里执行安装:

pip install -r requirements.txt

如果你用的是虚拟环境,先激活再装。装完之后可以用pip show fastmcp确认版本。

接下来是服务端代码。我把完整内容贴出来,你可以直接复制到file_server.py:

#!/usr/bin/env python3 import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') from mcp.server.fastmcp import FastMCP import os from pathlib import Path mcp = FastMCP("文件系统管理器") @mcp.tool() def list_directory(path: str = ".") -> str: target_path = Path(path) if os.path.isabs(path) else Path.home() / path if not target_path.is_dir(): return "错误:路径不存在或不是目录" items = [f.name for f in target_path.iterdir()] return f"目录 {target_path} 中的内容:\n" + "\n".join(items) @mcp.tool() def read_file(file_path: str) -> str: path = Path(file_path) if not path.is_file(): return "错误:文件不存在" try: with open(path, 'r', encoding='utf-8') as f: return f.read() except Exception as e: return f"读取文件出错:{e}" if __name__ == "__main__": mcp.run(transport="stdio")

这段代码做了三件事:创建 MCP 实例、用@mcp.tool()装饰器注册两个工具、以 stdio 模式启动服务。注意开头那三行强制 UTF-8 输出的代码,这是为了避免 Windows 终端下 GBK 编码导致的崩溃,后面排障部分会详细说。

然后是 Claude Desktop 的配置文件。路径按系统区分:

macOS 是~/Library/Application Support/Claude/claude_desktop_config.json,Windows 是%APPDATA%\Claude\claude_desktop_config.json,Linux 是~/.config/Claude/claude_desktop_config.json。

配置内容如下,你需要把路径替换成自己机器上的实际路径:

{ "mcpServers": { "file-server": { "command": "python3", "args": ["/你的完整路径/mcp-demo/file_server.py"] } } }

Windows 用户要注意两点:command最好写 Python 的完整路径,args里的反斜杠要转义。比如:

{ "mcpServers": { "file-server": { "command": "C:\\Users\\YourName\\AppData\\Local\\Programs\\Python\\Python311\\python.exe", "args": ["C:\\Users\\YourName\\mcp-demo\\file_server.py"] } } }

保存配置文件后,完全退出 Claude Desktop 再重新打开。不是关窗口,是彻底退出进程。macOS 用 Cmd+Q,Windows 在任务栏右键退出。

4. 验证请求与成功结果:确认工具被正确识别和调用

重启之后,你怎么知道 MCP 服务加载成功了?有两个验证点。

第一个是看 Claude Desktop 的界面。在输入框附近通常会有一个工具图标或者连接状态提示,不同版本位置不太一样。如果配置正确,你会看到file-server出现在已连接的服务列表里。如果没看到,先别急着改代码,去日志里找原因。

第二个是直接对话测试。在 Claude 里输入类似“请列出我主目录下的文件”或者“帮我读一下某个文件的内容”。如果 Claude 判断需要调用工具,它会显示一个调用过程,然后返回结果。这时候你看到的输出,就是你的 Python 函数返回的字符串。

为了更可控地验证,你可以先手动跑一下服务脚本,确认它本身不报错:

python file_server.py

如果没有任何输出就停在那里,说明服务正常启动了,在等待 stdio 输入。按 Ctrl+C 退出即可。如果报错,那就是代码或环境问题,跟 Claude Desktop 无关,先解决这个。

另一个验证方式是用 MCP 的调试工具。fastmcp 自带一个开发模式,你可以用mcp dev file_server.py启动一个带界面的调试器,在里面直接调用工具、看输入输出。这个方式适合在接入 Claude Desktop 之前先把工具逻辑调通。

当你确认脚本能跑、配置路径没错、Claude Desktop 也重启了,就可以在对话里试。比如你问“列出我文档目录里的文件”,Claude 可能会调用list_directory并传入Documents。如果返回的是目录内容列表,说明整条链路通了。

这里有个细节:Claude 是否调用工具,取决于它自己的判断。有时候它会直接回答而不调用,这时候你可以更明确地说“请使用 file-server 工具列出目录”。多试几次就能感受到它的触发逻辑。

5. 本篇常见错排查:401、spawn ENOENT、编码崩溃怎么解

搭建过程中最容易卡住的就是这几类报错。我按实际遇到的频率排一下。

第一类是spawn python ENOENT。这个错误的意思是 Claude Desktop 找不到python命令。根源通常是 Python 装在了非标准路径,或者你用的是 Microsoft Store 版本,它的可执行文件藏在WindowsApps目录里,不在系统 PATH 中。解决办法是先找到完整路径:

where python

或者:

where python3

把输出的完整路径复制出来,填到配置文件的command字段里。注意 Windows 路径要双反斜杠转义。改完保存,彻底重启 Claude Desktop。

第二类是编码错误导致的崩溃,报错信息类似UnicodeEncodeError: 'gbk' codec can't encode character。这是因为 Windows 终端默认用 GBK 编码,而你的脚本里如果有 emoji 或者特殊字符,print 的时候就会炸。解决办法有两个:一是删掉所有 print 里的 emoji,用[OK]这种纯 ASCII 替代;二是在脚本开头强制标准输出用 UTF-8,就是我上面模板里那三行。推荐第二种,一劳永逸。

第三类是 401 或者认证失败。如果你在 MCP 脚本里调用了外部 API,并且把 Key 写错了或者没传,就会看到 401。注意 MCP 工具本身不需要 Key,但如果你在工具函数里发 HTTP 请求,那就要确保 Key 正确。检查一下 Base URL 是不是https://taotoken.net/api,Key 有没有多余空格。

第四类是reading choices相关的解析错误。这种通常出现在你用了某个客户端去调模型,但返回格式不符合预期。如果你是用 Claude Code 或者 Cline 这类工具接入,检查一下 Model ID 有没有填对,以及 Base URL 后面有没有多写斜杠。三件套——Base URL、Key、Model ID——任何一个不对都会导致解析失败。

第五类是 OAuth 相关的报错。如果你在配置里启用了某些需要 OAuth 的远程服务,但本地没配好回调,就会卡在授权环节。对于本篇的本地 stdio 服务来说,不涉及 OAuth,所以如果你看到这类错误,大概率是配置文件里混入了其他服务的配置,检查一下mcpServers下面是不是只有你自己的服务。

排查的时候有一个通用思路:先单独跑 Python 脚本,确认脚本本身没问题;再检查配置文件路径和转义;最后看 Claude Desktop 的日志。日志位置在配置目录旁边,macOS 是~/Library/Logs/Claude/,Windows 在%APPDATA%\Claude\logs\。日志里会明确告诉你哪个服务启动失败、报了什么错。

6. 从本地工具到长期编码流:把 MCP 接入你的日常工作

跑通第一个工具之后,你可以沿着这个模板继续扩展。比如加一个write_file工具,让 Claude 能帮你写文件;或者加一个search_code工具,在指定目录里做关键词搜索。fastmcp 的装饰器模式让扩展变得很简单,你只需要定义新函数,加上@mcp.tool(),重启服务就生效。

如果你打算把 MCP 用在长期的编码辅助场景里,比如让 Claude 帮你读项目文件、改代码、跑测试,那可以考虑把模型接入也统一管理起来。TaoToken 的 Coding Plan 就是为这种场景准备的,你可以在控制台里创建 Key,然后配置到 Claude Code 或者 Cline 里,配合本地 MCP 工具一起用。接入文档里有完整的配置示例,包括settings.json和auth.json的写法。

对于需要频繁调试的场景,建议把 MCP 服务的日志输出到一个文件里,方便回溯。你可以在mcp.run()之前加一些文件日志的配置,把每次工具调用的入参和返回都记下来。这样当 Claude 调用结果不符合预期时,你能快速定位是工具逻辑问题还是模型理解问题。

另外一个小技巧:工具函数的返回值尽量用结构化文本,比如 JSON 字符串或者带明确分隔符的列表。这样模型在解析的时候不容易出错。如果你返回的是自然语言描述,模型有时候会过度解读。我在list_directory里用换行分隔文件名,就是出于这个考虑。

最后,如果你想让多个 MCP 服务同时运行,比如一个管文件、一个管数据库,只需要在claude_desktop_config.json的mcpServers下面加多个条目,每个条目指向不同的脚本。Claude Desktop 会分别启动它们,模型在需要的时候自动选择调用哪个。注意每个服务的名字要唯一,不要重复。

整套流程走下来,你会发现 MCP 的门槛比想象中低。核心就是写 Python 函数、配 JSON、重启客户端。真正花时间的地方在排错,而排错的关键是学会看日志和单独测试脚本。把这两件事做好,后面加多少工具都只是重复劳动。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询