一文带大家了解关于MCP 的完整 Hello World 示例

本文默认读者已经了解了MCP概念,不了解MCP概念的同学可以参考文章:

一文读懂大模型中的MCP协议到底是啥东东-CSDN博客

以下是一个基于 Model Context Protocol (MCP) 的完整 Hello World 示例,包含服务端和客户端代码,展示最基本的工具注册与调用流程:

一、MCP服务端(Server)

# mcp_server.py
from jsonrpcserver import method, Success, Result, serve

# 注册一个最简单的MCP工具:返回"Hello World"
@method
def hello_world(context: dict) -> Result:
    """MCP工具:返回Hello World"""
    # 实际业务逻辑(此处仅返回字符串)
    return Success({"message": "Hello, MCP World!"})

if __name__ == "__main__":
    # 启动MCP服务端(端口5000)
    print("MCP服务端已启动,监听端口 5000...")
    serve(port=5000, methods=[hello_world])

二、MCP客户端(Client)

# mcp_client.py
import requests

def call_mcp_hello():
    # 构建符合JSON-RPC 2.0标准的请求体
    payload = {
        "jsonrpc": "2.0",
        "method": "hello_world",  # 调用注册的工具名
        "params": {
            "context": {"user": "demo"}  # 安全上下文(示例)
        },
        "id": 1
    }

    # 发送请求到MCP服务端
    response = requests.post(
        "http://localhost:5000",
        json=payload,
        headers={"Content-Type": "application/json"}
    ).json()

    # 解析响应
    if "result" in response:
        return response["result"]["message"]
    else:
        return f"错误: {response['error']['message']}"

if __name__ == "__main__":
    result = call_mcp_hello()
    print("MCP服务端响应:", result)

三、运行流程

  1. 安装依赖(需Python 3.7+):

    pip install jsonrpcserver requests
  2. 启动服务端

    python mcp_server.py
    # 输出:MCP服务端已启动,监听端口 5000...
  3. 运行客户端

    python mcp_client.py
    # 输出:MCP服务端响应: Hello, MCP World!

四、关键代码解析

  1. 服务端核心逻辑

    • 使用 @method 装饰器注册工具方法 hello_world

    • 返回结构必须符合MCP标准:Success({"key": value})

    • 自动处理协议层细节(序列化/反序列化)

  2. 客户端核心逻辑

    • 请求体严格遵循JSON-RPC 2.0格式:

      {
        "jsonrpc": "2.0",
        "method": "方法名",
        "params": {"context": {}, ...},
        "id": 请求ID
      }
    • 响应体自动解析:

      {
        "jsonrpc": "2.0",
        "result": {"message": "Hello, MCP World!"},
        "id": 1
      }
  3. 协议扩展性

    • 新增工具只需在服务端添加新的 @method 方法

    • 客户端调用时只需修改 method 名称和参数

五、高级特性扩展

若需实现 动态工具发现,可添加以下代码:

# 在服务端添加工具元数据
@method
def list_tools() -> Result:
    return Success({
        "tools": [{
            "name": "hello_world",
            "description": "返回欢迎信息",
            "params": {}  # 无输入参数
        }]
    })

# 客户端查询可用工具
def discover_tools():
    response = requests.post(
        "http://localhost:5000",
        json={"jsonrpc": "2.0", "method": "list_tools", "id": 2}
    ).json()
    print("可用工具:", response["result"]["tools"])

运行后输出:

可用工具: [{'name': 'hello_world', 'description': '返回欢迎信息', 'params': {}}]

六、协议交互流程

sequenceDiagram
    participant Client as MCP客户端
    participant Server as MCP服务端

    Client->>Server: JSON-RPC请求
    Note over Server: 解析请求<br/>执行hello_world方法
    Server->>Client: JSON-RPC响应

七、示例场景:通过MCP实现AI模型调用数据库查询工具

# ---------- MCP 服务端 (Server) ----------
from jsonrpcserver import method, serve
import sqlite3

# 注册MCP工具:SQLite数据库查询
@method
def query_database(context: dict, sql: str) -> dict:
    """MCP协议标准工具接口:输入SQL语句,返回查询结果"""
    try:
        # 权限验证(示例)
        if not context.get("auth_token") == "SECRET_123":
            return {"error": "Permission denied"}
        
        # 连接数据库并执行查询
        conn = sqlite3.connect('demo.db')
        cursor = conn.cursor()
        cursor.execute(sql)
        results = cursor.fetchall()
        conn.close()
        
        # 返回MCP标准格式
        return {
            "status": "success",
            "data": results
        }
    except Exception as e:
        return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    # 启动MCP服务端(端口5000)
    serve(port=5000, methods=[query_database])

