概述
自定义工具让 Tron 可以调用你自己的函数或脚本,将 AI 能力与现有的内部系统、数据库或业务逻辑深度集成。与 MCP 服务不同,自定义工具配置简单,无需启动额外的服务进程,适合快速集成场景。
典型使用场景包括:查询内部数据库、调用公司内部 API、执行特定的部署脚本或自动化任务。
定义工具
在 config.json 的 customTools 数组中定义工具,使用 JSON Schema 描述工具的接口:
json
{
"customTools": [
{
"name": "query_database",
"description": "查询内部数据库,返回符合条件的记录",
"command": "./scripts/db-query.sh",
"parameters": {
"type": "object",
"properties": {
"table": {
"type": "string",
"description": "要查询的表名"
},
"where": {
"type": "string",
"description": "WHERE 条件子句"
},
"limit": {
"type": "integer",
"description": "返回记录数量上限",
"default": 10
}
},
"required": ["table"]
}
}
]
}
实现工具
自定义工具的实现可以是任意可执行程序——Shell 脚本、Python 脚本、编译后的二进制文件均可。Tron 通过标准输入/输出与工具通信:
- 输入:Tron 将参数以 JSON 格式写入工具的标准输入(stdin)
- 输出:工具将结果以 JSON 或纯文本输出到标准输出(stdout)
- 错误:错误信息输出到标准错误(stderr),Tron 会将其展示给用户
bash
#!/bin/bash
# scripts/db-query.sh
# 从 stdin 读取参数 JSON
INPUT=$(cat)
TABLE=$(echo "$INPUT" | jq -r '.table')
WHERE=$(echo "$INPUT" | jq -r '.where // "1=1"')
LIMIT=$(echo "$INPUT" | jq -r '.limit // 10')
# 执行数据库查询(示例使用 sqlite3)
RESULT=$(sqlite3 /path/to/db.sqlite \
"SELECT * FROM $TABLE WHERE $WHERE LIMIT $LIMIT" \
-json 2>&1)
# 输出 JSON 结果
echo "{\"rows\": $RESULT}"
安全提示
自定义工具脚本会以当前用户权限执行,请确保对输入参数进行适当的校验和过滤,防止注入攻击。
完整示例
以下是一个数据库查询工具的完整定义和实现示例,包含错误处理和结果格式化:
json
// config.json
{
"customTools": [
{
"name": "query_users",
"description": "查询用户数据库,支持按姓名、邮箱或角色筛选",
"command": "python3 ./tools/query_users.py",
"timeout": 10000,
"parameters": {
"type": "object",
"properties": {
"filter": {
"type": "object",
"description": "筛选条件",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" },
"role": { "type": "string", "enum": ["admin", "user", "guest"] }
}
},
"limit": { "type": "integer", "default": 20 }
}
}
}
]
}
python
# tools/query_users.py
import sys, json, sqlite3
def main():
args = json.load(sys.stdin)
filters = args.get("filter", {})
limit = args.get("limit", 20)
conn = sqlite3.connect("./data/users.db")
conn.row_factory = sqlite3.Row
conditions = []
params = []
if filters.get("name"):
conditions.append("name LIKE ?")
params.append(f"%{filters['name']}%")
if filters.get("email"):
conditions.append("email = ?")
params.append(filters["email"])
if filters.get("role"):
conditions.append("role = ?")
params.append(filters["role"])
where = "WHERE " + " AND ".join(conditions) if conditions else ""
cursor = conn.execute(
f"SELECT id, name, email, role FROM users {where} LIMIT ?",
params + [limit]
)
rows = [dict(row) for row in cursor.fetchall()]
print(json.dumps({"count": len(rows), "users": rows}))
main()
与 MCP 的区别
Tron 同时支持自定义工具(customTools)和 MCP 服务两种扩展方式,两者适用场景不同:
| 特性 | 自定义工具 | MCP 服务 |
|---|---|---|
| 配置复杂度 | 简单,仅需 config.json 配置 | 较复杂,需启动独立服务进程 |
| 适用场景 | 简单脚本、一次性工具 | 复杂集成、多功能服务 |
| 性能 | 每次调用启动新进程 | 长驻进程,响应更快 |
| 状态管理 | 无状态 | 可维护会话状态 |
| 推荐场景 | 简单工具、快速原型 | 生产环境、需要持久连接 |
选择建议
从自定义工具开始快速验证想法,当工具逐渐复杂、需要持久连接或服务多个客户端时,再迁移到 MCP 服务。