MCP:AI 的「万能插头」

人工智能世界在不断发展,我们几乎每天都能听到新的新闻。我们现在需要学习的是 MCP(模型上下文协议)。 在了解它是什么及其用途之前,先来看看协议的含义。

在探索模型上下文协议(MCP)之前,我们需要理解其技术前身——函数调用(Function Call)机制。这一概念的演变过程揭示了AI系统交互能力的发展轨迹。

Function Call

传统的AI大模型犹如一位掌握丰富知识但被困在围墙内的学者,无法主动获取外界最新信息或操作外部系统。这种局限性在需要实时数据或专业工具支持的场景中表现得尤为明显,比如无法直接查询数据库中的最新记录或调用专业计算工具。

Function Call 是 OPEN AI 在 2023 年推出的一个非常重要的概念:

图片

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

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

这种机制在各类AI平台(如Coze)中已普遍应用,其插件系统本质上就是基于Function Call原理构建的:

图片

这个能力确实是挺好的,给了大模型更多的可能性,然而,这项技术在实际应用中暴露出明显的局限性。首先是严重的模型依赖性,不同厂商的模型实现方案各不相同,开发者需要针对GPT、Claude、DeepSeek等不同模型分别进行适配。并且需要模型本身能够稳定支持 Function Call 的调用。这也就意味着模型本身需要进行过专门的 Function Call 调用微调才能稳定支持这种能力。

另外还有一个比较大的问题,OPEN AI 最开始提出这项技术的时候,并没有想让它成为一项标准,所以虽然后续很多模型也支持了 Function Call 的调用,但是各自实现的方式都不太一样。

这也就意味着,如果我们要发开一个 Function Call 工具,需要对不同的模型进行适配,比如参数格式、触发逻辑、返回结构等等,这个成本是非常高的。

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

从技术特征来看,Function Call具有模型专属、即时触发和简单直接三大特点。不同模型的调用规则各不相同,系统会在识别用户意图后立即触发工具调用,这种机制特别适合单一功能场景。但由此带来的协议碎片化问题不容忽视,开发者需要为每个模型单独开发适配层,新增工具往往需要重新训练模型或调整接口,这种状况恰似智能手机充电接口的混乱局面——不同品牌采用不同标准(如Lightning和USB-C),导致设备间无法通用。

这种技术困境催生了模型上下文协议(MCP)的诞生,其设计初衷正是要解决Function Call面临的标准化难题,为AI系统与外部工具的交互建立统一规范。

核心特点

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

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

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

痛点

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

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

类比

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

什么是MCP?

Function Call 虽然开创了 AI 与外部系统交互的先河,但其实现方式存在明显的工程瓶颈。每当需要对接新的数据源或工具时,开发者都必须投入大量精力编写特定的对接代码,这个过程不仅繁琐,还容易引入错误。这种重复劳动严重制约了 AI 应用的开发效率。

什么是 MCP?

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

最初,MCP 仅获得 Claude 客户端的支持,只有 Claude 客户端支持,大家也没把它当回事,但是后续由于 Cursor的支持,各种插件和工具也开始陆续提供支持;再加上最近 AI Agent 被 Manus 这个 “概念” 工具给炒的非常火热,让 MCP 逐步开始走进大众视野,直到最近,OPEN AI 也宣布对 MCP 提供了支持:

图片

这让我真正的感觉到,MCP 真的做到了,它已经成为 AI 工具调用的 “行业标准”。

MCP Host,比如 Claude Desktop、Cursor 这些工具,在内部实现了 MCP Client,然后 MCP Client 通过标准的 MCP 协议和 MCP Server 进行交互,由各种三方开发者提供的 MCP Server 负责实现各种和三方资源交互的逻辑,比如访问数据库、浏览器、本地文件,最终再通过 标准的 MCP 协议返回给 MCP Client,最终在 MCP Host 上展示。

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

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

核心特点

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

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

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

核心价值,解决三大问题

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

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

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

类比

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

什么是协议?

在计算机世界中,协议是决定两个系统如何相互通信的一系列规则。协议规范计算机网络、互联网通信和软件系统之间的数据传输。

例如:

  • HTTP(超文本传输协议):允许网站与浏览器通信。

  • TCP/IP(传输控制协议/互联网协议): 定义互联网上数据包的路由方式。

  • JSON-RPC(远程过程调用): 一种允许以 JSON 格式交换数据的协议。

为什么要使用 MCP

