数据库查询服务

提供对Chinook SQLite数据库的安全、标准化的MCP协议访问,支持LLM和其他MCP兼容客户端进行交互式查询。

  • by andrewwgordon
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 andrewwgordon/mcp-chinookdb-server

使用说明

mcp-chinookdb服务器

示例MCP服务器,提供LLM MCP对示例sqlite3 Chinook数据库的访问

概述

该项目为 Chinook SQLite数据库 以及用于交互式查询的示例Agno代理客户端。它使LLM和其他MCP兼容客户端能够使用标准化协议安全地探索和查询Chinook数据库。

主要特点

  • 自动数据库下载:
    • 下载并提取Chinook SQLite数据库(如果不存在)。
  • 资源端点:
    • schema://chinook/tables:返回数据库中所有表的架构。
    • schema://chinook/table/{table_name}:返回特定表的架构。
  • SQL查询工具:
    • run_sql_query:允许执行只读(SELECT)SQL查询。为了安全起见,只允许使用SELECT语句。
  • 提示模板:
    • 为常见任务提供提示模板,例如列出表、显示表架构、计数行和查询顶级艺术家。
  • 安全SQL标识符逃逸:
    • 包含一个本地函数,用于安全地转义SQLite的SQL标识符。
  • Agno代理集成:
    • 包括一个示例客户端(agno_test_client.py)演示了如何连接到MCP服务器并使用LLM代理与之交互。

如何开始

1.安装

  • 克隆存储库:
    curl -LsSf https://astral.sh/uv/install.sh | sh
    git clone <your-repo-url>
    cd mcp-chinookdb-server
    
  • 使用uv安装Python依赖项:
    uv sync
    
    确保您已安装Python 3.8+ 紫外线 在您的环境中可用。

2.运行MCP服务器

  • 启动服务器:
    uv run chinook_mcp_server.py
    
    如果需要,服务器将自动下载Chinook数据库,并开始监听MCP请求(默认:stdio传输)。

3.使用Agno测试客户端

  • 启动交互式客户端:

    uv run agno_test_client.py
    

    这将启动一个REPL,您可以在其中键入有关Chinook数据库的自然语言查询。客户端将启动MCP服务器(如果尚未运行),并使用LLM(例如OpenAI GPT-4)来解释您的查询,并通过MCP工具与数据库交互。

  • 示例查询:

    • List all tables.
    • Show the schema for the Album table.
    • How many tracks are there in the database?
    • Who are the top 5 artists by number of tracks?
  • 要退出: 类型 q, quit,或 exit 在提示下。

程序如何工作

chinook_mcp_server.py

  • 实现一个MCP服务器,该服务器通过资源端点、工具和提示模板公开Chinook数据库。
  • 处理数据库的自动下载和提取。
  • 提供对架构和数据的安全只读访问。
  • 设计用于LLM或任何兼容MCP的客户端。

agno_test_client.py

  • 演示如何使用Agno代理框架连接到MCP服务器。
  • 将MCP服务器作为子进程启动(使用 uv run chinook_mcp_server.py 用于快速启动)。
  • 使用LLM(例如OpenAI GPT-4)来解释用户查询并调用MCP工具/资源。
  • 为交互式探索提供了一个简单的REPL。

安全说明

  • 只允许通过SELECT查询 run_sql_query 工具。
  • SQL标识符被安全地转义以防止注入。

定制

  • 您可以按照中的模式添加更多MCP资源、工具或提示 chinook_mcp_server.py.
  • 客户端可以扩展为使用不同的LLM或提供更高级的会话功能。

参考文献

奇努克数据库概述

Chinook SQLite数据库是一个模拟数字音乐商店的示例数据库,类似于iTunes。它被广泛用于SQL学习和演示。该模式旨在表示在线音乐商店中的核心实体和关系,包括客户、员工、艺术家、专辑、曲目、发票等。

概念概述

  • 艺术家 发布 专辑.
  • 专辑 包含多个 曲目 (歌曲或音频文件)。
  • 轨迹 按以下方式分类 类型 和 纸张类型.
  • 客户 通过以下方式购买曲目 发票.
  • 员工 代表员工,包括销售支持。
  • 发票行 在发票中详细说明购买的每条轨道。
  • 播放列表 允许对曲目进行分组以供收听。

主表和列

  • 艺术家

    • ArtistId (INTEGER,PK):唯一艺术家标识符
    • Name (NVARCHAR):艺人名称
  • 专辑

    • AlbumId (INTEGER,PK):唯一专辑标识符
    • Title (NVARCHAR):专辑标题
    • ArtistId (INTEGER,FK):参考艺术家
  • 轨道

    • TrackId (INTEGER,PK):唯一轨道标识符
    • Name (NVARCHAR):曲目名称
    • AlbumId (INTEGER,FK):参考专辑
    • MediaTypeId (INTEGER,FK):参考媒体类型
    • GenreId (INTEGER,FK):参考流派
    • Composer (NVARCHAR):作曲家名称
    • Milliseconds (整数):轨道长度
    • Bytes (INTEGER):文件大小
    • UnitPrice (数字):每条轨道的价格
  • 类型

    • GenreId (INTEGER,PK):唯一流派标识符
    • Name (NVARCHAR):流派名称
  • 媒体类型

    • MediaTypeId (INTEGER,PK):唯一的媒体类型标识符
    • Name (NVARCHAR):媒体类型名称(例如,MPEG音频、AAC音频)
  • 客户

    • CustomerId (INTEGER,PK):唯一客户标识符
    • FirstName, LastName (NVARCHAR):客户名称
    • Company, Address, City, State, Country, PostalCode (NVARCHAR):联系方式
    • Phone, Fax, Email (NVARCHAR):联系方式
    • SupportRepId (INTEGER,FK):分配给客户的员工
  • 员工

    • EmployeeId (INTEGER,PK):唯一的员工标识符
    • LastName, FirstName (NVARCHAR):员工姓名
    • Title (NVARCHAR):职位名称
    • ReportsTo (INTEGER,FK):经理
    • BirthDate, HireDate (日期时间):日期
    • Address, City, State, Country, PostalCode, Phone, Fax, Email (NVARCHAR):联系方式
  • 发票

    • InvoiceId (INTEGER,PK):唯一发票标识符
    • CustomerId (INTEGER,FK):客户进行购买
    • InvoiceDate (日期时间):发票日期
    • BillingAddress, BillingCity, BillingState, BillingCountry, BillingPostalCode (NVARCHAR):账单信息
    • Total (数字):总金额
  • InvoiceLine

    • InvoiceLineId (INTEGER,PK):唯一的行项目标识符
    • InvoiceId (INTEGER,FK):参考发票
    • TrackId (INTEGER,FK):轨道参考
    • UnitPrice (数字):每条轨道的价格
    • Quantity (INTEGER):购买的曲目数量
  • 播放列表

    • PlaylistId (INTEGER,PK):唯一播放列表标识符
    • Name (NVARCHAR):播放列表名称
  • 播放列表Track

    • PlaylistId (INTEGER,FK):参考播放列表
    • TrackId (INTEGER,FK):轨道参考

此模式支持广泛的查询和分析,例如查找顶级艺术家、最受欢迎的流派、客户购买历史等。