一、前言

首先我们需要了解MCP是什么?需要了解大模型LLM是什么?通过LLM能计算数学表达式嘛?例如: 3+4的结果吗?

官网解释大模型LLM (Large Language Model)中文名为大语言模型或大型语言型,是一种相较传统语言模型参数量更多、在更大规模语料上进行预训练的语言模型(产物)。所以LLM的特点:海量的数据、预训练的产物(数据缺乏实时性)、文本数据(缺少真逻辑);所以后续相继出现了很多补充LLM大模型的工具和技术,例如:Function Calling 、 MCP 、 AI Agent等概览。

官网解释MCP(Model Context Protocol) 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的USB-C接口。USB-C : 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口安全,可以做到即插即用。

二、核心概念

LLM

技术名词

  • MCP Hosts: 如 Claude Desktop、IDE、Curson 或 AI 工具,希望通过 MCP 访问数据的程序
  • MCP Clients: 维护与服务器一对一连接的协议客户端
  • MCP Servers: 轻量级程序,通过标准的 Model Context Protocol 提供特定能力
  • 本地数据源: MCP 服务器可安全访问的计算机文件、数据库和服务
  • 远程服务: MCP 服务器可连接的互联网上的外部系统(如通过 APIs)
  • MCP协议:传输都使用 JSON-RPC(www.jsonrpc.org/) 2.0 进行消息交换

传输机制

  1. Stdio 传输
    • 使用标准输入/输出进行通信
    • 适用于本地进程
  2. 通过 HTTP
  3. SSE 传输
    • 使用服务器发送事件进行服务器到客户端的消息传递
    • 使用 HTTP POST 进行客户端到服务器的消息传递

生命周期

  1. Client 发送包含协议版本和能力的 initialize 请求
  2. Server 以其协议版本和能力响应
  3. Client 发送 initialized 通知作为确认
  4. 开始正常消息交换
    • 请求-响应:客户端或服务器发送请求,另一方响应
    • 通知:任一方发送单向消息

MCP核心模块

  1. Resource:提供给 clients 的任何类型的数据,通过[protocol]://[host]/[path]
  2. Prompts:允许 servers 定义可复用的提示模板和工作流,clients 可以轻松地将它们呈现给用户和 LLMs。它们提供了一种强大的方式来标准化和共享常见的 LLM 交互。
  3. Tools:servers 能够向 clients 暴露可执行功能。通过 tools,LLMs 可以与外部系统交互、执行计算并在现实世界中采取行动。最重要的工具,辅助AI我们可以自定义完成很 LLM不能完成的能力
  4. Sampling(采样):它允许 servers 通过 client 请求 LLM 补全,从而实现复杂的 agentic 行为,同时保持安全性和隐私性
  5. Roots:定义了 servers 可以操作的边界。当 client 连接到 server 时,它声明 server 应该使用哪些 roots(URI,HTTP URL)

三、示例代码

创建MCP Sever

通过FastMcp快速创建 MCP Server服务,具体示例代码如下:

import axios from "axios";
import * as cheerio from 'cheerio';
import { FastMCP } from "fastmcp";
import { z } from "zod";

// 创建FastMCP服务器实例
const mcp = new FastMCP({
  name: "示例MCP服务器",
  version: "1.0.0",
  logger: {
    debug: (...args) => console.error('[DEBUG]', ...args),
    info: (...args) => console.error('[INFO]', ...args),
    warn: (...args) => console.error('[WARN]', ...args),
    error: (...args) => console.error('[ERROR]', ...args),
    log: (...args) => console.error('[LOG]', ...args)
  }
});

Tools

通过addTools快速完成添加工具,例如实现一个通过MCP获取任意网页的内容,将我们远程网页的内容喂给LLM大模型,让大模型可以为我们做更多事情,具有上网能力。具体示例代码如下:

