avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 自己编写一个自定义的 MCP 服务器
文章

自己编写一个自定义的 MCP 服务器

发表于 2026-06-19 更新于 2026-06- 19
作者 mdo
10~13 分钟 阅读

使用 Python 的 mcp 官方库(搭配 FastMCP 框架)是目前最快、最简单的开发方式。你可以像写 FastAPI 一样,通过装饰器快速将 Python 函数转变成 AI 可以调用的工具(Tools)或读取的资源(Resources)。

以下是完整的开发与测试指南。


1. 准备环境与安装

首先,创建一个新的项目目录并安装 mcp 核心库。

bash

mkdir my-mcp-server && cd my-mcp-server
pip install mcp[cli]

请谨慎使用此类代码。

(注:[cli] 选项会附带安装 dev 开发和测试工具,方便后续调试)


2. 编写服务器代码

创建一个名为 server.py 的文件。我们将在里面定义一个工具(Tool)和一个资源(Resource)。

  • 工具(Tool):AI 可以主动调用来执行操作的函数(例如:获取实时天气)。

  • 资源(Resource):AI 可以读取的静态或动态数据(例如:系统的配置提示)。

python

# server.py
from mcp.server.fastmcp import FastMCP
import httpx

# 1. 初始化 FastMCP 服务器
mcp = FastMCP("MyAwesomeServer")

# 2. 定义一个工具(Tool)
# AI 可以调用这个工具来查询指定城市的实时天气
@mcp.tool()
async def get_weather(city: str) -> str:
    """获取指定城市的当前天气情况。
    
    Args:
        city: 城市名称 (例如: 'Beijing', 'Tokyo')
    """
    # 提示:实际开发中这里可以调用外部 API
    url = f"https://wttr.in{city}?format=3"
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        if response.status_code == 200:
            return response.text.strip()
        return f"无法获取 {city} 的天气数据。"

# 3. 定义一个资源(Resource)
# AI 可以读取这个资源作为上下文背景
@mcp.resource("memo://system-instructions")
def get_system_memo() -> str:
    """提供当前服务器的内部运行规范和备忘录。"""
    return "注意:本服务器的所有天气数据均实时抓取自开源服务,结果仅供参考。"

if __name__ == "__main__":
    # 启动服务器(默认使用 stdio 通信模式)
    mcp.run()

请谨慎使用此类代码。


3. 本地调试与测试 (MCP Inspector)

MCP 官方提供了一个可视化的调试工具 MCP Inspector,让你在接入 Cursor 或 Claude 之前,先在浏览器里测试你的代码是否正常。

在终端中运行以下命令启动调试器:

bash

mcp dev server.py

请谨慎使用此类代码。

运行后你会看到:

  1. 终端会输出一个 Web 调试界面的链接(通常是 http://localhost:5173 或类似地址)。

  2. 在浏览器中打开该链接,你会看到一个仪表盘。

  3. 点击 Tools 标签页,你会看到刚才写的 get_weather 函数。输入一个城市(如 London)并点击 Run,即可直接看到返回的天气结果。


4. 接入到 AI 客户端 (以 Cursor / Claude 为例)

调试通过后,你只需要将这个本地脚本配置到你的 AI 编辑器或客户端中。

选项 A:接入 Cursor 编辑器

  1. 打开 Cursor,进入 Settings -> Models -> MCP。

  2. 点击 + Add New MCP Server。

  3. 填写配置:

    • Name: MyPythonMCP

    • Type: 选择 command

    • Command: python /绝对路径/to/my-mcp-server/server.py (注意:请替换为你电脑上的实际绝对路径)

  4. 点击 Save。连接成功后,状态图标会变成绿色的 Active。

选项 B:接入 Claude Desktop 客户端

修改 Claude 的配置文件(MacOS 路径为 ~/Library/Application Support/Claude/claude_desktop_config.json),添加以下内容:

json

{
  "mcpServers": {
    "my-python-server": {
      "command": "python",
      "args": ["/绝对路径/to/my-mcp-server/server.py"]
    }
  }
}

请谨慎使用此类代码。


5. 体验效果

配置完成后,直接在 AI 的对话框里对它下达指令,它就会自动发现并调用你的本地服务器:

💬 “帮我查一下东京现在的天气怎么样?”

AI 在后台会识别出 get_weather(city="Tokyo") 工具,执行你的 Python 脚本,并在获得返回后将结果组织成自然语言回答你。

知识库
许可协议:  CC BY 4.0
分享

相关文章

7月 21, 2026

think-orm 2.0.62 单独设置数据表字段缓存驱动和数据缓存驱动

think-cache 拥有强大的多通道(Multi-store)管理能力,但问题的根源在于 think-orm 底层的调用机制太死板。即使您在 think-cache 中配置了 file 和 redis 两个完全独立的通道,think-orm 默认也只会向您通过 Db::setCache() 注入

7月 1, 2026

WebSocket Server + 独立 RPC Server

从架构角度来说,它已经接近 think-swoole 能做到的极限了,但是我仍然不建议继续这样维护。 原因不是代码写法,而是 think-swoole 本身的事件模型。 第一处问题:addListener() 仍然共享 Worker 你的代码: $rpcServer = $server->addLi

6月 25, 2026

Linux | Reqable · API抓包调试 + API测试一站式工具

Reqable是什么? Reqable = Fiddler + Charles + Postman 极简的设计、极高的性能、丰富的功能、桌面手机多端平台。 多协议流量分析 基于经典的MITM中间人代理方案捕获和分析您的应用流量,自适应HTTP/HTTPS/SOCKS4/SOCKS5等多种代理协议,并

下一篇

通过监听 request 事件来拦截和验证 WebSocket 握手

上一篇

Golang 中,结合使用 RPC(远程过程调用)与 WebSocket

最近更新

  • 完美地解决 TP3 老系统数据的平滑读取
  • thinkphp3 redis序列化和反序列化
  • Table 空间极易发生哈希冲突并溢出
  • 将监控程序直接跑在云端
  • AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

热门标签

API CodeGeex Gitkraken Management Manticore Premiere Sublime Swoole ThinkPHP ThinkPHP5

目录

©2026 mdo. 保留部分权利。