人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)

发布于:2025-07-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

目前,MCP(Model Context Protocol)协议并不是一个广泛标准化或公开开源的协议标准。不过,在某些AI工具链和LLM开发框架中,确实出现了以“MCP”命名的内部通信机制,尤其是在与语言模型代理(LLM Agent)和工具调用接口相关的系统中。

假设场景:
MCP是用于Agent与外部工具之间交互的协议。

其核心目标是:
1、标准化请求/响应格式
2、支持多轮对话上下文
3、支持工具调用(tool call)
4、可扩展性强

1、定义MCP消息结构(JSON格式)

json示例:

{
  "protocol": "MCP",       // 表示使用的协议是MCP(Model Calling Protocol)
  "version": "1.0",        // 当前使用的MCP版本为1.0	       
  "request_id": "abc123",  // 请求的唯一标识符,便于后续追踪和关联请求/响应。
  "timestamp": 1720000000,  // 时间戳,表示请求发送的时间(单位:秒)
  "context": {          // 会话上下文信息
    "conversation_id": "conv_987654",  // 会话唯一ID,用来标识一次会话流程
    "history": [         // 会话历史记录
      {"role": "user", "content": "查询北京天气"},
      {"role": "assistant", "content": "正在为您查询..."}
    ]
  },
  "tool_call": {            // 这是一个工具调用请求
    "name": "get_weather",  // 要调用的工具名称,这里是get_weather,表示“获取天气”
    "parameters": {         // 工具所需的参数
      "location": "北京"    // 参数为北京,即查询北京的天气
    }
  }
}

整个JSON的作用是:
在一次编号为conv_987654的对话中,模型识别到用户想要查询北京天气,于是大模型生成了一个名为get_weather的工具调用请求,并附带了参数location: 北京,以便外部系统执行该操作并返回结果。

这体现了MCP的核心思想:模型作为智能中枢,通过标准协议调用外部工具来扩展能力。

2、Python客户端(发送MCP请求)

以下脚本模拟一个客户端角色,构造并发送一个符合MCP v1.0协议的JSON请求体,并对本地运行http://localhost:8080的服务端发送一个POST请求,然后打印出接收到的响应。

python示例:

import json    // 用于构建和解析JSON数据
import requests    // 发送HTTP请求(如POST)
import time      // 获取当前时间戳

# 构建 MCP 请求
mcp_request = {    // 构建一个请求的json,类似上面JSON的介绍
    "protocol": "MCP",
    "version": "1.0",
    "request_id": "req_001",
    "timestamp": int(time.time()),
    "context": {
        "conversation_id": "conv_123",
        "history": [
            {"role": "user", "content": "查询北京天气"},
            {"role": "assistant", "content": "正在为您查询..."}
        ]
    },
    "tool_call": {
        "name": "get_weather",
        "parameters": {
            "location": "北京"
        }
    }
}

# 发送请求到MCP服务端
url = "http://localhost:8080"    // 请求地址
headers = {'Content-Type': 'application/json'}   // 请求参数格式
// 向http://localhost:8080服务端发送POST请求,参数mcp_request和请求头headers
response = requests.post(url, data=json.dumps(mcp_request), headers=headers)

# 打印响应
print("MCP Response:")
print(json.dumps(response.json(), indent=2))   // 打印服务端的响应

注意:
在运行这个客户端脚本前,请确保你已经运行了前面那个服务端程序(监听在8080端口),否则会报错连接失败。

3、Python服务端(接收MCP请求并处理)

以下代码实现了一个简单的HTTP服务端(Server),接收并处理符合MCP(Model Calling Protocol)v1.0协议的请求。模拟了模型调用工具(如get_weather)的过程,并返回结构化的响应。

python示例:

import json      // 导入模块,用于JSON数据的解析和构造
from http.server import BaseHTTPRequestHandler, HTTPServer  // 导入模块,用于HTTP请求

class MCPRequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):     // 定义post请求处理方法
        content_length = int(self.headers['Content-Length'])  // 从请求头中读取数据长度
        post_data = self.rfile.read(content_length)  // 从输入流中读取原始数据
        mcp_request = json.loads(post_data)  // 将其解析为 Python 字典对象

        print("Received MCP Request:")    // 原样打印字符串
        print(json.dumps(mcp_request, indent=2))  // 打印mcp请求参数

        # 解析 tool_call
        tool_name = mcp_request.get("tool_call", {}).get("name")  // 获取调用的工具名称 tool_call.name,即上json的get_weather
        params = mcp_request.get("tool_call", {}).get("parameters", {})  // 获取调用所需的参数 tool_call.parameters ,"location": "北京"

        # 模拟调用get_weather工具
        if tool_name == "get_weather":  // 如果调用是get_weather,则模拟调用
            location = params.get("location")  // 获取参数,北京,模拟调用
            response_content = f"北京当前天气为晴朗,气温25°C。"  // 模拟得到响应

        else:
            response_content = "未知工具调用。"  // 否则返回“未知工具”提示

        # 构造MCP响应
        mcp_response = {   // 构造一个标准的MCP响应JSON
            "protocol": "MCP",  // 协议
            "version": "1.0",   // 版本
            "request_id": mcp_request["request_id"],  // 请求id和入参要一致
            "timestamp": 1720000001,    // 时间戳
            "response": {    // 响应
                "content": response_content,  // 调用得到的内容
                "status": "success"       // 调用状态,成功
            }
        }

        self.send_response(200)     // 设置HTTP状态码为200(OK)
        self.send_header('Content-type', 'application/json')  //设置响应头为JSON类型
        self.end_headers()
        self.wfile.write(json.dumps(mcp_response).encode())  // 发送响应内容

if __name__ == "__main__":   // main方法
    server_address = ('', 8080)   // 创建HTTP服务器实例,监听8080端口
    httpd = HTTPServer(server_address, MCPRequestHandler)
    print("Starting MCP Server on port 8080...")
    httpd.serve_forever()   // 启动服务器并持续运行

解释下:
可以使用如上客户端代码示例创建json体并发送请求示例。也可以直接使用curl或Postman发送POST请求到http://localhost:8080,如下:
示例:

curl -X POST http://localhost:8080 \
     -H "Content-Type: application/json" \
     -d '{
           "protocol": "MCP",
           "version": "1.0",
           "request_id": "abc123",
           "timestamp": 1720000000,
           "context": {
             "conversation_id": "conv_987654",
             "history": [
               {"role": "user", "content": "查询北京天气"},
               {"role": "assistant", "content": "正在为您查询..."}
             ]
           },
           "tool_call": {
             "name": "get_weather",
             "parameters": {
               "location": "北京"
             }
           }
         }'

服务端会接收你的请求进行处理,并返回类似如下响应。
json示例:

{
  "protocol": "MCP",
  "version": "1.0",
  "request_id": "abc123",
  "timestamp": 1720000001,
  "response": {
    "content": "北京当前天气为晴朗,气温25°C。",
    "status": "success"
  }
}

4、总结

尽管目前没有统一的“官方”MCP协议,但在实际开发中,这种轻量级上下文交换协议非常实用,尤其适用于:

  • LLM Agent与插件之间的通信
  • 多模型协作时的状态同步
  • 内部服务间的标准化接口
  • 支持多轮对话与上下文保持

向阳而生,Dare To Be!!!


网站公告

今日签到

点亮在社区的每一天
去签到