# ---------- MCP 客户端 (Client) ----------
import requests

def mcp_client_call(sql_query: str) -> str:
    """通过MCP协议调用数据库工具"""
    # 构建JSON-RPC 2.0请求
    payload = {
        "jsonrpc": "2.0",
        "method": "query_database",
        "params": {
            "context": {"auth_token": "SECRET_123"},  # 安全上下文
            "sql": sql_query
        },
        "id": 1
    }
    
    # 发送请求到MCP服务端
    response = requests.post(
        "http://localhost:5000",
        json=payload,
        headers={"Content-Type": "application/json"}
    ).json()
    
    # 处理响应
    if "error" in response:
        return f"Error: {response['error']}"
    else:
        return response["result"]

# ---------- AI模型调用示例 ----------
# 用户提问:"显示最近3个月的订单数据"
# AI模型生成SQL并通过MCP调用工具
sql = "SELECT * FROM orders WHERE order_date >= DATE('now','-3 month')"
result = mcp_client_call(sql)
print("MCP查询结果:", result)

关键代码解析

  1. 服务端工具注册

    • 使用@method装饰器定义query_database方法,符合MCP的Tools规范

    • 内置权限验证(auth_token),体现MCP的安全控制

    • 返回结构遵循{status: "success"/"error", data: [...]}标准格式

  2. 客户端协议调用

    • 请求格式严格遵循JSON-RPC 2.0标准,包含methodparams字段

    • context参数传递安全凭证,支持细粒度权限管理

    • 通过HTTP协议与MCP服务端通信,支持跨网络调用

  3. AI模型集成

    • 模型只需生成标准化SQL语句,无需关心具体数据库连接细节

    • 通过MCP实现自然语言→工具调用→结构化数据的完整链路

以上,通过此示例,开发者可以快速理解MCP协议的核心交互模式,后续只需替换工具逻辑即可扩展复杂功能(如数据库操作、API调用等)。

### 关于MCP4728的控制机制 对于MCP4728设备而言,其输出并非仅通过向寄存器写入数值即可实现精确调整。为了使设置生效,需配合外部LDAC引脚或是利用软件中的UDAC位来触发DAC更新操作[^1]。 针对所提到的不同类型的MCP(既可以指代多芯片封装也可以是指多通道处理器),具体示例取决于实际应用场景和技术需求: #### 多芯片封装(Multi-Chip Package, MCP) 当提及作为硬件集成方案之一的多芯片封装时,通常涉及的是将多个独立功能模块整合到单一物理包中以减少空间占用并提高性能效率的情况。这类技术常见于存储卡、移动通信等领域,在这些场合下,“MCP”的概念更多体现在物理结构层面而非编程接口上;因此,寻找具体的代码示例外可能不如查阅制造商提供的应用笔记或数据手册那样直接有效。 #### 多通道处理器(Multi-Channel Processor) 如果关注点在于具备处理来自不同源输入信号能力的电子元件,则涉及到如何配置各个通道参数以及协调它们之间的工作流程等问题。例如,在音频处理领域可能会遇到需要同步管理四个立体声音轨的情形。此时可以通过I²C总线等方式与像MCP4728这样的器件交互,从而完成对各路模拟电压水平的精准调控。 ```python import smbus def set_dac_value(bus, address, channel, value): """Set the DAC output voltage on a specific channel.""" command_byte = (channel << 4) | 0b0000_0011 # Selecting single write mode and target channel data_bytes = [(value >> 4) & 0xFF, (value << 4) & 0xF0] bus.write_i2c_block_data(address, command_byte, data_bytes) udac_command = 0x04 # Software update UDAC bit to apply changes immediately. bus.write_byte(address, udac_command) # Example usage with I2C communication over SMBus library in Python i2cbus = smbus.SMBus(1) # Use /dev/i2c-1 for Raspberry Pi dac_address = 0x60 # Default I2C address of MCP4728 set_dac_value(i2cbus, dac_address, 0, int(2.5/5*4096)) # Set VoutA to half supply voltage ``` 上述Python代码片段展示了怎样借助SMBus库经由I²C协议发送指令给MCP4728型数模转换器,并指定某一特定信道上的期望输出电平值。值得注意的是,这段演示主要围绕着后者即多通道处理器的概念展开讨论。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试开发Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值