AI导航

MCP协议如何用于数据库查询?

AI百科
5 min read
34 次阅读

MCP 协议驱动数据库查询:原理、选型与实践路线

**一、为什么用 MCP 调数据库?**MCP 把“数据库→LLM”这条链路标准化:只需一次对接,即可让任何支持 MCP 的模型调用现有数据。借助流式传输,超长结果集可以分片回写,前端边收边渲染,大幅降低等待时间。细粒度 OAuth 作用域又能把查询权限限定在单张表或单条语句,满足企业合规要求。

二、三层架构:Server / Tool / Client

  • MCP Server ― 持久保活数据库连接,暴露查询类 Tool。
  • Tool 元数据 ― 用 JSON Schema 声明参数与 SQL 模板,让模型自行填参。
  • MCP Client ― 模型或代理,通过 listTools→callTool 完成 SQL 执行并接收流式结果。

三、实现选型

方案 特色 & 适用场景 维护成本
MCP Toolbox for Databases 开箱即用,已内置 Postgres / MySQL / BigQuery 等 Source,K8s/Cloud Run 部署模板齐全
FastMCP + SQLAlchemy 灵活自定义,适合需要业务逻辑拼装或混合 API 调用的后台
mcp-proxy 零改造把现有 REST/GraphQL 查询接口“转译”为 MCP Tool

四、查询模式与最佳实践

  1. 参数化查询:使用 $1,$2… 占位符可防注入;Tool 层自动绑定参数。
  2. 模板查询:需要动态插入表名/列名时,可用 {{.tableName}} 模板,但务必限制白名单。
  3. 流式结果:在 Server 端 yield 每 100 行结果,Client 侧立即渲染,避免一次性加载。

五、端到端开发流程

  1. 梳理可暴露的 SQL 语句,拆分为独立 Tool。
  2. tools.yaml 描述 kind: postgres-sql / mysql-sql
  3. 选择传输层:本地脚本用 Stdio,远程生产用 Streamable HTTP
  4. 配置 OAuth + Scope,把每条 Tool 映射到最小权限。
  5. 在 LLM 提示词中列出可用 Tool,启用自动调用。

```yaml
# tools.yaml —— 参数化查询示例(PostgreSQL)
tools:
  list_recent_orders:
    kind: postgres-sql
    source: orders-db
    statement: |
      SELECT * FROM orders
      WHERE customer_id = $1
      ORDER BY created_at DESC
      LIMIT 20
    description: >
      查询指定客户最近 20 条订单。
    parameters:
      - name: customer_id
        type: string
        description: 客户唯一 ID
# server.py —— FastMCP + async SQLAlchemy
from fastmcp import FastMCP
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy import text
import os

DATABASE_URL = os.getenv("DATABASE_URL")

engine = create_async_engine(DATABASE_URL, echo=False)
mcp = FastMCP("DB-Tools", transport="streamable_http", listen="0.0.0.0:8080")

@mcp.tool(name="run_sql", description="执行安全参数化 SQL", parameters={"sql": "string", "args": "array"})
async def run_sql(sql: str, args: list[str]) -> list[dict]:
    async with AsyncSession(engine) as session:
        result = await session.execute(text(sql), args)
        # 按行分块推送回客户端
        for row in result.fetchall():
            yield dict(row)

if __name__ == "__main__":
    mcp.run()
# client.py —— Streamable HTTP 调用
import asyncio
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession

async def main():
    async with streamablehttp_client("https://api.example.com/mcp") as (r, w, _):
        async with ClientSession(r, w) as s:
            await s.initialize()
            res = await s.call_tool("list_recent_orders", {"customer_id": "C123"})
            async for chunk in res:
                print(chunk)

asyncio.run(main())

推荐工具

NVIDIA Chat with RTX AI聊天 Chat with RTX 是 NVIDIA 面向 RTX 电脑的本地 AI 聊天工具,可围绕本地文档和视频资料做问答,适合重视隐私、离线检索并具备硬件条件的用户更适合资料不便上传云 文心一言 AI聊天 文心一言 是百度文心大模型 AI 助手,支持百度 AI 聊天、文案创作和图像理解,适合中文用户和内容创作者完成 AI 对话、资料问答和任务协作,适合上线前核对权限、成本和资料质量。 HuggingChat AI聊天 HuggingChat 是 Hugging Face 的开源模型聊天应用,支持 Omni 自动选模型,也可手动选社区开放模型对话。它适合体验开源模型、技术探索和问答,结果可能不稳定,重要内容需复核。 纳米AI搜索 AI搜索 纳米AI 是 360 旗下 AI 搜索和智能体入口,支持文字、语音、拍照提问、多模型协作与内容创作,适合中文用户做日常搜索、学习问答、移动查询、热点追踪、生活决策、知识整理和轻量创作。 Meta AI AI聊天 Meta AI 是 Meta 的个人 AI 助手,可在网页、应用、AI 眼镜及 WhatsApp、Instagram 中使用,支持问答、图像理解和语音交流,适合社交与生活场景,部分功能受地区限制。 Pi AI AI聊天 Pi AI 是 Inflection AI 推出的个人 AI 助手,强调情绪理解、陪伴式交流、生产力建议和安全对话,可在 pi.ai 与移动端使用。它适合日常思考、学习陪练和规划,不替代专业心理支持。