mcp-framework


Namemcp-framework JSON
Version 0.1.2.post1724313300 PyPI version JSON
download
home_pagehttps://github.com/mcpframework/mcp_framework
Summary一个强大且易用的 MCP (Model Context Protocol) 服务器开发框架
upload_time2025-08-22 08:37:24
maintainerNone
docs_urlNone
authorMCP Framework Team
requires_python>=3.8
licenseMIT
keywords mcp model-context-protocol server framework ai llm tools streaming async web-server
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # MCP Framework

一个强大且易用的 MCP (Model Context Protocol) 服务器开发框架,支持快速构建、部署和管理 MCP 服务器。

使用该框架开发的mcp_servers: https://gitee.com/wmjsoft_admin/mcp-servers

## 🚀 特性

### 核心功能
- **简单易用**: 基于装饰器的 API 设计,快速定义工具和资源
- **类型安全**: 完整的类型注解支持,自动生成 JSON Schema
- **流式支持**: 内置流式响应支持,适合大数据量处理
- **配置管理**: 灵活的配置系统,支持多端口配置
- **自动构建**: 集成 PyInstaller 构建系统,一键生成可执行文件

### 高级特性
- **多平台支持**: Windows、macOS、Linux 跨平台构建
- **依赖管理**: 智能依赖分析和打包
- **热重载**: 开发模式下支持代码热重载
- **日志系统**: 完整的日志记录和调试支持
- **Web 界面**: 内置配置和测试 Web 界面

## 📦 安装

### 从 PyPI 安装

```bash
pip install mcp-framework
```

### 从源码安装

```bash
git clone https://github.com/your-repo/mcp_framework.git
cd mcp_framework
pip install -e .
```

## 🎯 快速开始

### 1. 创建基础服务器

```python
#!/usr/bin/env python3
import asyncio
from mcp_framework import EnhancedMCPServer, run_server_main
from mcp_framework.core.decorators import Required, Optional
from typing import Annotated


class MyMCPServer(EnhancedMCPServer):
    """我的第一个 MCP 服务器"""
    
    def __init__(self):
        super().__init__(
            name="MyMCPServer",
            version="1.0.0",
            description="我的第一个 MCP 服务器"
        )
        self._setup_tools()
    
    async def initialize(self):
        """初始化服务器"""
        self.logger.info("MyMCPServer 初始化完成")
    
    def _setup_tools(self):
        """设置工具和资源"""
        
        # 使用装饰器定义工具
        @self.tool("计算两个数的和")
        async def add_numbers(
            a: Annotated[int, Required("第一个数字")],
            b: Annotated[int, Required("第二个数字")]
        ) -> int:
            """计算两个数字的和"""
            return a + b
        
        # 定义流式工具
        @self.streaming_tool("生成数字序列")
        async def generate_sequence(
            start: Annotated[int, Required("起始数字")],
            end: Annotated[int, Required("结束数字")]
        ):
            """生成数字序列"""
            for i in range(start, end + 1):
                yield f"数字: {i}"
                await asyncio.sleep(0.1)  # 模拟处理时间
        
        # 定义资源
        @self.resource(
            uri="file://data.txt",
            name="示例数据",
            description="示例数据文件"
        )
        async def get_data():
            return {"content": "这是示例数据", "type": "text/plain"}


# 启动服务器
if __name__ == "__main__":
    server = MyMCPServer()
    run_server_main(
        server_instance=server,
        server_name="MyMCPServer",
        default_port=8080
    )
```

### 2. 运行服务器

```bash
python my_server.py --port 8080 --host localhost
```

## 📚 详细文档

### 装饰器 API

#### 工具装饰器

```python
# 在 _setup_tools 方法中定义工具
def _setup_tools(self):
    # 基础工具
    @self.tool("工具描述")
    async def my_tool(param1: str, param2: int) -> str:
        return f"处理结果: {param1} - {param2}"
    
    # 流式工具
    @self.streaming_tool("流式工具描述")
    async def my_streaming_tool(query: str):
        for i in range(10):
            yield f"处理步骤 {i}: {query}"
            await asyncio.sleep(0.1)
```

#### 参数类型注解

```python
from typing import List, Optional, AsyncGenerator
from typing_extensions import Annotated
from mcp_framework.core.decorators import (
    Required as R,
    Optional as O,
    IntRange,
    ServerParam,
    StringParam,
    BooleanParam,
    PathParam
)

# 在 _setup_tools 方法中定义
def _setup_tools(self):
    # 流式工具参数示例
    @self.streaming_tool(description="📖 **File Line Range Reader** - 流式读取文件指定行范围")
    async def read_file_lines(
        file_path: Annotated[str, R("文件路径(支持相对和绝对路径)")],
        start_line: Annotated[int, IntRange("起始行号(1-based)", min_val=1)],
        end_line: Annotated[int, IntRange("结束行号(1-based,包含)", min_val=1)]
    ) -> AsyncGenerator[str, None]:
        """流式读取文件指定行范围"""
        # 实现代码...
        yield "result"
    
    # 搜索工具参数示例
    @self.tool(description="🔍 **Content Search** - 搜索文件内容")
    async def search_files(
        query_text: Annotated[str, R("搜索关键词")],
        limit: Annotated[int, O("最大结果数量", default=50, minimum=1)] = 50,
        case_sensitive: Annotated[bool, O("是否区分大小写", default=False)] = False,
        file_extensions: Annotated[Optional[List[str]], O("文件扩展名列表,如 ['.py', '.js']")] = None
    ) -> dict:
        """搜索文件内容"""
        return {"results": []}
```

#### 资源装饰器

```python
import json

# 在 _setup_tools 方法中定义
def _setup_tools(self):
    @self.resource(
        uri="file://config.json",
        name="配置文件",
        description="服务器配置文件",
        mime_type="application/json"
    )
    async def get_config():
        return {
            "content": json.dumps({"setting1": "value1"}),
            "type": "application/json"
        }
```

### 服务器配置

#### 配置参数定义

```python
from mcp_framework.core.decorators import (
    ServerParam,
    StringParam,
    SelectParam,
    BooleanParam,
    PathParam
)
from typing import Annotated

# 在 _setup_tools 方法中定义
def _setup_tools(self):
    @self.decorators.server_param("api_key")
    async def api_key_param(
        param: Annotated[str, StringParam(
            display_name="API 密钥",
            description="用于访问外部服务的 API 密钥",
            placeholder="请输入 API 密钥"
        )]
    ):
        """API 密钥参数"""
        pass
    
    @self.decorators.server_param("model_type")
    async def model_param(
        param: Annotated[str, SelectParam(
            display_name="模型类型",
            description="选择要使用的 AI 模型",
            options=["gpt-3.5-turbo", "gpt-4", "claude-3"]
        )]
    ):
        """模型类型参数"""
        pass
    
    @self.decorators.server_param("project_root")
    async def project_root_param(
        param: Annotated[str, PathParam(
            display_name="项目根目录",
            description="服务器操作的根目录路径,留空使用当前目录",
            required=False,
            placeholder="/path/to/project"
        )]
    ):
        """项目根目录参数"""
        pass
    
    @self.decorators.server_param("max_file_size")
    async def max_file_size_param(
        param: Annotated[int, ServerParam(
            display_name="最大文件大小 (MB)",
            description="允许读取的最大文件大小,单位MB",
            param_type="integer",
            default_value=10,
            required=False
        )]
    ):
        """最大文件大小参数"""
        pass
    
    @self.decorators.server_param("enable_hidden_files")
    async def enable_hidden_files_param(
        param: Annotated[bool, BooleanParam(
            display_name="启用隐藏文件",
            description="是否允许访问以点(.)开头的隐藏文件",
            default_value=False,
            required=False
        )]
    ):
        """启用隐藏文件参数
        
        这个装饰器的作用:
        1. 定义一个名为 'enable_hidden_files' 的服务器配置参数
        2. 参数类型为布尔值(BooleanParam)
        3. 在Web配置界面中显示为"启用隐藏文件"选项
        4. 用户可以通过配置界面或配置文件设置此参数
        5. 在工具函数中可通过 self.get_config_value("enable_hidden_files") 获取值
        
        参数说明:
        - display_name: 在配置界面显示的友好名称
        - description: 参数的详细说明
        - default_value: 默认值(False表示默认不启用隐藏文件)
        - required: 是否为必需参数(False表示可选)
        """
        pass
```

#### 配置使用

```python
from mcp_framework.core.decorators import Required
from typing import Annotated

# 在 _setup_tools 方法中定义
def _setup_tools(self):
    @self.tool("使用配置的工具")
    async def configured_tool(query: Annotated[str, Required("查询内容")]):
        # 获取配置值
        api_key = self.get_config_value("api_key")
        model_type = self.get_config_value("model_type", "gpt-3.5-turbo")
        enable_hidden = self.get_config_value("enable_hidden_files", False)
        
        # 使用配置进行处理
        result = f"使用 {model_type} 处理查询: {query}"
        if enable_hidden:
            result += " (包含隐藏文件)"
        return result
```

#### 服务器参数装饰器详解

服务器参数装饰器 `@self.decorators.server_param()` 是 MCP Framework 的核心功能之一,它允许你为服务器定义可配置的参数。

**工作原理:**

1. **参数定义阶段**:使用装饰器定义参数的元数据(名称、类型、默认值等)
2. **配置收集阶段**:框架自动生成配置界面,用户可以设置参数值
3. **运行时使用**:在工具函数中通过 `self.get_config_value()` 获取用户设置的值

**完整示例:**

```python
# 1. 定义参数(在 _setup_tools 方法中)
@self.decorators.server_param("enable_hidden_files")
async def enable_hidden_files_param(
    param: Annotated[bool, BooleanParam(
        display_name="启用隐藏文件",
        description="是否允许访问以点(.)开头的隐藏文件",
        default_value=False,
        required=False
    )]
):
    """定义是否启用隐藏文件的配置参数"""
    pass

# 2. 在工具中使用参数
@self.tool("列出文件")
async def list_files(directory: Annotated[str, Required("目录路径")]):
    # 获取用户配置的参数值
    show_hidden = self.get_config_value("enable_hidden_files", False)
    
    files = []
    for file in os.listdir(directory):
        # 根据配置决定是否包含隐藏文件
        if not show_hidden and file.startswith('.'):
            continue
        files.append(file)
    
    return {"files": files, "show_hidden": show_hidden}
```

**参数类型支持:**

- `StringParam`: 字符串参数
- `BooleanParam`: 布尔参数
- `SelectParam`: 选择参数(下拉菜单)
- `PathParam`: 路径参数
- `ServerParam`: 通用参数(可指定类型)

**配置文件生成:**

框架会自动生成配置文件(如 `server_port_8080_config.json`),用户的设置会保存在其中:

```json
{
  "enable_hidden_files": true,
  "api_key": "your-api-key",
  "model_type": "gpt-4"
}
```

### 多端口配置

框架支持为不同端口创建独立的配置文件:

```bash
# 在不同端口启动服务器,会自动创建对应的配置文件
python server.py --port 8080  # 创建 server_port_8080_config.json
python server.py --port 8081  # 创建 server_port_8081_config.json
```

## 🔨 构建系统

框架集成了强大的构建系统,支持将 MCP 服务器打包为独立的可执行文件。

### 构建功能特性

- **自动发现**: 自动发现项目中的所有服务器脚本
- **依赖分析**: 智能分析和收集依赖包
- **多平台构建**: 支持 Windows、macOS、Linux
- **虚拟环境隔离**: 为每个服务器创建独立的构建环境
- **完整打包**: 生成包含所有依赖的分发包

### 使用构建系统

#### 1. 准备构建脚本

在项目根目录创建 `build.py`(或使用框架提供的构建脚本):

```python
#!/usr/bin/env python3
from mcp_framework.build import MCPServerBuilder

if __name__ == "__main__":
    builder = MCPServerBuilder()
    builder.build_all()
```

