|
|
|
|
|
"""
|
|
|
|
|
|
自定义MCP服务器示例
|
|
|
|
|
|
|
|
|
|
|
|
这是一个简单的MCP服务器,提供基础的数学计算和文本处理工具。
|
|
|
|
|
|
用于演示如何创建自己的MCP服务器。
|
|
|
|
|
|
|
|
|
|
|
|
运行方式:
|
|
|
|
|
|
python my_mcp_server.py
|
|
|
|
|
|
|
|
|
|
|
|
或者作为MCP服务器被客户端调用:
|
|
|
|
|
|
MCPClient(["python", "my_mcp_server.py"])
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from fastmcp import FastMCP
|
|
|
|
|
|
import sys
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
|
|
# 创建MCP服务器实例
|
|
|
|
|
|
mcp = FastMCP("MyCustomServer")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 数学工具 ====================
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def add(a: float, b: float) -> float:
|
|
|
|
|
|
"""
|
|
|
|
|
|
加法计算器
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
a: 第一个数字
|
|
|
|
|
|
b: 第二个数字
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
两数之和
|
|
|
|
|
|
"""
|
|
|
|
|
|
return a + b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def subtract(a: float, b: float) -> float:
|
|
|
|
|
|
"""
|
|
|
|
|
|
减法计算器
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
a: 被减数
|
|
|
|
|
|
b: 减数
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
两数之差
|
|
|
|
|
|
"""
|
|
|
|
|
|
return a - b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def multiply(a: float, b: float) -> float:
|
|
|
|
|
|
"""
|
|
|
|
|
|
乘法计算器
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
a: 第一个数字
|
|
|
|
|
|
b: 第二个数字
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
两数之积
|
|
|
|
|
|
"""
|
|
|
|
|
|
return a * b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def divide(a: float, b: float) -> float:
|
|
|
|
|
|
"""
|
|
|
|
|
|
除法计算器
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
a: 被除数
|
|
|
|
|
|
b: 除数
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
两数之商
|
|
|
|
|
|
|
|
|
|
|
|
Raises:
|
|
|
|
|
|
ValueError: 当除数为0时
|
|
|
|
|
|
"""
|
|
|
|
|
|
if b == 0:
|
|
|
|
|
|
raise ValueError("除数不能为零")
|
|
|
|
|
|
return a / b
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 文本处理工具 ====================
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def reverse_text(text: str) -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
反转文本
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
text: 要反转的文本
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
反转后的文本
|
|
|
|
|
|
"""
|
|
|
|
|
|
return text[::-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def count_words(text: str) -> int:
|
|
|
|
|
|
"""
|
|
|
|
|
|
统计文本中的单词数量
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
text: 要统计的文本
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
单词数量
|
|
|
|
|
|
"""
|
|
|
|
|
|
return len(text.split())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def to_uppercase(text: str) -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
将文本转换为大写
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
text: 要转换的文本
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
大写文本
|
|
|
|
|
|
"""
|
|
|
|
|
|
return text.upper()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.tool()
|
|
|
|
|
|
def to_lowercase(text: str) -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
将文本转换为小写
|
|
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|
|
text: 要转换的文本
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
小写文本
|
|
|
|
|
|
"""
|
|
|
|
|
|
return text.lower()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 资源定义 ====================
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.resource("config://server")
|
|
|
|
|
|
def get_server_config() -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取服务器配置信息
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
服务器配置的JSON字符串
|
|
|
|
|
|
"""
|
|
|
|
|
|
import json
|
|
|
|
|
|
config = {
|
|
|
|
|
|
"name": "MyCustomServer",
|
|
|
|
|
|
"version": "1.0.0",
|
|
|
|
|
|
"tools_count": 8,
|
|
|
|
|
|
"description": "自定义MCP服务器示例"
|
|
|
|
|
|
}
|
|
|
|
|
|
return json.dumps(config, ensure_ascii=False, indent=2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.resource("info://capabilities")
|
|
|
|
|
|
def get_capabilities() -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取服务器能力列表
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
能力列表的文本描述
|
|
|
|
|
|
"""
|
|
|
|
|
|
capabilities = """
|
|
|
|
|
|
服务器能力列表:
|
|
|
|
|
|
|
|
|
|
|
|
数学计算:
|
|
|
|
|
|
- add: 加法计算
|
|
|
|
|
|
- subtract: 减法计算
|
|
|
|
|
|
- multiply: 乘法计算
|
|
|
|
|
|
- divide: 除法计算
|
|
|
|
|
|
|
|
|
|
|
|
文本处理:
|
|
|
|
|
|
- reverse_text: 反转文本
|
|
|
|
|
|
- count_words: 统计单词数
|
|
|
|
|
|
- to_uppercase: 转换为大写
|
|
|
|
|
|
- to_lowercase: 转换为小写
|
|
|
|
|
|
|
|
|
|
|
|
资源:
|
|
|
|
|
|
- config://server: 服务器配置
|
|
|
|
|
|
- info://capabilities: 能力列表(本资源)
|
|
|
|
|
|
"""
|
|
|
|
|
|
return capabilities.strip()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 提示词模板 ====================
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.prompt()
|
|
|
|
|
|
def math_helper() -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
数学计算助手提示词
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
提示词模板
|
|
|
|
|
|
"""
|
|
|
|
|
|
return """你是一个数学计算助手。你可以使用以下工具:
|
|
|
|
|
|
- add(a, b): 计算两数之和
|
|
|
|
|
|
- subtract(a, b): 计算两数之差
|
|
|
|
|
|
- multiply(a, b): 计算两数之积
|
|
|
|
|
|
- divide(a, b): 计算两数之商
|
|
|
|
|
|
|
|
|
|
|
|
请根据用户的问题选择合适的工具进行计算。"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@mcp.prompt()
|
|
|
|
|
|
def text_processor() -> str:
|
|
|
|
|
|
"""
|
|
|
|
|
|
文本处理助手提示词
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
提示词模板
|
|
|
|
|
|
"""
|
|
|
|
|
|
return """你是一个文本处理助手。你可以使用以下工具:
|
|
|
|
|
|
- reverse_text(text): 反转文本
|
|
|
|
|
|
- count_words(text): 统计单词数
|
|
|
|
|
|
- to_uppercase(text): 转换为大写
|
|
|
|
|
|
- to_lowercase(text): 转换为小写
|
|
|
|
|
|
|
|
|
|
|
|
请根据用户的需求选择合适的工具处理文本。"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# ==================== 主程序 ====================
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
# 运行MCP服务器
|
|
|
|
|
|
# FastMCP会自动处理stdio传输
|
|
|
|
|
|
mcp.run()
|
|
|
|
|
|
|