MCP 工具开发

环境准备

首先安装 uv,本项目完全基于 uv 运行。这里解释下为什么用 uv:本地运行会从工作目录逐级向上找虚拟环境,而如果从三方库或 git 里拉包运行,uvx 可以自行解决依赖,交给 agent 的最好是一个命令就能解决。

代码编写

创建文件 src/my_mcp/server.py

import time
from mcp.server import MCPServer
mcp = MCPServer("my-mcp")
@mcp.tool()
def add(a: int, b: int) -> int:
    """计算两个数字的和"""
    return a + b
@mcp.tool()
def get_current_timestamp() -> str:
    """获取当前时间戳"""
    return str(int(time.time()*1000))
def main():
    print('my mcp server start')
    mcp.run()
if name == "main":
    main()

开发调试阶段

进入项目根目录,运行以下命令,会弹出界面可以调用调试工具:

uv run mcp dev src/my_mcp/server.py

提供给其它 agent 使用,如 trae

配置项目的 pyproject.toml

会从 src 找到对应的入口:

[project.scripts]
my-mcp = "my_mcp.server:main"
# ...添加其它的工具
[tool.uv] 
# 需要配置识别 package
package = true
运行

my-mcp 就是上面 project.scripts 配置的入口别名,如果报错通过 uv sync 命令查看警告报错信息:

uv run my-mcp
trae 配置

.trae/mcp.json 里进行配置,指定到本地 D:/xx/my_mcp_tool 的项目根目录运行:

{
  "mcpServers": {
    "my-mcp": {
      "command": "uv",
      "args": ["run", "--directory", "D:/xx/my_mcp_tool", "my-mcp"]
    }
  }
}

给其它人使用

搭建 Python 私有仓库

docker-compose.yml 配置如下:

version: '3.8'

services:
  pypiserver:
    image: pypiserver/pypiserver:latest
    container_name: pypi-private
    restart: unless-stopped
    ports:
      - "8900:8900"
    volumes:
      - ./packages:/data/packages          # 包存储目录 - 持久化你的 Python 包
      - ./.htpasswd:/data/.htpasswd        # 认证文件 - 存储用户名密码
    environment:
      - TZ=Asia/Shanghai                   # 设置时区
    command: >
      run
      -P /data/.htpasswd
      -a "update,download,list"
      --fallback-url https://pypi.tuna.tsinghua.edu.cn/simple
      /data/packages
    networks:
      - pypi-network

networks:
  pypi-network:
    driver: bridge

.htpasswd 生成:

# Ubuntu/Debian:
#sudo apt-get install apache2-utils
# CentOS/RHEL:
sudo yum install httpd-tools
# 创建密码文件,用户名设为 admin (交互式输入密码)
htpasswd -sc .htpasswd admin

docker 运行:

docker compose up -d

上传包

配置添加
# 配置私有仓库索引
[[tool.uv.index]]
name = "qatools"                              # 索引名称,后续命令会用到
url = "http://qatools.test.com:8900/simple/"  # 安装时使用的索引地址(通常以 /simple/ 结尾)
publish-url = "http://qatools.test.com:8900/" # 上传包的地址
命令执行
uv build
export UV_INSECURE_HOST=qatools.test.com:8900
uv publish --index qatools --username admin --password ******

上传成功可在 web 页面访问查看:http://qatools.test.com:8900/simple/

本地安装包

uvx 运行(这里解释下 uvx 执行逻辑,一般会在用户根目录 .cache/uv 目录下自动创建虚拟环境安装依赖包):

uvx --extra-index-url http://admin:******@qatools.test.com:8900/simple/ 
--allow-insecure-host qatools.test.com 
--from my-mcp-tool my-mcp.exe

trae 配置:

{
  "mcpServers": {
    "timestamp-mcp": {
      "command": "uvx",
      "args": [
        "--extra-index-url",
        "http://admin:******@qatools.test.com:8900/simple/",
        "--allow-insecure-host",
        "qatools.test.com",
        "--from",
        "my-mcp-tool",
        "my-mcp.exe"
      ]
    }
  }
}
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