Skip to main content
Glama
jason-chang

FastAPI OpenAPI MCP Server

by jason-chang

FastAPI OpenAPI MCP Server

🚀 基于 MCP 2025-06-18 标准的 FastAPI OpenAPI Server,提供 Resources + Tools 混合架构,让 AI 编程助手能够高效查询和操作 API 信息,大幅减少 Token 消耗。

Python Version License Code style: ruff MCP Standard

📖 项目简介

FastAPI OpenAPI MCP Server 是一个基于最新 MCP 2025-06-18 标准的服务器实现,采用创新的 Resources + Tools 混合架构,为 FastAPI 应用提供完整的 MCP 生态支持。该服务器让 AI 编程助手(如 Claude、GPT 等)能够:

  • 🎯 双重访问模式 - Resources 提供结构化概览,Tools 提供精确操作

  • 📊 智能缓存 - 多级缓存机制,显著提升响应速度

  • 🔍 强大搜索 - 支持正则表达式、模糊匹配、多维度搜索

  • 🛡️ 安全可控 - 细粒度权限控制、数据脱敏、审计日志

  • 💰 极致优化 - 减少 90%+ 的 Token 消耗

适用场景

  • ✅ 大型 API 项目(接口数量 > 50 个)

  • ✅ 需要深度 AI 辅助开发和调试

  • ✅ 严格的安全和合规要求

  • ✅ 需要高性能和高可用性

  • ✅ 多服务、多租户环境

✨ 核心功能

🌐 MCP Resources

基于最新 MCP 标准的 Resources 功能,提供直观的资源访问:

openapi://spec                 # 完整 OpenAPI 规范
openapi://endpoints           # 所有端点列表
openapi://endpoints/{path}    # 具体端点详情
openapi://models              # 数据模型列表
openapi://models/{name}       # 具体模型定义
openapi://tags                # 标签列表
openapi://tags/{tag}/endpoints # 按标签分组的端点

🔧 MCP Tools

4 个核心工具,覆盖所有使用场景:

  1. search_endpoints - 强大的端点搜索和过滤

  2. generate_examples - 智能调用示例生成

  3. validate_request - 请求参数验证

  4. analyze_dependencies - API 依赖关系分析

📡 访问方式

  • JSON-RPC 2.0 - 标准 MCP 协议

  • HTTP Transport - 基于 HTTP 的 MCP 传输

  • SSE 流式传输 - 实时数据推送

  • 多协议支持 - stdio、HTTP、WebSocket

🏗️ 架构设计

🎯 Resources + Tools 混合架构

