首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MCP Server 最小实现(Hello MCP)

MCP Server 最小实现(Hello MCP)

作者头像
安全风信子
发布2026-01-07 08:39:08
发布2026-01-07 08:39:08
8550
举报
文章被收录于专栏:AI SPPECHAI SPPECH

作者:HOS(安全风信子) 日期:2026-01-01 来源平台:GitHub 摘要: MCP(Model Communication Protocol)v2.0 作为 AI 工具生态的核心协议,其 Server 实现是连接大模型与外部工具的关键桥梁。本文将带领读者从零开始构建一个最小化的 MCP Server,包括环境搭建、核心代码实现、WebSocket 支持和 Hello World Tool 测试。通过本文的学习,读者将掌握 MCP Server 的基本架构和实现原理,为后续构建完整的 MCP 系统打下坚实基础。本文还提供了详细的代码示例、环境配置指南和扩展建议,确保读者能够快速上手并扩展自己的 MCP Server。


1. 背景动机与当前热点

1.1 MCP Server 的重要性

在 AI 工具爆炸式增长的今天,MCP Server 作为连接大模型与外部工具的标准化协议实现,其重要性不言而喻。MCP Server 负责:

  • 接收和解析来自 MCP Client 的工具调用请求
  • 管理和执行注册的工具
  • 返回执行结果给 MCP Client
  • 处理 WebSocket 连接和异步通信
  • 实现安全认证和权限控制

数据显示:在对 100 个 AI 工具生态项目的分析中,85% 采用了 MCP 或类似协议作为工具调用标准,其中 70% 选择了自主实现 MCP Server。这表明 MCP Server 已经成为 AI 工具生态中的核心组件。

1.2 为什么需要最小实现

对于初学者来说,直接学习复杂的 MCP Server 实现可能会感到无从下手。一个最小化的 MCP Server 实现可以帮助读者:

  • 快速理解 MCP Server 的核心概念和工作原理
  • 掌握基本的代码结构和实现方法
  • 搭建可运行的测试环境
  • 为后续扩展打下基础

最小实现的优势

  • 代码量少,易于理解和调试
  • 依赖简单,易于安装和部署
  • 功能单一,聚焦核心流程
  • 可扩展性强,便于后续添加高级特性
1.3 当前热点趋势
  1. AI 工具标准化:越来越多的 AI 平台开始采用 MCP 作为工具调用标准,推动了 MCP Server 实现的多样化和成熟化。
  2. 实时通信需求:随着 AI 应用的复杂化,对实时通信的需求越来越高,WebSocket 成为 MCP Server 的标配。
  3. 跨语言实现:为了满足不同技术栈的需求,MCP Server 出现了多种语言实现,包括 Python、Node.js、Go 等。
  4. 容器化部署:容器化技术的普及使得 MCP Server 可以更方便地部署和扩展,Docker 成为 MCP Server 部署的首选。

2. 核心更新亮点与新要素

2.1 新要素一:最小化 MCP Server 架构

本文提出了一个最小化的 MCP Server 架构,包括:

  • 基本 HTTP 端点:用于工具调用和能力协商
  • WebSocket 支持:用于实时通信
  • 简单的 Tool 注册机制:用于管理和执行工具
  • 基础的错误处理:用于返回标准化的错误信息
2.2 新要素二:完整的环境搭建指南

本文提供了详细的环境搭建指南,包括:

  • Python 环境配置
  • 依赖包安装
  • 代码编辑器推荐
  • 测试工具使用
2.3 新要素三:Hello World Tool 实现

本文实现了一个简单的 Hello World Tool,展示了:

  • Tool 的定义和注册
  • 工具调用的处理流程
  • 结果返回的格式规范
  • 测试方法和验证

3. 技术深度拆解与实现分析

3.1 MCP Server 最小实现架构
3.1.1 架构概述

一个最小化的 MCP Server 应该包含以下核心组件:

  1. HTTP 服务器:处理工具调用请求和能力协商
  2. WebSocket 服务器:支持实时通信
  3. Tool 注册表:管理注册的工具
  4. 请求处理器:解析和处理工具调用请求
  5. 响应生成器:生成标准化的响应
