MCP入门:让AI大模型拥有“超能力”的通信协议

146 阅读6分钟

今天学习了一个特别有意思的技术——MCP(Model Context Protocol),感觉像是给AI大模型装上了“眼睛”和“耳朵”,让它能够与外部世界进行交互。作为一个前端初学者,我觉得这个概念虽然听起来有点高大上,但实际上理解起来并不难,而且特别实用。

为什么需要MCP?

想象一下,你有一个非常聪明的AI助手,它知识渊博,能回答各种问题。但它有个局限:它只知道它被训练时学到的知识,对于训练后发生的新事情,或者需要实时数据的问题,它就无能为力了。比如你问它“现在几点了?”或者“从公司到机场怎么走最快?”,它可能就回答不上来了。

这就是MProtocol要解决的问题。MCP就像是一个翻译官和信使,让AI大模型能够与外部工具、API和服务进行沟通。通过MCP,AI可以获取实时信息、执行计算任务,或者操作外部系统,从而突破它自身知识和能力的限制。

MCP是什么?

MCP的全称是Model Context Protocol,翻译过来就是“模型上下文协议”。它是一种通信协议,规定了AI大模型与外部资源之间如何交换信息。你可以把它想象成Web开发中的RESTful API,但是专门为AI大模型设计的。

如果说AI大模型是一个聪明但有点“宅”的专家,那么MCP就是它的手机和互联网连接,让它能够与外界保持联系,获取最新信息,使用各种工具和服务。

MCP是Function Call的升级版。Function Call已经可以让LLM调用外部工具,但当你有多种不同的Function Call时,管理起来可能会很混乱。MCP提供了一种统一的方式来管理所有这些外部调用,让一切变得井井有条。

MCP的工作原理

MCP的工作原理其实并不复杂,它主要包括三个部分:MCP Server(服务器)MCP Client(客户端)LLM(大语言模型)

MCP Server是提供具体功能的服务器,比如获取时间、查询地图、访问数据库等。它定义了各种工具(Tools),等待被调用。

LLM是AI大模型本身,它很聪明,但需要外部工具来扩展能力。

MCP Client是连接LLM和MCP Server的桥梁。当LLM需要调用外部工具时,它会通过MCP Client发送请求,MCP Client再将请求转发给相应的MCP Server,最后将结果返回给LLM。

这个过程可以简单理解为:LLM -> Client -> Server -> Transport(通信)。

实操演示

高德MCP服务器

首先我们需要申请高德地图的APIkey,我们进入 高德地图平台创建好,就会生成属于你自己的API

image.png

其次我们得需要一个MCP客户端,我们在编辑器得插件市场下载就好,这里我用的是trae

image.png

之后进入客户端,创建自己的账号,然后开始配置

image.png

image.png

{
  "mcpServers": {
   
    "amap-maps": {
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "npx.cmd",
      "args": [
        "-y",
        "@amap/amap-maps-mcp-server"
      ],
      "env": {
        "AMAP_MAPS_API_KEY": "xxxxxx" 这里是APIkey换成自己的APIkey即可
      }
    }
  }
}

现在客户端页配置好了,我们可以进行实操了,可以看到它会帮我进行实际查找线路,这就是mcp的强大之处了

image.png

当然我们也可以自己自己搭建简单的MCP服务器

实操搭建时间MCP服务器

// mcp-server.js
// 导入MCP服务端核心类,用于创建和管理MCP服务器
// MCP服务器统一管理工具调用与上下文,实现大模型与外部工具间标准化、高效、安全的交互。
// LLM 开发,web server 开发一样
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// 导入基于标准输入输出的传输层,实现进程间通信
// 大模型运行的主进程(如AI应用)与通过StdioServerTransport启动的MCP工具服务器进程之间的通信。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
// 导入调用工具请求和响应的数据结构类型定义,确保通信数据格式规范
import {
    CallToolRequestSchema,
    CallToolResultSchema,
} from "@modelcontextprotocol/sdk/types.js";

// 1. 创建 MCP Server
const server = new Server(
    {
        name: "demo-mcp-server", // 服务器名称,用于标识当前MCP服务
        version: "1.0.0",// 服务器版本,便于版本管理和兼容性控制
    },
    {
        capabilities: {
            tools: {}, // 可以动态注册工具
        },
    }
);

// 2. 注册一个工具(比如:获取当前时间)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
    if (request.params.name === "getTime") {
        return {
            content: [
                {
                    type: "text",
                    text: `当前时间是: ${new Date().toISOString()}`,
                },
            ],
        };
    }
    throw new Error("未知工具: " + request.params.name);
});

// 3. 启动 MCP Server
// StdioServerTransport 是通信桥梁(运输层)
const transport = new StdioServerTransport();
// server.connect(transport) 是将 MCP 服务器连接到该桥梁
server.connect(transport);

这也是学习性的,很多代码我也是不懂的,这里让AI解释一下:

这段代码做了以下几件事情:

首先,它导入了必要的模块。Server类是MCP服务器的核心,用于创建和管理服务器。StdioServerTransport是基于>标准输入输出的传输层,负责进程间通信。CallToolRequestSchema和CallToolResultSchema是工具调用请求和响>应的数据结构定义,确保通信数据的格式规范。

然后,创建了一个MCP服务器实例,指定了服务器名称和版本。这类似于我们在Web开发中创建一个Express或Koa服务>器。

接下来,注册了一个名为"getTime"的工具。当收到调用这个工具的请求时,服务器会返回当前的ISO格式时间字符 > 串。这就像在Web服务器中定义一个API端点。

最后,创建了一个StdioServerTransport实例(通信桥梁),并将服务器连接到这个桥梁上。这样,服务器就可以通>过标准输入输出与客户端进行通信了。

客户端配置

有了MCP服务器,还需要配置客户端来连接它。我们重复上述配置高德演示示例的客户端配置:

{
  "mcpServers": {
    "time-mcp": {
      "autoApprove": [],
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "node",
      "args": [
        "你的mcp-server.js绝对路径"
      ],
      "env": {}
    },
}

出现以下就算成功

image.png 我们再来看看效果:

image.png

总结

今天的学习让我对MCP有了初步的认识。MCP是一个让AI大模型能够与外部工具和API进行交互的通信协议,它像是AI与外界之间的“USB接口”,提供了一种标准化的方式来扩展AI的能力。

通过MCP,AI可以获取实时信息,执行精确计算,与外部系统交互,从而突破自身知识和能力的限制。MCP统一了各种Function Call的调用方式,降低了集成成本,提高了数据安全性和输出可靠性。

虽然我只是一个前端初学者,但通过今天的学习,我感受到了技术的连通性和标准化的重要性。一个良好的协议和标准可以让不同的系统协同工作,创造出比单个系统更强大的能力。