关于 MCP_Server_Setup
MCP_Server_Setup 是 Python MCP 服务的搭建与运行示例,面向开发者。内容涵盖工具和资源定义、测试及客户端连接,展示 stdio 与 SSE 传输方式。
主要功能
- 01定义 MCP 工具与资源
- 02使用 MCP Inspector 测试
- 03安装到 Claude Desktop
- 04支持 stdio 与 SSE 传输
适用场景
- 01本地测试 MCP 服务
- 02将服务接入 Claude Desktop
- 03让客户端通过 stdio 或 SSE 连接
MCP 相关
介绍如何构建 MCP 服务,以及通过 stdio 或 SSE 连接 MCP 客户端。服务可向客户端提供定义的工具和资源。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("DemoServer")
@mcp.tool()
def say_hello(name: str) -> str:
"""Say hello to someone
Args:
name: The person's name to greet
"""
return f"Hello, {name}! Nice to meet you."
if __name__ == "__main__":
mcp.run()
运行服务
运行 MCP 服务有几种方式:
1. 使用 MCP Inspector 进行开发模式运行
测试服务最简单的方式是使用 MCP Inspector:
mcp dev server.py
这会在本地运行服务,并将其连接到 MCP Inspector。MCP Inspector 是一款基于 Web 的工具,可让你直接与服务的工具和资源交互。这种方式非常适合测试。
2. 集成 Claude Desktop
如果已安装 Claude Desktop,可以安装服务并在 Claude 中使用:
mcp install server.py
这会将服务添加到 Claude Desktop 的配置中,以便在 Claude 中使用。
3. 直接执行(仅在需要 SSE 时)
你也可以直接运行服务:
# Method 1: Running as a Python script
python server.py
# Method 2: Using UV (recommended)
uv run server.py
运行 MCP 服务时会发生什么?
运行 MCP 服务时:
- 服务会使用已定义的功能(工具、资源等)进行初始化。
- 服务会开始通过特定传输方式侦听连接。
默认情况下,MCP 服务不会使用传统 Web 服务端口,而是使用以下任一种方式:
- stdio 传输:服务通过标准输入和输出进行通信(
mcp run和集成 Claude Desktop 时的默认方式) - SSE 传输:用于基于 HTTP 的通信(显式配置时使用)
如果要通过 HTTP 使用特定端口公开服务,需要将服务修改为使用 SSE 传输:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("MyServer", host="127.0.0.1", port=8050)
# Add your tools and resources here...
if __name__ == "__main__":
# Run with SSE transport on port 8000
mcp.run(transport="sse")
然后可以通过以下命令运行:
python server.py
这会在 http://127.0.0.1:8050 启动服务。
客户端实现(使用标准 I/O)
接下来,看看如何创建一个使用该服务的客户端:
import asyncio
import nest_asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="python", # The command to run your server
args=["server.py"], # Arguments to the command
)
async with stdio_client(server_params) as (read_stream, write_stream):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools_result = await session.list_tools()
print("Available tools:")
for tool in tools_result.tools:
print(f" - {tool.name}: {tool.description}")
result = await session.call_tool("add", arguments={"a": 2, "b": 3})
print(f"2 + 3 = {result.content[0].text}")
if __name__ == "__main__":
asyncio.run(main())
此客户端会:
- 通过 stdio 与服务建立连接
- 建立 MCP 会话
- 列出可用工具
- 使用参数调用
add工具
客户端实现(使用服务器发送事件)
以下是使用 SSE 连接到服务的方法:
import asyncio
import nest_asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
async def main():
async with sse_client("http://localhost:8050/sse") as (read_stream, write_stream):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools_result = await session.list_tools()
print("Available tools:")
for tool in tools_result.tools:
print(f" - {tool.name}: {tool.description}")
result = await session.call_tool("add", arguments={"a": 2, "b": 3})
print(f"2 + 3 = {result.content[0].text}")
if __name__ == "__main__":
asyncio.run(main())
应该选择哪种方式?
- 如果客户端和服务在同一进程中运行,或者由客户端直接启动服务进程,请使用 stdio。
- 如果服务与客户端分开运行(可能位于不同机器或不同容器中),请使用 HTTP。
对于大多数生产环境中的后端集成,HTTP 方式的隔离性和可扩展性更好,而 stdio 方式对于开发或紧密耦合的系统来说可能更简单。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。