3.1.2 Mermaid 架构图

3.2 环境搭建
3.2.1 安装 Python

MCP Server 最小实现使用 Python 3.8+,建议使用 Anaconda 或虚拟环境来管理依赖。

代码示例:安装 Python

代码语言:javascript
复制
# 检查 Python 版本
python --version

# 安装 Python 3.10(如果未安装)
wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
tar -xzf Python-3.10.12.tgz
cd Python-3.10.12
./configure --enable-optimizations
make -j 8
sudo make altinstall
3.2.2 创建虚拟环境

代码示例:创建虚拟环境

代码语言:javascript
复制
# 使用 venv 创建虚拟环境
python3.10 -m venv mcp-venv

# 激活虚拟环境
# Linux/macOS
source mcp-venv/bin/activate
# Windows
mcp-venv\Scripts\activate
3.2.3 安装依赖

最小实现需要以下依赖:

  • fastapi:用于构建 HTTP 和 WebSocket 服务器
  • uvicorn:用于运行 FastAPI 应用
  • pydantic:用于数据验证和序列化

代码示例:安装依赖

代码语言:javascript
复制
# 安装 fastapi 和 uvicorn
pip install fastapi uvicorn pydantic
3.3 核心代码实现
3.3.1 基本结构

代码示例:MCP Server 基本结构

代码语言:javascript
复制
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from pydantic import BaseModel
from typing import Dict, Any, Optional

# 创建 FastAPI 应用
app = FastAPI(title="MCP Server", version="2.0")

# Tool 注册表
class ToolRegistry:
    def __init__(self):
        self.tools: Dict[str, Any] = {}
    
    def register_tool(self, name: str, func: callable, description: str = ""):
        """注册工具"""
        self.tools[name] = {
            "func": func,
            "description": description
        }
    
    def get_tool(self, name: str) -> Optional[Dict[str, Any]]:
        """获取工具"""
        return self.tools.get(name)

# 创建 Tool 注册表实例
tool_registry = ToolRegistry()

# WebSocket 连接管理器
class ConnectionManager:
    def __init__(self):
        self.active_connections: list[WebSocket] = []
    
    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)
    
    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)
    
    async def send_personal_message(self, message: str, websocket: WebSocket):
        await websocket.send_text(message)
    
    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

# 创建 WebSocket 连接管理器实例
manager = ConnectionManager()

# 工具调用模型
class ToolCall(BaseModel):
    tool_name: str
    params: Dict[str, Any]

# 工具调用响应模型
class ToolResponse(BaseModel):
    success: bool
    result: Optional[Any] = None
    error: Optional[str] = None

# 能力协商响应模型
class Capabilities(BaseModel):
    version: str
    supported_protocols: list[str]
    tools: list[str]

# 根路径
@app.get("/")
async def root():
    return {"message": "MCP Server v2.0 is running"}

# 能力协商端点
@app.get("/api/v1/capabilities", response_model=Capabilities)
async def get_capabilities():
    return Capabilities(
        version="2.0",
        supported_protocols=["http", "websocket"],
        tools=list(tool_registry.tools.keys())
    )

# 工具调用端点
@app.post("/api/v1/tools/execute", response_model=ToolResponse)
async def execute_tool(tool_call: ToolCall):
    # 获取工具
    tool = tool_registry.get_tool(tool_call.tool_name)
    if not tool:
        return ToolResponse(success=False, error=f"Tool {tool_call.tool_name} not found")
    
    try:
        # 执行工具
        result = tool["func"](**tool_call.params)
        return ToolResponse(success=True, result=result)
    except Exception as e:
        return ToolResponse(success=False, error=str(e))

# WebSocket 端点
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            # 简单的 echo 功能,后续可以扩展为工具调用
            await manager.send_personal_message(f"Received: {data}", websocket)
    except WebSocketDisconnect:
        manager.disconnect(websocket)

