news 2026/5/26 4:50:50

AI学习:什么是MCP,写第一个MCP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI学习:什么是MCP,写第一个MCP

什么是MCP?

MCP(Model Context Protocol)是一个开放的协议标准,用于连接AI助手(如Claude、GPT等)与外部工具和数据源。它定义了一套标准化的通信方式,让AI助手能够安全、可靠地调用外部服务。

MCP的核心概念

1. 客户端-服务器架构

  • 客户端:AI助手(如Claude Desktop、VS Code插件等)
  • 服务器:提供工具和资源的外部服务
  • 通信方式:通过标准输入输出进行JSON-RPC 2.0协议通信

2. 传输协议

  • 使用JSON-RPC 2.0作为通信协议
  • 通过stdin/stdout进行数据传输
  • 每行一个JSON对象,以换行符分隔

MCP基本语法规范

1. 初始化请求initialize

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"clientInfo":{"name":"Claude Desktop","version":"1.0.0"}}}

2. 工具列表请求tools/list

{"jsonrpc":"2.0","id":2,"method":"tools/list"}

3. 工具调用请求tools/call

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"calculate","arguments":{"expression":"2+3*4"}}}

4. 响应格式

{"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":"计算结果:14"}]}}

MCP服务器实现要点

1. 必需的方法

  • initialize:服务器初始化
  • tools/list:返回可用工具列表
  • tools/call:执行具体的工具调用

2. 工具定义结构

{"name":"工具名称","description":"工具描述","inputSchema":{"type":"object","properties":{"参数名":{"type":"参数类型","description":"参数描述"}},"required":["必需参数列表"]}}

3. 错误处理

{"jsonrpc":"2.0","id":请求ID,"error":{"code":错误代码,"message":"错误描述"}}

MCP服务器例子

#!/usr/bin/env python3 #-*-coding:utf-8-*-""" 简单的MCP服务器示例 提供基本的计算工具"""importjsonimportsysfromtypingimportDict,Any,List,OptionalclassSimpleMCPServer:"""简单的MCP服务器实现"""def__init__(self):self.tools={"calculate":{"name":"calculate","description":"执行简单的数学计算","inputSchema":{"type":"object","properties":{"expression":{"type":"string","description":"要计算的数学表达式,如 '2+3*4'"}},"required":["expression"]}},}defhandle_request(self,request:Dict[str,Any])->Dict[str,Any]:"""处理MCP请求"""method=request.get("method")ifmethod=="initialize":returnself._handle_initialize(request)elif method=="tools/list":returnself._handle_tools_list(request)elif method=="tools/call":returnself._handle_tools_call(request)else:return{"jsonrpc":"2.0","id":self._get_request_id(request),"error":{"code":-32601,"message":f"未知方法: {method}"}}def_handle_initialize(self,request:Dict[str,Any])->Dict[str,Any]:"""处理初始化请求"""return{"jsonrpc":"2.0","id":self._get_request_id(request),"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"SimpleMCPServer","version":"1.0.0"}}}def_handle_tools_list(self,request:Dict[str,Any])->Dict[str,Any]:"""处理工具列表请求"""return{"jsonrpc":"2.0","id":self._get_request_id(request),"result":{"tools":list(self.tools.values())}}def_handle_tools_call(self,request:Dict[str,Any])->Dict[str,Any]:"""处理工具调用请求"""params=request.get("params",{})tool_name=params.get("name")arguments=params.get("arguments",{})try:iftool_name=="calculate":result=self._calculate(arguments.get("expression",""))else:return{"jsonrpc":"2.0","id":self._get_request_id(request),"error":{"code":-32601,"message":f"未知工具: {tool_name}"}}return{"jsonrpc":"2.0","id":self._get_request_id(request),"result":{"content":[{"type":"text","text":json.dumps(result,ensure_ascii=False,indent=2)}]}}except Exceptionase:return{"jsonrpc":"2.0","id":self._get_request_id(request),"error":{"code":-32603,"message":f"工具执行错误: {str(e)}"}}def_calculate(self,expression:str)->Dict[str,Any]:"""执行数学计算"""try:# 安全的数学表达式计算 allowed_chars=set("0123456789+-*/.() ")ifnotall(cinallowed_charsforcinexpression):raiseValueError("表达式包含不允许的字符")result=eval(expression)return{"expression":expression,"result":result,"type":"number"}except Exceptionase:raiseValueError(f"计算错误: {str(e)}")def_get_request_id(self,request:Dict[str,Any])->Any:"""获取请求ID,如果请求中没有ID则返回默认ID"""if"id"inrequest:returnrequest["id"]else:# 如果请求中没有id,返回一个默认的字符串IDreturn"default-id"defrun(self):"""运行MCP服务器"""print("Simple MCP Server 启动中...",file=sys.stderr)try:forlineinsys.stdin:line=line.strip()ifnot line:continuetry:request=json.loads(line)response=self.handle_request(request)print(json.dumps(response,ensure_ascii=True))sys.stdout.flush()except json.JSONDecodeError:error_response={"jsonrpc":"2.0","id":"default-id","error":{"code":-32700,"message":"解析错误"}}print(json.dumps(error_response,ensure_ascii=False))sys.stdout.flush()except KeyboardInterrupt:print("服务器关闭",file=sys.stderr)if__name__=="__main__":server=SimpleMCPServer()server.run()

