人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)
目前,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_calltool_name = mcp_request.get("tool_call", {}).get("name") // 获取调用的工具名称 tool_call.name,即上json的get_weatherparams = 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!!!