掘金 人工智能 07月30日 12:16
一文入门 MCP(Model Context Protocol)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

Model Context Protocol (MCP) 是一种约定的中间协议层,旨在统一AI模型与各种数据源、工具及功能之间的连接方式,类似于USB-C接口的通用性。它通过定义MCP Host(客户端)、MCP Client(中转站)和MCP Server(工具)三方交互的规范,实现了AI模型能够自动化地调用和整合外部资源,从而提高AI工作的效率和准确性,减少人工干预。MCP的出现是为了解决AI在处理复杂任务时需要人工提取信息、纠错的低效流程,最终目标是让AI能够更自主地执行更广泛的任务,推动AI应用的开发和集成标准化。

🔹 **MCP的核心作用与目标**:MCP是一个约定好的协议,旨在充当AI模型与外部数据源、工具和功能之间的中间协议层,实现它们之间的一致性连接。其目标是简化AI应用程序的开发和集成,使AI能够直接调用其原本无法访问或理解的资源,从而提高AI工作的效率和准确性。

🔹 **三方架构与职责划分**:MCP协议定义了MCP Host(用户客户端)、MCP Client(中转站)和MCP Server(待扩展的工具)三方。MCP Host负责理解用户意图并决定调用哪些工具;MCP Client作为中转站,将Host的指令转换为标准协议并管理通信细节;MCP Server则负责实际执行数据查询或API调用等具体操作,它包含Resources(资源)、Tools(工具)和Prompts(提示)三大功能模块。

🔹 **通信协议与数据格式**:MCP Client与MCP Server之间的通信遵循JSON-RPC协议,这是一种定义了请求和响应对象数据规范的标准。数据格式主要包括请求对象(包含jsonrpc、method、params、id)和响应对象(包含jsonrpc、result或error、id)。MCP Host(模型)与MCP Client之间的通信则涉及系统设定、用户输入、AI响应以及工具回调等四种信息类型,其中工具回调是关键。

🔹 **MCP Server的最小实现**:开发一个MCP Server相对独立且现实,其核心功能在于定义Resources(如文件内容)、Tools(LLM可调用的函数)和Prompts(预编写的任务模板)。通过使用如@modelcontextprotocol/sdk等库,可以方便地创建和注册这些功能,实现与AI模型的交互,例如示例代码展示了如何定义一个简单的加法工具和一个问候语资源。

🔹 **MCP Client的数据接收与处理**:MCP Client负责接收并处理来自MCP Server的数据,包括列出所有可用的提示(Prompts)、调用指定提示并获取结果、列出所有资源(Resources)以及读取特定资源的内容。这些操作通过调用MCP实例的方法来实现,如listPrompts、getPrompt、listResources和readResource等,从而将外部工具的功能整合到AI的工作流程中。

你是谁?

Model Context Protocol

一个约定好的协议。使得开发者能够以一致的方式将各种数据源、工具和功能连接到 AI 模型(一个中间协议层),就像 USB-C 让不同设备能够通过相同的接口连接一样。

而约定的三方分别是:

组件餐厅类比技术职责
用户顾客提出自然语言请求(如"查订单123的物流")
MCP Host服务员+厨师1. 理解用户意图 2. 决定需要调用哪些工具 3. 整合结果生成自然响应
MCP Client传菜员1. 将Host的指令转为标准协议 2. 管理连接/重试等通信细节
MCP Server厨房设备实际执行数据查询/API调用等具体操作

这三者通过约定好的协议,协调工作

从哪里来?

本质来源于人们懒地 Ctrl C V ,而前置雏形则是prompt engineering(提示词)提示词MCP的目的就是让AI更高效更准确地来工作

假如没有MCP,在使用AI的过程中,必然需要人工提取关键信息,然后提供。从提出问题到解答变成了多个步骤:

    提出问题AI思考并给出初步答案人工纠错或提供更多信息AI再思考最终给出准确答案

最关键纠错和提供信息的过程可能会持续好几个回合而当MCP出现之后,AI会自动取寻找相关的信息,并自己去获取错误,然后再思考。分步操作瞬间变成了自动化操作

要去往何方

与AI相关的技术,最终目的只有一个:让AI代替人所以MCP 的目标是创建一个通用标准,使 AI 应用程序的开发和集成变得更加简单和统一,让 AI 能直接调用那些它本不能调用或模糊理解的东西

如何实现的

MCP其实可以理解为协商过后定义下来的数据格式,来看一个问题到解答的流程图:根据这张图,我们可以拆解出几个关键的地方:

MCP Client 与 MCP Server 之间

clientserver 两者之间有个明确的数据格式:JSON-RPC所以同情本质为 HTTP content-type = json-rpc

JSON-RPC规定了具体的数据规范,比如:

请求对象(Request Object)

字段名类型是否必须说明
jsonrpcString必须协议版本,必须为"2.0"
methodString必须调用的方法名,禁止以rpc.开头
paramsArray / Object可选方法参数,可省略
idString / Number / null可选请求标识符。若省略则为通知(无响应);建议不为null且数字为整数