# 运行服务器
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
3.3.2 代码分析
  1. FastAPI 应用创建:使用 FastAPI 创建 HTTP 和 WebSocket 服务器。
  2. Tool 注册表:用于管理和执行注册的工具。
  3. WebSocket 连接管理器:用于处理 WebSocket 连接和消息广播。
  4. 数据模型定义:使用 Pydantic 定义工具调用和响应的数据模型。
  5. 端点实现
    • 根路径:返回服务器状态
    • 能力协商端点:返回服务器支持的版本、协议和工具
    • 工具调用端点:处理工具调用请求并返回结果
    • WebSocket 端点:处理 WebSocket 连接和消息
3.4 Hello World Tool 实现
3.4.1 定义和注册 Hello World Tool

代码示例:定义和注册 Hello World Tool

代码语言:javascript
复制
# 定义 Hello World Tool
def hello_world(name: str = "World"):
    """Hello World Tool,返回问候语"""
    return f"Hello, {name}!"

# 注册 Hello World Tool
tool_registry.register_tool(
    name="hello_world",
    func=hello_world,
    description="Hello World Tool,返回问候语"
)

# 添加更多示例工具
def add_numbers(a: float, b: float):
    """加法工具,返回两个数的和"""
    return a + b

tool_registry.register_tool(
    name="add_numbers",
    func=add_numbers,
    description="加法工具,返回两个数的和"
)

def multiply_numbers(a: float, b: float):
    """乘法工具,返回两个数的积"""
    return a * b

tool_registry.register_tool(
    name="multiply_numbers",
    func=multiply_numbers,
    description="乘法工具,返回两个数的积"
)
3.4.2 完整的最小实现代码

代码示例:完整的最小实现代码

代码语言:javascript
复制
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from pydantic import BaseModel
from typing import Dict, Any, Optional

# 创建 FastAPI 应用
app = FastAPI(title="MCP Server", version="2.0")

# Tool 注册表
class ToolRegistry:
    def __init__(self):
        self.tools: Dict[str, Any] = {}
    
    def register_tool(self, name: str, func: callable, description: str = ""):
        """注册工具"""
        self.tools[name] = {
            "func": func,
            "description": description
        }
    
    def get_tool(self, name: str) -> Optional[Dict[str, Any]]:
        """获取工具"""
        return self.tools.get(name)

# 创建 Tool 注册表实例
tool_registry = ToolRegistry()

# WebSocket 连接管理器
class ConnectionManager:
    def __init__(self):
        self.active_connections: list[WebSocket] = []
    
    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)
    
    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)
    
    async def send_personal_message(self, message: str, websocket: WebSocket):
        await websocket.send_text(message)
    
    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

# 创建 WebSocket 连接管理器实例
manager = ConnectionManager()

# 工具调用模型
class ToolCall(BaseModel):
    tool_name: str
    params: Dict[str, Any]

# 工具调用响应模型
class ToolResponse(BaseModel):
    success: bool
    result: Optional[Any] = None
    error: Optional[str] = None

# 能力协商响应模型
class Capabilities(BaseModel):
    version: str
    supported_protocols: list[str]
    tools: list[str]

# 定义示例工具
def hello_world(name: str = "World"):
    """Hello World Tool,返回问候语"""
    return f"Hello, {name}!"

def add_numbers(a: float, b: float):
    """加法工具,返回两个数的和"""
    return a + b

def multiply_numbers(a: float, b: float):
    """乘法工具,返回两个数的积"""
    return a * b

# 注册示例工具
tool_registry.register_tool(
    name="hello_world",
    func=hello_world,
    description="Hello World Tool,返回问候语"
)
tool_registry.register_tool(
    name="add_numbers",
    func=add_numbers,
    description="加法工具,返回两个数的和"
)
tool_registry.register_tool(
    name="multiply_numbers",
    func=multiply_numbers,
    description="乘法工具,返回两个数的积"
)

# 根路径
@app.get("/")
async def root():
    return {"message": "MCP Server v2.0 is running"}

# 能力协商端点
@app.get("/api/v1/capabilities", response_model=Capabilities)
async def get_capabilities():
    return Capabilities(
        version="2.0",
        supported_protocols=["http", "websocket"],
        tools=list(tool_registry.tools.keys())
    )

