内容
# MCP 应用 Trino
符合 MCP 应用标准的 Trino 和 Starburst 查询可视化服务器。它提供了通常的 Trino 发现/查询工具,以及一个交互式的 `visualize_query` 工具,该工具使用 Elastic Charts 在 MCP 应用预览中渲染查询结果。
## 功能
- 通过 Trino HTTP API 执行 Trino/Starburst SQL 查询。
- `SELECT`、`WITH`、`SHOW`、`DESCRIBE` 和 `EXPLAIN` 的只读保护。
- 发现工具:`list_catalogs`、`list_schemas`、`list_tables`、`get_table_schema`、`explain_query`。
- MCP 应用 UI 工具:`visualize_query`,用于单个图表和多面板仪表盘。
- MCP 应用预览控件可以通过主机桥回调以刷新查询、切换图表类型、重新映射字段、调整行限制以及在不进行新聊天回合的情况下替换图表。
- Elastic Charts 预览支持条形图、堆积条形图、标准化堆积条形图、折线图、面积图、堆积面积图、散点图、气泡图、热力图、饼图、甜甜圈图、旭日图、树形图、指标图、目标图和表格视图,以及带有平移、缩放、搜索、选择、节点拖动和固定功能的强制有向图/网络视图。
- 仪表盘预览可以在一个 MCP 应用结果中组合最多 12 个独立的查询面板。
- Stdio 传输兼容 Rubberband、Claude Desktop、Cursor 等 MCP 客户端。
## 工具
### `visualize_query`
执行只读 Trino/Starburst SQL 查询,并返回使用 Elastic Charts 渲染的 MCP 应用预览。
在支持 iframe 工具调用的 MCP 应用客户端中,预览还渲染用于编辑 SQL、更改图表类型、重新映射字段和通过桥梁获取更新的 `visualize_query` 结果的控件。
输入:
- `sql`:只读 SQL 查询语句。对于单个可视化,必填;对于仪表盘,可选,每个面板提供自己的 `sql`。
- `chartType`:`bar`、`stacked_bar`、`normalized_stacked_bar`、`line`、`area`、`stacked_area`、`scatter`、`bubble`、`heatmap`、`pie`、`donut`、`sunburst`、`treemap`、`graph`、`metric`、`goal` 或 `table`。
- `title`:可选的图表标题。
- `dashboardTitle`:使用 `panels` 时的可选仪表盘标题。
- `panels`:可选的仪表盘面板数组,最大 12 个。提供时,应用渲染一个多面板仪表盘而不是单个图表。
- `xField`、`yField`、`seriesField`:常见的 XY 图字段。
- `valueField`:热力图、分区图、指标图和目标图的数值度量。
- `rowField`、`columnField`:热力图维度。
- `colorField`、`sizeField`:散点图/气泡图编码。
- `goalField`:目标图的指标/目标值。
- `sourceField`、`targetField`、`edgeWeightField`、`nodeLabelField`、`groupField`:图/网络编码。
- `partitionFields`:饼图、甜甜圈图、旭日图和树形图的维度。
- `maxRows`:预览数据的行限制,默认为 `1000`,最大 `5000`。
仪表盘面板输入:
- `id`:稳定的面板 ID。省略时生成。
- `sql`:面板特定的只读 SQL 查询。回退到根 `sql` 参数。
- `chartType`、`title` 和上述所有字段映射输入。
- `maxRows`:每个面板的行限制。
- `width`:`full`、`half` 或 `third`。默认值根据图表类型推断。
- `height`:以像素为单位的首选面板高度,从 `180` 到 `900`。
### `execute_query`
执行只读 Trino/Starburst SQL 查询,并返回 JSON 行而不带 MCP 应用预览。
输入:
- `sql`:只读 SQL 查询语句。
- `maxRows`:行限制,默认为 `1000`,最大 `5000`。
### `list_catalogs`
列出可用的 Trino 目录。
### `list_schemas`
列出模式,可选地为提供的目录。
输入:
- `catalog`:可选的目录名称。
### `list_tables`
列出表格,可选地限定在目录和模式中。
输入:
- `catalog`:可选的目录名称。
- `schema`:可选的模式名称。
### `get_table_schema`
运行 `DESCRIBE` 获取表格架构,表格输入仅限于简单的无引号标识符,可选地限定为 `catalog.schema.table`。
输入:
- `table`:表格标识符,例如 `tpch.tiny.orders`。
### `explain_query`
运行 `EXPLAIN` 获取只读 SQL 查询。
输入:
- `sql`:要解释的只读 SQL 查询语句。
## 安全模型
该服务器设计用于只读分析,但不应将任何应用程序层 SQL 保护视为完整的数据库安全边界。
当前防护措施:
- 仅接受 `SELECT`、`WITH`、`SHOW`、`DESCRIBE`、`DESC` 和 `EXPLAIN` 语句。
- 拒绝分号以避免多语句请求。
- 在字符串/注释外部阻止变异/控制关键字,例如 `INSERT`、`UPDATE`、`DELETE`、`CREATE`、`DROP`、`ALTER`、`TRUNCATE`、`MERGE`、`CALL`、`GRANT`、`REVOKE`、`SET`、`ANALYZE`、`COMMIT` 和 `ROLLBACK`。
- 发现帮助工具在组成 SQL 时引用目录/模式标识符。
- `get_table_schema` 拒绝任意 SQL 片段,仅接受简单的限定表标识符。
这并不能声称对 SQL 注入或滥用 100% 免疫。最强的保护措施是使用具有目录/模式/表级别只读权限的 Trino/Starburst 身份连接。应将 SQL 验证器视为深度防御,而不是主要权限模型。
## 配置
在启动服务器之前设置环境变量:
```bash
TRINO_HOST=localhost
TRINO_PORT=8080
TRINO_SCHEME=http
TRINO_USER=trino
TRINO_PASSWORD=
TRINO_CATALOG=tpch
TRINO_SCHEMA=tiny
TRINO_AUTH_TYPE=none
```
对于 Starburst 或安全的 Trino:
```bash
TRINO_SCHEME=https
TRINO_AUTH_TYPE=basic
TRINO_USER=alice
TRINO_PASSWORD=...
```
还支持带有 `TRINO_AUTH_TYPE=bearer` 和 `TRINO_ACCESS_TOKEN` 的 Bearer Token 身份验证。
### TLS
对于内部或自签名的 Trino/Starburst 端点,更倾向于传递 CA 证书而不是禁用验证:
```bash
TRINO_SCHEME=https
TRINO_CA_CERT_FILE=/absolute/path/to/ca.pem
```
您还可以直接传递 PEM 内容。文字 `\n` 序列转换为换行符:
```bash
TRINO_CA_CERT="-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----"
```
如果需要绕过内部端点的证书验证,请设置以下任意一个:
```bash
TRINO_INSECURE_TLS=true
TRINO_TLS_INSECURE=true
NODE_TLS_REJECT_UNAUTHORIZED=0
```
对于相互 TLS/客户端证书身份验证,请提供客户端证书和密钥:
```bash
TRINO_CLIENT_CERT_FILE=/absolute/path/to/client.crt
TRINO_CLIENT_KEY_FILE=/absolute/path/to/client.key
TRINO_CLIENT_KEY_PASSPHRASE=
```
直接 PEM 内容也支持 `TRINO_CLIENT_CERT` 和 `TRINO_CLIENT_KEY`。Starburst-prefixed 别名支持相同的设置:`STARBURST_CA_CERT_FILE`、`STARBURST_CLIENT_CERT_FILE`、`STARBURST_CLIENT_KEY_FILE`、`STARBURST_INSECURE_TLS` 和相关非 `_FILE` 变体。
## 本地开发
```bash
npm install
npm run build
npm run start:stdio
```
## 客户端设置
该项目是一个通用的 stdio MCP 服务器,带有 MCP 应用 UI 资源。它可以用于任何可以启动本地 stdio 服务器的 MCP 客户端。带有 MCP 应用支持的客户端可以渲染交互式图表预览;不支持 MCP 应用的客户端仍然可以使用文本和结构化工具结果。
在将服务器连接到客户端之前,请至少构建一次服务器:
```bash
git clone https://github.com/metalshanked/mcp-app-trino.git
cd mcp-app-trino
npm install
npm run build
```
在客户端配置中使用 `dist/server/index.js` 的绝对路径。替换 `/absolute/path/to/mcp-app-trino` 为您的本地克隆路径。
通用环境变量:
```json
{
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
```
对于安全的 Trino 或 Starburst,请添加 `TRINO_PASSWORD` 和 `TRINO_AUTH_TYPE=basic`,或添加 `TRINO_ACCESS_TOKEN` 和 `TRINO_AUTH_TYPE=bearer`。
### Rubberband
将此应用添加到 Rubberband 的 `mcp-apps.json`:
```json
{
"id": "mcp-app-trino",
"name": "Trino Visualization",
"description": "Query Trino or Starburst and render MCP App previews with Elastic Charts.",
"source": {
"type": "git",
"url": "https://github.com/metalshanked/mcp-app-trino.git",
"ref": "master"
},
"install": [
["npm", "install"],
["npm", "run", "build"]
],
"transport": {
"type": "stdio",
"command": "npm",
"args": ["run", "start:stdio"],
"cwd": "${appDir}"
},
"envPassthrough": [
"TRINO_HOST",
"TRINO_PORT",
"TRINO_SCHEME",
"TRINO_SSL",
"TRINO_USER",
"TRINO_PASSWORD",
"TRINO_ACCESS_TOKEN",
"TRINO_AUTH_TYPE",
"TRINO_CATALOG",
"TRINO_SCHEMA",
"TRINO_SOURCE",
"TRINO_INSECURE_TLS",
"TRINO_TLS_INSECURE",
"TRINO_CA_CERT",
"TRINO_CA_CERT_FILE",
"TRINO_TLS_CA_CERT",
"TRINO_TLS_CA_CERT_FILE",
"TRINO_CLIENT_CERT",
"TRINO_CLIENT_CERT_FILE",
"TRINO_CLIENT_KEY",
"TRINO_CLIENT_KEY_FILE",
"TRINO_CLIENT_KEY_PASSPHRASE",
"TRINO_TLS_CLIENT_CERT",
"TRINO_TLS_CLIENT_CERT_FILE",
"TRINO_TLS_CLIENT_KEY",
"TRINO_TLS_CLIENT_KEY_FILE",
"TRINO_TLS_CLIENT_KEY_PASSPHRASE",
"NODE_TLS_REJECT_UNAUTHORIZED"
]
}
```
### Claude Code
Claude Code 通过 `claude mcp add` 或 JSON 配置支持本地 stdio MCP 服务器。有关当前详细信息,请参阅 Claude MCP 文档。
CLI 示例:
```bash
claude mcp add --transport stdio \
--env TRINO_HOST=localhost \
--env TRINO_PORT=8080 \
--env TRINO_SCHEME=http \
--env TRINO_USER=trino \
--env TRINO_CATALOG=tpch \
--env TRINO_SCHEMA=tiny \
--env TRINO_AUTH_TYPE=none \
mcp-app-trino -- node /absolute/path/to/mcp-app-trino/dist/server/index.js
```
项目 `.mcp.json` 示例:
```json
{
"mcpServers": {
"mcp-app-trino": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/mcp-app-trino/dist/server/index.js"],
"env": {
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
}
}
}
```
### Claude Desktop
Claude Desktop 使用 MCP 服务器配置文件,其中包含 `mcpServers` 对象。将类似的条目添加到 `claude_desktop_config.json`,然后重启 Claude Desktop:
```json
{
"mcpServers": {
"mcp-app-trino": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/mcp-app-trino/dist/server/index.js"],
"env": {
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
}
}
}
```
### Cursor
Cursor 支持项目配置在 `.cursor/mcp.json` 和全局配置在 `~/.cursor/mcp.json`。
```json
{
"mcpServers": {
"mcp-app-trino": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/mcp-app-trino/dist/server/index.js"],
"env": {
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
}
}
}
```
### VS Code
VS Code MCP 配置使用顶级 `servers` 对象。你可以将此配置放在 `.vscode/mcp.json` 或使用 MCP 用户配置命令。MCP 应用渲染可能需要 `chat.mcp.apps.enabled` 设置,具体取决于您的 VS Code 版本。
```json
{
"servers": {
"mcpAppTrino": {
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/mcp-app-trino/dist/server/index.js"],
"env": {
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
}
}
}
```
### 其他 MCP 客户端
任何 stdio MCP 客户端都应该能够使用以下配置启动服务器:
```json
{
"type": "stdio",
"command": "node",
"args": ["/absolute/path/to/mcp-app-trino/dist/server/index.js"],
"env": {
"TRINO_HOST": "localhost",
"TRINO_PORT": "8080",
"TRINO_SCHEME": "http",
"TRINO_USER": "trino",
"TRINO_CATALOG": "tpch",
"TRINO_SCHEMA": "tiny",
"TRINO_AUTH_TYPE": "none"
}
}
```
## 客户端引用
- [Claude Code MCP 文档](https://code.claude.com/docs/en/mcp)
- [Cursor MCP 文档](https://docs.cursor.com/advanced/model-context-protocol)
- [VS Code MCP 配置参考](https://code.visualstudio.com/docs/copilot/reference/mcp-configuration)
- [VS Code MCP 应用笔记](https://code.visualstudio.com/docs/copilot/customization/mcp-servers)
## 示例提示
```text
使用 Trino Visualization 来绘制 tpch.tiny.orders 中的 orderstatus 的总订单。
```
模型应调用 `visualize_query` 并使用类似的查询:
```sql
SELECT orderstatus, count(*) AS orders
FROM tpch.tiny.orders
GROUP BY orderstatus
ORDER BY orders DESC
```
对于更丰富的图表,请将图表特定字段传递给 `visualize_query`:
- `stacked_bar` / `stacked_area`: `xField`, `yField`, `seriesField`
- `heatmap`: `rowField`, `columnField`, `valueField`
- `pie` / `donut` / `sunburst` / `treemap`: `partitionFields`, `valueField`
- `bubble`: `xField`, `yField`, `sizeField`, optional `colorField`
- `goal`: `valueField`, `goalField`
- `graph`: `sourceField`, `targetField`, optional `edgeWeightField`, `nodeLabelField`, `groupField`
图/网络示例:
```sql
SELECT source_service AS source, target_service AS target, count(*) AS weight
FROM service_calls
GROUP BY source_service, target_service
ORDER BY weight DESC
LIMIT 200
```
使用 `chartType: "graph"`, `sourceField: "source"`, `targetField: "target"`,以及 `edgeWeightField: "weight"`。
在支持 iframe 工具调用的 MCP 应用客户端中,图预览是交互式的:拖动画布以平移,轮或捏缩放,拖动节点以固定它,双击节点以切换固定,搜索标签/组,选择节点以突出显示其邻域,并从工具栏重置视图。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器