Python工具服务器

一个异步服务器,用于通过多种通信传输方式将Python函数暴露为工具,支持动态加载自定义工具和内置工具。

  • by planetf1
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 planetf1/mcp-server

使用说明

MCP工具服务器(mcp_server.py)

这 mcp_server.py 脚本是一个异步服务器,旨在通过各种通信传输将Python函数作为“工具”公开。它利用了 FastMCP 用于管理工具和处理客户端交互的框架。服务器自带内置工具,支持从Python文件或目录动态加载自定义工具。

特性

  • 多个传输:支持通过以下方式进行通信:
    • stdio:标准输入/输出,适用于直接命令行交互或与其他进程集成。
    • sse:服务器发送事件,允许web客户端订阅工具输出(侦听 http://<host>:<port>/sse).
  • 内置工具:
    • echo:返回调用时使用的参数。
    • health:报告服务器的运行状态(返回“就绪”)。
  • 自定义工具加载:
    • 从指定位置动态加载Python函数作为工具 .py 包含以下内容的文件或目录 .py 文件夹。
    • 每个工具文件必须精确定义一个函数作为工具公开。
    • 支持在工具文件中导入。
  • 可配置日志记录:
    • 默认情况下,将INFO级别消息输出到控制台。
    • 支持将详细的DEBUG级别日志记录到服务器应用程序和底层MCP SDK的指定文件中。
  • 异步:内置 asyncio 用于高效处理并发操作。

先决条件

  • Python 3.x
  • 这 mcp Python包(特别是 mcp.server.fastmcp 使用)。确保此包已安装在您的Python环境中。

命令行用法

剧情简介

python mcp_server.py [tools_paths...] [--log FILENAME] [--transport {stdio,sse}] [--port PORT]

选项

  • tools_paths (位置,零或更多)

    • Python工具文件或包含Python工具文件的目录的路径。
    • 如果提供了目录,服务器将搜索 *.py 文件(不包括以开头的文件 _).
    • 例子: ./my_tool.py ./utils_directory
    • 默认值:无(如果没有提供路径,则只有内置工具可用)。
  • --log FILENAME

    • 启用指定文件的详细日志记录(应用程序和MCP SDK的DEBUG级别)。
    • 包括工具调用、响应和内部操作的全部详细信息。
    • 控制台仍将显示信息级别消息。
  • --transport {stdio|sse}

    • 要使用的通信传输。
    • stdio:使用标准输入/输出。
    • sse:使用服务器发送的事件。服务器将监听 0.0.0.0 默认情况下。
    • 违约: stdio
  • --port PORT

    • 用于SSE传输的端口号。
    • 违约: 8080

工具加载

自定义工具是服务器可以公开的Python函数。

  • 定义:每个Python文件(.py)作为一个工具模块,应该只定义一个功能。此功能将注册为工具。函数的名称将是它的工具名称。
  • 发现:
    • 如果一条通往 .py 如果提供了文件,服务器将尝试从该文件加载工具。
    • 如果提供了目录的路径,服务器将扫描该目录以查找 .py 文件(忽略以下文件 __init__.py 或任何以下划线开头的文件),并尝试从每个有效文件加载工具。
  • 进口:工具文件可以根据需要导入其他模块。服务器临时将工具的目录添加到 sys.path 在装载过程中,以方便当地进口。

例子

1.创建自定义工具

例如,创建一个Python文件, calculator.py:

# calculator.py
def add(a: int, b: int) -> int:
    """
    Adds two integers and returns the result.
    """
    print(f"Tool 'add' called with a={a}, b={b}") # Example of internal tool logging
    return a + b

2.运行服务器

a) 仅使用内置工具(stdio传输):

python mcp_server.py

服务器将启动,您可以与 echo 和 health 工具通过其标准输入/输出(详细信息取决于 FastMCP 客户端交互协议)。

b) 使用自定义工具(stdio传输):

python mcp_server.py calculator.py

现在 add 工具从 calculator.py 也将可用。

c) 使用工具目录和详细日志记录(stdio传输):

假设您有一个名为的目录 my_tools 包含 calculator.py 以及其他工具文件:

mkdir my_tools
mv calculator.py my_tools/
# You can add more .py tool files to my_tools/

python mcp_server.py my_tools --log server.log

服务器将从加载所有有效工具 my_tools 目录。详细日志将写入 server.log,并向控制台发送INFO消息。

d) 使用SSE传输:

python mcp_server.py calculator.py --transport sse --port 8888

服务器将在上启动并监听SSE连接 http://0.0.0.0:8888/sse。客户端可以连接到此端点以与 echo, health,以及 add 工具。

与服务器交互(概念)

您如何与工具交互取决于所选的运输方式和 FastMCP 客户端实现。

  • 对于 stdio:您通常会向服务器的标准输入发送类似JSON-RPC的消息,并在其标准输出上接收响应。

    // Example conceptual input for stdio (actual format depends on FastMCP)
    // {"jsonrpc": "2.0", "method": "add", "params": {"a": 5, "b": 3}, "id": 1}
    
  • 对于 sse:客户端将连接到 /sse 终点。然后,服务器将推送工具调用和响应的消息。

日志记录

  • 控制台:默认情况下,INFO级别消息打印到 stdout。这包括服务器启动消息、注册的工具和基本活动。
  • 文件记录(--log 选项):
    • 为两者启用DEBUG级别的日志记录 mcp_server.py 和那个 mcp SDK。
    • 这非常冗长,包括:
      • 详细的工具调用参数和结果。
      • 内部服务器操作。
      • 来自MCP SDK的调试消息。
    • 日志文件的格式如下: %(asctime)s - %(name)s - %(levelname)s - %(message)s.

关机

按 Ctrl+C 优雅地关闭服务器。