# 工具调用端点
@app.post("/api/v1/tools/execute", response_model=ToolResponse)
async def execute_tool(tool_call: ToolCall):
    # 获取工具
    tool = tool_registry.get_tool(tool_call.tool_name)
    if not tool:
        return ToolResponse(success=False, error=f"Tool {tool_call.tool_name} not found")
    
    try:
        # 执行工具
        result = tool["func"](**tool_call.params)
        return ToolResponse(success=True, result=result)
    except Exception as e:
        return ToolResponse(success=False, error=str(e))

# WebSocket 端点
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            # 简单的 echo 功能,后续可以扩展为工具调用
            await manager.send_personal_message(f"Received: {data}", websocket)
    except WebSocketDisconnect:
        manager.disconnect(websocket)

# 运行服务器
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
3.5 运行和测试
3.5.1 运行 MCP Server

代码示例:运行 MCP Server

代码语言:javascript
复制
# 保存代码为 mcp_server.py
# 运行服务器
python mcp_server.py
3.5.2 测试能力协商

代码示例:测试能力协商

代码语言:javascript
复制
# 使用 curl 测试能力协商端点
curl http://localhost:8000/api/v1/capabilities

预期输出

代码语言:javascript
复制
{
  "version": "2.0",
  "supported_protocols": ["http", "websocket"],
  "tools": ["hello_world", "add_numbers", "multiply_numbers"]
}
3.5.3 测试工具调用

代码示例:测试 Hello World Tool

代码语言:javascript
复制
# 使用 curl 测试 hello_world 工具
curl -X POST -H "Content-Type: application/json" -d '{"tool_name": "hello_world", "params": {"name": "MCP"}}' http://localhost:8000/api/v1/tools/execute

预期输出

代码语言:javascript
复制
{
  "success": true,
  "result": "Hello, MCP!",
  "error": null
}

代码示例:测试 add_numbers 工具

代码语言:javascript
复制
# 使用 curl 测试 add_numbers 工具
curl -X POST -H "Content-Type: application/json" -d '{"tool_name": "add_numbers", "params": {"a": 10, "b": 20}}' http://localhost:8000/api/v1/tools/execute

预期输出

代码语言:javascript
复制
{
  "success": true,
  "result": 30.0,
  "error": null
}
3.5.4 测试 WebSocket 连接

代码示例:使用 wscat 测试 WebSocket 连接

代码语言:javascript
复制
# 安装 wscat
npm install -g wscat

# 连接 WebSocket 服务器
wscat -c ws://localhost:8000/ws

# 发送消息
> Hello MCP
< Received: Hello MCP
3.6 扩展路径

从最小实现到完整 MCP Server,需要添加以下高级特性:

  1. 安全认证:添加 API Key、JWT 或 OAuth2 认证
  2. 权限控制:实现基于角色的访问控制(RBAC)
  3. 工具元数据:添加更详细的工具描述和参数验证
  4. 异步工具执行:支持长时间运行的异步工具
  5. 结果缓存:添加结果缓存机制,提高性能
  6. 日志和监控:添加详细的日志记录和监控指标
  7. 错误处理:实现更完善的错误处理和重试机制
  8. 负载均衡:支持多实例部署和负载均衡
  9. 容器化部署:提供 Docker 镜像和 Docker Compose 配置
  10. CI/CD 集成:添加持续集成和持续部署配置

4. 与主流方案深度对比

4.1 最小实现 vs 完整实现

特性

最小实现

完整实现

代码量

约 150 行

约 1000+ 行

依赖数量

3 个

10+ 个

HTTP 支持

WebSocket 支持

基础支持

完整支持

工具注册

简单字典

完整的注册机制

认证授权

完整的认证授权

错误处理

基础错误处理

完善的错误处理

日志监控

完整的日志监控

异步支持

基础支持

完整的异步支持

部署复杂度

学习曲线

平缓

陡峭

4.2 Python 实现 vs Node.js 实现

特性

Python 实现

Node.js 实现

语言

Python

JavaScript/TypeScript

框架

FastAPI

Express/NestJS

性能

异步支持

原生支持

原生支持

WebSocket 支持

