MCP服务器框架

Simply-MCP-PY是一个Python实现的现代框架,用于构建支持多种API风格和传输协议的Model Context Protocol(MCP)服务器。

  • by Clockwork-Innovations
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Clockwork-Innovations/simply-mcp-py

使用说明

简单的MCP PY

用于构建具有多种API样式的模型上下文协议(MCP)服务器的现代Python框架

简单来说,MCP PY是Python的实现 简单来说就是mcp-ts,为构建MCP服务器的Python生态系统带来了同样的易用性和灵活性。

特性

  • 多种API样式 -选择适合您工作流程的样式:

    • 🎨 装饰师API -干净、声明性的基于类的方法
    • 🔧 API功能 -使用方法链进行程序化服务器构建
    • 📝 接口API -纯类型注释接口(即将推出)
    • 🤖 生成器API -人工智能驱动的工具开发(未来)
  • 多个传输 -在任何地方运行服务器:

    • 📟 工作室 -标准输入/输出(默认)
    • 🌐 超文本传输协议 -支持会话的RESTful HTTP服务器
    • 📡 上海证券交易所 -服务器发送实时流媒体事件
  • 零配置 -立即开始:

    • 自动检测API风格
    • 从类型提示自动生成架构
    • 一切都是合理的违约
    • 高级用例的可选配置
  • 开发者体验:

    • 🔥 带手表模式的热重新加载
    • 📦 捆绑到独立可执行文件
    • 🎯 类型安全,完全支持mypy
    • 📚 全面的文件
  • 生产就绪:

    • 🔒 速率限制和身份验证
    • ⚡ 长期运营的进度报告
    • 🔄 使用启动/关闭挂钩进行寿命管理
    • 📊 二进制内容支持
    • 🛡️ 安全最佳实践

快速开始

安装

选项1:尝试不安装(uvx)

# Install uvx
pip install uv

# Run directly without installing simply-mcp
uvx simply-mcp --version
uvx simply-mcp run server.py

选项2:永久安装(pip)

pip install simply-mcp

您的第一台服务器(Decorator API)

# server.py
from simply_mcp import mcp_server, tool

@mcp_server(name="my-server", version="1.0.0")
class MyServer:
    @tool(description="Add two numbers")
    def add(self, a: int, b: int) -> int:
        """Add two numbers together."""
        return a + b

    @tool(description="Greet a user")
    def greet(self, name: str, formal: bool = False) -> str:
        """Generate a greeting."""
        if formal:
            return f"Good day, {name}."
        return f"Hey {name}!"

运行您的服务器

# Run with stdio (default)
simply-mcp run server.py

# Run with HTTP on port 3000
simply-mcp run server.py --transport http --port 3000

# Run with auto-reload
simply-mcp run server.py --watch

注: 如果使用uvx,请在命令前加上前缀 uvx: uvx simply-mcp run server.py。第一次运行需要大约7-30秒来下载软件包,后续运行几乎是即时的。

API样式

装饰师API(推荐)

干净、声明性的基于类的方法:

from simply_mcp import mcp_server, tool, prompt, resource

@mcp_server(name="my-server", version="1.0.0")
class MyServer:
    @tool(description="Calculate sum")
    def add(self, a: int, b: int) -> int:
        return a + b

    @prompt(description="Generate code review")
    def code_review(self, language: str) -> str:
        return f"Please review this {language} code..."

    @resource(uri="config://server", mime_type="application/json")
    def get_config(self) -> dict:
        return {"status": "running", "version": "1.0.0"}

API功能

程序化服务器构建:

from simply_mcp import BuildMCPServer

mcp = BuildMCPServer(name="my-server", version="1.0.0")

@mcp.add_tool(description="Add two numbers")
def add(a: int, b: int) -> int:
    return a + b

@mcp.add_prompt(description="Generate greeting")
def greet(name: str) -> str:
    return f"Hello, {name}!"

# Method chaining
mcp.configure(port=3000).run()

配置

创建 simplymcp.config.toml 文件:

[server]
name = "my-mcp-server"
version = "1.0.0"

[transport]
type = "http"  # or "stdio", "sse"
port = 3000

[logging]
level = "INFO"
format = "json"

[security]
enable_rate_limiting = true
rate_limit_per_minute = 60

或者使用环境变量:

export SIMPLY_MCP_TRANSPORT=http
export SIMPLY_MCP_PORT=3000
export SIMPLY_MCP_LOG_LEVEL=DEBUG

高级功能

寿命管理

from simply_mcp import BuildMCPServer, Context

mcp = BuildMCPServer(name="my-server", version="1.0.0")

@mcp.on_startup()
async def initialize():
    """Run on server startup - load resources, connect to databases, etc."""
    db = await create_database_connection()
    mcp.server.lifespan['db'] = db  # Store for later use

@mcp.on_shutdown()
async def cleanup():
    """Run on server shutdown - close connections, save state, etc."""
    db = mcp.server.lifespan.get('db')
    if db:
        await db.close()

@mcp.tool()
async def query_data(query: str, ctx: Context) -> dict:
    """Access lifespan state in request handlers."""
    db = ctx.request_context.lifespan_context['db']
    result = await db.query(query)
    return result

进度报告

from simply_mcp import tool, Progress

@tool(description="Process large dataset")
async def process_data(data: list, progress: Progress) -> dict:
    total = len(data)
    for i, item in enumerate(data):
        await progress.update(
            percentage=(i / total) * 100,
            message=f"Processing item {i+1}/{total}"
        )
        # Process item...
    return {"processed": total}

认证

# simplymcp.config.toml
[security.auth]
enabled = true
type = "api_key"
api_keys = ["your-secret-key"]

二进制内容

@resource(uri="file://document.pdf", mime_type="application/pdf")
def get_document(self) -> bytes:
    with open("document.pdf", "rb") as f:
        return f.read()

CLI命令

# Run a server
simply-mcp run server.py [--transport TYPE] [--port PORT] [--watch]

# Bundle to executable
simply-mcp bundle server.py --output dist/

# List available servers
simply-mcp list [--json]

# Configuration management
simply-mcp config init          # Create config file
simply-mcp config validate      # Validate config
simply-mcp config show          # Show current config

例子

看看 examples/ 目录:

  • simple_server.py -最小工作示例
  • decorator_basic.py -装饰师API基础
  • functional_api.py -API功能使用
  • http_server.py -HTTP传输示例
  • lifespan_management_example.py -启动/关闭挂钩、状态管理
  • advanced_features.py -进度、身份验证、二进制内容

文档

与简单的mcp-ts进行比较

功能 简单mcp-ts 简单mcp py
装饰师API ✅ ✅
API功能 ✅ ✅
接口API ✅ 🚧 (计划中)
生成器API ✅ 🚧 (未来)
标准运输 ✅ ✅
HTTP传输 ✅ ✅
苏格兰和南方能源公司运输✅ ✅
监视模式 ✅ ✅
捆绑 ✅ ✅
模式验证 Zod Pydantic
类型系统 TypeScript Python+mypy

开发状态

✅ v0.1.0稳定版 -生产准备就绪。核心功能已完全实现和测试。API稳定,适合生产使用。看 ROADMAP.md 以了解未来版本中的计划功能。

贡献

我们欢迎捐款!请参阅 贡献.md 作为指导方针。

需求

  • Python 3.10或更高版本
  • 通过pip管理依赖关系

许可证

MIT许可证-请参阅 许可证 文件以获取详细信息。

相关项目

致谢

支持


由...制作❤️ 钟表创新