Agent 工具箱:一步步搭建你的第一个 MCP 服务

一、为什么需要MCP?

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

  • 用户输入 → 智能体规划任务 → 调用模型完成任务 → 汇总回复

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

  • LLM模型:用于生成、对话、总结
  • Embedding 模型:用于向量检索与语义匹配
  • 多模态模型:图像、语音、视频理解
  • 工具模型:SQL 生成、代码补全、文档解析

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

二、什么是MCP服务?

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

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

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

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

Agent 调用 MCP 的两步链路:

  1. 使用**文生图模型(Text-to-Image)**根据 prompt 生成一张“弹琴小猫”图片
  2. 使用视频生成模型或图像动画模型(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与服务之前也有标准化的通信协议。

  • 工具调用方式(Tools)
  • 资源访问方式(Resources)
  • 输入输出的结构(inputSchema)
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";
  • McpServer:MCP 服务器核心类,用于创建和管理 MCP 服务。
  • StdioServerTransport:基于标准输入输出(stdin/stdout)的通信传输机制,实现服务端与客户端的消息收发。
  • z(Zod):声明式校验库,用于定义输入参数的类型和结构。
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()
  1. 创建 MCP 服务器并注册工具,启动服务监听通信
    创建 MCP 服务器实例,名字为 local-app-opener,版本 1.0.0
  2. 注册工具 openApp
    注册一个工具名叫 openApp,代表打开本地应用,里面还包含一些工具元信息,其中 inputSchema定义了输入参数格式
  3. 启动通信传输层并连接
    实例化 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,可以直接配置下面的json体验一下:

{
  "mcpServers": {
    "mcp-demo": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-test-zhuling"
      ]
    }
  }
}
### MCP协议简介 Model Context Protocol (MCP) 是一种用于实现大型语言模型(LLM)与外部数据源和工具之间无缝集成的开放协议[^4]。它采用经典的客户端-服务器(CS)架构,其中 **MCP Host** 表示需要通过 MCP 获取数据的应用程序,而 **MCP Server** 则是一个轻量级应用程序,负责暴露某些特定的功能或资源给主机。 #### 关键组件说明 - **MCP Host**: 如 Claude Desktop、IDE 或其他 AI 工具等,这些程序依赖于 MCP 来获取所需的数据或能力[^1]。 - **MCP Client**: 客户端部分通常由 MCP 协议驱动,能够一对一地连接到指定的 MCP Server 上[^3]。 - **MCP Server**: 负责对外提供某种特殊功能的小型化应用,比如访问本地文件系统、调用远程 API 等[^2]。 - **Local Data Resources**: 可供 MCP Server 访问的安全本地资源,例如文件夹、数据库或其他服务。 - **Remote Services**: 支持通过网络接口(API 形式)与其他外部系统建立通信通道。 --- ### 实现首个 MCP Server 的教程 以下是基于现有文档指导来创建并运行一个基础版本 MCP Server 所需的关键步骤: #### 准备工作环境 确保安装有 Python 和 pip 命令行工具,并且具备基本开发技能以便理解后续操作逻辑。如果尚未完成此环节,则先执行如下命令更新软件包管理器: ```bash pip install --upgrade pip setuptools wheel ``` 接着引入必要的库支持以简化编码过程中的复杂度处理问题: ```python import json from http.server import BaseHTTPRequestHandler, HTTPServer ``` 上述代码片段展示了导入 JSON 解析模块以及内置 Web 服务器框架的核心类定义方法。 #### 编写核心业务逻辑 下面给出一段简单的示例脚本作为起点,演示如何响应来自 MCP Host 请求的消息体内容转换成标准格式返回去的过程: ```python class MCPRequestHandler(BaseHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) try: request_json = json.loads(post_data.decode('utf-8')) response_payload = { 'status': 'success', 'message': f"Received data: {request_json}" } status_code = 200 except Exception as e: response_payload = {'error': str(e)} status_code = 400 self.send_response(status_code) self.send_header('Content-Type', 'application/json') self.end_headers() self.wfile.write(json.dumps(response_payload).encode('utf-8')) def run(server_class=HTTPServer, handler_class=MCPRequestHandler, port=8080): server_address = ('', port) httpd = server_class(server_address, handler_class) print(f'Starting MCP Server on port {port}...') httpd.serve_forever() if __name__ == "__main__": run() ``` 这段代码实现了最基本的 POST 方法处理器 `do_POST` ,用来接收传入参数并通过异常捕获机制保障稳定性的同时反馈适当的结果状态码信息给调用方知道当前请求成功与否情况怎样。 #### 启动您的 MCP Server 保存以上全部修改后的完整版 python 文件至任意目录下命名为 mcp_server.py 并切换终端位置至此路径处输入以下指令即可启动监听模式等待连接到来: ```bash python mcp_server.py ``` 此时应该能看到类似这样的提示消息表示正常运作当中:"Starting MCP Server on port 8080..." 最后一步就是按照官方指南配置好对应平台上的插件选项指向刚才开启的服务地址便能正式投入使用啦! --- ### 注意事项 实际项目部署过程中可能还会涉及到安全性加固措施诸如身份验证机制设置等方面考量因素;另外考虑到跨域资源共享(CORS)策略限制也可能影响正常使用体验所以必要时候记得调整浏览器端权限设定或者利用反向代理技术绕过障碍达成目标效果哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值