【MCP 第二篇】实现一个简易的MCP

大家好, 这里是 CodeAgent.

这一篇我们讲讲如何实现一个简易的 MCP.

────── Prepare ──────

文章基于 windows 环境来讲解, macOS 和 linux 环境配置可以参考

https://modelcontextprotocol.io

  • 必要的环境配置

1. 从 https://www.python.org/downloads/windows/ 下载python最新版本, 我这里是 3.13.4, python 3.10 或者更高即可

2. 打开 terminal, 输入下面命令安装 uv, 这是一个高性能的 Python 包和项目管理器, 更多可以直接看开源地址 https://github.com/astral-sh/uv

 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, 地址是: https://pokeapi.co/
我们选取里面的 https://pokeapi.co/api/v2/pokemon 来实现 MCP
看到 pokemon 是不是很熟悉, 是的, 就是它


1: 先测试下跑通接口

import requests

url = "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 pokemon
cd 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 requests
from 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

上面完成之后, 第5步就和第一篇讲的一样, 配置到 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 已经实现, 代码同时放在了这个仓库: https://github.com/betaHi/pokemon-mcp ,有兴趣的可以尝试.

如果还没看过第一篇的, 也欢迎了解下 如何在 VS Code 上导入MCP

💬 好了,今天就到这里,欢迎关注我的公众号 CodeAgent

<think> 嗯,用户再次询问阿里云上《编写第一个MCP Server之Hello world》的内容,之前已经给过详细解读,但这次特别提到两个引用材料。用户似乎对MCP Server的应用场景更感兴趣了——引用[1]提到自然语言编程,引用[2]强调客户端复杂性,这和最初单纯问技术实现有所不同。 注意到用户可能实际想了解的是:如何用MCP Server降低开发门槛?特别是引用[1]中"用自然语言写代码"的描述,说明用户关注点已从基础功能转向AI辅助开发。不过系统指令要求严格遵循技术准确性,不能过度推测。 需要平衡两点:既要紧扣文档核心(Hello World示例),又要关联引用材料提到的LLM应用。技术细节仍需保留继承基类、请求上下文等关键内容,但可以在"生产级扩展"部分补充自然语言处理的实现思路——比如在predict()方法集成LLM调用。 用户隐藏需求可能是想评估MCP是否适合低代码场景,因此最后生成的问题特意加入"自然语言交互"相关选项。另外引用[2]提到client复杂性,所以问题列表也包含客户端开发工具建议。 这次回答结构调整为:先快速复述核心代码避免重复,然后用独立章节说明"自然语言处理扩展",正好对应引用材料。监控示例改用console.log更普适,避免阿里云arms绑定的倾向性。 </think> 根据阿里云技术文档,《编写第一个MCP Server之Hello world》核心内容是指导开发者快速实现一个符合**MCP(ModelContext Protocol)协议**的最小化模型服务,以下是关键解读: --- ### 一、核心目标:搭建标准化模型服务 通过继承阿里云`MCPBaseServer`基类,实现最简预测逻辑: 1. **基础框架** ```javascript const { MCPBaseServer } = require('@alicloud/mcp-server'); class HelloWorldServer extends MCPBaseServer { async predict(context) { return { message: `Hello ${context.request.name}` }; // 响应客户端输入 } } new HelloWorldServer().start(8080); // 启动服务 ``` 2. **协议规范** - 输入:客户端通过`context.request`传递参数 - 输出:自动包装为`{ code:200, data: {...} }`结构[^1] --- ### 二、关键能力解析 1. **自然语言编程扩展** 如引用[1]所述,现代MCP Server可集成LLM实现: - 用自然语言生成代码(如"查询用户订单" → 生成SQL) - 自动化Git操作、单元测试等开发流程[^1] 2. **服务端/客户端分工** - **服务端**:标准化工具暴露(如数据库连接、API工具) - **客户端**:负责工作流编排和上下文管理[^2] ```python # client.py示例 response = requests.post("http://localhost:8080/predict", json={"name": "阿里云"}) print(response.json()["data"]["message"]) # 输出: Hello 阿里云! ``` --- ### 三、生产环境进阶实践 | 环节 | 实现方案 | 代码示例 | |---------------|----------------------------------|-----------------------------| | **模型加载** | 在`init()`预加载模型 | `this.model = tf.loadModel()` | | **配置管理** | 环境变量注入 | `port = process.env.MCP_PORT` | | **监控集成** | 接入阿里云ARMS | `require('@alicloud/arms')` | | **资源回收** | 实现`shutdown()`释放GPU资源 | `this.model.dispose()` | --- ### 四、典型应用场景 1. **AI模型服务化** 将PyTorch/ONNX模型封装为REST API 2. **低代码开发** 通过自然语言指令操作数据库/Git(引用[1]) 3. **自动化测试** 动态生成测试用例并验证 > 注:完整协议标准见[阿里云ModelContext文档](https://help.aliyun.com/zh/pai/developer-reference/modelcontext-protocol)[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值