MCP服务创建指南

目录

一、问题原点

二、MCP基础知识

[2.1 Function Call](#2.1 Function Call)

[2.2 MCP](#2.2 MCP)

[2.3 MCP VS Function Call](#2.3 MCP VS Function Call)

三、MCP基本概念

[3.1 MCP Host](#3.1 MCP Host)

[3.2 MCP Server](#3.2 MCP Server)

[3.3 通信协议](#3.3 通信协议)

STDIO的两种启动方式

npm与npx

uv与uvx

npx和nvx的对比

[3.4 MCP 的核心流程](#3.4 MCP 的核心流程)

[四、使用 MCP 分析大规模表格](#四、使用 MCP 分析大规模表格)

[4.1 VsCode + Cline](#4.1 VsCode + Cline)

[4.2 在 Cline 中配置 table-reader(server)](#4.2 在 Cline 中配置 table-reader(server))

​编辑

[4.3 在cline上使用这个mcp](#4.3 在cline上使用这个mcp)

[4.4 MCP的局限性](#4.4 MCP的局限性)

五、参考资料


一、问题原点

当分析大规模表格时,会遇到两个问题:

(1)如果一次性读取表格,则如果表格内容太多,非常容易超过基座大模型的上下文窗口限制,导致推理报错;

(2)如果用RAG进行内容截取,则不能了解数据的全貌,如问这个表格一共多少行数据,则无法得知。

因此,这里采用MCP的方式,可动态分析大规模表格数据。

二、MCP基础知识

MCP的本质是调用工具,那么调用工具的两种方式有:(1)Function Call (2)MCP

2.1 Function Call

Function CallOPEN AI2023 年推出的一个非常重要的概念:

截图自:https://openai.com/index/function-calling-and-other-api-updates/

Function Call(函数调用) 本质上就是提供了大模型与外部系统交互的能力,类似于给大模型安装一个 "外挂工具箱"。当大模型遇到自己无法直接回答的问题时,它会主动调用预设的函数(如查询天气、计算数据、访问数据库等),获取实时或精准信息后再生成回答。

缺点:

(1)开发者想实现 Function Call 的成本是比较高的,首先得需要模型本身能够稳定支持 Function Call 的调用,比如我们在 Coze 中选择某些模型时提示,选择的模型不支持插件的调用,其实就是不支持 Function Call 的调用。

(2)OPEN AI 最开始提出这项技术的时候,并没有想让它成为一项标准,所以虽然后续很多模型也支持了 Function Call 的调用,但是各自实现的方式都不太一样。如果我们要发开一个 Function Call 工具,需要对不同的模型进行适配,比如参数格式、触发逻辑、返回结构等等,这个成本是非常高的。

这也大大提高了 AI Agent 的开发门槛,所以在以前我们大部分情况下只能通过 Dify、Coze 这些平台来构建 Agent

核心特点

  • 模型专属:不同模型(GPT/Claude/DeepSeek)的调用规则不同

  • 即时触发:模型解析用户意图后直接调用工具

  • 简单直接:适合单一功能调用(如"查北京温度"→调用天气API)

痛点

  • 协议碎片化:需为每个模型单独开发适配层

  • 功能扩展难:新增工具需重新训练模型或调整接口

类比

  • 不同品牌手机的充电接口(Lightning/USB-C),设备间无法通用

2.2 MCP

MCP(Model Context Protocol,模型上下文协议)是一种由 Anthropic 公司(也就是开发 Claude 模型的公司)推出的一个开放标准协议,目的就是为了解决 AI 模型与外部数据源、工具交互的难题。

Function Call的问题:每次要让模型连接新的数据源或使用新工具,开发者都得专门编写大量代码来进行对接,既麻烦又容易出错。

MCP 的解决思路:MCP像是一个 "通用插头" 或者 "USB 接口",制定了统一的规范,不管是连接数据库、第三方 API,还是本地文件等各种外部资源,都可以通过这个 "通用接口" 来完成,让 AI 模型与外部工具或数据源之间的交互更加标准化、可复用。

开发者按照 MCP 协议进行开发,无需为每个模型与不同资源的对接重复编写适配代码,可以大大节省开发工作量,另外已经开发出的 MCP Server,因为协议是通用的,能够直接开放出来给大家使用,这也大幅减少了开发者的重复劳动。

比如,你如果想开发一个同样逻辑的插件,你不需要在 Coze 写一遍,再去 Dify 写一遍,如果它们都支持了 MCP,那就可以直接使用同一个插件逻辑。

核心特点

  • 协议标准化:统一工具调用格式(请求/响应/错误处理)

  • 生态兼容性:一次开发即可对接所有兼容MCP的模型

  • 动态扩展:新增工具无需修改模型代码,即插即用

核心价值,解决三大问题

  • 数据孤岛 → 打通本地/云端数据源

  • 重复开发 → 工具开发者只需适配MCP协议

  • 生态割裂 → 形成统一工具市场

类比

  • USB-C 接口:手机/电脑/外设通过统一标准互联

2.3 MCP VS Function Call

|-----------|----------------------|----------------------------------|
| 对比维度 | Function Calling | MCP (Model Control Protocol) |
| 协议标准 | 私有协议(各模型自定规则) | 开放协议(JSON-RPC 2.0) |
| 工具发现 | 动态获取(initialize请求) | 静态预定义 |
| 调用方式 | 同进程函数或API | stdio/sse/steamableHttp |
| 扩展成本 | 高(每新增工具需调整模型) | 低(工具热插拔,模型无需改动) |
| 适用场景 | 简单任务(单次函数调用) | 复杂流程(多工具协同+数据交互) |
| 工程复杂度 | 低(快速接入单个工具) | 高(需部署MCP服务器+客户端) |
| 生态协作 | 工具与模型强绑定 | 工具开发者与 Agent 开发者解耦 |

三、MCP基本概念

从上面 MCP 的架构图中我们可以看到,想要使用 MCP 技术,首先就是得找到一个支持 MCP 协议的客户端,然后就是找到符合我们需求到 MCP 服务器,然后在 MCP 客户端里调用这些服务。

3.1 MCP Host

在 MCP 官方文档中,我们看到已经支持了 MCP 协议的一些客户端/工具列表:

从表格里,我们可以看到,MCP 对支持的客户端划分了五大能力,这里我们先简单了解即可:

  • Tools:服务器暴露可执行功能,供 LLM 调用以与外部系统交互。

  • Resources:服务器暴露数据和内容,供客户端读取并作为 LLM 上下文。

  • Prompts:服务器定义可复用的提示模板,引导 LLM 交互。

  • Sampling:让服务器借助客户端向 LLM 发起完成请求,实现复杂的智能行为。

  • Roots:客户端给服务器指定的一些地址,用来告诉服务器该关注哪些资源和去哪里找这些资源。

目前最常用,并且被支持最广泛的就是 Tools 工具调用。

对于上面这些已经支持 MCP 的工具,其实整体划分一下就是这么几类:

  • AI 聊天工具:如 5ire、LibreChat、Cherry Studio

  • AI 编码工具:如 Cursor、Windsurf、Cline

  • AI 开发框架:如 Genkit、GenAIScript、BeeAI

3.2 MCP Server

MCP Server 的官方描述:一个轻量级程序,每个程序都通过标准化模型上下文协议公开特定功能。

简单理解,就是通过标准化协议与客户端交互,能够让模型调用特定的数据源或工具功能。常见的 MCP Server 有:

  • 文件和数据访问类:让大模型能够操作、访问本地文件或数据库,如 File System MCP Server;

  • Web 自动化类:让大模型能够操作浏览器,如 Pupteer MCP Server;

  • 三方工具集成类:让大模型能够调用三方平台暴露的 API,如 高德地图 MCP Server;

下面是一些可以查找 MCP Server 的途径:

  1. 官方示例:https://github.com/modelcontextprotocol/servers

  2. 三方MCP聚合:https://mcp.so/

  3. 魔塔MCP广场:https://modelscope.cn/mcp?name=ocr\&page=1

  4. 百度MCP广场(带深度思考搜索):https://www.mcpworld.com/

3.3 通信协议

我们使用 Cherry Studio 中的 MCP 服务配置来举例,最前面的名称和描述比较好理解,都是用于展示的。

MCP 协议中的 STDIO/SSE/HTTP 其实就是是两种不同的(MCP ServerMCP Client)通信模式:

  • STDIO(标准输入输出):像「面对面对话」:客户端和服务器通过本地进程的标准输入和标准输出直接通信。例如:本地开发时,你的代码脚本通过命令行启动,直接与 MCP 服务器交换数据,无需网络连接。

  • SSE(服务器推送事件):像「电话热线」:客户端通过 HTTP 协议连接到远程服务器,服务器可以主动推送数据(如实时消息)。例如:AI 助手通过网页请求调用远程天气 API,服务器持续推送最新的天气信息。

  • streamableHttp(服务器推送事件):像「边说边回短信」:客户端发一次 HTTP 请求,服务器不是最后一次性返回结果,而是把结果分成多段 "一段段吐回来"。例如:AI 助手调用一个大模型生成 3000 字文档,不是等全都生成完再一次性返回,而是先把前几句先流回来,边生成边返回,就像 ChatGPT 的 token 流一样。

STDIO的两种启动方式

分为 npx 启动 和 nv 启动,分别对应不同的mcp服务编码,npx基于node.js,uv则是python的生态系统。

npm与npx

++npm:++ npm 是 Node.js 的包管理工具,主要用来 安装、管理和发布包

主要功能

  • 安装依赖:

    npm install package-name

(1) 如果不加 -g,会安装到当前项目的 node_modules 下。

(2) 如果加 -g,会全局安装。

  • 管理依赖:

    • package.json 会记录依赖版本。
  • 发布包:

    • 可以用 npm publish 发布到 npm 仓库。
  • 特点

    • 需要先安装包,然后才能执行。

    • 安装的包会占用磁盘空间(本地或全局)。

++npx:++ npx 是 npm 5.2+ 内置的一个 命令执行工具 ,主要用来 直接运行包里的可执行命令,不一定需要先全局安装。

主要功能

  • 直接执行本地或远程包:

    npx create-react-app my-app

会临时下载(如果本地没有),执行一次后就不用保留。

  • 可以运行当前项目 node_modules/.bin 下的包:​​​​​​​

    npx eslint .

不需要在 package.json scripts 中定义,也不需要全局安装 eslint。

  • 支持指定版本:

    npx package@version

  • 特点

    • 不需要全局安装即可运行。

    • 执行一次就可以,不占用长期磁盘空间。

    • 适合临时使用或者试用新版本工具。

++总结对比++

|---------|-----------|--------------|
| 特性 | npm | npx |
| 主要用途 | 安装、管理、发布包 | 运行包里的可执行命令 |
| 是否需要安装包 | 必须安装 | 可临时执行,无需安装 |
| 全局执行 | 需要 -g | 可直接执行 |
| 使用场景 | 项目依赖管理 | 快速执行脚手架或工具命令 |

💡 一句话理解

  • npm = 安装和管理包

  • npx = 直接运行包(一次性或临时)

uv与uvx

先明确一点:这里的 uv 工具类似于 condavenv,主要用来管理 隔离环境项目运行,但它有自己的一套命令体系。

++uv++ ++启动++

  • 作用:在当前 uv 环境下直接运行一个项目或脚本。

  • 特点

    • 使用的是 当前激活的 uv 环境

    • 没有额外的环境隔离。

    • 类似于在 conda 环境中直接执行 python main.py

  • 适用场景

    • 你已经在某个 uv 环境中,想快速启动项目。

    • 不需要为每次启动创建新的隔离环境。

++uvx++ ++启动++

  • 作用 :为每次启动创建 独立的隔离运行环境

  • 特点

    • 自动隔离依赖,防止污染全局或其他 uv 环境。

    • 类似 docker run -v .:/app python:3.11 这种临时环境启动。

    • 可以保证不同项目或不同版本的依赖不会冲突。

  • 适用场景

    • 多项目并行,需要环境完全隔离。

    • 测试不同依赖版本。

    • 临时运行脚本,不想污染原环境。

++总结对比++

|--------|-----------|--------------|
| 特性 | ux | uvx |
| 是否隔离环境 | 否 | 是 |
| 启动速度 | 快 | 相对慢(要创建隔离环境) |
| 依赖冲突风险 | 高 | 低 |
| 适用场景 | 单一项目、快速启动 | 多项目并行、测试不同版本 |

💡 一句话理解

  • ux = 当前环境直接运行

  • uvx = 临时隔离环境运行

npx和nvx的对比

3.4 MCP 的核心流程

  1. 初始化与工具列表获取 用户首先对MCP客户端进行初始化操作,随后MCP客户端向MCP服务器发送请求以获取可用的工具列表,MCP服务器将工具列表返回给客户端。

  2. 用户输入与提示词构建 用户在客户端完成初始化后,向MCP客户端输入具体请求。客户端将此前获取的工具列表与用户输入内容相结合,共同组成用于询问LLM的提示词。

  3. 工具传递方式选择 MCP客户端通过两种方式之一将提示词传递给LLM:

    1. 方式1:使用Function Call(函数调用)直接携带工具列表信息;

    2. 方式2:在系统提示词(System Prompt)中包含工具列表。

  4. LLM判断与响应 LLM接收到提示词后,返回判断结果:

    1. 无需工具:LLM直接将处理结果通过MCP客户端回复给用户;

    2. 需要工具:LLM先向客户端返回所需工具的参数格式要求。

  5. 工具命令生成与执行 若需要工具,MCP 客户端根据 LLM 提供的参数格式,以及 MCP Server 配置的命令模板进行拼接,生成完整的可执行命令,并在本地环境(Local_Env)中执行该命令。

  6. 结果处理与输出 本地环境执行命令后,将结果返回给 MCP 客户端。客户端将执行结果提交给 LLM,由 LLM 对技术化的执行结果进行处理,最终以人性化的语言形式输出给用户。

四、使用 MCP 分析大规模表格

4.1 VsCode + Cline

在 VsCode 插件市场搜索,Cline 找到后点击安装即可(注意这里还有很多非官方的版本,直接安装那个下载量最大的就好):

配置大模型(这里我用的deepseek测试,效果不错)

4.2 在 Cline 中配置 table-reader(server)

在服务器上任一位置获取table-reader服务代码

复制代码
git clone https://gitee.com/thomacai/table_reader.git

安装依赖

复制代码
cd table_reader
uv sync

注:这里使用uv工具,如果没有则安装

复制代码
curl -LsSf https://astral.sh/uv/install.sh | sh

试运行

复制代码
uv run python table_reader.py

这里能启动就行,然后关闭即可。

然后再cline上配置table-reader服务

复制代码
{
  "mcpServers": {
    "table-reader": {
      "autoApprove": [
        "get_table_info",
        "read_table_rows"
      ],
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "uv",
      "args": [
        "run",
        "table_reader.py"
      ],
      "cwd": "/home/XXX/XXX/codes/table_reader"
    }
  }
}

4.3 在cline上使用这个mcp

确保使用了这个mcp:

以及打开读取文件和使用mcp的权限:

最后执行:

调用 table-reader 读取 /home/XXX/codes/table_reader/data/test2.xls 这个表格,并分析要读取多少行能得知表格中涉及的字段以及总结摘要,然后把要读取的行数分成多段并读取(较为保守的方式,建议每100行读一次且最多不超过300行,保证不超过大模型的上下文窗口token) 分别总结各段的字段和摘要 最后合并起来给出 总的字段详情 和 摘要 以及 总行数。

得到结果:

4.4 MCP的局限性

  • 提示词要引导大模型"分批读取表格数据",避免一次性让模型处理过大的数据量。若一次输入接近或超过模型上下文窗口,极容易触发报错,并导致 MCP 客户端直接崩溃。

  • 使用 MCP 后 Token 耗费会显著上升------因为许多 MCP 客户端本身依赖大量系统提示词来维持与 MCP 工具的通信,所以在 MCP 模式下的每一次调用,都天然包含更重的系统级上下文。

五、参考资料

  1. MCP官方服务:

https://modelcontextprotocol.io/docs/develop/build-server#claude-for-desktop-integration-issues

(仅支持uv直接启动mcp服务)

  1. mcp基础知识:

https://mp.weixin.qq.com/s?__biz=Mzk0MDMwMzQyOA==\&mid=2247503333\&idx=1\&sn=6f81fccb7bc19b3a18b4c590f055d757\&scene=21\&poc_token=HMa2CmmjVIQ0hJqkdDVfUGwY7O0bTVuKqrVXXiP-

  1. mcp核心原理:

https://mp.weixin.qq.com/s/yP6D_mnxwFsL3SbC4qZnYg

相关推荐
硅谷秋水6 小时前
LLM的测试-时规模化:基于子问题结构视角的综述
人工智能·深度学习·机器学习·语言模型
Boxsc_midnight6 小时前
【规范驱动的开发方式】之【spec-kit】 的安装入门指南
人工智能·python·深度学习·软件工程·设计规范
爱笑的眼睛116 小时前
深入解析PyTorch nn模块:超越基础模型构建的高级技巧与实践
java·人工智能·python·ai
人工智能AI技术6 小时前
【SD教程】提示词
人工智能·stable diffusion·aigc·ai绘画
2401_841495646 小时前
【自然语言处理】自然语言理解:从技术基础到多元应用的全景探索
人工智能·python·自然语言处理·语音助手·翻译工具·自然语言理解·企业服务
一个处女座的程序猿6 小时前
AI之Tool:Next AI Draw.io的简介、安装和使用方法、案例应用之详细攻略
人工智能·draw.io
Sol-itude7 小时前
强化学习——PPO、DPO、GRPO的原理推导
人工智能·机器学习
阿杰学AI7 小时前
AI核心知识52——大语言模型之Model Quantization(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·模型量化·ai-native
Dev7z7 小时前
基于MATLAB的零件表面缺陷检测系统设计与实现
开发语言·人工智能·matlab