const get_article = async (link: string) => {
  try {
    console.log(`Fetching web content: ${link}`);
    
    // 发送HTTP请求获取网页内容
    const response = await axios.get(link, {
      timeout: 10000, // 10秒超时
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
      }
    });

    // 使用cheerio解析HTML
    const $ = cheerio.load(response.data);
    
    // 移除不需要的标签
    $('script, style, nav, header, footer, aside, .advertisement, .ads').remove();
    
    // 尝试提取主要内容
    let content = '';
    
    // 常见的文章内容选择器
    const contentSelectors = [
      'article',
      '.article-content',
      '.post-content',
      '.entry-content',
      '.content',
      'main',
      '.main-content',
      '[role="main"]'
    ];
    
    for (const selector of contentSelectors) {
      const element = $(selector);
      if (element.length > 0) {
        content = element.text().trim();
        if (content.length > 100) { // 如果内容足够长,就使用它
          break;
        }
      }
    }
    
    // 如果没有找到特定的内容区域,使用body
    if (!content || content.length < 100) {
      content = $('body').text().trim();
    }
    
    // 清理文本内容
    content = content
      .replace(/s+/g, ' ') // 将多个空白字符替换为单个空格
      .replace(/ns*n/g, 'n') // 移除多余的空行
      .trim();
    
    // 限制内容长度(避免过长)
    if (content.length > 5000) {
      content = content.substring(0, 5000) + '...';
    }
    
    console.log(`Successfully fetched content, length: ${content.length} characters`);
    return content;
  } catch (error) {
    console.error(`Failed to fetch web content: ${error instanceof Error ? error.message : String(error)}`);
    return `Failed to fetch web content: ${error instanceof Error ? error.message : String(error)}`;
  }
}
mcp.addTool({
  name: "get_article_by_link",
  description: "获取网页内容",
  parameters: z.object({
    expression: z.string().describe("要获取的网页内容")
  }),
  execute: async ({ expression }) => {
    try {
      console.log(`Fetching web content: ${expression}`);
      const result = await get_article(expression); // 注意:这里需要await
      return {
        content: [
          {
            type: "text",
            text: `Web content from ${expression}:nn${result}`
          }
        ]
      };
    } catch (error) {
      return {
        content: [
          {
            type: "text",
            text: `Error fetching web content: ${error instanceof Error ? error.message : 'Unknown error'}`
          }
        ],
        isError: true
      };
    }
  }
});

// 添加计算工具
mcp.addTool({
  name: "calculate",
  description: "执行数学计算",
  parameters: z.object({
    expression: z.string().describe("要计算的数学表达式")
  }),
  execute: async ({ expression }) => {
    try {
      // 简单的数学计算(仅支持基本运算)
      const result = eval(expression);
      return {
        content: [
          {
            type: "text",
            text: `计算结果: ${expression} = ${result}`
          }
        ]
      };
    } catch (error) {
      return {
        content: [
          {
            type: "text",
            text: `计算错误: ${error instanceof Error ? error.message : '未知错误'}`
          }
        ],
        isError: true
      };
    }
  }
});

Resource

通过addResource快速完成添加资源等能力,例如实现获取系统信息或让 LLM可以读取本地文件,将本地文件喂给 LLM大模型,让大模型具有本地文件推断能力。具体示例代码如下:

// 添加系统信息资源
mcp.addResource({
  uri: "system://info",
  name: "系统信息",
  description: "当前系统的信息",
  mimeType: "application/json",
  load: async () => {
    const os = await import('os');
    return {
      uri: "system://info",
      mimeType: "application/json", 
      text: JSON.stringify({
        platform: os.platform(),
        arch: os.arch(),
        nodeVersion: process.version,
        uptime: os.uptime(),
        totalMemory: os.totalmem(),
        freeMemory: os.freemem(),
        cpus: os.cpus().length
      }, null, 2)
    };
  }
});

Prompt

通过addPrompt快速完成定义大模型Prompt的能力,让 LLM可以选择 MCP提供的Prompt角色切换。具体示例代码如下:

