文章目录第一MCP是什么为什么它被称为“AI的USB-C接口”从一个问题说起什么是MCP为什么我们需要MCPMCP的核心架构MCP能做什么第二深入MCP核心——Resources、Tools与Prompts三者速览谁控制谁Resources资源让AI“知道”什么Tools工具让AI“做”什么Prompts提示引导AI“怎么”做三者如何协同工作第三动手搭建你的第一个MCP服务器——从代码到实战准备工作编写第一个MCP服务器测试你的服务器接入AI客户端最佳实践与注意事项结语第一MCP是什么为什么它被称为“AI的USB-C接口”从一个问题说起想象这样一个场景你正在VS Code里用AI助手写代码随口问了一句“PR #72的状态是什么”AI助手信心满满地给出了一个答案——听起来很合理但其实是错的因为它根本无法直接访问GitHub获取实时信息。这不是AI不够聪明而是它被“关在”了一个信息孤岛里。大语言模型LLM的能力再强如果无法连接到外部工具和数据源它的作用就大打折扣。而过去几年开发者们一直在用各种“土办法”来解决这个问题为每个AI应用、每个数据源单独写集成代码费时费力重复劳动严重。模型上下文协议Model Context Protocol简称MCP正是为了解决这个问题而诞生的。什么是MCPMCP是由Anthropic公司在2024年11月推出并开源的一种开放标准。它的核心目标很简单标准化AI应用与外部数据源、工具之间的交互方式。通俗地说MCP就像给AI应用装了一个“通用插口”。无论你是想让AI读取本地文件、查询数据库、调用API还是操作各种软件工具只要这些工具和数据源也支持MCPAI就能“即插即用”。正因如此MCP被广泛称为**“AI的USB-C接口”**。就像USB-C统一了各种电子设备的连接方式一样MCP要统一AI与外部世界的连接方式。为什么我们需要MCP在MCP出现之前AI应用的集成方式可以用一个词概括碎片化。每个AI应用比如Claude Desktop、ChatGPT、各种Agent框架要为每个工具和数据源编写专门的集成代码。如果有N个AI应用要对接M个数据源就需要开发N×M个不同的连接方案——这就是所谓的“N×M问题”。这不仅带来了巨大的重复劳动还导致系统扩展性差每接入一个新工具就要重新开发维护成本高接口一变就要到处改安全性和一致性难以保障而MCP的出现把N×M的问题简化成了NMAI应用只需要支持MCP协议数据源也只需要暴露MCP接口两者就能自动连通。MCP的核心架构MCP采用的是客户端-服务器Client-Server架构整个体系包含三个核心角色1. MCP主机Host希望访问外部数据的AI应用比如Claude Desktop、VS Code、Cursor等。2. MCP客户端Client运行在主机内部与MCP服务器保持1对1连接负责协议的通信。3. MCP服务器Server一个轻量级程序通过MCP协议对外暴露特定的功能——比如读取数据库、调用API、操作文件等。当你在AI应用里提出一个请求时流程大致是这样的主机将你的自然语言问题转化为语义请求客户端将其打包为标准的MCP请求服务器从对应的数据源获取真实数据以结构化格式返回整个过程对用户来说是完全透明的——你只需要用自然语言提问AI就能自动获取所需信息并给出回答。MCP能做什么MCP的想象空间很大。官方文档列举了几个典型场景个人助理AI可以访问你的Google日历和Notion成为一个真正了解你日程的智能助手设计开发Claude Code可以根据Figma设计稿直接生成完整的Web应用企业数据分析企业聊天机器人可以连接组织内的多个数据库用户通过聊天就能完成数据分析跨领域操作AI模型可以在Blender中创建3D设计并直接通过3D打印机打印出来在实际应用中开发者已经用MCP构建了各种有趣的功能。比如在Cursor这个代码编辑器里你可以通过Slack MCP服务器把它变成Slack客户端或者通过邮件MCP服务器直接发送邮件——你不需要离开自己的工作环境就能完成各种跨应用的任务。第二深入MCP核心——Resources、Tools与Prompts了解了MCP的宏观概念后我们来深入它的能力内核。MCP的魔力来源于三个核心原语PrimitivesResources资源、Tools工具和Prompts提示。这三个原语分别对应了AI与外部世界交互的三种基本方式读取信息、执行操作、引导对话。三者速览谁控制谁在深入细节之前先看一张官方给出的对比表格原语控制方描述示例Prompts用户控制由用户选择的交互式模板斜杠命令、菜单选项Resources应用控制由客户端附加和管理的上下文数据文件内容、Git历史Tools模型控制暴露给LLM执行操作的函数API POST请求、文件写入这个“控制层级”非常关键——它决定了谁来决定什么时候使用什么。接下来我们逐一拆解。Resources资源让AI“知道”什么Resources是MCP中用于向AI提供只读数据的原语。简单说就是让AI能够“看到”某些信息但不能修改它们。核心特点只读Read-only、由URI唯一标识、应用控制典型场景本地文件内容、数据库表结构、Git提交历史、API文档说明Resources是被动的——它们静静地躺在那里等待被读取不会主动做任何事情。Tools工具让AI“做”什么如果说Resources是让AI“知道”那Tools就是让AI“行动”。Tools是MCP中用于执行操作、产生副作用的原语。核心特点可执行Executable、有副作用Side Effects、由LLM自主决定调用、需要参数Schema典型场景调用外部API、写入或修改文件、执行数据库操作、触发业务流程Tools是主动的——它们被调用时真的会“做事”。Prompts提示引导AI“怎么”做Prompts是MCP中用于预定义对话模板和指令的原语。它们不直接读取数据也不执行操作而是告诉AI“在这种场景下应该怎么做”。核心特点模板化Template-based、纯数据Pure Data、由用户主动触发、提供指导框架典型场景代码审查流程/review-pr、项目日报生成/daily-report、特定领域的分析模板Prompts是指导性的——它们不亲自做事但告诉AI“按照这个套路来”。三者如何协同工作理解了三者各自的角色我们来看一个完整的协作示例假设你正在开发一个项目对AI说“帮我审查一下PR #72的代码变更。”Resources发挥作用AI通过MCP服务器读取PR #72的代码变更内容只读数据Prompts发挥作用你输入了/review-pr命令一个预定义的审查流程Prompt被加载告诉AI应该从哪些维度进行审查Tools发挥作用AI根据Prompt的指引调用各种Tool——可能是check_style检查代码规范、scan_vulnerabilities扫描安全漏洞最后post_comment把审查结果发布到PR上整个过程行云流水Resources提供数据Prompts提供方法Tools执行操作。第三动手搭建你的第一个MCP服务器——从代码到实战理论讲完了这一篇我们来动手。从零搭建一个属于自己的MCP服务器并让AI助手真正能够“调用外部工具”。准备工作请确保你的环境满足以下条件Python 3.10或更高版本uv推荐的Python包管理工具安装uv——这是一个快速的Python包管理工具curl-LsSfhttps://astral.sh/uv/install.sh|sh创建项目并安装依赖mkdirweather-mcp-servercdweather-mcp-server uv init.uvaddmcp[cli]httpx编写第一个MCP服务器创建一个文件weather.py写入以下代码importhttpxfrommcp.server.fastmcpimportFastMCP# 创建MCP服务器实例mcpFastMCP(Weather Server)# 定义工具1获取天气预警mcp.tool()asyncdefget_alerts(state:str)-str:获取指定州的天气预警信息urlfhttps://api.weather.gov/alerts/active?area{state}asyncwithhttpx.AsyncClient()asclient:responseawaitclient.get(url,timeout30.0)response.raise_for_status()dataresponse.json()ifnotdata.get(features):return当前没有活跃的天气预警alerts[f【{alert[properties][headline]}】foralertindata[features]]return\n.join(alerts)# 定义工具2获取天气预报mcp.tool()asyncdefget_forecast(latitude:float,longitude:float)-str:获取指定经纬度的天气预报# 先获取气象站信息points_urlfhttps://api.weather.gov/points/{latitude},{longitude}asyncwithhttpx.AsyncClient()asclient:responseawaitclient.get(points_url,timeout30.0)response.raise_for_status()dataresponse.json()forecast_urldata[properties][forecast]# 再获取预报数据asyncwithhttpx.AsyncClient()asclient:responseawaitclient.get(forecast_url,timeout30.0)response.raise_for_status()dataresponse.json()periodsdata[properties][periods][:5]forecasts[f{p[name]}:{p[detailedForecast]}forpinperiods]return\n\n.join(forecasts)# 启动服务器if__name____main__:mcp.run(transportstreamable-http)这段代码做了三件事创建服务器实例、通过mcp.tool()装饰器将函数变成AI可调用的工具、启动服务器。注意函数签名中的类型注解和文档字符串——它们会被自动解析为工具的输入参数描述和功能说明。测试你的服务器先用MCP Inspector进行测试——这是官方提供的交互式调试工具。首先启动服务器uv run weather.py然后在另一个终端窗口运行Inspectornpx-ymodelcontextprotocol/inspector浏览器会自动打开localhost:6274你可以在Tools面板中看到刚刚定义的两个工具直接运行它们就能验证功能是否正常。接入AI客户端以接入Claude Desktop为例找到配置文件macOS:~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:%APPDATA%\Claude\claude_desktop_config.json添加配置{mcpServers:{weather:{command:uv,args:[--directory,/path/to/your/weather-mcp-server,run,weather.py]}}}重启Claude Desktop你就可以在对话中让AI查询天气了——比如问“加州现在有什么天气预警”AI会自动调用工具获取实时数据并回答你。最佳实践与注意事项在实际开发中有几个要点值得注意1. 日志处理要小心如果你的服务器使用STDIO传输模式千万不要向stdout打印任何内容——这会破坏MCP的JSON-RPC消息通信。正确的做法是使用stderr或专门的日志库。2. 工具设计要清晰为每个工具编写清晰的文档字符串——它会被LLM用来理解工具的用途使用类型注解明确输入参数的类型工具的名称要直观让AI能准确判断何时该调用哪个工具3. 安全第一MCP服务器本质上是在给AI“打开一扇通往外部世界的门”。务必注意最小权限原则服务器只暴露必要的功能输入验证对来自LLM的所有参数进行校验敏感操作需人工确认对于写入、删除等操作建议增加确认机制4. 选择合适的传输模式模式适用场景特点STDIO本地开发、桌面应用简单直接通过标准输入输出通信Streamable HTTP云端部署、远程调用支持网络访问便于扩展和容器化结语回顾整个系列我们从三个层面完整地认识了MCP概念层面MCP是“AI的USB-C接口”通过标准化协议解决了AI应用与外部工具集成的碎片化问题原语层面Resources知道、Tools行动、Prompts怎么行动三大原语构建了MCP的能力基石实践层面通过Python和FastMCP我们可以轻松搭建自己的MCP服务器并将其接入主流AI客户端