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
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):轨道参考
此模式支持广泛的查询和分析,例如查找顶级艺术家、最受欢迎的流派、客户购买历史等。
______________________________________________________________________
