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

什么是 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,你可以在此页面下载安装:claude.ai/download

MCP Server

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

  1. 资源(Resources):类似文件的数据,可以被客户端读取,如 API 响应或文件内容。
  2. 工具(Tools):可以被 LLM 调用的函数(需要用户批准)。
  3. 提示(Prompts):预先编写的模板,帮助用户完成特定任务。

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

你可以在 MCP Servers RepositoryAwesome 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 服务。

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

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

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

-- 创建数据库
CREATE DATABASE shopdb;

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

-- 创建 users 表
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL
);

-- 创建 orders 表
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    order_date TIMESTAMP NOT NULL,
    total_amount DECIMAL(10, 2) NOT NULL,
    user_id INT REFERENCES users(user_id)
);

-- 插入示例数据
INSERT INTO users (first_name, last_name, email) VALUES
('John', 'Doe', 'john.doe@example.com'),
('Jane', 'Smith', 'jane.smith@example.com'),
('Alice', 'Johnson', 'alice.johnson@example.com');

INSERT INTO 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 文件中添加如下内容:

json 复制代码
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres",
        "postgresql://postgres:postgres@127.0.0.1/shopdb"
      ]
    }
  }
}

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

根据 PostgreSQL 的数据进行提问

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

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

接下来我们可以增加一点难度:查询金额最高的订单信息 。在数据库中有两张表 usersorders,要想得到完整的订单信息,需要先去查询 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 开发的相关内容,欢迎持续关注。

参考资料

欢迎关注

相关推荐
python_13611 小时前
MCP模型上下文协议以及交互流程
交互·mcp
乐予吕16 小时前
GEO 入门:从 SEO 到 GEO 的转变
aigc·openai·seo
sorryhc18 小时前
0~1构建一个mini blot.new(无AI版本)
前端·前端框架·openai
量子位19 小时前
姚顺雨离职OpenAI,开启下半场
openai·ai编程
深度学习机器20 小时前
Embedding Gemma,谷歌发布的小而精向量模型,仅需0.3B|附RAG实战代码
google·llm·openai
安思派Anspire1 天前
Google 新 LLM 仅需 0.5GB 内存即可运行——如何在本地对其进行微调
aigc·openai·agent
奇舞精选1 天前
别让 AI 代码变成技术负债:Vibe Coding 提效实践
openai
六月的可乐1 天前
Vue3项目中集成AI对话功能的实战经验分享
前端·人工智能·openai
新智元2 天前
世界首富换人!81 岁硅谷狂人 4000 亿身价碾压马斯克,33 岁华裔才女逆袭
人工智能·openai
机器之心2 天前
交互扩展时代来临:创智复旦字节重磅发布AgentGym-RL,昇腾加持,开创智能体训练新范式
人工智能·openai