一文带你入门 MCP(模型上下文协议)

什么是 MCP? MCP(Model Context Protocol,模型上下文协议) 是由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。 MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。

什么是 MCP?

MCP(Model Context Protocol,模型上下文协议) 是由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。

MCP 架构

MCP 遵循客户端-服务器架构(client-server),其中包含以下几个核心概念:

  • MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
  • MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持 1:1 的连接。
  • MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。
  • 本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。
  • 远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。

图片图片

MCP Client

MCP client 充当 LLM 和 MCP server 之间的桥梁,MCP client 的工作流程如下:

  • MCP client 首先从 MCP server 获取可用的工具列表。
  • 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。
  • LLM 决定是否需要使用工具以及使用哪些工具。
  • 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用。
  • 工具调用的结果会被发送回 LLM。
  • LLM 基于所有信息生成自然语言响应。
  • 最后将响应展示给用户。

你可以在 Example Clients 找到当前支持 MCP 协议的客户端程序。本文将会使用 Claude Desktop 作为 MCP client,你可以在此页面下载安装:https://claude.ai/download 。

MCP Server

MCP server 是 MCP 架构中的关键组件,它可以提供 3 种主要类型的功能:

资源(Resources):类似文件的数据,可以被客户端读取,如 API 响应或文件内容。

工具(Tools):可以被 LLM 调用的函数(需要用户批准)。

提示(Prompts):预先编写的模板,帮助用户完成特定任务。

这些功能使 MCP server 能够为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 的实用性和灵活性。

你可以在 MCP Servers Repository 和 Awesome MCP Servers 这两个 repo 中找到许多由社区实现的 MCP server。使用 TypeScript 编写的 MCP server 可以通过 npx 命令来运行,使用 Python 编写的 MCP server 可以通过 uvx 命令来运行。

使用 Claude Desktop 通过 PostgreSQL MCP Server 查询数据库信息

接下来演示通过 PostgreSQL MCP Server 使 LLM 能够基于 PostgreSQL 中的数据来回答问题。

准备 PostgreSQL 数据

首先使用 Docker 启动 PostgreSQL 服务。

复制
docker run -d --name postgres \
  -e POSTGRES_PASSWORD=postgres -p 5432:5432 \
  postgres

在 PostgreSQL 中创建数据库和表,并插入数据。

复制
-- 登录 PostgreSQL
docker exec -it postgres psql -U postgres

-- 创建数据库
CREATEDATABASE shopdb;

-- 连接到新创建的数据库
\c shopdb;

-- 创建 users 表
CREATETABLEusers (
    user_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOTNULL,
    last_name VARCHAR(50) NOTNULL,
    email VARCHAR(100) UNIQUENOTNULL
);

-- 创建 orders 表
CREATETABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date TIMESTAMPNOTNULL,
    total_amount DECIMAL(10, 2) NOTNULL,
    user_id INTREFERENCESusers(user_id)
);

-- 插入示例数据
INSERTINTOusers (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Alice', 'Johnson', '[email protected]');

INSERTINTO orders (order_date, total_amount, user_id) VALUES
('2025-01-05 10:30:00', 150.75, 1),
('2025-01-06 11:00:00', 200.50, 2),
('2025-01-07 12:45:00', 120.25, 1);

配置连接 PostgreSQL MCP Server

在 Claude Desktop 中配置 PostgreSQL MCP Server 的连接信息,具体内容可以参考:For Claude Desktop Users。最终是在 claude_desktop_config.json 文件中添加如下内容:

复制
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://postgres:[email protected]/shopdb"
      ]
    }
  }
}

配置完毕后,重启 Claude Desktop。一切正常的话,你应该能在输入框的右下角看到一个锤子图标。点击锤子图标,可以看到 PostgreSQL MCP Server 提供的工具信息。

图片图片

根据 PostgreSQL 的数据进行提问

首先来问一个简短的问题:数据库中有哪些表? Claude 会判断出需要调用 MCP server 来查询 PostgreSQL 中的数据。这里会弹出一个窗口,需要用户授权。

图片图片

点击 Allow 后,Claude 成功返回了结果。

图片图片

接下来我们可以增加一点难度:查询金额最高的订单信息。在数据库中有两张表 users 和 orders,要想得到完整的订单信息,需要先去查询 orders 表中金额最高的一条记录,然后根据 user_id 这个外键再去查询 users 表中对应的用户信息。

从下面的输出可以发现 Claude 一开始是不知道数据库中的表结构的,因此先发送请求分别确定 orders 表和 users 表中相应的字段,然后再对两张表进行 join 查询。

图片图片

点击 View Result from query from postgres 可以看到 Claude Desktop 向 MCP server 发送的请求以及得到的响应,说明这个结果确实是从 PostgreSQL 数据库中查询得到的。

图片图片

你也可以复制这条 SQL 语句到数据库中查询进行确认。

图片图片

总结

本文带领读者快速入门了 MCP(模型上下文协议),介绍了其架构、核心概念以及实际应用场景。通过演示 Claude Desktop 结合 PostgreSQL MCP Server 查询数据库的场景,展示了 MCP 如何增强 LLM 与外部数据源的交互能力。后续文章还会继续分享 MCP server 和 MCP client 开发的相关内容,欢迎持续关注。

参考资料

  • Model Context Protocol 官方文档:https://modelcontextprotocol.io/introduction
  • 深度解析:Anthropic MCP 协议:https://mp.weixin.qq.com/s/ASmcjW53HKokdYt1m-xyXA

相关资讯

LLM应用开发者新利好:再也不用写集成代码了!

编辑 | 言征进入今年以来,如何磕破头也要挤进大LLM应用的赛道成为了每一位开发者的心事。 但上车LLM应用的人都知道,基于大模型做开发,远没有外界所说的“调接口”那么简单,开发人的痛,没人懂。 比如,光定制代码就能把你搞到没脾气。

参数量仅为4%,性能媲美GPT-3:开发者图解DeepMind的RETRO

构建越来越大的模型并不是提高性能的唯一方法。

近30天中国下载第一,Sci-Hub新年首更,实时查看下载统计,logo钥匙环变「锤子和镰刀」

在重重压力下,Sci-Hub 还是更新了。