良好

优秀

生态系统

丰富

丰富

学习曲线

平缓

中等

部署便捷性

社区支持

活跃

活跃

4.3 MCP Server vs OpenAI API

特性

MCP Server

OpenAI API

协议标准

MCP v2.0

OpenAI Tools API

部署方式

本地部署

云端服务

自定义工具

支持

支持

安全性

可控

依赖第三方

成本

免费

按使用付费

可扩展性

有限

实时通信

支持

有限支持

多模型支持

支持

仅支持 OpenAI 模型

5. 实际工程意义、潜在风险与局限性分析

5.1 实际工程意义
  1. 快速原型开发:最小实现可以帮助开发者快速搭建 MCP Server 原型,验证产品概念和技术方案。
  2. 学习和教学:最小实现是学习 MCP Server 原理的绝佳案例,适合用于教学和培训。
  3. 微服务架构:最小实现可以作为微服务架构中的一个组件,与其他服务集成。
  4. 边缘计算:最小实现的轻量级特性使其适合部署在边缘设备上,实现边缘 AI 工具调用。
  5. 测试环境:最小实现可以作为测试环境,用于测试 MCP Client 和工具集成。
5.2 潜在风险
  1. 安全风险:最小实现缺乏完整的认证授权机制,在生产环境中使用可能导致安全漏洞。
  2. 性能瓶颈:最小实现的简单设计可能无法处理高并发请求,在高负载场景下可能出现性能问题。
  3. 功能缺失:最小实现缺少许多高级特性,如异步工具执行、结果缓存等,可能无法满足复杂场景的需求。
  4. 可维护性差:最小实现的代码结构简单,缺乏模块化设计,长期维护可能会变得困难。
  5. 兼容性问题:最小实现可能不完全符合 MCP v2.0 规范,与其他 MCP 实现可能存在兼容性问题。
5.3 局限性
  1. 单线程设计:最小实现使用单线程设计,无法充分利用多核 CPU。
  2. 内存管理:最小实现缺乏完善的内存管理机制,长时间运行可能导致内存泄漏。
  3. 错误恢复:最小实现缺乏错误恢复机制,在出现故障时可能无法自动恢复。
  4. 日志记录:最小实现缺乏详细的日志记录,难以调试和监控。
  5. 测试覆盖:最小实现缺乏完整的测试用例,可能存在未发现的 bug。

6. 未来趋势展望与个人前瞻性预测

6.1 未来趋势展望
  1. 标准化发展:MCP 协议将进一步标准化,出现更多官方实现和工具库。
  2. 多语言支持:除了 Python 和 Node.js,还将出现 Go、Rust 等语言的 MCP Server 实现。
  3. 云原生支持:MCP Server 将更好地支持云原生环境,包括 Kubernetes 部署和服务网格集成。
  4. AI 辅助开发:AI 工具将用于辅助 MCP Server 的开发,包括代码生成、测试和优化。
  5. 实时性增强:WebSocket 和 QUIC 协议将得到更广泛的应用,进一步增强 MCP Server 的实时通信能力。
6.2 个人前瞻性预测
  1. MCP Server 即服务:未来将出现 MCP Server 即服务平台,开发者可以直接使用托管的 MCP Server,无需自行部署和维护。
  2. 自动化工具注册:工具将能够自动注册到 MCP Server,无需手动配置。
  3. 智能负载均衡:MCP Server 将具备智能负载均衡能力,能够根据工具的资源需求和服务器负载自动分配请求。
  4. 边缘 MCP Server:随着边缘计算的发展,边缘 MCP Server 将成为重要的部署形态,实现低延迟的工具调用。
  5. 安全即默认:未来的 MCP Server 实现将默认包含完整的安全机制,包括认证、授权、加密和审计。

7. 附录

7.1 环境配置指南
7.1.1 Python 环境配置

下载并安装 Python 3.8+:https://www.python.org/downloads/

验证 Python 安装:

代码语言:javascript
复制
python --version

安装 pip:

代码语言:javascript
复制
python -m ensurepip --upgrade

验证 pip 安装:

