AI AinoCode AI 工具与基础设施
AI教程 6 分钟

MCP 生态全景图 + 实战:30 分钟搭建你的第一个 MCP Server

从架构到工具选型再到手把手教程,一文搞懂 MCP 协议在 2026 年的现状和用法

AinoCode 编辑部

MCP 生态全景图

MCP 生态全景图 + 实战:30 分钟搭建你的第一个 MCP Server

2024 年 Anthropic 提出 MCP(Model Context Protocol)的时候,很多人觉得又是一个大厂标准。一年后回头来看,MCP 已经是 2026 年 AI Agent 生态里最重要的基础设施之一了。

GitHub 上标了 mcp 标签的仓库超过 8000 个。Claude Desktop、Cursor、Windsurf、Hermes Agent、OpenClaw,几乎所有主流 AI 工具都原生支持 MCP。从 GitHub 搜索到数据库查询,从飞书通知到智能家居控制,MCP Server 的覆盖范围已经远超最初的设计预期。

但问题也来了。MCP Server 这么多,质量参差不齐,文档质量更是天差地别。怎么选?怎么用?怎么自己写一个?

这篇就是答案。


MCP 到底是什么,用最简单的话说

MCP 就是一个标准化协议,让 AI 模型能调用外部工具。

在这之前,每个 AI 工具都有自己的工具调用方式。Claude 有一套 API,ChatGPT 有一套 API,每个 Agent 框架又有一套。开发者想让自己的工具被多个 AI 平台调用,得写好几套适配代码。

MCP 的思路是,搞一个统一标准。你写一个 MCP Server,所有支持 MCP 的客户端都能调用。写一次,到处用。

技术上,MCP 基于 JSON-RPC 2.0,通信层支持 stdio(本地进程)和 HTTP/SSE(远程服务)两种模式。Server 暴露三样东西:Tools(可调用的函数)、Resources(可读取的数据源)、Prompts(预定义的交互模板)。


2026 年 MCP 生态地图

我把目前主流的 MCP Server 按功能分了类,挑了每个类别里最成熟的几个。

开发工具类

  • GitHub MCP Server(官方维护,12k+ stars):搜索仓库、读取 Issue、创建 PR、管理 Actions。这是生态里使用率最高的 Server 之一。
  • Filesystem MCP Server(官方参考实现):读写本地文件、目录操作。几乎所有桌面 AI 工具的标配。
  • Git MCP Server:Git 操作封装,支持 diff、log、branch 管理等。Cursor 和 Windsurf 深度集成。

数据类

  • PostgreSQL MCP Server:SQL 查询接口。支持只读模式和 schema 自省,AI 可以自动发现表结构并生成查询。
  • Puppeteer MCP Server:浏览器自动化。网页截图、内容提取、表单填写。做网页数据抓取特别好用。
  • Google Drive MCP Server:文件搜索、读取、上传。企业知识库场景的标配。

通信类

  • Slack MCP Server:频道消息、DM、文件上传。
  • 飞书 MCP Server(社区维护):消息收发、日程管理、审批流触发。国内团队用得很多。
  • Email MCP Server:IMAP/SMTP 封装,读取和发送邮件。

AI 基础设施类

  • Brave Search MCP Server:联网搜索。Claude Desktop 默认的搜索工具。
  • Fetch MCP Server:网页内容提取。把 URL 变成 LLM 能理解的文本。
  • Sequential Thinking MCP Server:让 AI 做多步推理的”元工具”。AI 可以自己调用它来拆分复杂任务。

质量评估:哪些值得用,哪些别碰

生态大了,质量自然参差不齐。我自己用了大概 30 多个 MCP Server,总结出几条判断标准。

值得用的特征:

  1. 有明确的 schema 定义(JSON Schema),不是让 AI 猜参数格式
  2. 错误处理完善,返回结构化的错误信息而不是直接崩溃
  3. 有 rate limiting 或请求队列,不会把下游 API 打挂
  4. 文档里有实际使用示例,不仅仅是 API 参考