#### 2. 构建命令

##### 使用 mcp-build 命令行工具(推荐)

框架提供了专门的 `mcp-build` 命令行工具,简化构建过程:

```bash
# 基础构建命令
mcp-build                           # 构建所有发现的服务器
mcp-build --server my_server.py     # 构建特定服务器
mcp-build --list                    # 列出所有可构建的服务器

# 构建选项
mcp-build --no-clean               # 跳过清理构建目录
mcp-build --no-test                # 跳过测试阶段
mcp-build --no-onefile             # 构建为目录而非单文件
mcp-build --include-source         # 在分发包中包含源代码
mcp-build --clean-only             # 只清理构建目录,不进行构建

# 组合使用
mcp-build --server weather_server.py --no-test --include-source
```

**mcp-build 命令详细说明:**

| 参数 | 简写 | 说明 | 示例 |
|------|------|------|------|
| `--server` | `-s` | 指定要构建的服务器脚本 | `mcp-build -s my_server.py` |
| `--list` | `-l` | 列出所有可构建的服务器 | `mcp-build -l` |
| `--no-clean` | | 跳过构建前的清理步骤 | `mcp-build --no-clean` |
| `--no-test` | | 跳过构建后的测试验证 | `mcp-build --no-test` |
| `--no-onefile` | | 构建为目录而非单个可执行文件 | `mcp-build --no-onefile` |
| `--include-source` | | 在分发包中包含源代码 | `mcp-build --include-source` |
| `--clean-only` | | 只清理构建目录,不执行构建 | `mcp-build --clean-only` |

**构建流程说明:**

1. **发现阶段**: 自动扫描项目目录,发现所有 MCP 服务器脚本
2. **清理阶段**: 清理之前的构建文件(可通过 `--no-clean` 跳过)
3. **依赖分析**: 分析每个服务器的依赖包,包括:
   - 通用依赖 (`requirements.txt`)
   - 服务器特定依赖 (`{server_name}_requirements.txt`)
   - 代码中导入的本地模块
4. **构建阶段**: 使用 PyInstaller 构建可执行文件
5. **测试阶段**: 验证构建的可执行文件能正常启动(可通过 `--no-test` 跳过)
6. **打包阶段**: 创建包含所有必要文件的分发包

##### 使用 Python 脚本构建(传统方式)

```bash
# 构建所有服务器
python build.py

# 构建特定服务器
python build.py --server my_server.py

# 列出所有可构建的服务器
python build.py --list

# 只清理构建目录
python build.py --clean-only

# 跳过测试
python build.py --no-test

# 包含源代码
python build.py --include-source
```

#### 3. 构建输出

构建完成后,会在 `dist/` 目录生成分发包:

```
dist/
├── my-server-macos-arm64-20241201_143022.tar.gz
├── weather-server-macos-arm64-20241201_143025.tar.gz
└── ...
```

每个分发包包含:
- 可执行文件
- 完整的 requirements.txt
- 启动脚本(start.sh / start.bat)
- README 和许可证文件
- 源代码(如果指定 --include-source)

### 跨平台构建

框架支持跨平台构建,可以在一个平台上构建其他平台的可执行文件:

#### 使用 mcp-build 进行跨平台构建

```bash
# 构建所有平台版本(需要 Docker)
mcp-build --platform all

# 构建特定平台
mcp-build --platform windows      # 构建 Windows 版本
mcp-build --platform linux        # 构建 Linux 版本
mcp-build --platform native       # 构建当前平台版本

# 跨平台构建特定服务器
mcp-build --platform windows --server my_server.py

# 检查 Docker 环境
mcp-build --check-docker
```

#### 跨平台构建要求

- **Docker Desktop**: 用于跨平台构建(Windows 和 Linux)
- **本地构建**: 不需要 Docker,只构建当前平台

#### 便捷脚本

框架还提供了便捷的构建脚本:

```bash
# 使用跨平台构建脚本
python build_cross_platform.py --platform all

# 使用 Windows 构建脚本(仅限 Windows 构建)
./build_windows.sh

# 使用 Docker Compose
docker-compose --profile build up build-windows
docker-compose --profile build up build-linux
```

### 依赖管理

构建系统支持多层依赖管理:

1. **通用依赖** (`requirements.txt`): 所有服务器共享的依赖
2. **特定依赖** (`{server_name}_requirements.txt`): 特定服务器的依赖
3. **自动分析**: 从代码中自动分析导入的包

示例文件结构:
```
project/
├── requirements.txt              # 通用依赖
├── weather_server.py
├── weather_server_requirements.txt  # weather_server 特定依赖
├── chat_server.py
├── chat_server_requirements.txt     # chat_server 特定依赖
├── build.py                      # 构建脚本
├── build_cross_platform.py      # 跨平台构建脚本
└── build_windows.sh              # Windows 构建便捷脚本
```

### 构建输出详解

构建完成后,分发包的详细结构:

```
dist/
├── my-server-macos-arm64-20241201_143022.tar.gz
│   ├── my-server                 # 可执行文件
│   ├── start.sh                  # Unix 启动脚本
│   ├── start.bat                 # Windows 启动脚本
│   ├── requirements.txt          # 依赖列表
│   ├── README.md                 # 使用说明
│   ├── LICENSE                   # 许可证文件
│   └── src/                      # 源代码(如果使用 --include-source)
├── my-server-windows-amd64-20241201_143025.zip
└── my-server-linux-x86_64-20241201_143028.tar.gz
```

**分发包特性:**

- **独立运行**: 包含所有必要的依赖,无需额外安装
- **跨平台**: 支持 Windows、macOS、Linux
- **便捷启动**: 提供启动脚本,简化运行过程
- **完整文档**: 包含 README 和许可证文件
- **源码可选**: 可选择是否包含源代码

### mcp-build 使用示例和最佳实践

#### 典型工作流程

```bash
# 1. 开发阶段:列出所有可构建的服务器
mcp-build --list

# 输出示例:
# 📋 Available server scripts:
#    - weather_server.py → Weather MCP Server
#    - chat_server.py → AI Chat Assistant
#    - file_manager.py → File Management Server

# 2. 测试构建:构建特定服务器(快速验证)
mcp-build --server weather_server.py --no-test

# 3. 完整构建:包含测试和源码
mcp-build --server weather_server.py --include-source

# 4. 生产构建:构建所有服务器
mcp-build

# 5. 跨平台发布:构建所有平台版本
mcp-build --platform all
```

#### 常见使用场景

**场景1:快速开发测试**
```bash
# 跳过测试,快速构建验证
mcp-build --server my_server.py --no-test --no-clean
```

**场景2:CI/CD 集成**
```bash
# 适合自动化构建的命令
mcp-build --no-test --include-source
```

**场景3:发布准备**
```bash
# 完整构建,包含所有验证
mcp-build --platform all --include-source
```

**场景4:调试构建问题**
```bash
# 只清理,不构建
mcp-build --clean-only

# 保留构建文件,便于调试
mcp-build --server my_server.py --no-clean
```

#### 构建优化建议

1. **依赖管理优化**
   ```bash
   # 为每个服务器创建特定的依赖文件
   # weather_server_requirements.txt
   requests>=2.28.0
   beautifulsoup4>=4.11.0
   
   # chat_server_requirements.txt  
   openai>=1.0.0
   langchain>=0.1.0
   ```

2. **构建性能优化**
   ```bash
   # 跳过不必要的步骤
   mcp-build --no-test --no-clean  # 开发阶段
   
   # 只构建变更的服务器
   mcp-build --server changed_server.py
   ```

3. **分发包优化**
   ```bash
   # 生产环境:不包含源码,减小包大小
   mcp-build
   
   # 开发分发:包含源码,便于调试
   mcp-build --include-source
   ```

#### 错误排查

**常见问题及解决方案:**

1. **Docker 不可用**
   ```bash
   # 检查 Docker 状态
   mcp-build --check-docker
   
   # 如果 Docker 不可用,只构建本地平台
   mcp-build --platform native
   ```

2. **依赖冲突**
   ```bash
   # 清理构建缓存
   mcp-build --clean-only
   
   # 重新构建
   mcp-build --server problematic_server.py
   ```

3. **构建失败**
   ```bash
   # 跳过测试,查看构建是否成功
   mcp-build --server my_server.py --no-test
   
   # 保留构建文件,手动检查
   mcp-build --server my_server.py --no-clean
   ```

#### 高级用法

**自定义构建脚本集成**
```python
#!/usr/bin/env python3
# custom_build.py
from mcp_framework.build import MCPServerBuilder
import subprocess

def custom_build():
    # 预处理
    print("🔧 Running custom pre-build steps...")
    
    # 使用 mcp-build
    result = subprocess.run([
        "mcp-build", 
        "--server", "my_server.py",
        "--include-source"
    ])
    
    if result.returncode == 0:
        print("✅ Build successful!")
        # 后处理
        print("📦 Running custom post-build steps...")
    else:
        print("❌ Build failed!")
        return False
    
    return True

if __name__ == "__main__":
    custom_build()
```

**批量构建脚本**
```bash
#!/bin/bash
# batch_build.sh

echo "🚀 Starting batch build process..."

# 构建开发版本
echo "📦 Building development versions..."
mcp-build --include-source

# 构建生产版本
echo "🏭 Building production versions..."
mcp-build --platform all

echo "✅ Batch build completed!"
echo "📁 Check dist/ directory for all packages"
ls -la dist/
```

## 🌐 Web 界面

框架提供内置的 Web 管理界面:

```python
from mcp_framework import EnhancedMCPServer
from mcp_framework.web import setup_web_interface

# 在服务器类中启用 Web 界面
class MyMCPServer(EnhancedMCPServer):
    def __init__(self):
        super().__init__(name="MyServer", version="1.0.0")
        # 启用 Web 界面
        setup_web_interface(self, port=8080)
```

访问 `http://localhost:8080/config` 进行配置管理。

## 🔧 高级用法


### 中间件支持

框架提供了中间件系统,用于处理HTTP请求的预处理和后处理。中间件在请求到达具体处理函数之前或响应返回给客户端之前执行特定的逻辑。

#### 内置中间件

框架自动集成了以下核心中间件:

**1. CORS 中间件 (`cors_middleware`)**
- **功能**: 处理跨域资源共享
- **用途**: 允许Web界面从不同域名访问MCP服务器
- **自动配置**: 支持所有常见的HTTP方法和头部

**2. 错误处理中间件 (`error_middleware`)**
- **功能**: 统一处理和格式化错误响应
- **用途**: 捕获异常,记录日志,返回标准化的JSON错误格式
- **安全性**: 避免敏感信息泄露

**3. 日志中间件 (`logging_middleware`)**
- **功能**: 记录HTTP请求的访问日志
- **监控**: 记录请求方法、路径、响应状态码和处理时间
- **调试**: 便于问题排查和性能分析

#### 中间件工作流程

```
请求 → CORS中间件 → 错误处理中间件 → 日志中间件 → 路由处理 → 响应
```

#### 自定义中间件示例

#### 框架中间件实现

框架的中间件在 `MCPHTTPServer` 中自动配置:

```python
from mcp_framework.server.middleware import (
    cors_middleware,
    error_middleware, 
    logging_middleware
)

class MCPHTTPServer:
    def setup_middleware(self):
        """设置中间件"""
        self.app.middlewares.append(cors_middleware)
        self.app.middlewares.append(error_middleware)
        self.app.middlewares.append(logging_middleware)
```

#### 中间件应用场景

**1. 安全控制**
- 跨域资源共享 (CORS)
- 统一错误处理
- 请求日志记录

**2. 监控和调试**
- 请求响应时间统计
- 错误率监控
- 访问日志记录

**3. 自动化处理**
- 响应头标准化
- 错误格式统一
- 请求追踪

#### 使用示例

