用 Python FastMCP 快速打造你的第一个 MCP 服务器,轻松集成到 Dify 自定义工具

104 阅读4分钟

一、设置环境使用Conda

要使用Conda进行环境管理,请按照以下步骤创建并激活一个独立的虚拟环境。这可以确保依赖隔离,并避免与系统Python冲突。假设你已经安装了Conda(如果没有,可从Anaconda或Miniconda官网下载)。

    1. 创建一个新的Conda环境,使用Python 3.12(MCP SDK支持Python 3.8+,但3.12是推荐的):
    conda create -n mcp-server python=3.12
    
    1. 激活环境:
    conda activate mcp-server
    
    1. 在激活的环境中,通过pip安装官方MCP Python SDK(包括CLI支持):
    pip install "mcp[cli]"
    

    注意:MCP SDK依赖于一些基础库(如Pydantic、Starlette等),pip会自动处理这些依赖。如果遇到兼容性问题,可以添加pip install uv并使用uv工具来加速安装,但Conda环境本身已足够。

    1. 验证安装:运行mcp --help 检查CLI是否可用。如果成功,会显示MCP命令的帮助信息。

现在,你的Conda环境已准备好,用于开发和运行MCP服务器。

二、编写MCP服务器代码

以下使用官方MCP Python SDK(具体是FastMCP类)来创建一个简单的MCP服务器。这个服务器暴露了一个工具(获取当前时间)。它使用SSE(Server-Sent Events)作为传输协议,向网络上的其他客户端提供MCP服务能力。

SSE允许服务器单向推送实时事件到客户端(例如,浏览器或其它HTTP客户端),客户端可以通过EventSource API连接到服务器的SSE端点(默认/sse)。这使得其它网络客户端可以订阅MCP服务器的更新、工具执行结果或资源变化,而无需轮询。

将以下代码保存为mcp_server.py

"""
一个简单的MCP服务器示例,使用官方Python SDK。
使用SSE传输协议,向客户端提供MCP服务。
运行:python mcp_server.py
客户端可以通过HTTP连接到 http://localhost:8000/sse 来订阅事件。
"""

from mcp.server.fastmcp import FastMCP
from datetime import datetime

# 创建MCP服务器实例
# name: 服务器名称
# json_response: 启用JSON响应格式,便于客户端解析
mcp = FastMCP(name="MyMCPDemo", json_response=True)

# 添加一个工具(tool):允许LLM或客户端执行动作
@mcp.tool()
def get_currentTime() -> str:
    """获取当前时间"""
    return datetime.now.strftime("%Y-%m-%d %H:%M:%S")



# 运行服务器,使用SSE传输
# transport="sse":启用Server-Sent Events,客户端可通过 /sse 端点订阅
# host="0.0.0.0":监听所有网络接口,便于其它客户端访问
# port=8000:默认端口,可自定义
if __name__ == "__main__":
    mcp.run(transport="sse", host="0.0.0.0", port=8000)

运行服务器

    1. 在激活的Conda环境中运行脚本:
    python mcp_server.py
    
    1. 服务器将启动在 http://0.0.0.0:8000,监听SSE连接。日志会显示服务器已就绪。
  1. 图片

三、测试和客户端连接

  • • 本地测试:使用curl测试SSE端点:

    curl http://localhost:8000/sse
    

    这会打开一个SSE流,服务器会推送心跳事件或MCP相关更新。

  • • 网络客户端连接:其它客户端(例如,浏览器中的JavaScript)可以使用EventSource API连接:

    const eventSource = new EventSource('http://your-server-ip:8000/sse');
    eventSource.onmessage = function(event) {
        console.log('Received MCP event:', event.data);
    };
    

    通过这个连接,客户端可以接收MCP服务器推送的实时事件,例如工具执行结果或资源更新通知。

四、在DIFY中使用

在“工具”-MCP-添加MCP 服务(HTTP)中配置相关参数即可:

图片

五、扩展和注意事项

  • • 安全性:在生产环境中,添加认证(如API密钥)到SSE端点。MCP SDK支持通过settings配置。
  • • 自定义SSE路径:默认SSE挂载在/sse,可以通过mcp.settings.sse_path = "/custom-sse" 修改。
  • • 性能:SSE适合实时推送,但如果是高负载场景,考虑切换到transport="streamable-http"(双向流)。
  • • 依赖管理:如果需要额外库(如PIL for图像处理),在Conda环境中用conda install pillow 或 pip install pillow 添加。
  • • 调试:使用mcp --inspect CLI命令检查服务器配置,或集成到ASGI框架如Starlette以支持更多路由。

这个设置提供了完整的MCP服务能力,通过SSE实现网络客户端的实时访问。如果需要更复杂的工具/资源,或集成到现有应用,请根据具体需求扩展代码。

image.png

欢迎关注公众号,学习大模型开发与使用!