最好别碰的特征:

  1. eval() 执行用户输入的代码
  2. 没有权限控制,MCP Server 能访问你的所有文件系统
  3. 没有超时机制,一个慢查询卡死整个 AI 对话
  4. 仓库三个月没更新,issue 里一堆未解决的 bug

坦率地讲,GitHub 上至少有一半的 MCP Server 属于”作者自己能用,别人用就崩”的状态。选的时候一定看 issue 列表和最近 commit 时间。


实战:30 分钟搭建一个 MCP Server

光说不练没意义。接下来我们从头写一个 MCP Server。

目标:一个「系统监控 MCP Server」,让 AI 能查询服务器的 CPU、内存、磁盘使用情况,以及运行中的进程列表。

技术栈:Python + MCP Python SDK

第一步:环境准备

mkdir system-monitor-mcp && cd system-monitor-mcp
python -m venv .venv && source .venv/bin/activate
pip install mcp psutil

mcp 是官方的 Python SDK,psutil 是系统信息获取库。

第二步:写 Server 代码

创建一个 server.py

from mcp.server.fastmcp import FastMCP
import psutil
import platform
from datetime import datetime

mcp = FastMCP("System Monitor")

@mcp.tool()
def get_cpu_info() -> str:
    """获取当前 CPU 使用率和核心数"""
    cpu_percent = psutil.cpu_percent(interval=1)
    cpu_count = psutil.cpu_count()
    cpu_freq = psutil.cpu_freq()
    freq_str = f"{cpu_freq.current:.0f}MHz" if cpu_freq else "未知"
    
    return (
        f"CPU 使用率: {cpu_percent}%\n"
        f"核心数: {cpu_count}\n"
        f"当前频率: {freq_str}\n"
        f"负载(1/5/15min): {psutil.getloadavg()}"
    )

@mcp.tool()
def get_memory_info() -> str:
    """获取内存使用情况"""
    mem = psutil.virtual_memory()
    swap = psutil.swap_memory()
    
    return (
        f"总内存: {mem.total / 1024**3:.1f} GB\n"
        f"已使用: {mem.used / 1024**3:.1f} GB ({mem.percent}%)\n"
        f"可用: {mem.available / 1024**3:.1f} GB\n"
        f"Swap 使用: {swap.percent}%"
    )

@mcp.tool()
def get_disk_info() -> str:
    """获取磁盘使用情况"""
    lines = []
    for partition in psutil.disk_partitions():
        try:
            usage = psutil.disk_usage(partition.mountpoint)
            lines.append(
                f"{partition.device} ({partition.mountpoint}): "
                f"总计 {usage.total / 1024**3:.0f}GB, "
                f"已用 {usage.used / 1024**3:.0f}GB, "
                f"可用 {usage.free / 1024**3:.0f}GB, "
                f"使用率 {usage.percent}%"
            )
        except PermissionError:
            continue
    return "\n".join(lines)

@mcp.tool()
def get_top_processes(limit: int = 10) -> str:
    """获取占用资源最多的进程"""
    processes = []
    for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
        try:
            processes.append(proc.info)
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue
    
    processes.sort(key=lambda x: x.get('cpu_percent', 0) or 0, reverse=True)
    
    lines = [f"{'PID':<8} {'名称':<20} {'CPU%':<8} {'内存%':<8}"]
    for proc in processes[:limit]:
        lines.append(
            f"{proc['pid']:<8} "
            f"{(proc['name'] or ''):<20} "
            f"{(proc['cpu_percent'] or 0):<8.1f} "
            f"{(proc['memory_percent'] or 0):<8.1f}"
        )
    return "\n".join(lines)

@mcp.resource("system://info")
def system_info() -> str:
    """系统基本信息(作为资源暴露)"""
    return (
        f"操作系统: {platform.system()} {platform.release()}\n"
        f"主机名: {platform.node()}\n"
        f"架构: {platform.machine()}\n"
        f"Python: {platform.python_version()}\n"
        f"时间: {datetime.now().isoformat()}"
    )

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

