内容
# Teradata MCP 服务器
一个只读的 MCP(模型上下文协议)服务器,适用于 Teradata。允许 AI 代理安全地查询您的 Teradata 数据库 — 无写入、无 DDL、无会话更改。
## 功能
- **只读** — 仅允许 `SELECT` 查询
- **两种模式** — stdio(本地)或 HTTP + JWT(远程)
- **官方驱动** — 使用 Teradata 自己的 `teradatasql` Node.js 驱动
- **无第三方身份验证库** — JWT 使用 Node.js 内置 `crypto` 验证
- **查询安全** — 阻止危险关键词,需要 `TOP`、`SAMPLE` 或 `WHERE`
## 暴露给 AI 代理的工具
| 工具 | 描述 |
|---|---|
| `list_tables` | 列出当前(或指定)数据库中的所有表 |
| `describe_table` | 显示表的列和类型 |
| `query` | 运行只读的 SELECT 查询 |
## 安装
需要 Node.js >= 20。
```bash
npm install
cp .env.example .env
# 填写您的 Teradata 凭证和 API_KEY
```
## 使用
### Stdio 模式(本地代理)
```bash
node server.js
```
在 `claude_desktop_config.json` 中配置:
```json
{
"mcpServers": {
"teradata": {
"command": "node",
"args": ["/path/to/server.js"]
}
}
}
```
从命令行测试:
```bash
# Windows
echo {"jsonrpc":"2.0","method":"tools/list","params":{},"id":1} | node server.js
# Mac / Linux
echo '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}' | node server.js
```
### HTTP 模式(远程代理)
```bash
node server.js --http
```
代理通过以下方式连接:
```http
POST http://your-server:3000/mcp
Authorization: Bearer <jwt-token>
```
## 测试
包含三个测试 JSON 文件。在运行之前,请编辑每个文件并将 `your-api-key` 替换为 `.env` 中的值。
**步骤 1 — 检查服务器启动并列出工具:**
```cmd
node server.js < test-list-tools.json
```
预期输出:包含 `query`、`list_tables`、`describe_table` 的 JSON。
**步骤 2 — 列出数据库中的表:**
```cmd
node server.js < test-list-tables.json
```
预期输出:表名数组的 JSON。
**步骤 3 — 运行查询:**
编辑 `test-query.json` 并将 `your_table` 替换为实际的表名,然后:
```cmd
node server.js < test-query.json
```
预期输出:行数组的 JSON。
> **Windows 提示:** 如果 `<` 重定向在 cmd 中不起作用,请使用 PowerShell:
> ```powershell
> Get-Content test-query.json | node server.js
> ```
## 环境变量
| 变量 | 必需 | 描述 |
|---|---|---|
| `TD_HOST` | 是 | Teradata 主机名或 IP |
| `TD_USER` | 是 | 数据库用户名(使用只读账户) |
| `TD_PASSWORD` | 是 | 数据库密码 |
| `TD_DATABASE` | 否 | 默认数据库(可选) |
| `API_KEY` | 是 | 代理在工具调用中必须传递的密钥 |
| `HTTP_PORT` | 否 | HTTP 模式端口,默认值:3000 |
| `JWT_SECRET` | 仅 HTTP | JWT 验证密钥 |
## 创建只读 DB 用户(Teradata)
```sql
CREATE USER mcp_agent AS
PASSWORD = 'strong-password'
PERM = 0;
GRANT SELECT ON your_database TO mcp_agent;
```
## 生成 API_KEY
```bash
node -e "const c=require('crypto');console.log(c.randomBytes(32).toString('hex'))"
```
## Teradata 特定说明
- 默认端口为 **1025**(由驱动程序自动处理)
- `SAMPLE n` 支持作为行限制的 `TOP n` 替代方案
- 查询安全阻止 Teradata 特定危险操作:`SEL INTO`、`COLLECT STATS`、`.SET SESSION`、`DATABASE`