从零读懂MCP:AI的“万能插座”是什么?怎么造?和Agent、Skill啥关系?

8 阅读7分钟

MCP(Model Context Protocol,模型上下文协议)。MCP其实解决了一个非常实在的问题:怎么让AI大模型像用USB-C接口一样,轻松连接数据库、文件系统、各种API,甚至指挥其他AI干活

我从最基础的“MCP是什么”讲起,一步步带你理解它的工作原理,亲手造一个MCP服务器,再聊聊当MCP缺功能时怎么办,以及它和Agent、Skill这些热门概念到底什么关系。全文干货,建议先收藏再细看。


一、MCP是什么?——AI世界的“USB-C接口”

先问一个问题:现在的AI大模型(比如GPT-4、Claude)已经很能聊了,但如果你想让它查一下公司内部数据库的订单,或者读取你电脑上的Excel文件并做分析,怎么办?

传统做法是:为每一个需求写一段特定的代码(比如用函数调用、写API接口),然后集成到AI应用里。这就好比你家的电视、冰箱、空调各自需要一个专用的遥控器,换一个设备就得换一个遥控器,非常麻烦。

MCP要做的事,就是给AI造一个“万能遥控器”——或者说“USB-C接口”。

  • MCP = 标准化的通信协议,定义了AI(作为客户端)和外部工具/数据源(作为服务器)之间怎么对话。
  • MCP服务器:一个轻量级程序,把某个具体功能(比如“读文件”“查天气”“连数据库”)包装成标准接口。
  • MCP客户端:内嵌在AI应用(如Claude Desktop、Cursor)里,负责和服务器通信。

这样一来,AI只需要学会一种“语言”,就能调用成千上万个MCP服务器提供的功能。解耦是它的灵魂。


二、MCP是怎么工作的?——一次标准RPC调用

看一张最简单的流程图(脑补一下):

  1. 用户:在AI聊天框输入“帮我查一下北京今天的天气”。
  2. AI主机(如Claude Desktop):大模型分析后,决定调用一个叫get_weather的工具。
  3. MCP客户端:构造一个JSON-RPC请求,发送给对应的MCP服务器。
    {
      "method": "tools/call",
      "params": {
        "name": "get_weather",
        "arguments": { "city": "Beijing" }
      }
    }
    
  4. MCP服务器:收到请求,执行真正的天气API调用,拿到数据。
  5. 服务器返回结果:同样以标准格式返回。
  6. AI生成回答:“北京今天晴天,25℃,空气质量良。”

核心原语(MCP定义的三种基本操作):

  • Resources:暴露数据(只读,比如文件内容)。
  • Tools:暴露可执行的函数(可读写,比如发送邮件)。
  • Prompts:预定义的模板,引导AI完成特定流程。

通过这三种原语,MCP覆盖了绝大多数“AI需要外部能力”的场景。


三、怎么做一个MCP服务器?——10分钟从零上手

光说不练假把式。我们以Node.js + TypeScript为例,写一个最简单的MCP服务器,功能只有一个:跟人打招呼。顺便附上Python版本,任君挑选。

步骤1:环境准备

mkdir my-mcp-server && cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install -D @types/node typescript

步骤2:配置TypeScript(tsconfig.json

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "Node16",
    "moduleResolution": "Node16",
    "outDir": "./build",
    "rootDir": "./src",
    "strict": true
  }
}

步骤3:写代码(src/index.ts

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

const server = new McpServer({
  name: "greeting-server",
  version: "1.0.0",
});

// 定义一个工具
server.tool("say_hello", { name: z.string() }, async ({ name }) => ({
  content: [{ type: "text", text: `Hello ${name}! 欢迎进入MCP世界。` }],
}));

async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("Greeting server running");
}
main();

步骤4:编译和测试

npx tsc
npx @modelcontextprotocol/inspector node build/index.js

浏览器打开弹出的地址,你就能在可视化界面里调用say_hello工具了。

Python版(更简洁)

from fastmcp import FastMCP

mcp = FastMCP("greeting")

@mcp.tool()
def say_hello(name: str) -> str:
    return f"Hello {name}!"

if __name__ == "__main__":
    mcp.run()

运行:fastmcp run server.py

集成到Claude Desktop:编辑claude_desktop_config.json,加上你的服务器路径即可。就是这么简单。