代码量不到 80 行。每个函数就是一个 Tool,函数 docstring 会被 MCP 自动提取作为工具描述,告诉 AI 这个工具是干什么的。

@mcp.tool() 装饰器负责注册工具。@mcp.resource() 装饰器负责注册资源。Tools 是 AI 可以主动调用的函数,Resources 是 AI 可以读取的数据。

第三步:配置客户端

以 Claude Desktop 为例,在配置文件中添加:

{
  "mcpServers": {
    "system-monitor": {
      "command": "python",
      "args": ["/path/to/server.py"],
      "env": {}
    }
  }
}

如果是 Hermes Agent,在 mcp.yaml 中添加:

servers:
  system-monitor:
    command: python
    args:
      - /path/to/server.py

第四步:测试

启动 Claude Desktop(或其他 MCP 客户端),然后试试这些对话:

“我的服务器 CPU 使用率多少?内存还剩多少?”

AI 会自动调用 get_cpu_infoget_memory_info 两个工具,然后把结果用自然语言告诉你。

“列出占用 CPU 最多的 5 个进程”

AI 调用 get_top_processes(limit=5),拿到数据后格式化输出。

“系统基本信息是什么?”

AI 读取 system://info 资源,返回系统信息。

就这么简单。


进阶:把 MCP Server 部署为远程服务

上面的例子是本地 stdio 模式。如果你想让多个客户端共享一个 MCP Server,可以部署为 HTTP 模式。

只需要改一行代码:

if __name__ == "__main__":
    mcp.run(transport="sse")  # 改为 SSE 传输

启动后 Server 会监听 8000 端口。客户端配置改为:

{
  "mcpServers": {
    "system-monitor": {
      "url": "http://your-server:8000/sse"
    }
  }
}

生产环境建议加两层保护。第一层,身份验证。MCP SDK 支持自定义 middleware,可以在 HTTP 层加 API key 验证。第二层,权限控制。不是所有工具都对外开放,敏感操作(比如 get_top_processes)可以设置白名单。


MCP Server 的开发建议

写了好几个 MCP Server 之后,我总结了几个实用的建议。

1. 工具描述比代码质量更重要。 AI 是靠工具描述(docstring)来决定调用哪个工具的。描述写得模糊,AI 就不知道什么时候该用这个工具。每条描述应该包含:做什么、需要什么参数、返回什么格式的数据。

2. 错误处理要结构化。 不要只抛异常。AI 需要知道”调用失败了”和”调用成功了但返回空数据”的区别。返回结构化的错误信息,AI 才能据此做下一步决策。

3. 不要在一个 Server 里塞太多工具。 我见过一个 MCP Server 暴露了 50+ 个工具,AI 每次都要在几十个工具里做选择,出错率直线上升。按功能拆分,每个 Server 专注一个领域,5-10 个工具最佳。

4. 返回值要精简。 LLM 的 context window 是有限的。如果你返回 10MB 的日志文件,AI 根本消化不了。默认只返回关键信息,提供可选的 verbose 参数让用户决定要不要详细信息。

5. 加缓存。 很多工具的结果在短时间内不会变化(比如磁盘使用率、系统信息)。加一个 TTL 缓存,减少重复调用。MCP SDK 没有内置缓存,但可以用 functools.lru_cache 自己加。


写在最后

MCP 协议在 2026 年已经从一个实验性的标准变成了 AI 工具生态的基础设施。它解决的问题很实际,让 AI 工具和外部系统的对接标准化了。

写一个 MCP Server 的门槛很低。80 行 Python 代码就能让 AI 获得查询系统信息的能力。但写好一个 MCP Server 需要功力,工具描述的设计、错误处理的完善、权限控制的严谨,这些才是区分”能用的 Server”和”好用的 Server”的关键。

MCP 的生态还在快速扩张中。谁能写出最实用的 MCP Server,谁就能在 AI Agent 时代占据一席之地。这个赛道目前还是蓝海。