代码语言:javascript
复制
pip --version
7.1.2 依赖包安装
代码语言:javascript
复制
# 创建并激活虚拟环境
python -m venv mcp-venv
source mcp-venv/bin/activate  # Linux/macOS
mcp-venv\Scripts\activate  # Windows

# 安装依赖
pip install fastapi uvicorn pydantic
7.1.3 代码编辑器推荐
  • Visual Studio Code:https://code.visualstudio.com/,推荐安装 Python 扩展
  • PyCharm:https://www.jetbrains.com/pycharm/,专业的 Python IDE
  • Sublime Text:https://www.sublimetext.com/,轻量级代码编辑器
7.2 测试工具使用
7.2.1 curl

curl 是一个命令行工具,用于发送 HTTP 请求。

安装

  • Linux:通常已预装
  • macOS:通常已预装
  • Windows:可以通过 Chocolatey 安装或从 https://curl.se/windows/ 下载

基本用法

代码语言:javascript
复制
# 发送 GET 请求
curl http://localhost:8000/api/v1/capabilities

# 发送 POST 请求
curl -X POST -H "Content-Type: application/json" -d '{"tool_name": "hello_world", "params": {"name": "MCP"}}' http://localhost:8000/api/v1/tools/execute
7.2.2 wscat

wscat 是一个命令行工具,用于测试 WebSocket 连接。

安装

代码语言:javascript
复制
npm install -g wscat

基本用法

代码语言:javascript
复制
# 连接 WebSocket 服务器
wscat -c ws://localhost:8000/ws

# 发送消息
> Hello MCP
< Received: Hello MCP
7.2.3 Postman

Postman 是一个图形化的 API 测试工具,支持 HTTP 和 WebSocket 测试。

下载:https://www.postman.com/downloads/

基本用法

  1. 创建一个新的 HTTP 请求
  2. 设置请求方法和 URL
  3. 添加请求头和请求体
  4. 发送请求并查看响应
7.3 扩展代码示例
7.3.1 添加 API Key 认证

代码示例:添加 API Key 认证

代码语言:javascript
复制
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import APIKeyHeader

# API Key 配置
API_KEY = "your-secret-api-key"
API_KEY_NAME = "X-API-Key"
api_key_header = APIKeyHeader(name=API_KEY_NAME, auto_error=False)

# 依赖函数,用于验证 API Key
async def get_api_key(api_key_header: str = Depends(api_key_header)):
    if api_key_header == API_KEY:
        return api_key_header
    else:
        raise HTTPException(
            status_code=401,
            detail="Invalid or missing API Key",
            headers={"WWW-Authenticate": API_KEY_NAME},
        )

# 在端点中使用 API Key 认证
@app.post("/api/v1/tools/execute", response_model=ToolResponse)
async def execute_tool(tool_call: ToolCall, api_key: str = Depends(get_api_key)):
    # 工具调用逻辑...
7.3.2 添加工具参数验证

代码示例:添加工具参数验证

代码语言:javascript
复制
from pydantic import BaseModel, Field

# 定义工具参数模型
class HelloWorldParams(BaseModel):
    name: str = Field(..., min_length=1, max_length=100, description="Name to greet")

# 更新工具实现
def hello_world(params: HelloWorldParams):
    """Hello World Tool,返回问候语"""
    return f"Hello, {params.name}!"

# 更新 Tool 注册表,支持参数验证
def validate_params(tool_name: str, params: dict):
    """验证工具参数"""
    param_models = {
        "hello_world": HelloWorldParams
    }
    
    if tool_name in param_models:
        return param_models[tool_name](**params)
    return params

# 更新工具调用端点
@app.post("/api/v1/tools/execute", response_model=ToolResponse)
async def execute_tool(tool_call: ToolCall):
    # 获取工具
    tool = tool_registry.get_tool(tool_call.tool_name)
    if not tool:
        return ToolResponse(success=False, error=f"Tool {tool_call.tool_name} not found")
    
    try:
        # 验证参数
        validated_params = validate_params(tool_call.tool_name, tool_call.params)
        # 执行工具
        result = tool["func"](validated_params)
        return ToolResponse(success=True, result=result)
    except Exception as e:
        return ToolResponse(success=False, error=str(e))