响应对象(Response Object)

字段名类型是否必须说明
jsonrpcString必须协议版本,必须为"2.0"
resultAny成功时必选方法返回值,与error互斥
errorObject失败时必选错误信息(含code和message),与result互斥
idString / Number / null必须必须与请求的id一致;若请求id无效(如解析错误),则必须为null
--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}<-- {"jsonrpc": "2.0", "result": 19, "id": 3}--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4}<-- {"jsonrpc": "2.0", "result": 19, "id": 4}

具体可以去官网中查看www.jsonrpc.org/specificati…

MCP Host(模型)与MCP Client 之间

我们直接看deepseekAPI中的请求参数:这里这边我们看到请求分成了四种:系统设定(System)用户输入(User)AI响应(Assistant)工具回调(Tool)而在MCP中我们需要关注的就是工具回调(Tool),也就是MCP Server执行后的结果传入的消息。至于怎么告诉AI模型有哪些方法可以执行呢?则是通过一下的参数tools传入

MCP Server 最小实现

相对于 MCP ClientMCP Host 来说,平常开发者其实更关注 MCP Server 的开发,毕竟不管是 AI模型开发 还是 客户端开发 都是巨大的工程,反而个人写一个MCP Server是非常现实的。

所以我们直接先看 MCP Server ,它一共有三大块功能:

下面只讲解最小实现,具体构建项目可以参考官方文档,都是简单的命令行执行

import {  McpServer,  ResourceTemplate,} from "@modelcontextprotocol/sdk/server/mcp.js";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";import { z } from "zod";// 创建一个McpServer实例,名称为"Demo",版本为"1.0.0"const server = new McpServer({  name: "Demo",  version: "1.0.0",});// 定义一个名为"add"的工具,接受两个数字参数a和b,返回它们的和server.tool("add", { a: z.number(), b: z.number() }, async ({ a, b }) => ({  content: [{ type: "text", text: String(a + b) }],}));// 定义一个名为"greeting"的资源,根据{name}参数生成问候信息server.resource(  "greeting",  new ResourceTemplate("greeting://{name}", {    list: async () => ({      resources: [        {          uri: "greeting://",          name: "这是一个描述",        },      ],    }),  }),  async (uri, { name }) => ({    contents: [      {        uri: uri.href, // 确保 uri.href 是字符串        text: `Hello, ${name}!`,      },    ],  }));// 定义一个名为"greet"的提示,生成问候消息,支持多种语言server.prompt(  "greet",  "Generate a greeting message",  {    name: z.string().describe("Name to greet"),    language: z.enum(["en", "zh", "es"]).describe("Language for greeting"),  },  async ({ name, language }) => {    const greetings = {      en: `Hello, ${name}!`,      zh: `你好,${name}!`,      es: `¡Hola, ${name}!`,    };    return {      messages: [        {          role: "assistant",          content: {            type: "text",            text: greetings[language],          },        },      ],    };  });// 使用StdioServerTransport创建一个传输实例,并将server连接到该传输实例const transport = new StdioServerTransport();await server.connect(transport);

以上可以看出要写一个简单的MCP Server是非常简单的,主要按照规定的格式和类型就不会有问题。

官方还提供了个debug的方式npx @modelcontextprotocol/inspector node main.js

MCP Client 是如何接受数据的?

  // 列出所有提示  async listPrompts() {    try {      const result = await this.mcp.listPrompts();      console.log("Available prompts:", result);      return result.prompts;    } catch (e) {      console.log("Failed to list prompts:", e);      throw e;    }  }    // 调用指定提示  async callPrompt(name, language) {    try {      const result = await this.mcp.getPrompt({        name: "greet",        arguments: { name, language },      });      console.log("Prompt result:", result.messages);      return result.content;    } catch (e) {      console.log("Failed to call prompt:", e);      throw e;    }  }// 列出所有资源  async listResources() {    try {      const result = await this.mcp.listResources();      console.log("Available resources:", result);      return result.resources;    } catch (e) {      console.log("Failed to list resources:", e);      throw e;    }  }  // 读取指定资源的内容  async readResource(resourceUri, variable) {    try {      const result = await this.mcp.readResource({        uri: resourceUri,      });      console.log("Resource content:", result);      return result.content;    } catch (e) {      console.log("Failed to read resource:", e);      throw e;    }  }  // 列出所有提示  async listPrompts() {    try {      const result = await this.mcp.listPrompts();      console.log("Available prompts:", result);      return result.prompts;    } catch (e) {      console.log("Failed to list prompts:", e);      throw e;    }  }     // 调用指定提示  async callPrompt(name, language) {    try {      const result = await this.mcp.getPrompt({        name: "greet",        arguments: { name, language },      });      console.log("Prompt result:", result.messages);      return result.content;    } catch (e) {      console.log("Failed to call prompt:", e);      throw e;    }  }

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Model Context Protocol AI集成 工具调用 协议标准 AI效率
相关文章