```python
from mcp_framework import EnhancedMCPServer, run_server_main

class MyMCPServer(EnhancedMCPServer):
    def __init__(self):
        super().__init__(
            name="MyServer", 
            version="1.0.0",
            description="支持内置中间件的MCP服务器"
        )
        self._setup_tools()
    
    async def initialize(self):
        """服务器初始化"""
        self.logger.info("服务器启动,内置中间件已自动配置")
        self.logger.info("CORS、错误处理、日志中间件已启用")
    
    def _setup_tools(self):
        @self.tool("测试工具")
        async def test_tool(message: str) -> str:
            """测试中间件功能的工具"""
            return f"处理消息: {message}"

if __name__ == "__main__":
    server = MyMCPServer()
    run_server_main(
        server_instance=server,
        server_name="MyServer",
        default_port=8080
    )
```

#### 中间件效果验证

启动服务器后,可以通过以下方式验证中间件功能:

```bash
# 测试CORS中间件
curl -H "Origin: http://localhost:3000" http://localhost:8080/health

# 测试错误处理中间件
curl http://localhost:8080/nonexistent

# 查看日志中间件输出
# 在服务器日志中会看到请求记录
```

**注意事项:**
- 中间件在HTTP服务器层面自动配置,无需手动注册
- 所有MCP服务器实例都会自动获得这些中间件功能
- 中间件按照固定顺序执行:CORS → 错误处理 → 日志记录
- 当前版本不支持自定义中间件注册(未来版本可能会支持)
#### 中间件应用场景

**1. 安全控制**
- API密钥验证
- 请求频率限制
- IP白名单/黑名单

**2. 监控和调试**
- 请求响应时间统计
- 错误率监控
- 访问日志记录

**3. 数据处理**
- 请求数据预处理
- 响应数据格式化
- 内容压缩

**4. 缓存优化**
- 响应缓存
- 静态资源缓存
- 数据库查询缓存

#### 配置示例

```python
from mcp_framework import EnhancedMCPServer, run_server_main

class MyMCPServer(EnhancedMCPServer):
    def __init__(self):
        super().__init__(
            name="MyServer", 
            version="1.0.0",
            description="支持中间件的MCP服务器"
        )
        self._setup_tools()
    
    async def initialize(self):
        """服务器初始化"""
        self.logger.info("服务器启动,中间件已自动配置")
        self.logger.info("CORS、错误处理、日志中间件已启用")
    
    def _setup_tools(self):
        @self.tool("测试工具")
        async def test_tool(message: str) -> str:
            """测试中间件功能的工具"""
            return f"处理消息: {message}"

if __name__ == "__main__":
    server = MyMCPServer()
    run_server_main(
        server_instance=server,
        server_name="MyServer",
        default_port=8080
    )
```

通过访问 `http://localhost:8080/health` 可以看到中间件的工作效果,包括CORS头部、访问日志和错误处理。

## 📖 示例项目

查看 `examples/` 目录中的完整示例:

- `examples/port_config_demo.py` - 端口配置演示
- `examples/weather_server.py` - 天气服务器示例
- `examples/file_manager.py` - 文件管理服务器
- `examples/ai_assistant.py` - AI 助手服务器

## 🤝 贡献

欢迎贡献代码!请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解详细信息。

## 📄 许可证

本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详细信息。

## 🆘 支持