MCP 的功能与 API 相似,但具有更广泛的使用潜力。传统的应用程序接口需要为每个集成单独实施,而使用 MCP 的单个集成可访问许多不同的数据源和工具。

换句话说,人工智能模型不仅可以接收数据,还可以触发某些操作。

  1. 解决AI集成难题:传统上,AI模型与不同数据源的集成需要定制代码(“MxN问题”),而MCP提供统一接口,减少开发复杂性。

  2. 增强上下文感知:MCP让AI能访问实时数据(如天气、股票信息)和专用工具(如GitHub、百度地图API),提升响应准确性。

  3. 促进开放生态:作为开放标准,MCP鼓励开发者共享兼容工具,避免重复开发,加速AI应用创新68。

  4. 简化开发流程:开发者只需编写一次MCP服务器,即可让多个AI模型使用,降低适配成本(如百度地图API兼容MCP后,大模型可快速接入)。

  5. 支持复杂任务:MCP支持多步骤工作流(如代码调试+文件管理+API调用),使AI能自主执行更复杂的任务。

总之,MCP通过标准化、安全性和灵活性,推动AI从“被动问答”向“主动执行”演进,成为连接AI与真实世界的通用桥梁

MCP 的架构

MCP 基于简单的客户-服务器架构。一个应用程序可以同时连接多个 MCP 服务器。该结构由以下部分组成:

  • MCP 主机: 应用程序作为 MCP 主机访问数据或工具。

  • MCP 客户端: 主机内的客户端与 MCP 服务器建立一对一的连接。

  • MCP 服务器: 轻量级,通过 MCP 提供特定功能,可连接本地或远程数据源。

  • 本地数据源: MCP 服务器可访问的数据,如文件和数据库。

  • 远程服务: MCP 服务器可访问的基于互联网的外部 API。

连接生命周期

1. 初始化

https://modelcontextprotocol.io/docs/concepts/architecture

https://modelcontextprotocol.io/docs/concepts/architecture

  • 客户端向服务器发送初始化请求,其中包含自己的协议版本和功能。

  • 服务器以自己的协议版本和功能做出响应。

  • 客户端发送初始化通知。

  • 连接建立,信息交换开始。

2. 消息交换

连接建立后,客户端和服务器之间可以发送请求和响应消息,也可以传输单向消息。

3. 终止

客户端或服务器可终止连接。

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

MCP Server

MCP Server 的官方描述:一个轻量级程序,每个程序都通过标准化模型上下文协议公开特定功能。简单理解,就是通过标准化协议与客户端交互,能够让模型调用特定的数据源或工具功能。常见的 MCP Server 有:

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

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

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

下面是一些可以查找到你需要的 MCP Server 的途径:

