使用说明
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依赖项:确保您已安装Python 3.8+ 紫外线 在您的环境中可用。
uv sync
2.运行MCP服务器
- 启动服务器:如果需要,服务器将自动下载Chinook数据库,并开始监听MCP请求(默认:stdio传输)。
uv run chinook_mcp_server.py
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):轨道参考
此模式支持广泛的查询和分析,例如查找顶级艺术家、最受欢迎的流派、客户购买历史等。