当前位置: 首页 > news >正文

人工智能-基础篇-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!!!

http://www.xdnf.cn/news/1100053.html

相关文章:

  • 大数据学习7:Azkaban调度器
  • 《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
  • Three.js+Shader实现三维波动粒子幕特效
  • 量子计算系统软件:让“脆弱”的量子计算机真正可用
  • DDL期间TDSQL异常会话查询造成数据库主备切换
  • 【NLP入门系列六】Word2Vec模型简介,与以《人民的名义》小说原文实践
  • 如何利用个人电脑搭建数据库服务器实现远程协作
  • RabbitMQ用法的6种核心模式全面解析
  • 零基础入门物联网-远程门禁开关:云平台创建
  • 自动驾驶控制系统
  • 李宏毅(深度学习)--(2)
  • 【TCP/IP】10. 引导协议与动态主机配置协议
  • 查看uniapp 项目中没有用到依赖
  • mx6ull-裸机学习实验15——RTC 实时时钟实验
  • 【养老机器人】核心技术
  • 栈题解——有效的括号【LeetCode】两种方法
  • LangChain框架 Prompts、Agents 应用
  • Git 学习笔记
  • OpenAI正准备推出一款搭载人工智能功能的网络浏览器,试图直接挑战Alphabet旗下
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (二) RISC-V架构深度解剖(上)
  • 链表算法之【合并两个有序链表】
  • 【算法笔记 day three】滑动窗口(其他类型)
  • STM32第十九天 ESP8266-01S和电脑实现串口通信(2)
  • leetcode 3440. 重新安排会议得到最多空余时间 II 中等
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | DoubleVerticalSlider(双垂直滑块)
  • idea如何打开extract surround
  • (C++)任务管理系统(文件存储)(正式版)(迭代器)(list列表基础教程)(STL基础知识)
  • 自动化脚本配置网络IP、主机名、网段
  • Python正则表达式实战指南
  • k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper