掘金 人工智能 8小时前
Agent 工具箱:一步步搭建你的第一个 MCP 服务
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

随着大语言模型的兴起,Agent架构的应用日益广泛。然而,在实际工程实践中,系统往往需要调用多种模型,包括LLM、Embedding、多模态及工具模型。MCP(Model Compute Platform)作为一种面向Agent的后端服务,旨在统一注册、封装和调度这些底层模型能力,实现模型能力路由与编排。它使得上层Agent能够“只管调用,不管细节”,简化了复杂模型调用的流程。通过定义标准化的通信协议,MCP扮演着模型能力扩展者的角色,让Agent能够执行本地文件操作、打开浏览器等更复杂任务。文章通过一个“生成弹琴小猫视频”的实例,展示了MCP如何串联文生图和图生视频模型,并介绍了MCP的组成部分及一个本地应用打开工具的DEMO。

🗂️ **MCP的定位与必要性**:在Agent架构下,系统需要调用多种类型的模型(LLM、Embedding、多模态、工具模型)来完成复杂任务。MCP(Model Compute Platform)应运而生,它是一个面向Agent的后端服务,核心功能是统一注册、封装和调度底层模型能力,本质上是一个模型能力路由与编排平台,旨在让Agent能够便捷地调用各种模型,而无需关心底层实现的复杂细节。

🎬 **MCP的工作流程示例**:以“生成弹琴小猫视频”为例,展示了MCP如何协调不同模型。Agent通过MCP调用文生图模型生成一张“弹琴小猫”的图片,然后MCP再调用视频生成模型或图像动画模型将静态图片转换为视频。这个过程体现了MCP作为模型能力编排器的作用,将多个独立的模型调用串联起来,完成一个端到端的复杂任务。

🔗 **MCP的角色与通信机制**:MCP服务由Agent(服务使用方)和MCP Server(服务提供方)组成。MCP Server中注册的功能被称为Tool,资源被称为Resource,而Agent与MCP Server之间的通信通过Transport实现,如Stdio、WebSocket或HTTP。这些通信遵循标准化的协议,定义了工具调用方式、资源访问方式以及输入输出的结构,确保了Agent与MCP Server之间高效、规范的交互。

💻 **MCP DEMO与工具注册**:文中展示了一个MCP的DEMO,其中注册了两个工具:`openApp`和`add`。`openApp`工具能够根据应用名称(如chrome、notepad)在不同操作系统(Windows、macOS、Linux)上打开相应的本地应用程序,它通过`exec`命令执行系统指令实现。`add`工具则用于计算两个数字的和。这些DEMO直观地展示了MCP如何集成和管理外部功能,扩展Agent的能力边界。

一、为什么需要MCP?

随着大语言模型的兴起,越来越多的应用系统开始转向Agent架构

但是在真正的工程实践中,往往不止一个模型:

于是就有了MCP,来统一调度模型服务

二、什么是MCP服务?

MCP(Model Compute Platform) 是一种面向 Agent 的后端服务,用于注册、统一封装、调度调用底层模型能力。

MCP 本质上是一种 模型能力路由与编排平台,其目标是让上层 Agent “只管调用,不管细节”。

你可能听着很懵,举个简单的例子:

比如用户提问:帮我生成一个小猫弹琴的视频吧

Agent 调用 MCP 的两步链路:

    使用**文生图模型(Text-to-Image)**根据 prompt 生成一张“弹琴小猫”图片使用视频生成模型或图像动画模型(Image-to-Video)将静态图转成视频

代码类似这种:

// 第一步,文字生成图片const imageResponse = await MCP.call("generateImage", {  prompt: "一只小猫坐在钢琴前弹琴",  resolution: "512x512"});const imageUrl = imageResponse.url;// 第二步,图片生成视频const videoResponse = await MCP.call("imageToVideo", {  imageUrl,  duration: 8});// 返回视频链接给用户return `视频已生成,观看链接:${videoResponse.videoUrl}`;

三、MCP的角色和结构

