从零到一:打包并发布你的第一个MCP AI工具服务

探索MCP:模型上下文协议

概述

MCP (Model Context Protocol) 是一种专为大型语言模型 (LLM) 设计的协议,旨在打通模型与外部数据源、工具及服务之间的壁垒,实现无缝集成。

传输方式

MCP主要支持以下几种传输方式:

  1. stdio (标准输入/输出)

    这是最基础和通用的传输方式。它通过标准输入流读取数据,并向标准输出流写入结果,非常适合本地开发、命令行工具 (CLI) 和代理插件的集成。

  2. sse (服务器发送事件)

    SSE 基于标准的 HTTP 协议,用于解决远程服务的访问问题。在此模式下,MCP 服务作为一个独立的 Web 服务器运行,能够处理来自多个客户端的并发连接。

  3. streamable-http (可流式传输的HTTP)

    这是MCP协议在新版本中引入的新传输机制,作为 SSE 的强大替代方案。它同样基于 HTTP POST/GET 请求,并利用服务器发送事件 (SSE) 的能力来高效地流式传输多条服务器消息。

构建一个简单的MCP服务

MCP服务示例

使用 FastMCP 可以轻松创建一个MCP服务。

python 复制代码
from mcp.server.fastmcp import FastMCP

# 初始化MCP服务实例
mcp = FastMCP("My_Mcp_Server")

@mcp.tool()
def sum(a: int,b: int) -> int:
    """ 两个数相加求和
    
    Args:
        a (int): 整数a
        b (int): 整数b
        
    Returns:
        int: 两个数的和
    """
    return a+b

if __name__ == '__main__':
    # 启动MCP服务,使用标准输入输出作为传输方式
    mcp.settings.host = "0.0.0.0"
    mcp.settings.port = 8000
    mcp.run(transport='stdio')
    print("MCP服务已启动,等待工具调用...")

在本地使用MCP服务

在支持MCP的 AI工具(如 trae)中,可以通过简单的JSON配置来注册和使用本地服务。

配置 mcp.json 文件:

python 复制代码
{
  "mcpServers": {
    "My_Mcp_Server": {
      "command": "python",
          "args": [
            "D:\\WorkSpace\\AI\\demo\\main.py"
          ]
    }
  }
}

配置完成后,可以在工具中看到服务状态。 现在,向 AI 提问,验证服务是否被成功调用。

部署并远程调用MCP服务

本地 stdio 模式非常适合开发和调试,但若要让服务被公开访问,则需要将其部署为网络服务。这可以通过 ssestreamable-http 协议实现。

切换传输协议

只需在服务入口文件中修改一行代码,即可切换传输协议。

bash 复制代码
if __name__ == '__main__':
    # 启动 MCP 服务,使用 sse 或 streamable-http 协议
    # mcp.run(transport='stdio')
    mcp.settings.host = "0.0.0.0"
    mcp.settings.port = 8000
    mcp.run(transport='sse')
    # mcp.run(transport='streamable-http')

在AI客户端中配置远程服务

Cherry Studio 为例,添加一个新的MCP服务,并根据选择的协议进行配置。

  • 使用 sse 协议 : 选择 sse 类型,并输入服务地址,格式为 http://<IP>:<端口>/sse
  • 使用 streamable-http 协议 : 选择 streamableHttp 类型,URL 地址格式为 http://<IP>:<端口>/mcp

在AI开发工具中配置远程服务

可以将 Cherry Studio 中的图形化配置导出为 JSON,以便在其他开发工具(如 Cursor、VSCode)中使用。

将导出的 JSON 粘贴到开发工具的配置文件中。请注意 :某些工具(如 Cursor)要求将 baseUrl 字段名修改为 url 才能正确识别。

bash 复制代码
{
  "mcpServers": {
    "A_N9cktV9xBWJfUv4w3Ug": {
      "name": "我的MCP服务器",
      "type": "streamableHttp",
      "description": "",
      "isActive": true,
      "tags": [],
      "url": "http://localhost:8000/mcp"
    }
  }
}

配置完成后,即可在开发工具中看到服务已成功连接。

将MCP服务打包为Python包