// 修复后的prompt定义
mcp.addPrompt({
  name: "analyze-code",
  description: "分析代码以获得潜在改进",
  arguments: [
    {
      name: "language",
      description: "编程语言",
      required: true
    },
    {
      name: "code",
      description: "要分析的代码",
      required: true
    }
  ],
  load: async ({ language, code }) => {
    // 返回prompt内容,不是prompt对象
    return {
      messages: [
        {
          role: "user",
          content: {
            type: "text",
            text: `请分析以下${language}代码,并提供改进建议:nn```${language}n${code}n```nn请从以下几个方面分析:n1. 代码质量和可读性n2. 性能优化建议n3. 最佳实践建议n4. 潜在的安全问题n5. 代码结构改进建议`
          }
        }
      ]
    };
  }
});

Debug调试

MCP Inspector是一个交互式开发者工具,用于测试和调试 MCP 服务器。

npx @modelcontextprotocol/inspector  <command> <arg1> <arg2>

// 案例
npx -y @modelcontextprotocol/inspector npx server-postgres postgres://127.0.0.1/testdb

运行启动后,会在那浏览器打开一个本地服务连接http://localhost:6274/,如下图:

http://localhost:6274/本地服务的页面,可以通过 页面 commonargs配置启动服务的命令。例如

yarn --cwd "D:\code\个人项目\mcp\gpt-demo" mcp 指定目录下执行 yarn mcp 启动服务

Claude Desktop、IDE、Cursor等开发者工具中配置类似的服务,也可以完成MCP服务的集成。具体配置实例如下:

const mcpConfig = new MCPConfiguration({
  servers: {
    deepWiki: {
      type: "sse",
      url: "https://mcp.deepwiki.com/sse",
      timeout: 25000,
    },
    "mcp-test": {
      "type": "stdio",
      "command": "yarn",
      "args": [
        "--cwd",
        "D:\code\个人项目\mcp\gpt-demo",
        "mcp"
      ]
    }
});

通过切换tabtools可以看到我们开发的 tools 工具函数,选择对应调试的函数进行调试:

通过上面的配置看我们 MCP服务在 Claude Desktop、IDE、Cursor这些开发者工具中Agent 价值配置后结构,如下图示例(包含外部deepwiki MCP Server 和我们开发的 MCP Server):

通过Agent 进行测试我们开发的MCP Server可以看到调用了calculate这个工具函数,具体执行步骤示例如下:

四、总结

通过这篇文章我们可以快速完成 MCP的概念和基础知识的了解,也可以通过实例代码5分钟内完成MCP Server的开发。方便我们在研发后续的场景中尝试提效研发效率:

  1. 简化工具集成流程: MCP 通过定义统一的接口规范,使 AI 模型能够直接感知环境、操作工具、处理数据,无需为每个工具单独开发适配层。阿里云百炼平台展示,开发者只需 5 分钟即可搭建专属 MCP 智能体,极大提升了开发效率。
  2. 优化测试流程: 在软件测试领域,MCP 可让 AI 代理自动创建、执行并维护测试用例,覆盖更多边缘场景。还能动态调整测试策略,适应复杂分布式系统。同时,AI 代理可检测 UI/API 的变化并自动修复损坏的定位器或测试脚本,降低测试维护成本,加速 CI/CD 流程。
  3. 提升任务规划与协作效率: 以 Gitee 发布的企业版 MCP Server 为例,它能让 AI 助手深度参与企业研发管理,辅助需求拆解、完善需求内容、创建和审查 PR 等,减少人工沟通成本,提升团队协作效率,助力企业实现更高效、更规范的研发流程。
  4. 促进跨生态服务整合: MCP 协议可实现多 MCP 服务串联,如阿里云百炼平台中,高德地图 MCP、文本生成 MCP 和 Notion 存储 MCP 可自动生成旅行攻略。还能通过动态路由优化,确保任务精准执行,帮助开发者构建复杂任务链,加速研发成果落地。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]