第一个是官方的 MCP Server 集合 Github 仓库(https://github.com/modelcontextprotocol/servers),里面包含了作为官方参考示例的 MCP Server、被官方集成的 MCP Server 以及一些社区开发的第三方 MCP Server

图片

另外一个是 MCP.so(https://mcp.so/):一个三方的 MCP Server 聚合平台,目前收录了 5000+ MCP Server:

图片

其提供了非常友好的展示方式,每个 MCP Server 都有具体的配置示例:

图片

MCP Market(https://mcpmarket.cn/),访问速度不错,可以按工具类型筛选:

图片

快速开始

以下是实现 MCP 服务器的一个基本示例:

import asyncio
import mcp.types as types
from mcp.server import Server
from mcp.server.stdio import stdio_server

app = Server("example-server")

@app.list_resources()
asyncdef list_resources() -> list[types.Resource]:
    return [
        types.Resource(
            uri="example://resource",
            name="Example Resource"
        )
    ]

asyncdef main():
    asyncwith stdio_server() as streams:
        await app.run(
            streams[0],
            streams[1],
            app.create_initialization_options()
        )

if __name__ == "__main__":
    asyncio.run(main())

实战项目

因为Claude最早使用MCP,我们用  Desktop 从网站上获取新闻,来实操一下~

建议使用uv 包管理器而不是pip。打开终端,用下面的第一条命令将其下载到 MacOs 或 Linux。可以用第二条命令将其下载到 Windows。

curl -LsSf https://astral.sh/uv/install.sh | sh

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

图片

完成这些操作后,别忘了重启终端。

然后,我们将为项目创建一个目录。创建项目的目录下打开终端,运行以下命令。

  • 第一条命令是在当前目录下创建一个项目文件。

  • 第二条命令进入该文件目录。

uv init mcp-server-project

cd mcp-server-project 

图片

然后,我们将创建一个虚拟环境并安装软件包。使用 uv 软件包管理器。

# cretae virtual env
uv venv

# activate for macos/linux
source .venv/bin/activate

# activate for windows
.venv\Scripts\activate

# install libraries 
uv add "mcp[cli]" httpx bs4 dotenv

图片

现在,我们需要打开在 vscode 中创建的文件夹。打开后,我们会看到左侧的文件结构。

图片

在此,我们将更新 main.py 文件。

from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
import httpx
import os
from bs4 import BeautifulSoup
import json

load_dotenv()

# initialize server
mcp = FastMCP("tech_news")

USER_AGENT = "news-app/1.0"

NEWS_SITES = {
    "arstechnica": "https://arstechnica.com"
}

async def fetch_news(url: str):
    """It pulls and summarizes the latest news from the specified news site."""
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, timeout=30.0)
            soup = BeautifulSoup(response.text, "html.parser")
            paragraphs = soup.find_all("p")
            text = " ".join([p.get_text() for p in paragraphs[:5]]) 
            return text
        except httpx.TimeoutException:
            return"Timeout error"

@mcp.tool()  
async def get_tech_news(source: str):
    """
    Fetches the latest news from a specific tech news source.

    Args:
    source: Name of the news source (for example, "arstechnica" or "techcrunch").

    Returns:
    A brief summary of the latest news.
    """
    ifsource not in NEWS_SITES:
        raise ValueError(f"Source {source} is not supported.")

    news_text = await fetch_news(NEWS_SITES[source])
    return news_text

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

上面的代码可以从给定的网站获取最新消息。具体步骤如下

  1. 首先,我们进行必要的导入。

  2. 本代码未使用 API,但如果使用 API,可以使用 load_dotenv() 获取密钥。

  3. 我们使用 FastMCP. 初始化服务器

  4. “news-app/1.0”是我们给出的应用程序名称。

  5. NEW_SITES包含将从中获取新闻的网站。如果需要,你可以在此处添加更多网站。

  6. **fetch_news()**函数从指定网站获取新闻。

  7. get_tech_news()函数是我们的工具。我们通过在函数中添加@mcp.tool() 装饰器来指定这是一个工具。在这个函数中加入 docstring 对模型理解工具的工作原理非常重要。

  8. 我们的 MCP 服务器通过**mcp.run(transport=“stdio”)**运行,但我们不会通过 vscode 运行服务器。

Claude desktop 可以直接运行我们准备好的 MCP 服务器,因此我们将使用 Claude Desktop。你可以从这里下载:https://claude.ai/download。

图片

然后打开设置,进入developer设置。然后点击edit config

图片

点击edit config后,系统会为我们打开一个文件夹。在这个文件夹中,我们用文本编辑器打开claude_desktop_config.json文件。我们将在此输入服务器信息。

图片

该文件包含 claude 将如何运行服务器。有几点需要注意:

  1. mcp-server-project是我们创建的项目文件名。如果创建的文件名不同,可以更改。

  2. 你应在命令部分添加 uv 软件包管理器所在的路径。在这一部分,文件中只写了“uv ”,但对我来说并不是这样,所以我给出了路径。你可以在终端运行“which uv ”命令来查找路径。

  3. 你也可以将 args 中的路径改为自己的项目路径。为此,你可以在终端中的该目录下运行“pwd ”命令,获取完整路径。

  4. 保存并关闭文件。

{
    "mcpServers": {
        "mcp-server-project": {
            "command": "/Users/busekoseoglu/.local/bin/uv",
            "args": [
                "--directory",
                "/Users/busekoseoglu/Desktop/PROJELER/LLM Portfolio/mcp-server-project",
                "run",
                "main.py"
            ]
        }
    }
}

图片

我们已经完成了服务器配置,现在可以在claude桌面上试试了。打开claude桌面后,如果出现问题,右上方会弹出错误提示。你需要点击检查日志文件并解决错误。如果没有收到错误信息,则应看到红色方框中的锤子。

图片

点击 Hammer 后,会显示可用的 MCP 工具,如下所示。

图片

我们来到测试区,我问了一个问题What’s the latest news on Ars Technica?屏幕上显示,它要求使用该工具。此时claude明白他需要使用一个工具。

图片

在获得许可后,它使用我的工具检索答案,并将最新消息返回给我。

图片

恭喜你,你已经使用 Python 安装了一个简单的 MCP 服务器。我使用了一个简单的场景来学习它是如何工作的。当然,这些都可以扩展。