大家好, 这里是 CodeAgent.
这一篇我们讲讲如何实现一个简易的 MCP.
────── Prepare ──────
文章基于 windows 环境来讲解, macOS 和 linux 环境配置可以参考modelcontextprotocol.io
- 必要的环境配置
从 www.python.org/downloads/w… 下载python最新版本, 我这里是 3.13.4, python 3.10 或者更高即可
打开 terminal, 输入下面命令安装 uv, 这是是一个高性能的 Python 包和项目管理器, 关于uv更多内容可以从开源地址 github.com/astral-sh/u… 了解
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
安装好之后, uv 的路径一般如下所示: (注意反双斜杠)
C:\Users\用户名\.local\bin\uv.exe
也可以用 windows 自带的 where (类似 linux 的 which) 来找到 uv 的地址
Ctrl + R 输入 cmd 接着输入:
where uv
3. 安装 FastMCP
uv pip install fastmcp
安装 之后, 可以通过下面命令看版本
fastmcp version
结果如下:
────── Start ──────
接下来, 我们借助一个公开免费的API, 地址是: pokeapi.co/
我们选取里面的 pokeapi.co/api/v2/poke… 来实现 MCP
看到 pokemon 是不是很熟悉, 没错, 就是它
1: 先测试下跑通接口
import requestsurl = "https://pokeapi.co/api/v2/pokemon/pikachu"response = requests.get(url)if response.status_code == 200: data = response.json() print("名称:", data["name"]) print("编号:", data["id"]) print("身高:", data["height"] / 10, "米") print("体重:", data["weight"] / 10, "千克") print("类型:", [t["type"]["name"] for t in data["types"]]) print("能力:", [a["ability"]["name"] for a in data["abilities"]])else: print("请求失败,状态码:", response.status_code)
可以看到接口可以成功返回
2: 使用 uv 创建文件夹并初始化环境
uv init pokemoncd pokemon# 创建虚拟环境并激活uv venv.venv\Scripts\activate# 安装依赖uv add mcp[cli] httpx# 创建 server 文件new-item get-pokemon.py
3: 把接口封装到方法里
def get_pokemon_info(pokemon_name): url = f"https://pokeapi.co/api/v2/pokemon/{pokemon_name.lower()}" // ...
4: 导入 FastMCP, 封装成 mcp tool
import requestsfrom fastmcp import FastMCP# 起一个 MCP Server, 名字自定义mcp = FastMCP("get-pokemon")def main(): # 运行 MCP Server, 使用标准 io mcp.run(transport='stdio')# 定义为一个 mcp tool@mcp.tool()def get_pokemon_info(pokemon_name): url = f"https://pokeapi.co/api/v2/pokemon/{pokemon_name.lower()}" try: response = requests.get(url) if response.status_code == 200: data = response.json() return { "name": data["name"], "id": data["id"], "height": f"{data['height'] / 10} meters", "weight": f"{data['weight'] / 10} kg", "types": [t["type"]["name"] for t in data["types"]], "abilities": [a["ability"]["name"] for a in data["abilities"]] } else: return { "error": f"Request failed with status code: {response.status_code}" } except requests.exceptions.RequestException as e: return { "error": f"Request exception: {str(e)}" }if __name__ == "__main__": main()
注释都在代码里, 这里解释两个地方
mcp.tool()
把方法定义为了一个工具, 这个 tool 可以在上一篇提到的 Agent 的扳手那里看到
推荐使用 from fastmcp import FastMCP
而不是 from mcp.server.fastmcp import FastMCP
, 前者使用的是我们通过 uv pip install fastmcp
安装的 sdk, api 比较新并且丰富. 通过下面截图也可以看到有两个位置有 fastmcp sdk, 我们使用的是 Lib\site-packages\fastmcp
5: 配置 mcp json
tool 完成之后, 把 mcp 服务配置到 json 里我们打开 settings.json, 加入下面配置
"mcp-server-get-pokemon": { "command": "C:\Users\用户名\.local\bin\uv.exe", "args": [ "--directory", "Q:\pokemon", "run", "get-pokemon.py" ]}
接着点击 start, 等待状态变成 Running,
中间可能会报找不到 requests 这个 module, 因为我们开了一个虚拟环境,
所以还需要在 pokemon 下安装 requests
uv pip install requests
6: 使用
这里我们使用 github copilot. 点击下扳手
可以看到刚才声明的 mcp tool
接着我们问下: get pokemon info about pikachu
可以看到结果返回如下
────── End ──────
好了, 到此简易的 MCP 已经实现, 代码同时放在了这个仓库: github.com/betaHi/poke…, 有兴趣的可以尝试.
如果还没看过第一篇的, 也欢迎了解下 如何在 VS Code 上导入MCP
💬 欢迎评论区留下你的看法, 下一篇我们继续讲讲 MCP 的 api.
也欢迎关注我的公众号 CodeAgent, 不定期推送文章, 一起学习交流