- 📚 [文档](https://mcp-framework.readthedocs.io/)
- 🐛 [问题反馈](https://github.com/your-repo/mcp_framework/issues)
- 💬 [讨论区](https://github.com/your-repo/mcp_framework/discussions)
- 📧 [邮件支持](mailto:support@mcpframework.com)

## 🗺️ 路线图

- [ ] 插件系统
- [ ] 图形化配置界面
- [ ] 集群部署支持
- [ ] 性能监控面板
- [ ] Docker 容器化支持
- [ ] 云原生部署模板

---

**MCP Framework** - 让 MCP 服务器开发变得简单而强大! 🚀

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/mcpframework/mcp_framework",
    "name": "mcp-framework",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "MCP Framework Team <team@mcpframework.com>",
    "keywords": "mcp, model-context-protocol, server, framework, ai, llm, tools, streaming, async, web-server",
    "author": "MCP Framework Team",
    "author_email": "MCP Framework Team <team@mcpframework.com>",
    "download_url": "https://files.pythonhosted.org/packages/49/6a/dbf52bff8bad6c54ed73eb2572a34b9c60b222a6769f83b95523087e31cf/mcp_framework-0.1.2.post1724313300.tar.gz",
    "platform": null,
    "description": "# MCP Framework\n\n\u4e00\u4e2a\u5f3a\u5927\u4e14\u6613\u7528\u7684 MCP (Model Context Protocol) \u670d\u52a1\u5668\u5f00\u53d1\u6846\u67b6\uff0c\u652f\u6301\u5feb\u901f\u6784\u5efa\u3001\u90e8\u7f72\u548c\u7ba1\u7406 MCP \u670d\u52a1\u5668\u3002\n\n\u4f7f\u7528\u8be5\u6846\u67b6\u5f00\u53d1\u7684mcp_servers: https://gitee.com/wmjsoft_admin/mcp-servers\n\n## \ud83d\ude80 \u7279\u6027\n\n### \u6838\u5fc3\u529f\u80fd\n- **\u7b80\u5355\u6613\u7528**: \u57fa\u4e8e\u88c5\u9970\u5668\u7684 API \u8bbe\u8ba1\uff0c\u5feb\u901f\u5b9a\u4e49\u5de5\u5177\u548c\u8d44\u6e90\n- **\u7c7b\u578b\u5b89\u5168**: \u5b8c\u6574\u7684\u7c7b\u578b\u6ce8\u89e3\u652f\u6301\uff0c\u81ea\u52a8\u751f\u6210 JSON Schema\n- **\u6d41\u5f0f\u652f\u6301**: \u5185\u7f6e\u6d41\u5f0f\u54cd\u5e94\u652f\u6301\uff0c\u9002\u5408\u5927\u6570\u636e\u91cf\u5904\u7406\n- **\u914d\u7f6e\u7ba1\u7406**: \u7075\u6d3b\u7684\u914d\u7f6e\u7cfb\u7edf\uff0c\u652f\u6301\u591a\u7aef\u53e3\u914d\u7f6e\n- **\u81ea\u52a8\u6784\u5efa**: \u96c6\u6210 PyInstaller \u6784\u5efa\u7cfb\u7edf\uff0c\u4e00\u952e\u751f\u6210\u53ef\u6267\u884c\u6587\u4ef6\n\n### \u9ad8\u7ea7\u7279\u6027\n- **\u591a\u5e73\u53f0\u652f\u6301**: Windows\u3001macOS\u3001Linux \u8de8\u5e73\u53f0\u6784\u5efa\n- **\u4f9d\u8d56\u7ba1\u7406**: \u667a\u80fd\u4f9d\u8d56\u5206\u6790\u548c\u6253\u5305\n- **\u70ed\u91cd\u8f7d**: \u5f00\u53d1\u6a21\u5f0f\u4e0b\u652f\u6301\u4ee3\u7801\u70ed\u91cd\u8f7d\n- **\u65e5\u5fd7\u7cfb\u7edf**: \u5b8c\u6574\u7684\u65e5\u5fd7\u8bb0\u5f55\u548c\u8c03\u8bd5\u652f\u6301\n- **Web \u754c\u9762**: \u5185\u7f6e\u914d\u7f6e\u548c\u6d4b\u8bd5 Web \u754c\u9762\n\n## \ud83d\udce6 \u5b89\u88c5\n\n### \u4ece PyPI \u5b89\u88c5\n\n```bash\npip install mcp-framework\n```\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n\n```bash\ngit clone https://github.com/your-repo/mcp_framework.git\ncd mcp_framework\npip install -e .\n```\n\n## \ud83c\udfaf \u5feb\u901f\u5f00\u59cb\n\n### 1. \u521b\u5efa\u57fa\u7840\u670d\u52a1\u5668\n\n```python\n#!/usr/bin/env python3\nimport asyncio\nfrom mcp_framework import EnhancedMCPServer, run_server_main\nfrom mcp_framework.core.decorators import Required, Optional\nfrom typing import Annotated\n\n\nclass MyMCPServer(EnhancedMCPServer):\n    \"\"\"\u6211\u7684\u7b2c\u4e00\u4e2a MCP \u670d\u52a1\u5668\"\"\"\n    \n    def __init__(self):\n        super().__init__(\n            name=\"MyMCPServer\",\n            version=\"1.0.0\",\n            description=\"\u6211\u7684\u7b2c\u4e00\u4e2a MCP \u670d\u52a1\u5668\"\n        )\n        self._setup_tools()\n    \n    async def initialize(self):\n        \"\"\"\u521d\u59cb\u5316\u670d\u52a1\u5668\"\"\"\n        self.logger.info(\"MyMCPServer \u521d\u59cb\u5316\u5b8c\u6210\")\n    \n    def _setup_tools(self):\n        \"\"\"\u8bbe\u7f6e\u5de5\u5177\u548c\u8d44\u6e90\"\"\"\n        \n        # \u4f7f\u7528\u88c5\u9970\u5668\u5b9a\u4e49\u5de5\u5177\n        @self.tool(\"\u8ba1\u7b97\u4e24\u4e2a\u6570\u7684\u548c\")\n        async def add_numbers(\n            a: Annotated[int, Required(\"\u7b2c\u4e00\u4e2a\u6570\u5b57\")],\n            b: Annotated[int, Required(\"\u7b2c\u4e8c\u4e2a\u6570\u5b57\")]\n        ) -> int:\n            \"\"\"\u8ba1\u7b97\u4e24\u4e2a\u6570\u5b57\u7684\u548c\"\"\"\n            return a + b\n        \n        # \u5b9a\u4e49\u6d41\u5f0f\u5de5\u5177\n        @self.streaming_tool(\"\u751f\u6210\u6570\u5b57\u5e8f\u5217\")\n        async def generate_sequence(\n            start: Annotated[int, Required(\"\u8d77\u59cb\u6570\u5b57\")],\n            end: Annotated[int, Required(\"\u7ed3\u675f\u6570\u5b57\")]\n        ):\n            \"\"\"\u751f\u6210\u6570\u5b57\u5e8f\u5217\"\"\"\n            for i in range(start, end + 1):\n                yield f\"\u6570\u5b57: {i}\"\n                await asyncio.sleep(0.1)  # \u6a21\u62df\u5904\u7406\u65f6\u95f4\n        \n        # \u5b9a\u4e49\u8d44\u6e90\n        @self.resource(\n            uri=\"file://data.txt\",\n            name=\"\u793a\u4f8b\u6570\u636e\",\n            description=\"\u793a\u4f8b\u6570\u636e\u6587\u4ef6\"\n        )\n        async def get_data():\n            return {\"content\": \"\u8fd9\u662f\u793a\u4f8b\u6570\u636e\", \"type\": \"text/plain\"}\n\n\n# \u542f\u52a8\u670d\u52a1\u5668\nif __name__ == \"__main__\":\n    server = MyMCPServer()\n    run_server_main(\n        server_instance=server,\n        server_name=\"MyMCPServer\",\n        default_port=8080\n    )\n```\n\n### 2. \u8fd0\u884c\u670d\u52a1\u5668\n\n```bash\npython my_server.py --port 8080 --host localhost\n```\n\n## \ud83d\udcda \u8be6\u7ec6\u6587\u6863\n\n### \u88c5\u9970\u5668 API\n\n#### \u5de5\u5177\u88c5\u9970\u5668\n\n```python\n# \u5728 _setup_tools \u65b9\u6cd5\u4e2d\u5b9a\u4e49\u5de5\u5177\ndef _setup_tools(self):\n    # \u57fa\u7840\u5de5\u5177\n    @self.tool(\"\u5de5\u5177\u63cf\u8ff0\")\n    async def my_tool(param1: str, param2: int) -> str:\n        return f\"\u5904\u7406\u7ed3\u679c: {param1} - {param2}\"\n    \n    # \u6d41\u5f0f\u5de5\u5177\n    @self.streaming_tool(\"\u6d41\u5f0f\u5de5\u5177\u63cf\u8ff0\")\n    async def my_streaming_tool(query: str):\n        for i in range(10):\n            yield f\"\u5904\u7406\u6b65\u9aa4 {i}: {query}\"\n            await asyncio.sleep(0.1)\n```\n\n#### \u53c2\u6570\u7c7b\u578b\u6ce8\u89e3\n\n```python\nfrom typing import List, Optional, AsyncGenerator\nfrom typing_extensions import Annotated\nfrom mcp_framework.core.decorators import (\n    Required as R,\n    Optional as O,\n    IntRange,\n    ServerParam,\n    StringParam,\n    BooleanParam,\n    PathParam\n)\n\n# \u5728 _setup_tools \u65b9\u6cd5\u4e2d\u5b9a\u4e49\ndef _setup_tools(self):\n    # \u6d41\u5f0f\u5de5\u5177\u53c2\u6570\u793a\u4f8b\n    @self.streaming_tool(description=\"\ud83d\udcd6 **File Line Range Reader** - \u6d41\u5f0f\u8bfb\u53d6\u6587\u4ef6\u6307\u5b9a\u884c\u8303\u56f4\")\n    async def read_file_lines(\n        file_path: Annotated[str, R(\"\u6587\u4ef6\u8def\u5f84\uff08\u652f\u6301\u76f8\u5bf9\u548c\u7edd\u5bf9\u8def\u5f84\uff09\")],\n        start_line: Annotated[int, IntRange(\"\u8d77\u59cb\u884c\u53f7\uff081-based\uff09\", min_val=1)],\n        end_line: Annotated[int, IntRange(\"\u7ed3\u675f\u884c\u53f7\uff081-based\uff0c\u5305\u542b\uff09\", min_val=1)]\n    ) -> AsyncGenerator[str, None]:\n        \"\"\"\u6d41\u5f0f\u8bfb\u53d6\u6587\u4ef6\u6307\u5b9a\u884c\u8303\u56f4\"\"\"\n        # \u5b9e\u73b0\u4ee3\u7801...\n        yield \"result\"\n    \n    # \u641c\u7d22\u5de5\u5177\u53c2\u6570\u793a\u4f8b\n    @self.tool(description=\"\ud83d\udd0d **Content Search** - \u641c\u7d22\u6587\u4ef6\u5185\u5bb9\")\n    async def search_files(\n        query_text: Annotated[str, R(\"\u641c\u7d22\u5173\u952e\u8bcd\")],\n        limit: Annotated[int, O(\"\u6700\u5927\u7ed3\u679c\u6570\u91cf\", default=50, minimum=1)] = 50,\n        case_sensitive: Annotated[bool, O(\"\u662f\u5426\u533a\u5206\u5927\u5c0f\u5199\", default=False)] = False,\n        file_extensions: Annotated[Optional[List[str]], O(\"\u6587\u4ef6\u6269\u5c55\u540d\u5217\u8868\uff0c\u5982 ['.py', '.js']\")] = None\n    ) -> dict:\n        \"\"\"\u641c\u7d22\u6587\u4ef6\u5185\u5bb9\"\"\"\n        return {\"results\": []}\n```\n\n#### \u8d44\u6e90\u88c5\u9970\u5668\n\n```python\nimport json\n\n# \u5728 _setup_tools \u65b9\u6cd5\u4e2d\u5b9a\u4e49\ndef _setup_tools(self):\n    @self.resource(\n        uri=\"file://config.json\",\n        name=\"\u914d\u7f6e\u6587\u4ef6\",\n        description=\"\u670d\u52a1\u5668\u914d\u7f6e\u6587\u4ef6\",\n        mime_type=\"application/json\"\n    )\n    async def get_config():\n        return {\n            \"content\": json.dumps({\"setting1\": \"value1\"}),\n            \"type\": \"application/json\"\n        }\n```\n\n### \u670d\u52a1\u5668\u914d\u7f6e\n\n#### \u914d\u7f6e\u53c2\u6570\u5b9a\u4e49\n\n```python\nfrom mcp_framework.core.decorators import (\n    ServerParam,\n    StringParam,\n    SelectParam,\n    BooleanParam,\n    PathParam\n)\nfrom typing import Annotated\n\n# \u5728 _setup_tools \u65b9\u6cd5\u4e2d\u5b9a\u4e49\ndef _setup_tools(self):\n    @self.decorators.server_param(\"api_key\")\n    async def api_key_param(\n        param: Annotated[str, StringParam(\n            display_name=\"API \u5bc6\u94a5\",\n            description=\"\u7528\u4e8e\u8bbf\u95ee\u5916\u90e8\u670d\u52a1\u7684 API \u5bc6\u94a5\",\n            placeholder=\"\u8bf7\u8f93\u5165 API \u5bc6\u94a5\"\n        )]\n    ):\n        \"\"\"API \u5bc6\u94a5\u53c2\u6570\"\"\"\n        pass\n    \n    @self.decorators.server_param(\"model_type\")\n    async def model_param(\n        param: Annotated[str, SelectParam(\n            display_name=\"\u6a21\u578b\u7c7b\u578b\",\n            description=\"\u9009\u62e9\u8981\u4f7f\u7528\u7684 AI \u6a21\u578b\",\n            options=[\"gpt-3.5-turbo\", \"gpt-4\", \"claude-3\"]\n        )]\n    ):\n        \"\"\"\u6a21\u578b\u7c7b\u578b\u53c2\u6570\"\"\"\n        pass\n    \n    @self.decorators.server_param(\"project_root\")\n    async def project_root_param(\n        param: Annotated[str, PathParam(\n            display_name=\"\u9879\u76ee\u6839\u76ee\u5f55\",\n            description=\"\u670d\u52a1\u5668\u64cd\u4f5c\u7684\u6839\u76ee\u5f55\u8def\u5f84\uff0c\u7559\u7a7a\u4f7f\u7528\u5f53\u524d\u76ee\u5f55\",\n            required=False,\n            placeholder=\"/path/to/project\"\n        )]\n    ):\n        \"\"\"\u9879\u76ee\u6839\u76ee\u5f55\u53c2\u6570\"\"\"\n        pass\n    \n    @self.decorators.server_param(\"max_file_size\")\n    async def max_file_size_param(\n        param: Annotated[int, ServerParam(\n            display_name=\"\u6700\u5927\u6587\u4ef6\u5927\u5c0f (MB)\",\n            description=\"\u5141\u8bb8\u8bfb\u53d6\u7684\u6700\u5927\u6587\u4ef6\u5927\u5c0f\uff0c\u5355\u4f4dMB\",\n            param_type=\"integer\",\n            default_value=10,\n            required=False\n        )]\n    ):\n        \"\"\"\u6700\u5927\u6587\u4ef6\u5927\u5c0f\u53c2\u6570\"\"\"\n        pass\n    \n    @self.decorators.server_param(\"enable_hidden_files\")\n    async def enable_hidden_files_param(\n        param: Annotated[bool, BooleanParam(\n            display_name=\"\u542f\u7528\u9690\u85cf\u6587\u4ef6\",\n            description=\"\u662f\u5426\u5141\u8bb8\u8bbf\u95ee\u4ee5\u70b9(.)\u5f00\u5934\u7684\u9690\u85cf\u6587\u4ef6\",\n            default_value=False,\n            required=False\n        )]\n    ):\n        \"\"\"\u542f\u7528\u9690\u85cf\u6587\u4ef6\u53c2\u6570\n        \n        \u8fd9\u4e2a\u88c5\u9970\u5668\u7684\u4f5c\u7528\uff1a\n        1. \u5b9a\u4e49\u4e00\u4e2a\u540d\u4e3a 'enable_hidden_files' \u7684\u670d\u52a1\u5668\u914d\u7f6e\u53c2\u6570\n        2. \u53c2\u6570\u7c7b\u578b\u4e3a\u5e03\u5c14\u503c\uff08BooleanParam\uff09\n        3. \u5728Web\u914d\u7f6e\u754c\u9762\u4e2d\u663e\u793a\u4e3a\"\u542f\u7528\u9690\u85cf\u6587\u4ef6\"\u9009\u9879\n        4. \u7528\u6237\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u754c\u9762\u6216\u914d\u7f6e\u6587\u4ef6\u8bbe\u7f6e\u6b64\u53c2\u6570\n        5. \u5728\u5de5\u5177\u51fd\u6570\u4e2d\u53ef\u901a\u8fc7 self.get_config_value(\"enable_hidden_files\") \u83b7\u53d6\u503c\n        \n        \u53c2\u6570\u8bf4\u660e\uff1a\n        - display_name: \u5728\u914d\u7f6e\u754c\u9762\u663e\u793a\u7684\u53cb\u597d\u540d\u79f0\n        - description: \u53c2\u6570\u7684\u8be6\u7ec6\u8bf4\u660e\n        - default_value: \u9ed8\u8ba4\u503c\uff08False\u8868\u793a\u9ed8\u8ba4\u4e0d\u542f\u7528\u9690\u85cf\u6587\u4ef6\uff09\n        - required: \u662f\u5426\u4e3a\u5fc5\u9700\u53c2\u6570\uff08False\u8868\u793a\u53ef\u9009\uff09\n        \"\"\"\n        pass\n```\n\n#### \u914d\u7f6e\u4f7f\u7528\n\n```python\nfrom mcp_framework.core.decorators import Required\nfrom typing import Annotated\n\n# \u5728 _setup_tools \u65b9\u6cd5\u4e2d\u5b9a\u4e49\ndef _setup_tools(self):\n    @self.tool(\"\u4f7f\u7528\u914d\u7f6e\u7684\u5de5\u5177\")\n    async def configured_tool(query: Annotated[str, Required(\"\u67e5\u8be2\u5185\u5bb9\")]):\n        # \u83b7\u53d6\u914d\u7f6e\u503c\n        api_key = self.get_config_value(\"api_key\")\n        model_type = self.get_config_value(\"model_type\", \"gpt-3.5-turbo\")\n        enable_hidden = self.get_config_value(\"enable_hidden_files\", False)\n        \n        # \u4f7f\u7528\u914d\u7f6e\u8fdb\u884c\u5904\u7406\n        result = f\"\u4f7f\u7528 {model_type} \u5904\u7406\u67e5\u8be2: {query}\"\n        if enable_hidden:\n            result += \" (\u5305\u542b\u9690\u85cf\u6587\u4ef6)\"\n        return result\n```\n\n#### \u670d\u52a1\u5668\u53c2\u6570\u88c5\u9970\u5668\u8be6\u89e3\n\n\u670d\u52a1\u5668\u53c2\u6570\u88c5\u9970\u5668 `@self.decorators.server_param()` \u662f MCP Framework \u7684\u6838\u5fc3\u529f\u80fd\u4e4b\u4e00\uff0c\u5b83\u5141\u8bb8\u4f60\u4e3a\u670d\u52a1\u5668\u5b9a\u4e49\u53ef\u914d\u7f6e\u7684\u53c2\u6570\u3002\n\n**\u5de5\u4f5c\u539f\u7406\uff1a**\n\n1. **\u53c2\u6570\u5b9a\u4e49\u9636\u6bb5**\uff1a\u4f7f\u7528\u88c5\u9970\u5668\u5b9a\u4e49\u53c2\u6570\u7684\u5143\u6570\u636e\uff08\u540d\u79f0\u3001\u7c7b\u578b\u3001\u9ed8\u8ba4\u503c\u7b49\uff09\n2. **\u914d\u7f6e\u6536\u96c6\u9636\u6bb5**\uff1a\u6846\u67b6\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u754c\u9762\uff0c\u7528\u6237\u53ef\u4ee5\u8bbe\u7f6e\u53c2\u6570\u503c\n3. **\u8fd0\u884c\u65f6\u4f7f\u7528**\uff1a\u5728\u5de5\u5177\u51fd\u6570\u4e2d\u901a\u8fc7 `self.get_config_value()` \u83b7\u53d6\u7528\u6237\u8bbe\u7f6e\u7684\u503c\n\n**\u5b8c\u6574\u793a\u4f8b\uff1a**\n\n```python\n# 1. \u5b9a\u4e49\u53c2\u6570\uff08\u5728 _setup_tools \u65b9\u6cd5\u4e2d\uff09\n@self.decorators.server_param(\"enable_hidden_files\")\nasync def enable_hidden_files_param(\n    param: Annotated[bool, BooleanParam(\n        display_name=\"\u542f\u7528\u9690\u85cf\u6587\u4ef6\",\n        description=\"\u662f\u5426\u5141\u8bb8\u8bbf\u95ee\u4ee5\u70b9(.)\u5f00\u5934\u7684\u9690\u85cf\u6587\u4ef6\",\n        default_value=False,\n        required=False\n    )]\n):\n    \"\"\"\u5b9a\u4e49\u662f\u5426\u542f\u7528\u9690\u85cf\u6587\u4ef6\u7684\u914d\u7f6e\u53c2\u6570\"\"\"\n    pass\n\n# 2. \u5728\u5de5\u5177\u4e2d\u4f7f\u7528\u53c2\u6570\n@self.tool(\"\u5217\u51fa\u6587\u4ef6\")\nasync def list_files(directory: Annotated[str, Required(\"\u76ee\u5f55\u8def\u5f84\")]):\n    # \u83b7\u53d6\u7528\u6237\u914d\u7f6e\u7684\u53c2\u6570\u503c\n    show_hidden = self.get_config_value(\"enable_hidden_files\", False)\n    \n    files = []\n    for file in os.listdir(directory):\n        # \u6839\u636e\u914d\u7f6e\u51b3\u5b9a\u662f\u5426\u5305\u542b\u9690\u85cf\u6587\u4ef6\n        if not show_hidden and file.startswith('.'):\n            continue\n        files.append(file)\n    \n    return {\"files\": files, \"show_hidden\": show_hidden}\n```\n\n**\u53c2\u6570\u7c7b\u578b\u652f\u6301\uff1a**\n\n- `StringParam`: \u5b57\u7b26\u4e32\u53c2\u6570\n- `BooleanParam`: \u5e03\u5c14\u53c2\u6570\n- `SelectParam`: \u9009\u62e9\u53c2\u6570\uff08\u4e0b\u62c9\u83dc\u5355\uff09\n- `PathParam`: \u8def\u5f84\u53c2\u6570\n- `ServerParam`: \u901a\u7528\u53c2\u6570\uff08\u53ef\u6307\u5b9a\u7c7b\u578b\uff09\n\n**\u914d\u7f6e\u6587\u4ef6\u751f\u6210\uff1a**\n\n\u6846\u67b6\u4f1a\u81ea\u52a8\u751f\u6210\u914d\u7f6e\u6587\u4ef6\uff08\u5982 `server_port_8080_config.json`\uff09\uff0c\u7528\u6237\u7684\u8bbe\u7f6e\u4f1a\u4fdd\u5b58\u5728\u5176\u4e2d\uff1a\n\n```json\n{\n  \"enable_hidden_files\": true,\n  \"api_key\": \"your-api-key\",\n  \"model_type\": \"gpt-4\"\n}\n```\n\n### \u591a\u7aef\u53e3\u914d\u7f6e\n\n\u6846\u67b6\u652f\u6301\u4e3a\u4e0d\u540c\u7aef\u53e3\u521b\u5efa\u72ec\u7acb\u7684\u914d\u7f6e\u6587\u4ef6\uff1a\n\n```bash\n# \u5728\u4e0d\u540c\u7aef\u53e3\u542f\u52a8\u670d\u52a1\u5668\uff0c\u4f1a\u81ea\u52a8\u521b\u5efa\u5bf9\u5e94\u7684\u914d\u7f6e\u6587\u4ef6\npython server.py --port 8080  # \u521b\u5efa server_port_8080_config.json\npython server.py --port 8081  # \u521b\u5efa server_port_8081_config.json\n```\n\n## \ud83d\udd28 \u6784\u5efa\u7cfb\u7edf\n\n\u6846\u67b6\u96c6\u6210\u4e86\u5f3a\u5927\u7684\u6784\u5efa\u7cfb\u7edf\uff0c\u652f\u6301\u5c06 MCP \u670d\u52a1\u5668\u6253\u5305\u4e3a\u72ec\u7acb\u7684\u53ef\u6267\u884c\u6587\u4ef6\u3002\n\n### \u6784\u5efa\u529f\u80fd\u7279\u6027\n\n- **\u81ea\u52a8\u53d1\u73b0**: \u81ea\u52a8\u53d1\u73b0\u9879\u76ee\u4e2d\u7684\u6240\u6709\u670d\u52a1\u5668\u811a\u672c\n- **\u4f9d\u8d56\u5206\u6790**: \u667a\u80fd\u5206\u6790\u548c\u6536\u96c6\u4f9d\u8d56\u5305\n- **\u591a\u5e73\u53f0\u6784\u5efa**: \u652f\u6301 Windows\u3001macOS\u3001Linux\n- **\u865a\u62df\u73af\u5883\u9694\u79bb**: \u4e3a\u6bcf\u4e2a\u670d\u52a1\u5668\u521b\u5efa\u72ec\u7acb\u7684\u6784\u5efa\u73af\u5883\n- **\u5b8c\u6574\u6253\u5305**: \u751f\u6210\u5305\u542b\u6240\u6709\u4f9d\u8d56\u7684\u5206\u53d1\u5305\n\n### \u4f7f\u7528\u6784\u5efa\u7cfb\u7edf\n\n#### 1. \u51c6\u5907\u6784\u5efa\u811a\u672c\n\n\u5728\u9879\u76ee\u6839\u76ee\u5f55\u521b\u5efa `build.py`\uff08\u6216\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684\u6784\u5efa\u811a\u672c\uff09\uff1a\n\n```python\n#!/usr/bin/env python3\nfrom mcp_framework.build import MCPServerBuilder\n\nif __name__ == \"__main__\":\n    builder = MCPServerBuilder()\n    builder.build_all()\n```\n\n#### 2. \u6784\u5efa\u547d\u4ee4\n\n##### \u4f7f\u7528 mcp-build \u547d\u4ee4\u884c\u5de5\u5177\uff08\u63a8\u8350\uff09\n\n\u6846\u67b6\u63d0\u4f9b\u4e86\u4e13\u95e8\u7684 `mcp-build` \u547d\u4ee4\u884c\u5de5\u5177\uff0c\u7b80\u5316\u6784\u5efa\u8fc7\u7a0b\uff1a\n\n```bash\n# \u57fa\u7840\u6784\u5efa\u547d\u4ee4\nmcp-build                           # \u6784\u5efa\u6240\u6709\u53d1\u73b0\u7684\u670d\u52a1\u5668\nmcp-build --server my_server.py     # \u6784\u5efa\u7279\u5b9a\u670d\u52a1\u5668\nmcp-build --list                    # \u5217\u51fa\u6240\u6709\u53ef\u6784\u5efa\u7684\u670d\u52a1\u5668\n\n# \u6784\u5efa\u9009\u9879\nmcp-build --no-clean               # \u8df3\u8fc7\u6e05\u7406\u6784\u5efa\u76ee\u5f55\nmcp-build --no-test                # \u8df3\u8fc7\u6d4b\u8bd5\u9636\u6bb5\nmcp-build --no-onefile             # \u6784\u5efa\u4e3a\u76ee\u5f55\u800c\u975e\u5355\u6587\u4ef6\nmcp-build --include-source         # \u5728\u5206\u53d1\u5305\u4e2d\u5305\u542b\u6e90\u4ee3\u7801\nmcp-build --clean-only             # \u53ea\u6e05\u7406\u6784\u5efa\u76ee\u5f55\uff0c\u4e0d\u8fdb\u884c\u6784\u5efa\n\n# \u7ec4\u5408\u4f7f\u7528\nmcp-build --server weather_server.py --no-test --include-source\n```\n\n**mcp-build \u547d\u4ee4\u8be6\u7ec6\u8bf4\u660e\uff1a**\n\n| \u53c2\u6570 | \u7b80\u5199 | \u8bf4\u660e | \u793a\u4f8b |\n|------|------|------|------|\n| `--server` | `-s` | \u6307\u5b9a\u8981\u6784\u5efa\u7684\u670d\u52a1\u5668\u811a\u672c | `mcp-build -s my_server.py` |\n| `--list` | `-l` | \u5217\u51fa\u6240\u6709\u53ef\u6784\u5efa\u7684\u670d\u52a1\u5668 | `mcp-build -l` |\n| `--no-clean` | | \u8df3\u8fc7\u6784\u5efa\u524d\u7684\u6e05\u7406\u6b65\u9aa4 | `mcp-build --no-clean` |\n| `--no-test` | | \u8df3\u8fc7\u6784\u5efa\u540e\u7684\u6d4b\u8bd5\u9a8c\u8bc1 | `mcp-build --no-test` |\n| `--no-onefile` | | \u6784\u5efa\u4e3a\u76ee\u5f55\u800c\u975e\u5355\u4e2a\u53ef\u6267\u884c\u6587\u4ef6 | `mcp-build --no-onefile` |\n| `--include-source` | | \u5728\u5206\u53d1\u5305\u4e2d\u5305\u542b\u6e90\u4ee3\u7801 | `mcp-build --include-source` |\n| `--clean-only` | | \u53ea\u6e05\u7406\u6784\u5efa\u76ee\u5f55\uff0c\u4e0d\u6267\u884c\u6784\u5efa | `mcp-build --clean-only` |\n\n**\u6784\u5efa\u6d41\u7a0b\u8bf4\u660e\uff1a**\n\n1. **\u53d1\u73b0\u9636\u6bb5**: \u81ea\u52a8\u626b\u63cf\u9879\u76ee\u76ee\u5f55\uff0c\u53d1\u73b0\u6240\u6709 MCP \u670d\u52a1\u5668\u811a\u672c\n2. **\u6e05\u7406\u9636\u6bb5**: \u6e05\u7406\u4e4b\u524d\u7684\u6784\u5efa\u6587\u4ef6\uff08\u53ef\u901a\u8fc7 `--no-clean` \u8df3\u8fc7\uff09\n3. **\u4f9d\u8d56\u5206\u6790**: \u5206\u6790\u6bcf\u4e2a\u670d\u52a1\u5668\u7684\u4f9d\u8d56\u5305\uff0c\u5305\u62ec\uff1a\n   - \u901a\u7528\u4f9d\u8d56 (`requirements.txt`)\n   - \u670d\u52a1\u5668\u7279\u5b9a\u4f9d\u8d56 (`{server_name}_requirements.txt`)\n   - \u4ee3\u7801\u4e2d\u5bfc\u5165\u7684\u672c\u5730\u6a21\u5757\n4. **\u6784\u5efa\u9636\u6bb5**: \u4f7f\u7528 PyInstaller \u6784\u5efa\u53ef\u6267\u884c\u6587\u4ef6\n5. **\u6d4b\u8bd5\u9636\u6bb5**: \u9a8c\u8bc1\u6784\u5efa\u7684\u53ef\u6267\u884c\u6587\u4ef6\u80fd\u6b63\u5e38\u542f\u52a8\uff08\u53ef\u901a\u8fc7 `--no-test` \u8df3\u8fc7\uff09\n6. **\u6253\u5305\u9636\u6bb5**: \u521b\u5efa\u5305\u542b\u6240\u6709\u5fc5\u8981\u6587\u4ef6\u7684\u5206\u53d1\u5305\n\n##### \u4f7f\u7528 Python \u811a\u672c\u6784\u5efa\uff08\u4f20\u7edf\u65b9\u5f0f\uff09\n\n```bash\n# \u6784\u5efa\u6240\u6709\u670d\u52a1\u5668\npython build.py\n\n# \u6784\u5efa\u7279\u5b9a\u670d\u52a1\u5668\npython build.py --server my_server.py\n\n# \u5217\u51fa\u6240\u6709\u53ef\u6784\u5efa\u7684\u670d\u52a1\u5668\npython build.py --list\n\n# \u53ea\u6e05\u7406\u6784\u5efa\u76ee\u5f55\npython build.py --clean-only\n\n# \u8df3\u8fc7\u6d4b\u8bd5\npython build.py --no-test\n\n# \u5305\u542b\u6e90\u4ee3\u7801\npython build.py --include-source\n```\n\n#### 3. \u6784\u5efa\u8f93\u51fa\n\n\u6784\u5efa\u5b8c\u6210\u540e\uff0c\u4f1a\u5728 `dist/` \u76ee\u5f55\u751f\u6210\u5206\u53d1\u5305\uff1a\n\n```\ndist/\n\u251c\u2500\u2500 my-server-macos-arm64-20241201_143022.tar.gz\n\u251c\u2500\u2500 weather-server-macos-arm64-20241201_143025.tar.gz\n\u2514\u2500\u2500 ...\n```\n\n\u6bcf\u4e2a\u5206\u53d1\u5305\u5305\u542b\uff1a\n- \u53ef\u6267\u884c\u6587\u4ef6\n- \u5b8c\u6574\u7684 requirements.txt\n- \u542f\u52a8\u811a\u672c\uff08start.sh / start.bat\uff09\n- README \u548c\u8bb8\u53ef\u8bc1\u6587\u4ef6\n- \u6e90\u4ee3\u7801\uff08\u5982\u679c\u6307\u5b9a --include-source\uff09\n\n### \u8de8\u5e73\u53f0\u6784\u5efa\n\n\u6846\u67b6\u652f\u6301\u8de8\u5e73\u53f0\u6784\u5efa\uff0c\u53ef\u4ee5\u5728\u4e00\u4e2a\u5e73\u53f0\u4e0a\u6784\u5efa\u5176\u4ed6\u5e73\u53f0\u7684\u53ef\u6267\u884c\u6587\u4ef6\uff1a\n\n#### \u4f7f\u7528 mcp-build \u8fdb\u884c\u8de8\u5e73\u53f0\u6784\u5efa\n\n```bash\n# \u6784\u5efa\u6240\u6709\u5e73\u53f0\u7248\u672c\uff08\u9700\u8981 Docker\uff09\nmcp-build --platform all\n\n# \u6784\u5efa\u7279\u5b9a\u5e73\u53f0\nmcp-build --platform windows      # \u6784\u5efa Windows \u7248\u672c\nmcp-build --platform linux        # \u6784\u5efa Linux \u7248\u672c\nmcp-build --platform native       # \u6784\u5efa\u5f53\u524d\u5e73\u53f0\u7248\u672c\n\n# \u8de8\u5e73\u53f0\u6784\u5efa\u7279\u5b9a\u670d\u52a1\u5668\nmcp-build --platform windows --server my_server.py\n\n# \u68c0\u67e5 Docker \u73af\u5883\nmcp-build --check-docker\n```\n\n#### \u8de8\u5e73\u53f0\u6784\u5efa\u8981\u6c42\n\n- **Docker Desktop**: \u7528\u4e8e\u8de8\u5e73\u53f0\u6784\u5efa\uff08Windows \u548c Linux\uff09\n- **\u672c\u5730\u6784\u5efa**: \u4e0d\u9700\u8981 Docker\uff0c\u53ea\u6784\u5efa\u5f53\u524d\u5e73\u53f0\n\n#### \u4fbf\u6377\u811a\u672c\n\n\u6846\u67b6\u8fd8\u63d0\u4f9b\u4e86\u4fbf\u6377\u7684\u6784\u5efa\u811a\u672c\uff1a\n\n```bash\n# \u4f7f\u7528\u8de8\u5e73\u53f0\u6784\u5efa\u811a\u672c\npython build_cross_platform.py --platform all\n\n# \u4f7f\u7528 Windows \u6784\u5efa\u811a\u672c\uff08\u4ec5\u9650 Windows \u6784\u5efa\uff09\n./build_windows.sh\n\n# \u4f7f\u7528 Docker Compose\ndocker-compose --profile build up build-windows\ndocker-compose --profile build up build-linux\n```\n\n### \u4f9d\u8d56\u7ba1\u7406\n\n\u6784\u5efa\u7cfb\u7edf\u652f\u6301\u591a\u5c42\u4f9d\u8d56\u7ba1\u7406\uff1a\n\n1. **\u901a\u7528\u4f9d\u8d56** (`requirements.txt`): \u6240\u6709\u670d\u52a1\u5668\u5171\u4eab\u7684\u4f9d\u8d56\n2. **\u7279\u5b9a\u4f9d\u8d56** (`{server_name}_requirements.txt`): \u7279\u5b9a\u670d\u52a1\u5668\u7684\u4f9d\u8d56\n3. **\u81ea\u52a8\u5206\u6790**: \u4ece\u4ee3\u7801\u4e2d\u81ea\u52a8\u5206\u6790\u5bfc\u5165\u7684\u5305\n\n\u793a\u4f8b\u6587\u4ef6\u7ed3\u6784\uff1a\n```\nproject/\n\u251c\u2500\u2500 requirements.txt              # \u901a\u7528\u4f9d\u8d56\n\u251c\u2500\u2500 weather_server.py\n\u251c\u2500\u2500 weather_server_requirements.txt  # weather_server \u7279\u5b9a\u4f9d\u8d56\n\u251c\u2500\u2500 chat_server.py\n\u251c\u2500\u2500 chat_server_requirements.txt     # chat_server \u7279\u5b9a\u4f9d\u8d56\n\u251c\u2500\u2500 build.py                      # \u6784\u5efa\u811a\u672c\n\u251c\u2500\u2500 build_cross_platform.py      # \u8de8\u5e73\u53f0\u6784\u5efa\u811a\u672c\n\u2514\u2500\u2500 build_windows.sh              # Windows \u6784\u5efa\u4fbf\u6377\u811a\u672c\n```\n\n### \u6784\u5efa\u8f93\u51fa\u8be6\u89e3\n\n\u6784\u5efa\u5b8c\u6210\u540e\uff0c\u5206\u53d1\u5305\u7684\u8be6\u7ec6\u7ed3\u6784\uff1a\n\n```\ndist/\n\u251c\u2500\u2500 my-server-macos-arm64-20241201_143022.tar.gz\n\u2502   \u251c\u2500\u2500 my-server                 # \u53ef\u6267\u884c\u6587\u4ef6\n\u2502   \u251c\u2500\u2500 start.sh                  # Unix \u542f\u52a8\u811a\u672c\n\u2502   \u251c\u2500\u2500 start.bat                 # Windows \u542f\u52a8\u811a\u672c\n\u2502   \u251c\u2500\u2500 requirements.txt          # \u4f9d\u8d56\u5217\u8868\n\u2502   \u251c\u2500\u2500 README.md                 # \u4f7f\u7528\u8bf4\u660e\n\u2502   \u251c\u2500\u2500 LICENSE                   # \u8bb8\u53ef\u8bc1\u6587\u4ef6\n\u2502   \u2514\u2500\u2500 src/                      # \u6e90\u4ee3\u7801\uff08\u5982\u679c\u4f7f\u7528 --include-source\uff09\n\u251c\u2500\u2500 my-server-windows-amd64-20241201_143025.zip\n\u2514\u2500\u2500 my-server-linux-x86_64-20241201_143028.tar.gz\n```\n\n**\u5206\u53d1\u5305\u7279\u6027\uff1a**\n\n- **\u72ec\u7acb\u8fd0\u884c**: \u5305\u542b\u6240\u6709\u5fc5\u8981\u7684\u4f9d\u8d56\uff0c\u65e0\u9700\u989d\u5916\u5b89\u88c5\n- **\u8de8\u5e73\u53f0**: \u652f\u6301 Windows\u3001macOS\u3001Linux\n- **\u4fbf\u6377\u542f\u52a8**: \u63d0\u4f9b\u542f\u52a8\u811a\u672c\uff0c\u7b80\u5316\u8fd0\u884c\u8fc7\u7a0b\n- **\u5b8c\u6574\u6587\u6863**: \u5305\u542b README \u548c\u8bb8\u53ef\u8bc1\u6587\u4ef6\n- **\u6e90\u7801\u53ef\u9009**: \u53ef\u9009\u62e9\u662f\u5426\u5305\u542b\u6e90\u4ee3\u7801\n\n### mcp-build \u4f7f\u7528\u793a\u4f8b\u548c\u6700\u4f73\u5b9e\u8df5\n\n#### \u5178\u578b\u5de5\u4f5c\u6d41\u7a0b\n\n```bash\n# 1. \u5f00\u53d1\u9636\u6bb5\uff1a\u5217\u51fa\u6240\u6709\u53ef\u6784\u5efa\u7684\u670d\u52a1\u5668\nmcp-build --list\n\n# \u8f93\u51fa\u793a\u4f8b\uff1a\n# \ud83d\udccb Available server scripts:\n#    - weather_server.py \u2192 Weather MCP Server\n#    - chat_server.py \u2192 AI Chat Assistant\n#    - file_manager.py \u2192 File Management Server\n\n# 2. \u6d4b\u8bd5\u6784\u5efa\uff1a\u6784\u5efa\u7279\u5b9a\u670d\u52a1\u5668\uff08\u5feb\u901f\u9a8c\u8bc1\uff09\nmcp-build --server weather_server.py --no-test\n\n# 3. \u5b8c\u6574\u6784\u5efa\uff1a\u5305\u542b\u6d4b\u8bd5\u548c\u6e90\u7801\nmcp-build --server weather_server.py --include-source\n\n# 4. \u751f\u4ea7\u6784\u5efa\uff1a\u6784\u5efa\u6240\u6709\u670d\u52a1\u5668\nmcp-build\n\n# 5. \u8de8\u5e73\u53f0\u53d1\u5e03\uff1a\u6784\u5efa\u6240\u6709\u5e73\u53f0\u7248\u672c\nmcp-build --platform all\n```\n\n#### \u5e38\u89c1\u4f7f\u7528\u573a\u666f\n\n**\u573a\u666f1\uff1a\u5feb\u901f\u5f00\u53d1\u6d4b\u8bd5**\n```bash\n# \u8df3\u8fc7\u6d4b\u8bd5\uff0c\u5feb\u901f\u6784\u5efa\u9a8c\u8bc1\nmcp-build --server my_server.py --no-test --no-clean\n```\n\n**\u573a\u666f2\uff1aCI/CD \u96c6\u6210**\n```bash\n# \u9002\u5408\u81ea\u52a8\u5316\u6784\u5efa\u7684\u547d\u4ee4\nmcp-build --no-test --include-source\n```\n\n**\u573a\u666f3\uff1a\u53d1\u5e03\u51c6\u5907**\n```bash\n# \u5b8c\u6574\u6784\u5efa\uff0c\u5305\u542b\u6240\u6709\u9a8c\u8bc1\nmcp-build --platform all --include-source\n```\n\n**\u573a\u666f4\uff1a\u8c03\u8bd5\u6784\u5efa\u95ee\u9898**\n```bash\n# \u53ea\u6e05\u7406\uff0c\u4e0d\u6784\u5efa\nmcp-build --clean-only\n\n# \u4fdd\u7559\u6784\u5efa\u6587\u4ef6\uff0c\u4fbf\u4e8e\u8c03\u8bd5\nmcp-build --server my_server.py --no-clean\n```\n\n#### \u6784\u5efa\u4f18\u5316\u5efa\u8bae\n\n1. **\u4f9d\u8d56\u7ba1\u7406\u4f18\u5316**\n   ```bash\n   # \u4e3a\u6bcf\u4e2a\u670d\u52a1\u5668\u521b\u5efa\u7279\u5b9a\u7684\u4f9d\u8d56\u6587\u4ef6\n   # weather_server_requirements.txt\n   requests>=2.28.0\n   beautifulsoup4>=4.11.0\n   \n   # chat_server_requirements.txt  \n   openai>=1.0.0\n   langchain>=0.1.0\n   ```\n\n2. **\u6784\u5efa\u6027\u80fd\u4f18\u5316**\n   ```bash\n   # \u8df3\u8fc7\u4e0d\u5fc5\u8981\u7684\u6b65\u9aa4\n   mcp-build --no-test --no-clean  # \u5f00\u53d1\u9636\u6bb5\n   \n   # \u53ea\u6784\u5efa\u53d8\u66f4\u7684\u670d\u52a1\u5668\n   mcp-build --server changed_server.py\n   ```\n\n3. **\u5206\u53d1\u5305\u4f18\u5316**\n   ```bash\n   # \u751f\u4ea7\u73af\u5883\uff1a\u4e0d\u5305\u542b\u6e90\u7801\uff0c\u51cf\u5c0f\u5305\u5927\u5c0f\n   mcp-build\n   \n   # \u5f00\u53d1\u5206\u53d1\uff1a\u5305\u542b\u6e90\u7801\uff0c\u4fbf\u4e8e\u8c03\u8bd5\n   mcp-build --include-source\n   ```\n\n#### \u9519\u8bef\u6392\u67e5\n\n**\u5e38\u89c1\u95ee\u9898\u53ca\u89e3\u51b3\u65b9\u6848\uff1a**\n\n1. **Docker \u4e0d\u53ef\u7528**\n   ```bash\n   # \u68c0\u67e5 Docker \u72b6\u6001\n   mcp-build --check-docker\n   \n   # \u5982\u679c Docker \u4e0d\u53ef\u7528\uff0c\u53ea\u6784\u5efa\u672c\u5730\u5e73\u53f0\n   mcp-build --platform native\n   ```\n\n2. **\u4f9d\u8d56\u51b2\u7a81**\n   ```bash\n   # \u6e05\u7406\u6784\u5efa\u7f13\u5b58\n   mcp-build --clean-only\n   \n   # \u91cd\u65b0\u6784\u5efa\n   mcp-build --server problematic_server.py\n   ```\n\n3. **\u6784\u5efa\u5931\u8d25**\n   ```bash\n   # \u8df3\u8fc7\u6d4b\u8bd5\uff0c\u67e5\u770b\u6784\u5efa\u662f\u5426\u6210\u529f\n   mcp-build --server my_server.py --no-test\n   \n   # \u4fdd\u7559\u6784\u5efa\u6587\u4ef6\uff0c\u624b\u52a8\u68c0\u67e5\n   mcp-build --server my_server.py --no-clean\n   ```\n\n#### \u9ad8\u7ea7\u7528\u6cd5\n\n**\u81ea\u5b9a\u4e49\u6784\u5efa\u811a\u672c\u96c6\u6210**\n```python\n#!/usr/bin/env python3\n# custom_build.py\nfrom mcp_framework.build import MCPServerBuilder\nimport subprocess\n\ndef custom_build():\n    # \u9884\u5904\u7406\n    print(\"\ud83d\udd27 Running custom pre-build steps...\")\n    \n    # \u4f7f\u7528 mcp-build\n    result = subprocess.run([\n        \"mcp-build\", \n        \"--server\", \"my_server.py\",\n        \"--include-source\"\n    ])\n    \n    if result.returncode == 0:\n        print(\"\u2705 Build successful!\")\n        # \u540e\u5904\u7406\n        print(\"\ud83d\udce6 Running custom post-build steps...\")\n    else:\n        print(\"\u274c Build failed!\")\n        return False\n    \n    return True\n\nif __name__ == \"__main__\":\n    custom_build()\n```\n\n**\u6279\u91cf\u6784\u5efa\u811a\u672c**\n```bash\n#!/bin/bash\n# batch_build.sh\n\necho \"\ud83d\ude80 Starting batch build process...\"\n\n# \u6784\u5efa\u5f00\u53d1\u7248\u672c\necho \"\ud83d\udce6 Building development versions...\"\nmcp-build --include-source\n\n# \u6784\u5efa\u751f\u4ea7\u7248\u672c\necho \"\ud83c\udfed Building production versions...\"\nmcp-build --platform all\n\necho \"\u2705 Batch build completed!\"\necho \"\ud83d\udcc1 Check dist/ directory for all packages\"\nls -la dist/\n```\n\n## \ud83c\udf10 Web \u754c\u9762\n\n\u6846\u67b6\u63d0\u4f9b\u5185\u7f6e\u7684 Web \u7ba1\u7406\u754c\u9762\uff1a\n\n```python\nfrom mcp_framework import EnhancedMCPServer\nfrom mcp_framework.web import setup_web_interface\n\n# \u5728\u670d\u52a1\u5668\u7c7b\u4e2d\u542f\u7528 Web \u754c\u9762\nclass MyMCPServer(EnhancedMCPServer):\n    def __init__(self):\n        super().__init__(name=\"MyServer\", version=\"1.0.0\")\n        # \u542f\u7528 Web \u754c\u9762\n        setup_web_interface(self, port=8080)\n```\n\n\u8bbf\u95ee `http://localhost:8080/config` \u8fdb\u884c\u914d\u7f6e\u7ba1\u7406\u3002\n\n## \ud83d\udd27 \u9ad8\u7ea7\u7528\u6cd5\n\n\n### \u4e2d\u95f4\u4ef6\u652f\u6301\n\n\u6846\u67b6\u63d0\u4f9b\u4e86\u4e2d\u95f4\u4ef6\u7cfb\u7edf\uff0c\u7528\u4e8e\u5904\u7406HTTP\u8bf7\u6c42\u7684\u9884\u5904\u7406\u548c\u540e\u5904\u7406\u3002\u4e2d\u95f4\u4ef6\u5728\u8bf7\u6c42\u5230\u8fbe\u5177\u4f53\u5904\u7406\u51fd\u6570\u4e4b\u524d\u6216\u54cd\u5e94\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\u4e4b\u524d\u6267\u884c\u7279\u5b9a\u7684\u903b\u8f91\u3002\n\n#### \u5185\u7f6e\u4e2d\u95f4\u4ef6\n\n\u6846\u67b6\u81ea\u52a8\u96c6\u6210\u4e86\u4ee5\u4e0b\u6838\u5fc3\u4e2d\u95f4\u4ef6\uff1a\n\n**1. CORS \u4e2d\u95f4\u4ef6 (`cors_middleware`)**\n- **\u529f\u80fd**: \u5904\u7406\u8de8\u57df\u8d44\u6e90\u5171\u4eab\n- **\u7528\u9014**: \u5141\u8bb8Web\u754c\u9762\u4ece\u4e0d\u540c\u57df\u540d\u8bbf\u95eeMCP\u670d\u52a1\u5668\n- **\u81ea\u52a8\u914d\u7f6e**: \u652f\u6301\u6240\u6709\u5e38\u89c1\u7684HTTP\u65b9\u6cd5\u548c\u5934\u90e8\n\n**2. \u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6 (`error_middleware`)**\n- **\u529f\u80fd**: \u7edf\u4e00\u5904\u7406\u548c\u683c\u5f0f\u5316\u9519\u8bef\u54cd\u5e94\n- **\u7528\u9014**: \u6355\u83b7\u5f02\u5e38\uff0c\u8bb0\u5f55\u65e5\u5fd7\uff0c\u8fd4\u56de\u6807\u51c6\u5316\u7684JSON\u9519\u8bef\u683c\u5f0f\n- **\u5b89\u5168\u6027**: \u907f\u514d\u654f\u611f\u4fe1\u606f\u6cc4\u9732\n\n**3. \u65e5\u5fd7\u4e2d\u95f4\u4ef6 (`logging_middleware`)**\n- **\u529f\u80fd**: \u8bb0\u5f55HTTP\u8bf7\u6c42\u7684\u8bbf\u95ee\u65e5\u5fd7\n- **\u76d1\u63a7**: \u8bb0\u5f55\u8bf7\u6c42\u65b9\u6cd5\u3001\u8def\u5f84\u3001\u54cd\u5e94\u72b6\u6001\u7801\u548c\u5904\u7406\u65f6\u95f4\n- **\u8c03\u8bd5**: \u4fbf\u4e8e\u95ee\u9898\u6392\u67e5\u548c\u6027\u80fd\u5206\u6790\n\n#### \u4e2d\u95f4\u4ef6\u5de5\u4f5c\u6d41\u7a0b\n\n```\n\u8bf7\u6c42 \u2192 CORS\u4e2d\u95f4\u4ef6 \u2192 \u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6 \u2192 \u65e5\u5fd7\u4e2d\u95f4\u4ef6 \u2192 \u8def\u7531\u5904\u7406 \u2192 \u54cd\u5e94\n```\n\n#### \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\u793a\u4f8b\n\n#### \u6846\u67b6\u4e2d\u95f4\u4ef6\u5b9e\u73b0\n\n\u6846\u67b6\u7684\u4e2d\u95f4\u4ef6\u5728 `MCPHTTPServer` \u4e2d\u81ea\u52a8\u914d\u7f6e\uff1a\n\n```python\nfrom mcp_framework.server.middleware import (\n    cors_middleware,\n    error_middleware, \n    logging_middleware\n)\n\nclass MCPHTTPServer:\n    def setup_middleware(self):\n        \"\"\"\u8bbe\u7f6e\u4e2d\u95f4\u4ef6\"\"\"\n        self.app.middlewares.append(cors_middleware)\n        self.app.middlewares.append(error_middleware)\n        self.app.middlewares.append(logging_middleware)\n```\n\n#### \u4e2d\u95f4\u4ef6\u5e94\u7528\u573a\u666f\n\n**1. \u5b89\u5168\u63a7\u5236**\n- \u8de8\u57df\u8d44\u6e90\u5171\u4eab (CORS)\n- \u7edf\u4e00\u9519\u8bef\u5904\u7406\n- \u8bf7\u6c42\u65e5\u5fd7\u8bb0\u5f55\n\n**2. \u76d1\u63a7\u548c\u8c03\u8bd5**\n- \u8bf7\u6c42\u54cd\u5e94\u65f6\u95f4\u7edf\u8ba1\n- \u9519\u8bef\u7387\u76d1\u63a7\n- \u8bbf\u95ee\u65e5\u5fd7\u8bb0\u5f55\n\n**3. \u81ea\u52a8\u5316\u5904\u7406**\n- \u54cd\u5e94\u5934\u6807\u51c6\u5316\n- \u9519\u8bef\u683c\u5f0f\u7edf\u4e00\n- \u8bf7\u6c42\u8ffd\u8e2a\n\n#### \u4f7f\u7528\u793a\u4f8b\n\n```python\nfrom mcp_framework import EnhancedMCPServer, run_server_main\n\nclass MyMCPServer(EnhancedMCPServer):\n    def __init__(self):\n        super().__init__(\n            name=\"MyServer\", \n            version=\"1.0.0\",\n            description=\"\u652f\u6301\u5185\u7f6e\u4e2d\u95f4\u4ef6\u7684MCP\u670d\u52a1\u5668\"\n        )\n        self._setup_tools()\n    \n    async def initialize(self):\n        \"\"\"\u670d\u52a1\u5668\u521d\u59cb\u5316\"\"\"\n        self.logger.info(\"\u670d\u52a1\u5668\u542f\u52a8\uff0c\u5185\u7f6e\u4e2d\u95f4\u4ef6\u5df2\u81ea\u52a8\u914d\u7f6e\")\n        self.logger.info(\"CORS\u3001\u9519\u8bef\u5904\u7406\u3001\u65e5\u5fd7\u4e2d\u95f4\u4ef6\u5df2\u542f\u7528\")\n    \n    def _setup_tools(self):\n        @self.tool(\"\u6d4b\u8bd5\u5de5\u5177\")\n        async def test_tool(message: str) -> str:\n            \"\"\"\u6d4b\u8bd5\u4e2d\u95f4\u4ef6\u529f\u80fd\u7684\u5de5\u5177\"\"\"\n            return f\"\u5904\u7406\u6d88\u606f: {message}\"\n\nif __name__ == \"__main__\":\n    server = MyMCPServer()\n    run_server_main(\n        server_instance=server,\n        server_name=\"MyServer\",\n        default_port=8080\n    )\n```\n\n#### \u4e2d\u95f4\u4ef6\u6548\u679c\u9a8c\u8bc1\n\n\u542f\u52a8\u670d\u52a1\u5668\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u65b9\u5f0f\u9a8c\u8bc1\u4e2d\u95f4\u4ef6\u529f\u80fd\uff1a\n\n```bash\n# \u6d4b\u8bd5CORS\u4e2d\u95f4\u4ef6\ncurl -H \"Origin: http://localhost:3000\" http://localhost:8080/health\n\n# \u6d4b\u8bd5\u9519\u8bef\u5904\u7406\u4e2d\u95f4\u4ef6\ncurl http://localhost:8080/nonexistent\n\n# \u67e5\u770b\u65e5\u5fd7\u4e2d\u95f4\u4ef6\u8f93\u51fa\n# \u5728\u670d\u52a1\u5668\u65e5\u5fd7\u4e2d\u4f1a\u770b\u5230\u8bf7\u6c42\u8bb0\u5f55\n```\n\n**\u6ce8\u610f\u4e8b\u9879\uff1a**\n- \u4e2d\u95f4\u4ef6\u5728HTTP\u670d\u52a1\u5668\u5c42\u9762\u81ea\u52a8\u914d\u7f6e\uff0c\u65e0\u9700\u624b\u52a8\u6ce8\u518c\n- \u6240\u6709MCP\u670d\u52a1\u5668\u5b9e\u4f8b\u90fd\u4f1a\u81ea\u52a8\u83b7\u5f97\u8fd9\u4e9b\u4e2d\u95f4\u4ef6\u529f\u80fd\n- \u4e2d\u95f4\u4ef6\u6309\u7167\u56fa\u5b9a\u987a\u5e8f\u6267\u884c\uff1aCORS \u2192 \u9519\u8bef\u5904\u7406 \u2192 \u65e5\u5fd7\u8bb0\u5f55\n- \u5f53\u524d\u7248\u672c\u4e0d\u652f\u6301\u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\u6ce8\u518c\uff08\u672a\u6765\u7248\u672c\u53ef\u80fd\u4f1a\u652f\u6301\uff09\n#### \u4e2d\u95f4\u4ef6\u5e94\u7528\u573a\u666f\n\n**1. \u5b89\u5168\u63a7\u5236**\n- API\u5bc6\u94a5\u9a8c\u8bc1\n- \u8bf7\u6c42\u9891\u7387\u9650\u5236\n- IP\u767d\u540d\u5355/\u9ed1\u540d\u5355\n\n**2. \u76d1\u63a7\u548c\u8c03\u8bd5**\n- \u8bf7\u6c42\u54cd\u5e94\u65f6\u95f4\u7edf\u8ba1\n- \u9519\u8bef\u7387\u76d1\u63a7\n- \u8bbf\u95ee\u65e5\u5fd7\u8bb0\u5f55\n\n**3. \u6570\u636e\u5904\u7406**\n- \u8bf7\u6c42\u6570\u636e\u9884\u5904\u7406\n- \u54cd\u5e94\u6570\u636e\u683c\u5f0f\u5316\n- \u5185\u5bb9\u538b\u7f29\n\n**4. \u7f13\u5b58\u4f18\u5316**\n- \u54cd\u5e94\u7f13\u5b58\n- \u9759\u6001\u8d44\u6e90\u7f13\u5b58\n- \u6570\u636e\u5e93\u67e5\u8be2\u7f13\u5b58\n\n#### \u914d\u7f6e\u793a\u4f8b\n\n```python\nfrom mcp_framework import EnhancedMCPServer, run_server_main\n\nclass MyMCPServer(EnhancedMCPServer):\n    def __init__(self):\n        super().__init__(\n            name=\"MyServer\", \n            version=\"1.0.0\",\n            description=\"\u652f\u6301\u4e2d\u95f4\u4ef6\u7684MCP\u670d\u52a1\u5668\"\n        )\n        self._setup_tools()\n    \n    async def initialize(self):\n        \"\"\"\u670d\u52a1\u5668\u521d\u59cb\u5316\"\"\"\n        self.logger.info(\"\u670d\u52a1\u5668\u542f\u52a8\uff0c\u4e2d\u95f4\u4ef6\u5df2\u81ea\u52a8\u914d\u7f6e\")\n        self.logger.info(\"CORS\u3001\u9519\u8bef\u5904\u7406\u3001\u65e5\u5fd7\u4e2d\u95f4\u4ef6\u5df2\u542f\u7528\")\n    \n    def _setup_tools(self):\n        @self.tool(\"\u6d4b\u8bd5\u5de5\u5177\")\n        async def test_tool(message: str) -> str:\n            \"\"\"\u6d4b\u8bd5\u4e2d\u95f4\u4ef6\u529f\u80fd\u7684\u5de5\u5177\"\"\"\n            return f\"\u5904\u7406\u6d88\u606f: {message}\"\n\nif __name__ == \"__main__\":\n    server = MyMCPServer()\n    run_server_main(\n        server_instance=server,\n        server_name=\"MyServer\",\n        default_port=8080\n    )\n```\n\n\u901a\u8fc7\u8bbf\u95ee `http://localhost:8080/health` \u53ef\u4ee5\u770b\u5230\u4e2d\u95f4\u4ef6\u7684\u5de5\u4f5c\u6548\u679c\uff0c\u5305\u62ecCORS\u5934\u90e8\u3001\u8bbf\u95ee\u65e5\u5fd7\u548c\u9519\u8bef\u5904\u7406\u3002\n\n## \ud83d\udcd6 \u793a\u4f8b\u9879\u76ee\n\n\u67e5\u770b `examples/` \u76ee\u5f55\u4e2d\u7684\u5b8c\u6574\u793a\u4f8b\uff1a\n\n- `examples/port_config_demo.py` - \u7aef\u53e3\u914d\u7f6e\u6f14\u793a\n- `examples/weather_server.py` - \u5929\u6c14\u670d\u52a1\u5668\u793a\u4f8b\n- `examples/file_manager.py` - \u6587\u4ef6\u7ba1\u7406\u670d\u52a1\u5668\n- `examples/ai_assistant.py` - AI \u52a9\u624b\u670d\u52a1\u5668\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\uff01\u8bf7\u67e5\u770b [CONTRIBUTING.md](CONTRIBUTING.md) \u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u91c7\u7528 MIT \u8bb8\u53ef\u8bc1 - \u67e5\u770b [LICENSE](LICENSE) \u6587\u4ef6\u4e86\u89e3\u8be6\u7ec6\u4fe1\u606f\u3002\n\n## \ud83c\udd98 \u652f\u6301\n\n- \ud83d\udcda [\u6587\u6863](https://mcp-framework.readthedocs.io/)\n- \ud83d\udc1b [\u95ee\u9898\u53cd\u9988](https://github.com/your-repo/mcp_framework/issues)\n- \ud83d\udcac [\u8ba8\u8bba\u533a](https://github.com/your-repo/mcp_framework/discussions)\n- \ud83d\udce7 [\u90ae\u4ef6\u652f\u6301](mailto:support@mcpframework.com)\n\n## \ud83d\uddfa\ufe0f \u8def\u7ebf\u56fe\n\n- [ ] \u63d2\u4ef6\u7cfb\u7edf\n- [ ] \u56fe\u5f62\u5316\u914d\u7f6e\u754c\u9762\n- [ ] \u96c6\u7fa4\u90e8\u7f72\u652f\u6301\n- [ ] \u6027\u80fd\u76d1\u63a7\u9762\u677f\n- [ ] Docker \u5bb9\u5668\u5316\u652f\u6301\n- [ ] \u4e91\u539f\u751f\u90e8\u7f72\u6a21\u677f\n\n---\n\n**MCP Framework** - \u8ba9 MCP \u670d\u52a1\u5668\u5f00\u53d1\u53d8\u5f97\u7b80\u5355\u800c\u5f3a\u5927\uff01 \ud83d\ude80\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "\u4e00\u4e2a\u5f3a\u5927\u4e14\u6613\u7528\u7684 MCP (Model Context Protocol) \u670d\u52a1\u5668\u5f00\u53d1\u6846\u67b6",
    "version": "0.1.2.post1724313300",
    "project_urls": {
        "Bug Reports": "https://github.com/mcpframework/mcp_framework/issues",
        "Documentation": "https://mcp-framework.readthedocs.io/",
        "Homepage": "https://github.com/mcpframework/mcp_framework",
        "Repository": "https://github.com/mcpframework/mcp_framework.git",
        "Source Code": "https://github.com/mcpframework/mcp_framework"
    },
    "split_keywords": [
        "mcp",
        " model-context-protocol",
        " server",
        " framework",
        " ai",
        " llm",
        " tools",
        " streaming",
        " async",
        " web-server"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6bbb1d60f26cf8ce582921aaa3dda916e8e4cda8c238413f06d3fa2302f48ff7",
                "md5": "b33f7f0e3f039c6cba51c2a890f59c9f",
                "sha256": "b9cce8b8329919366719c425fe3aae33d54e91ade48c88312eed85f52aa9171a"
            },
            "downloads": -1,
            "filename": "mcp_framework-0.1.2.post1724313300-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b33f7f0e3f039c6cba51c2a890f59c9f",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 66559,
            "upload_time": "2025-08-22T08:37:22",
            "upload_time_iso_8601": "2025-08-22T08:37:22.994272Z",
            "url": "https://files.pythonhosted.org/packages/6b/bb/1d60f26cf8ce582921aaa3dda916e8e4cda8c238413f06d3fa2302f48ff7/mcp_framework-0.1.2.post1724313300-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "496adbf52bff8bad6c54ed73eb2572a34b9c60b222a6769f83b95523087e31cf",
                "md5": "8c4dad33b3e6f86a7dbcfd0c36efb29f",
                "sha256": "f42c6709039c010c876d1a852a7f1b7fc6eb044befa48c20e0d151fface790eb"
            },
            "downloads": -1,
            "filename": "mcp_framework-0.1.2.post1724313300.tar.gz",
            "has_sig": false,
            "md5_digest": "8c4dad33b3e6f86a7dbcfd0c36efb29f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 67769,
            "upload_time": "2025-08-22T08:37:24",
            "upload_time_iso_8601": "2025-08-22T08:37:24.303384Z",
            "url": "https://files.pythonhosted.org/packages/49/6a/dbf52bff8bad6c54ed73eb2572a34b9c60b222a6769f83b95523087e31cf/mcp_framework-0.1.2.post1724313300.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-22 08:37:24",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "mcpframework",
    "github_project": "mcp_framework",
    "github_not_found": true,
    "lcname": "mcp-framework"
}
        
Elapsed time: 0.85871s