http相当于浏览器和服务器之间的协议,有一些标准化的规则,Agent与服务之前也有标准化的通信协议。

MCP的角色

角色说明
Agent使用服务的一方(比如一个大模型、插件、UI 工具)
MCP Server提供服务的一方(比如调用文生图,图生视频的服务)
ToolMCP Server 中注册的一个功能(可被 Agent 调用)
ResourceMCP Server 中注册的资源(按 URI 模板动态生成内容)
TransportMCP Server 和 Agent 之间的通信通道(如 Stdio、WebSocket、HTTP)

MCP也可以理解为扩充了大模型的能力,大模型借助MCP服务还可以去做一些操作本地文件,打开浏览器等等

四、MCP-DEMO

当前mcp提供了两个tools,打开本地应用和计算数字加法

1. 导入模块

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";import { z } from "zod";import { exec } from "child_process";

2. 函数 openLocalApp(appName)

这个函数的作用是根据传入的应用名称,结合当前操作系统,拼接对应的系统命令来打开该应用。

function openLocalApp(appName) {  const platform = process.platform;  let command;  // 根据操作系统构造打开命令  if (platform === "win32") {    // Windows    switch (appName.toLowerCase()) {      case "chrome":        command = `start chrome`;        break;      case "notepad":        command = `start notepad`;        break;      default:        throw new Error(`Unknown app: ${appName}`);    }  } else if (platform === "darwin") {    // macOS    switch (appName.toLowerCase()) {      case "chrome":        command = `open -a "Google Chrome"`;        break;      case "textedit":        command = `open -a TextEdit`;        break;      default:        throw new Error(`Unknown app: ${appName}`);    }  } else if (platform === "linux") {    // Linux    switch (appName.toLowerCase()) {      case "chrome":        command = `google-chrome`;        break;      case "gedit":        command = `gedit`;        break;      default:        throw new Error(`Unknown app: ${appName}`);    }  } else {    throw new Error("Unsupported platform: " + platform);  }  return new Promise((resolve, reject) => {    exec(command, (error) => {      if (error) {        reject(error);      } else {        resolve(`Opened ${appName} successfully`);      }    });  });}

3. 主函数 main()

    创建 MCP 服务器并注册工具,启动服务监听通信创建 MCP 服务器实例,名字为 local-app-opener,版本 1.0.0注册工具 openApp注册一个工具名叫 openApp,代表打开本地应用,里面还包含一些工具元信息,其中inputSchema定义了输入参数格式启动通信传输层并连接实例化 StdioServerTransport,通过标准输入输出流和Agent通信
async function main() {  const server = new McpServer({    name: "local-app-opener",    version: "1.0.0",  });  server.registerTool(    "openApp",    {      title: "Open Local Application",      description: "Open a local application by name, e.g. chrome, notepad",      inputSchema: { appName: z.string() },    },    async ({ appName }) => {      try {        const result = await openLocalApp(appName);        return {          content: [{ type: "text", text: result }],        };      } catch (err) {        return {          content: [{ type: "text", text: `Failed to open app: ${err.message}` }],        };      }    }  );  server.registerTool("add", {    title: "Add Numbers",    description: "Add two numbers",    inputSchema: { a: z.number(), b: z.number() },  }, async ({ a, b }) => {    return {      content: [{ type: "text", text: `Sum: ${a + b}` }],    };  });  const transport = new StdioServerTransport();  await server.connect(transport);}main();

4. 使用展示:

1. 配置MCP:2. 测试MCP:在经过思考过程之后,最终整合了输入格式:

我测试用的是Trae,cursor收费有点贵,可以直接配置下面的json体验一下:

{  "mcpServers": {    "mcp-demo": {      "command": "npx",      "args": [        "-y",        "mcp-test-zhuling"      ]    }  }}

Fish AI Reader

Fish AI Reader

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

FishAI

FishAI

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

联系邮箱 441953276@qq.com

相关标签

MCP Agent架构 模型调度 模型编排 大语言模型
相关文章