简单计算器MCP服务器

本项目中的simple_mcp_server.py是一个完整的MCP服务器示例,包含:

  1. 数学计算工具:执行基本数学表达式
  2. 文本统计工具:分析文本的字符、单词等统计信息
  3. 系统信息工具:获取Python和系统基本信息

可以通过以下方式测试:

# 启动服务器python simple_mcp_server.py# 在另一个终端测试echo'{"jsonrpc":"2.0","id":1,"method":"tools/list"}'|python simple_mcp_server.py

真实cursor上加配置调用即可
{“mcpServers”:{“my-server”:{“command”:“python”,“args”:[“D:/sase-dfx/sase_dfx/9、ai生成/simple_mcp_server.py”],“disabled”:false,“alwaysAllow”:[“calculate”]}}}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 4:32:34

Java代码

int low 1, high L.length, mid; // 定义查找区间的上下界和中间位置while (low < high){mid (low high) / 2; // 计算中间位置if (L.r[mid].key key){return mid; // 找到目标&#xff0c;返回位置}else if (L.r[mid].key < key){low mid 1; // 目标在右半区间&a…

作者头像 李华
网站建设 2026/5/23 18:08:25

零基础学Arduino UNO下载:从电脑到开发板的连接详解

从零开始搞定 Arduino UNO 下载&#xff1a;手把手教你把代码“烧”进开发板 你是不是也经历过这样的场景&#xff1f; 刚买回一块 Arduino UNO&#xff0c;兴冲冲地插上 USB 线&#xff0c;打开 IDE 写好第一个“LED 闪烁”程序&#xff0c;点击“上传”——结果弹出一串红色…

作者头像 李华
网站建设 2026/5/24 20:59:11

终极指南:如何永久禁用Windows Defender并完全掌控系统安全

终极指南&#xff1a;如何永久禁用Windows Defender并完全掌控系统安全 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …

作者头像 李华
网站建设 2026/5/25 15:29:13

什么是智能巡检?有何作用与价值

智能巡检系统并非简单的“人工替代”&#xff0c;而是一个基于物联网架构、多源数据融合与人工智能分析的技术体系。其核心是通过构建“感知层-边缘层-平台层”三级架构&#xff0c;实现对工业设备状态从离散点检到连续监测、从阈值告警到趋势预测、从人工判断到算法决策的全面…

作者头像 李华
网站建设 2026/5/26 3:55:02

Keil5代码自动补全设置详解:全面讲解配置步骤

Keil5代码自动补全实战指南&#xff1a;让嵌入式开发像写Python一样丝滑你有没有过这样的经历&#xff1f;在调试STM32的UART时&#xff0c;手敲huart2.Instance->CR却拼成了CCR&#xff0c;编译报错查了半小时才发现是寄存器名字记混了&#xff1b;或者想调用HAL_GPIO_Togg…

作者头像 李华
网站建设 2026/5/24 5:14:11

从零开始配置ESP32开发环境的手把手教程

手把手教你从零搭建 ESP32 开发环境&#xff1a;新手避坑指南 你是不是也曾在尝试点亮一块 ESP32 开发板时&#xff0c;被驱动装不上、串口找不到、烧录失败等问题搞得焦头烂额&#xff1f;别担心&#xff0c;这几乎是每个嵌入式开发者都会经历的“入门仪式”。 今天&#xff…

作者头像 李华