大家好, 这里是 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 uv3. 安装 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.py3: 把接口封装到方法里
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 requests6: 使用
这里我们使用 github copilot. 点击下扳手
可以看到刚才声明的 mcp tool
接着我们问下: get pokemon info about pikachu
可以看到结果返回如下
────── End ──────
好了, 到此简易的 MCP 已经实现, 代码同时放在了这个仓库: github.com/betaHi/poke…, 有兴趣的可以尝试.
如果还没看过第一篇的, 也欢迎了解下 如何在 VS Code 上导入MCP
💬 欢迎评论区留下你的看法, 下一篇我们继续讲讲 MCP 的 api.
也欢迎关注我的公众号 CodeAgent, 不定期推送文章, 一起学习交流