四、MCP缺我需要的功能怎么办?——三板斧

你可能会问:“我想要的功能,没有现成的MCP服务器怎么办?” 三种解决方案:

1. 先找现成的

MCP生态发展很快,官方和社区已经有大量服务器:

  • GitHub MCP Registry:官方目录。
  • MCPZoo / MCPAnvil:社区收录的上千个服务器,分类齐全。
  • mcp-recommender:用自然语言搜索,比如输入“postgres数据库”,它给你推荐合适的MCP服务器。

2. 自己动手造

按照上一节的教程,把你需要的功能封装成一个新的MCP服务器。只要是你能写代码实现的功能(调用API、读数据库、执行Shell命令),就能变成MCP工具。

3. 把现有的Web服务/API“包”成MCP

如果你已经有一个REST API或者内部Web服务,不需要重写逻辑。写一个薄薄的MCP适配层,把HTTP请求转换成MCP协议。可以用Higress + Nacos这类方案做到零改造接入。

核心思想:MCP不是封闭的,它是可扩展的。缺什么,补什么。


五、Agent和MCP怎么结合?——大脑指挥手脚

有了MCP这个“万能接口”,AI就能调用工具了。但谁来决定什么时候调用什么工具、以什么顺序调用?这就是Agent的活了。

  • Agent = 自主决策的AI:它负责理解用户的高层目标,拆解成子任务,规划调用哪些MCP工具,并根据结果决定下一步。
  • MCP = 执行具体动作的“手脚”:每个MCP服务器只干一件简单的事(比如“搜索文件”“发送HTTP请求”)。

一个典型的多步任务

用户:“分析一下当前目录下所有日志文件,找出ERROR最多的前3个,然后生成一份报告发到我邮箱。”

Agent会:

  1. 调用filesystem MCP:列出所有.log文件。
  2. 调用grep MCP或自己读取文件内容,统计ERROR数量。
  3. 调用email MCP:发送报告。

Agent负责编排,MCP负责执行

快速上手:用mcp-agent框架

from mcp_agent.app import MCPApp
from mcp_agent.agents.agent import Agent

app = MCPApp(name="my_agent")

async def main():
    async with app.run():
        agent = Agent(
            name="analyst",
            instruction="分析日志文件并发送邮件",
            server_names=["filesystem", "email"]
        )
        # ... 调用agent执行任务

你也可以把另一个Agent包装成MCP工具,实现Agent-to-Agent协作——主Agent调用子Agent完成子任务,类似人类团队分工。


六、MCP和Skill有什么区别?——工具箱 vs 说明书

很多人分不清MCP和最近同样很火的Agent Skill(比如Claude的Skill、OpenAI的Custom Instructions进阶版)。我用一个比喻帮你厘清:

维度MCPSkill
类比工具箱里的扳手、螺丝刀贴在墙上的维修手册
作用提供原子能力:读文件、发请求、查数据库提供流程指导:当遇到X情况时,先做A,再做B,如果C则D
形式独立运行的服务(需要写代码)通常是Markdown文件 + 可选的脚本
上下文占用所有工具描述一次性加载,容易撑爆上下文渐进式加载,只暴露必要信息,省Token
典型例子fetch(抓网页)、postgres(查数据库)“安全告警调查步骤”“代码审查检查清单”
谁执行MCP服务器执行具体操作AI按照Skill里的指引去调用各种MCP工具

一句话总结:MCP是“能干什么”,Skill是“应该怎么干”。

实际应用中,两者强强联手:一个Skill可以写明“处理客户退款时,先调用order_db MCP查询订单,再调用payment_gateway MCP执行退款,最后调用crm MCP记录工单”。Skill把领域知识固化下来,让AI不再瞎发挥;MCP则提供了可执行的能力


七、写在最后:MCP的未来

MCP问世不到一年,但已经显露出成为AI基础设施的潜力。它解决的不是一个炫酷的功能,而是一个底层互联问题——就像USB-C统一了外设接口,HTTP统一了Web通信。未来,任何AI应用都可以通过MCP即插即用地获得海量外部能力。

对于开发者来说,学习MCP的门槛并不高(一个周末足够了),但回报可能很大:你可以把自己的服务变成AI生态中的“标准件”,被成千上万个Agent调用。