TronCode Tron CLI 自定义工具

概述

自定义工具让 Tron 可以调用你自己的函数或脚本,将 AI 能力与现有的内部系统、数据库或业务逻辑深度集成。与 MCP 服务不同,自定义工具配置简单,无需启动额外的服务进程,适合快速集成场景。

典型使用场景包括:查询内部数据库、调用公司内部 API、执行特定的部署脚本或自动化任务。

定义工具

config.jsoncustomTools 数组中定义工具,使用 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 服务