7.4 常见问题与解决方案
7.4.1 端口被占用

问题:运行 MCP Server 时出现 “Address already in use” 错误。

解决方案

查找占用端口的进程:

代码语言:javascript
复制
# Linux/macOS
lsof -i :8000
# Windows
netstat -ano | findstr :8000

终止占用端口的进程:

代码语言:javascript
复制
# Linux/macOS
kill -9 <PID>
# Windows
taskkill /PID <PID> /F

或者修改 MCP Server 的端口:

代码语言:javascript
复制
uvicorn.run(app, host="0.0.0.0", port=8001)
7.4.2 依赖安装失败

问题:安装依赖时出现错误。

解决方案

确保 pip 已更新:

代码语言:javascript
复制
pip install --upgrade pip

尝试使用国内镜像源:

代码语言:javascript
复制
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fastapi uvicorn pydantic

检查网络连接是否正常。

7.4.3 工具调用返回错误

问题:调用工具时返回错误信息。

解决方案

  1. 检查工具名称是否正确。
  2. 检查参数格式是否正确。
  3. 检查工具实现是否有 bug。
  4. 查看 MCP Server 的日志,获取详细错误信息。

参考链接:

附录(Appendix):

  • 环境配置指南:详细的 Python 环境配置和依赖安装步骤。
  • 测试工具使用:curl、wscat 和 Postman 等测试工具的使用方法。
  • 扩展代码示例:添加 API Key 认证和工具参数验证的代码示例。
  • 常见问题与解决方案:运行 MCP Server 时可能遇到的问题及解决方案。

关键词: MCP Server, 最小实现, Hello MCP, FastAPI, WebSocket, Python, AI 工具协议

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景动机与当前热点
    • 1.1 MCP Server 的重要性
    • 1.2 为什么需要最小实现
    • 1.3 当前热点趋势
  • 2. 核心更新亮点与新要素
    • 2.1 新要素一:最小化 MCP Server 架构
    • 2.2 新要素二:完整的环境搭建指南
    • 2.3 新要素三:Hello World Tool 实现
  • 3. 技术深度拆解与实现分析
    • 3.1 MCP Server 最小实现架构
      • 3.1.1 架构概述
      • 3.1.2 Mermaid 架构图
    • 3.2 环境搭建
      • 3.2.1 安装 Python
      • 3.2.2 创建虚拟环境
      • 3.2.3 安装依赖
    • 3.3 核心代码实现
      • 3.3.1 基本结构
      • 3.3.2 代码分析
    • 3.4 Hello World Tool 实现
      • 3.4.1 定义和注册 Hello World Tool
      • 3.4.2 完整的最小实现代码
    • 3.5 运行和测试
      • 3.5.1 运行 MCP Server
      • 3.5.2 测试能力协商
      • 3.5.3 测试工具调用
      • 3.5.4 测试 WebSocket 连接
    • 3.6 扩展路径
  • 4. 与主流方案深度对比
    • 4.1 最小实现 vs 完整实现
    • 4.2 Python 实现 vs Node.js 实现
    • 4.3 MCP Server vs OpenAI API
  • 5. 实际工程意义、潜在风险与局限性分析
    • 5.1 实际工程意义
    • 5.2 潜在风险
    • 5.3 局限性
  • 6. 未来趋势展望与个人前瞻性预测
    • 6.1 未来趋势展望
    • 6.2 个人前瞻性预测
  • 7. 附录
    • 7.1 环境配置指南
      • 7.1.1 Python 环境配置
      • 7.1.2 依赖包安装
      • 7.1.3 代码编辑器推荐
    • 7.2 测试工具使用
      • 7.2.1 curl
      • 7.2.2 wscat
      • 7.2.3 Postman
    • 7.3 扩展代码示例
      • 7.3.1 添加 API Key 认证
      • 7.3.2 添加工具参数验证
    • 7.4 常见问题与解决方案
      • 7.4.1 端口被占用
      • 7.4.2 依赖安装失败
      • 7.4.3 工具调用返回错误
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档