将开发好后的工具封装成一个 Python 包并发布到 PyPI,是与社区共享成果的最佳方式。其他用户只需一条命令即可安装和使用所开发的MCP服务。

初始化项目

使用 uv 可以快速创建一个结构规范的Python项目。

bash 复制代码
# 创建并进入项目目录
mkdir ccyy_mcp
cd ccyy_mcp

# 当前目录下初始化 创建一个结构化的、可以打包分发的Python项目
uv init . --package

uv会创建一个src目录,并在里面建立一个与项目同名的子目录,里面还包含一个 __init__.py文件。这种结构是Python打包的推荐做法。

添加依赖

bash 复制代码
uv add "mcp[cli]"

编写服务与入口脚本

将之前的服务代码放入 src/ccyy_mcp/main.py。然后,在 src/ccyy_mcp/__init__.py 中创建一个 main 函数作为命令行入口。

__init__.py同级目录创建main.py文件编写MCP服务代码

bash 复制代码
from mcp.server.fastmcp import FastMCP

# 初始化MCP服务实例
mcp = FastMCP("My_Mcp_Server")

@mcp.tool()
def sum(a: int,b: int) -> int:
    """ 两个数相加求和
    
    Args:
        a (int): 整数a
        b (int): 整数b
        
    Returns:
        int: 两个数的和
    """
    return a+b

if __name__ == '__main__':
    # 启动MCP服务,使用标准输入输出作为传输方式
    mcp.run(transport='stdio')

__init__.py文件中配置启动MCP服务

python 复制代码
from ccyy_mcp.main import mcp

def main() -> None:
    mcp.settings.host = "0.0.0.0"
    mcp.settings.port = 8000
    mcp.run(transport='stdio')
    print("MCP服务已启动,等待工具调用...")

打包构建

默认情况下,执行uv build后,所有生成的打包文件(.whl 和 .tar.gz)都会被放置在项目根目录下的一个名为dist的文件夹里

bash 复制代码
uv build

获取Token

首先,访问Pypi官网,在Account settings菜单栏下找到API tokens并执行Add API token进行添加一个Token

发布到Pypi

在项目根目录执行以下命令将构建的Python包发布到Pypi网站

bash 复制代码
uv publish --token Token

发布成功后,就可以在PyPI网站的 Your projects页面看到包信息。

使用发布的包

现在,任何用户都可以通过 uvx(或 pipx)直接运行发布的MCP服务,无需手动下载代码。

  • Cherry Studio 中使用commanduvxargs 填写包名 ccyy-mcp

  • 在AI开发工具中配置

python 复制代码
{
  "mcpServers": {
    "My_Mcp_Server": {
      "command": "uvx",
          "args": [
            "ccyy-mcp"
          ]
    }
  }
}
相关推荐
饭勺oO8 小时前
AI 编程配置太头疼?ACP 帮你一键搞定,再也不用反复折腾!
ai·prompt·agent·acp·mcp·skills·agent skill
AlienZHOU9 小时前
MCP 是最大骗局?Skills 才是救星?
agent·mcp·vibecoding
Linux内核拾遗10 小时前
人人都在聊 MCP,它到底解决了什么?
aigc·ai编程·mcp
谷哥的小弟12 小时前
SQLite MCP服务器安装以及客户端连接配置
服务器·数据库·人工智能·sqlite·大模型·源码·mcp
tyw1513 小时前
解决 Trae MySQL MCP 连接失败(Fail to start)
mcp·trae·fail to start·mysql mcp·mcp兼容
谷哥的小弟13 小时前
File System MCP服务器安装以及客户端连接配置
服务器·人工智能·大模型·file system·mcp·ai项目
啊湘1 天前
vscode 使用 github (适用CURSOR等使用)
ide·vscode·github·cursor·mcp
小小呱呱蛙1 天前
Claude Code 自下而上分析(Slash/Sub Agents/Skills/MCP)带来的启发
agent·claude·mcp
callJJ1 天前
MCP配置与实战:深入理解现代开发工具链
javascript·node.js·vue·mcp·windsurf
谷哥的小弟2 天前
Brave Search MCP服务器安装以及客户端连接配置
搜索引擎·大模型·spring ai·mcp·brave search