graph TB
    subgraph "MCP Client"
        A[AI Assistant]
    end

    subgraph "MCP Server"
        B[Resources Layer]
        C[Tools Layer]
        D[Transport Layer]
    end

    subgraph "FastAPI Application"
        E[OpenAPI Spec]
        F[API Endpoints]
        G[Data Models]
    end

    A --> B
    A --> C
    B --> D
    C --> D
    D --> E
    D --> F
    D --> G

    B --> |Structured Access| H[openapi://spec]
    B --> |Endpoint Overview| I[openapi://endpoints]
    B --> |Model Information| J[openapi://models]

    C --> |Powerful Search| K[search_endpoints]
    C --> |Example Generation| L[generate_examples]
    C --> |Request Validation| M[validate_request]
    C --> |Dependency Analysis| N[analyze_dependencies]

Resources 优势:

  • 📋 结构化概览 - 提供完整的 API 结构视图

  • 🎯 直观导航 - 通过 URI 路径直接访问资源

  • 💾 高效缓存 - 资源级别的缓存机制

  • 🔗 关联访问 - 支持资源间的引用和跳转

Tools 优势:

  • 🔍 精确查询 - 复杂的搜索和过滤能力

  • 动态计算 - 实时数据分析和生成

  • 🛠️ 业务逻辑 - 支持复杂的操作流程

  • 🎨 格式灵活 - 多种输出格式支持

📁 目录结构

openapi-mcp/
├── openapi_mcp/                 # 核心模块
│   ├── __init__.py
│   ├── server.py               # 核心 MCP Server
│   ├── config.py              # 配置管理
│   ├── transport.py           # 传输层实现
│   ├── resources/             # Resources 实现
│   │   ├── __init__.py
│   │   ├── base.py            # Resource 基类
│   │   ├── spec.py            # OpenAPI Spec Resource
│   │   ├── endpoints.py       # Endpoints Resources
│   │   ├── models.py          # Models Resources
│   │   └── tags.py            # Tags Resources
│   ├── tools/                 # Tools 实现
│   │   ├── __init__.py
│   │   ├── base.py            # Tool 基类
│   │   ├── search.py          # 搜索工具
│   │   ├── examples.py        # 示例生成工具
│   │   ├── validation.py      # 验证工具
│   │   └── analysis.py        # 分析工具
│   ├── security/              # 安全模块
│   │   ├── __init__.py
│   │   ├── filter.py          # 数据过滤
│   │   ├── audit.py           # 审计日志
│   │   └── auth.py            # 认证授权
│   ├── cache.py               # 缓存机制
│   ├── client.py              # MCP 客户端
│   └── types.py               # 类型定义
├── tests/                     # 测试文件
│   ├── test_resources/        # Resources 测试
│   ├── test_tools/            # Tools 测试
│   └── test_integration/      # 集成测试
├── examples/                  # 使用示例
│   ├── basic_usage.py         # 基础使用
│   ├── resources_tools_integration.py  # Resources + Tools 集成
│   ├── custom_config_example.py         # 自定义配置
│   ├── security_example.py              # 安全功能
│   ├── multi_app_example.py             # 多应用实例
│   ├── custom_tool_example.py           # 自定义工具
│   └── performance_test_example.py      # 性能测试
├── docs/                      # 文档
├── pyproject.toml
├── README.md
├── TODO.md
└── LICENSE

🧩 核心组件

1. OpenApiMcpServer - 主服务器类

class OpenApiMcpServer:
    """OpenAPI MCP Server 主类,实现 Resources + Tools 混合架构"""

    def __init__(
        self,
        fastapi_app: FastAPI,
        config: Optional[McpServerConfig] = None
    ):
        """
        初始化 MCP Server

        Args:
            fastapi_app: FastAPI 应用实例
            config: 服务器配置(可选)
        """

    def register_resource(self, resource: BaseResource) -> None:
        """注册 Resource"""

    def register_tool(self, tool: BaseTool) -> None:
        """注册 Tool"""

    def mount(self, path: str = "/mcp") -> None:
        """挂载 MCP 服务器到指定路径"""

2. McpServerConfig - 配置管理

@dataclass
class McpServerConfig:
    """MCP Server 完整配置"""

    # 服务器信息
    server_info: Dict[str, str] = field(default_factory=dict)

    # 缓存配置
    cache_enabled: bool = True
    cache_ttl: int = 300
    cache_size: int = 1000

    # 安全配置
    security_filter: Optional[SecurityFilter] = None
    access_log_enabled: bool = True
    audit_sensitive_operations: bool = True

    # 性能配置
    max_concurrent_requests: int = 50
    request_timeout: int = 30
    compression_enabled: bool = True
    metrics_enabled: bool = True

    # Resources 配置
    resources_config: Dict[str, Any] = field(default_factory=dict)

    # Tools 配置
    tools_config: Dict[str, Any] = field(default_factory=dict)

3. BaseResource - Resource 基类

class BaseResource(ABC):
    """Resource 基类"""

    @property
    @abstractmethod
    def uri(self) -> str:
        """Resource URI"""

    @property
    @abstractmethod
    def name(self) -> str:
        """Resource 名称"""

    @property
    @abstractmethod
    def description(self) -> str:
        """Resource 描述"""

    @abstractmethod
    async def get_content(self, params: Dict[str, Any]) -> str:
        """获取 Resource 内容"""

4. BaseTool - Tool 基类

class BaseTool(ABC):
    """Tool 基类"""

    @property
    @abstractmethod
    def name(self) -> str:
        """Tool 名称"""

    @property
    @abstractmethod
    def description(self) -> str:
        """Tool 描述"""

    @abstractmethod
    def get_definition(self) -> ToolDefinition:
        """获取 Tool 定义"""

    @abstractmethod
    async def execute(self, arguments: Dict[str, Any]) -> ToolResult:
        """执行 Tool"""

🔄 数据流架构

sequenceDiagram
    participant C as MCP Client
    participant S as MCP Server
    participant R as Resources Layer
    participant T as Tools Layer
    participant F as FastAPI App

    C->>S: List Resources
    S->>R: Get Available Resources
    R-->>S: Resource List
    S-->>C: Resources

    C->>S: Read Resource (openapi://spec)
    S->>R: Get Resource Content
    R->>F: Get OpenAPI Spec
    F-->>R: OpenAPI Document
    R-->>S: Formatted Content
    S-->>C: Resource Data

    C->>S: Call Tool (search_endpoints)
    S->>T: Execute Tool
    T->>R: Use Resources for Data
    R-->>T: Structured Data
    T-->>S: Tool Result
    S-->>C: Formatted Result

🚀 快速开始

安装

# 从 PyPI 安装(TODO: 发布后)
pip install fastapi-openapi-mcp

# 或使用 uv
uv add fastapi-openapi-mcp

# 开发模式安装
git clone https://github.com/yourusername/openapi-mcp.git
cd openapi-mcp
uv sync

💡 立即测试(使用 MCP Inspector)

在开发模式下,你可以立即使用 MCP Inspector 测试:

# 确保已安装依赖
uv sync

# 使用 MCP Inspector 测试 Resources + Tools
npx @modelcontextprotocol/inspector uv run python examples/mcp_stdio_example.py

这会打开一个 Web 界面(http://localhost:5173),让你可以:

  • ✅ 查看所有 MCP Resources 和 Tools

  • ✅ 浏览 OpenAPI 规范资源

  • ✅ 交互式调用工具

  • ✅ 实时查看返回结果

🎯 基础使用

from fastapi import FastAPI
from openapi_mcp import OpenApiMcpServer

# 创建 FastAPI 应用
app = FastAPI(
    title="My Awesome API",
    version="1.0.0",
    description="一个展示 MCP 功能的示例 API"
)

# 添加你的路由
@app.get("/users", tags=["users"])
async def list_users():
    return {"users": []}

@app.post("/users", tags=["users"])
async def create_user(user_data: dict):
    return {"id": 1, "name": user_data.get("name"), "status": "created"}

# 集成 MCP Server(仅需 1 行代码)
mcp_server = OpenApiMcpServer(app)
mcp_server.mount("/mcp")

# 启动应用
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

🔧 自定义配置

from openapi_mcp import OpenApiMcpServer, McpServerConfig

# 自定义配置
config = McpServerConfig(
    server_info={
        "name": "My Custom MCP Server",
        "version": "2.0.0"
    },
    cache_enabled=True,
    cache_ttl=600,  # 10分钟缓存
    max_concurrent_requests=100,
    compression_enabled=True,
    metrics_enabled=True
)

mcp_server = OpenApiMcpServer(app, config=config)
mcp_server.mount("/mcp")

🛡️ 安全配置

from openapi_mcp.security import SecurityFilter

class CustomSecurityFilter(SecurityFilter):
    def filter_data(self, data: Any, context: str = "") -> Any:
        """自定义数据脱敏"""
        if isinstance(data, dict):
            # 脱敏敏感字段
            sensitive_keys = ["password", "api_key", "secret"]
            for key in sensitive_keys:
                if key in data:
                    data[key] = "***"
        return data

# 启用安全功能
config = McpServerConfig(
    security_filter=CustomSecurityFilter(),
    access_log_enabled=True,
    audit_sensitive_operations=True
)

mcp_server = OpenApiMcpServer(app, config=config)
mcp_server.mount("/mcp")

🧪 Resources + Tools 集成使用

import asyncio
from openapi_mcp.client import OpenApiMcpClient
from openapi_mcp.transport.http import HttpMcpTransport

async def demo_mixed_usage():
    """演示 Resources + Tools 混合使用"""

    # 连接到 MCP 服务器
    transport = HttpMcpTransport("http://localhost:8000/mcp")
    client = OpenApiMcpClient(transport)
    await transport.connect()

    try:
        # 1. 使用 Resources 获取概览
        resources = await client.list_resources()
        print(f"发现 {len(resources)} 个资源")

        # 2. 读取 OpenAPI 规范
        spec_content = await client.read_resource("openapi://spec")
        spec = json.loads(spec_content)
        print(f"API 标题: {spec['info']['title']}")

        # 3. 读取端点列表
        endpoints_content = await client.read_resource("openapi://endpoints")
        endpoints = json.loads(endpoints_content)
        print(f"总端点数: {len(endpoints)}")

        # 4. 使用 Tools 进行搜索
        search_result = await client.call_tool("search_endpoints", {
            "query": "user",
            "filters": {"methods": ["GET", "POST"]}
        })
        print(f"找到 {len(search_result['results'])} 个用户相关端点")

        # 5. 生成调用示例
        example_result = await client.call_tool("generate_examples", {
            "endpoint_path": "/users",
            "method": "POST",
            "formats": ["json", "curl"]
        })
        print("生成的示例:")
        print(example_result['examples']['json'])

    finally:
        await transport.disconnect()

# 运行演示
asyncio.run(demo_mixed_usage())

🔧 高级功能

🏎️ 性能优化

# 高性能配置
config = McpServerConfig(
    # 缓存优化
    cache_enabled=True,
    cache_ttl=1800,              # 30分钟缓存
    cache_size=1000,             # 最大缓存条目

    # 并发控制
    max_concurrent_requests=100,
    request_timeout=60,

    # 传输优化
    compression_enabled=True,

    # 指标监控
    metrics_enabled=True
)

🔀 多应用管理

from openapi_mcp import MultiAppManager

# 创建应用管理器
manager = MultiAppManager()

# 注册多个应用
manager.register_app("ecommerce", ecommerce_app)
manager.register_app("users", user_service_app)
manager.register_app("content", content_service_app)

# 统一挂载
manager.mount_all("/mcp")

# 应用信息
app_info = manager.get_app_info()
print(f"总应用数: {len(app_info)}")

🛠️ 自定义 Tools

from openapi_mcp.tools.base import BaseTool
from openapi_mcp.types import ToolDefinition, ToolResult

class ApiAnalyzerTool(BaseTool):
    """自定义 API 分析工具"""

    def __init__(self):
        super().__init__()
        self.name = "api_analyzer"
        self.description = "分析 OpenAPI 规范,提供统计信息"

    def get_definition(self) -> ToolDefinition:
        return ToolDefinition(
            name=self.name,
            description=self.description,
            input_schema={
                "type": "object",
                "properties": {
                    "analysis_type": {
                        "type": "string",
                        "enum": ["overview", "endpoints", "models"],
                        "default": "overview"
                    }
                }
            }
        )

    async def execute(self, arguments: Dict[str, Any]) -> ToolResult:
        # 获取 OpenAPI 规范
        spec = await self.get_openapi_spec()

        # 执行分析逻辑
        analysis_type = arguments.get("analysis_type", "overview")
        result = self._analyze_spec(spec, analysis_type)

        return ToolResult(
            success=True,
            data=result,
            message="API 分析完成"
        )

    def _analyze_spec(self, spec: Dict, analysis_type: str) -> Dict:
        # 实现具体的分析逻辑
        paths = spec.get("paths", {})
        return {
            "total_paths": len(paths),
            "total_endpoints": sum(len(methods) for methods in paths.values())
        }

# 注册自定义工具
mcp_server.register_tool(ApiAnalyzerTool())

🔧 自定义 Resources

from openapi_mcp.resources.base import BaseResource

class CustomAnalyticsResource(BaseResource):
    """自定义分析资源"""

    @property
    def uri(self) -> str:
        return "openapi://analytics"

    @property
    def name(self) -> str:
        return "API Analytics"

    @property
    def description(self) -> str:
        return "API 使用分析和统计信息"

    async def get_content(self, params: Dict[str, Any]) -> str:
        # 获取分析数据
        spec = await self.get_openapi_spec()

        analytics = {
            "endpoint_count": len(spec.get("paths", {})),
            "tag_distribution": self._analyze_tags(spec),
            "method_distribution": self._analyze_methods(spec)
        }

        return json.dumps(analytics, indent=2)

# 注册自定义资源
mcp_server.register_resource(CustomAnalyticsResource())

🔐 安全增强

from openapi_mcp.security import SecurityFilter, AuditLogger

class EnterpriseSecurityFilter(SecurityFilter):
    """企业级安全过滤器"""

    def filter_tool(self, tool_name: str, tool_info: Dict) -> bool:
        # 禁用危险工具
        dangerous_tools = ['delete_endpoint', 'modify_server_config']
        return tool_name not in dangerous_tools

    def filter_data(self, data: Any, context: str = "") -> Any:
        # 多层脱敏逻辑
        if isinstance(data, dict):
            return self._apply_enterprise_filtering(data)
        return data

    def _apply_enterprise_filtering(self, data: Dict) -> Dict:
        # 实现企业级数据过滤逻辑
        filtered = data.copy()

        # 移除敏感字段
        sensitive_fields = ['password', 'secret', 'token', 'key']
        for field in sensitive_fields:
            if field in filtered:
                filtered[field] = '[REDACTED]'

        return filtered

# 启用企业级安全
config = McpServerConfig(
    security_filter=EnterpriseSecurityFilter(),
    access_log_enabled=True,
    audit_sensitive_operations=True
)

📚 API 参考

🌐 MCP Resources 详解

1. OpenAPI Spec Resource

  • URI: openapi://spec

  • 描述: 返回完整的 OpenAPI 规范文档

  • 用途: 获取 API 的完整结构信息

# 读取完整规范
GET openapi://spec

2. Endpoints Resources

  • URI: openapi://endpoints

  • 描述: 返回所有端点的概要信息

  • 用途: 快速浏览 API 端点

# 获取所有端点
GET openapi://endpoints

# 获取特定端点
GET openapi://endpoints/users/{user_id}

3. Models Resources

  • URI: openapi://models

  • 描述: 返回数据模型信息

  • 用途: 了解数据结构

# 获取所有模型
GET openapi://models

# 获取特定模型
GET openapi://models/User

4. Tags Resources

  • URI: openapi://tags

  • 描述: 返回标签分组信息

  • 用途: 按功能模块浏览 API

# 获取所有标签
GET openapi://tags

# 获取标签下的端点
GET openapi://tags/users/endpoints

🔧 MCP Tools 详解

1. search_endpoints

功能: 强大的端点搜索和过滤

# 基本搜索
result = await client.call_tool("search_endpoints", {
    "query": "user"
})

# 高级搜索
result = await client.call_tool("search_endpoints", {
    "query": "create user",
    "filters": {
        "methods": ["POST"],
        "tags": ["users"]
    },
    "pattern": r".*users.*"
})

参数:

  • query (string): 搜索关键词

  • filters (object): 过滤条件

    • methods (array): HTTP 方法

    • tags (array): 标签

  • pattern (string): 正则表达式模式

2. generate_examples

功能: 智能生成调用示例

# 生成基础示例
result = await client.call_tool("generate_examples", {
    "endpoint_path": "/users",
    "method": "POST",
    "formats": ["json", "curl", "python"]
})

# 生成带参数的示例
result = await client.call_tool("generate_examples", {
    "endpoint_path": "/users/{user_id}",
    "method": "GET",
    "include_parameters": True,
    "example_values": {
        "user_id": 123
    }
})

参数:

  • endpoint_path (string): 端点路径

  • method (string): HTTP 方法

  • formats (array): 输出格式

  • include_parameters (boolean): 是否包含参数示例

  • example_values (object): 自定义示例值

3. validate_request

功能: 请求参数验证

# 验证请求数据
result = await client.call_tool("validate_request", {
    "endpoint_path": "/users",
    "method": "POST",
    "request_data": {
        "name": "John Doe",
        "email": "john@example.com"
    }
})

4. analyze_dependencies

功能: API 依赖关系分析

# 分析端点依赖
result = await client.call_tool("analyze_dependencies", {
    "endpoint_path": "/orders/{order_id}",
    "include_transitive": True
})

📊 性能指标

缓存性能

# 获取缓存统计
cache_stats = mcp_server.get_cache_stats()
print(f"缓存命中率: {cache_stats['hit_rate']:.2%}")
print(f"缓存大小: {cache_stats['size']}")

系统性能

# 获取性能指标
metrics = mcp_server.get_metrics()
print(f"请求总数: {metrics['total_requests']}")
print(f"平均响应时间: {metrics['avg_response_time']}ms")
print(f"错误率: {metrics['error_rate']:.2%}")

🤝 贡献指南

我们欢迎各种形式的贡献!

开发环境搭建

# 克隆项目
git clone https://github.com/yourusername/openapi-mcp-server.git
cd openapi-mcp-server

# 安装依赖
uv sync

# 运行测试
uv run pytest

# 代码格式化
uv run ruff format .

# 代码检查
uv run ruff check . --fix

# 类型检查
uv run basedpyright

提交规范

遵循 Conventional Commits 规范:

feat: 添加新功能
fix: 修复 bug
docs: 文档更新
style: 代码格式调整
refactor: 代码重构
test: 测试相关
chore: 构建或工具更新

📄 许可证

MIT License

🙏 致谢

  • FastAPI - 现代化的 Python Web 框架

  • MCP - Model Context Protocol

  • Anthropic - MCP 协议的创建者

📮 联系方式


: 本项目当前处于开发阶段,API 可能会有变动。欢迎提前试用并提供反馈!

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - confirmed to work

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jason-chang/fastapi-openapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server