跳转至

mcp-tronlink-signer

GitHub: https://github.com/TronLink/mcp-tronlink-signer

将 tronlink-signer 封装为 MCP 工具的服务器,供 Claude 及其他 AI 客户端使用。通过 TronLink 浏览器钱包对 TRON 交易进行签名,需用户在浏览器中授权确认 — 私钥始终留在钱包中,不会对外暴露。

配置

Claude Code

claude mcp add -s user tronlink-signer -- npx mcp-tronlink-signer

Claude Desktop / Cursor

{
  "mcpServers": {
    "tronlink-signer": {
      "command": "npx",
      "args": ["mcp-tronlink-signer"]
    }
  }
}

从源码构建

git clone https://github.com/TronLink/mcp-tronlink-signer.git
cd mcp-tronlink-signer
pnpm install && pnpm build

然后指向构建产物:

claude mcp add -s user tronlink-signer -- node /path/to/packages/mcp-tronlink-signer/dist/cli.js

MCP 工具

工具 说明 参数 副作用 可自动重试
connect_wallet 连接 TronLink 钱包 network? Local Write(缓存 session) 可——必要时让用户重新授权
send_trx 向指定地址发送 TRX to、amount、network? Remote Write 不可——重发前先确认链上状态
send_trc20 发送 TRC20 代币 contractAddress、to、amount、decimals?、network? Remote Write 不可——同 send_trx
sign_message 对消息进行签名 message、network? Local Write(只签名不广播) 可——会重新弹审批
sign_typed_data 对 EIP-712 结构化数据签名 typedData、network? Local Write(只签名) 可——会重新弹审批
sign_transaction(broadcast=false) 仅签名 transaction、broadcast=false、network? Local Write 可——会重新弹审批
sign_transaction(broadcast=true) 签名 + 广播 transaction、broadcast=true、network? Remote Write 不可——重发前先确认链上状态
get_balance 查询 TRX 余额 address、network? Network Read 可

所有工具均支持可选的 network 参数(mainnet / nile / shasta),默认使用 mainnet。

人工确认(HITL)。 所有涉及签名的工具(send_trx、send_trc20、sign_message、sign_typed_data、sign_transaction)都会打开 TronLink 浏览器审批页。AI agent 无法在用户点击 Approve 之前签名。生产环境必须把 Remote Write 工具视为需要确认。

MCP 资源

URI 说明
wallet://networks 可用网络及其配置信息
wallet://config 当前签名器配置

MCP 提示词

提示词 说明
send-trx 发送 TRX 的引导式工作流
check-balance 查询余额的引导式工作流
send-token 发送 TRC20 代币的引导式工作流

工作原理

  1. AI 智能体调用 MCP 工具(如 send_trx)— CLI 中会显示签名提示
  2. 服务器将请求委托给 tronlink-signer,后者打开单个浏览器标签页用于授权(如已打开则复用现有标签)
  3. 授权页面通过 TIP-6963 协议发现 TronLink 钱包
  4. 自动解锁钱包,并在需要时切换网络
  5. 如果钱包已连接,connect_wallet 会自动完成
  6. 交易详情会被解析为人类可读的格式(TRX 转账、TRC20、TRC721 NFT、质押、委托、投票等)
  7. 用户在浏览器中查看并批准
  8. TronLink 完成交易签名 — 私钥始终留在钱包中
  9. 结果返回给 AI 智能体 — 页面保持打开以便处理下一次操作

端到端示例

一个典型的 send_trx 流程,从用户提问到链上结果:

1. 用户 → 智能体

「在 nile 上给 TJRabc…xyz 转 5 个 TRX。」

2. 智能体 → MCP 工具调用

{
  "name": "send_trx",
  "arguments": { "to": "TJRabc...xyz", "amount": 5, "network": "nile" }
}

3. 审批(人工确认 HITL) —— 服务打开 TronLink 审批页;用户核对「Send 5 TRX → TJRabc…xyz (Nile)」后点击 Approve。若点击 Reject 则返回错误结果 Error: USER_REJECTED(未经用户同意不要重发)。

4. MCP 工具 → 智能体(结果)

{
  "txId": "0a1b2c...",
  "status": "success"
}

5. 智能体 → 用户

「已发送 5 TRX——链上已确认(交易 0a1b2c…)。」

请基于 isError 与 JSON 结果中的 status 分支;错误只有消息文本(见错误)。status: "pending" 表示广播成功但确认超时——应用 get_balance 或浏览器查询对账,而不是重发(见错误)。

取消

所有签名工具均支持 MCP 取消机制。如果 AI 客户端取消了一个待处理的工具调用(例如用户在 Claude Code 中按下 Ctrl+C),进行中的请求会被自动中止,对于已被取消的请求不会打开浏览器授权页面。

交易确认

当调用 sign_transaction 且 broadcast: true 时,服务器会在广播后自动轮询链上确认状态,并返回执行结果(success、pending 或 failed)。如果交易在链上失败(如 OUT_OF_ENERGY、Solidity revert),结果为 status: "failed",error 中带解码后的原因,并标记 isError: true。

错误

v0.1.4 中,错误以 MCP 工具结果返回:isError: true,内容是一段文本 Error: <message>,没有结构化的 code 或 retryable 字段。已知的消息如下:

结果 Retryable 何时发生
Error: USER_REJECTED 否 用户在签名审批页点击 Reject。
Error: Confirmation declined by user 否 用户在 TronLink 插件弹窗中拒绝。
Error: CANCELLED_BY_CALLER 先核对 MCP 客户端取消调用(如按 Ctrl+C)。如果是在广播之后取消,交易可能已经上链。
Error: TIMEOUT: Request timed out after 5 minutes 先核对 5 分钟内没有结果。重发会重新弹出审批。
Error: WALLET_CHANGED: <reason> 先核对 TronLink 账户或网络切换、或钱包断开,待处理请求被清空。
JSON 结果 "status": "failed"(isError: true) 否 广播成功但链上执行失败(OUT_OF_ENERGY、Solidity revert)。该交易已最终化;先解决根因再发送新交易。
其他 Error: <message> 否——先排查 输入校验失败、节点拒绝广播、网络错误等,文本原样透传。

重试策略。 只读调用(get_balance)可安全重发。拒绝表示用户不同意——未经用户同意不要重发。对 send_trx、send_trc20 及 broadcast: true 的 sign_transaction,任何错误(包括 CANCELLED_BY_CALLER、TIMEOUT)都应视为结果未知,先用 get_balance 或区块浏览器确认后再考虑重发。

安全边界

边界 保证 Agent / 运维方义务
Prompt 注入 工具输入按原始值作为调用参数,server 不会再次提交给 LLM。TronLink 审批页渲染的是解析后的交易字段,不是 agent 的自由文本。 链上拿到的字符串(备注、revert 原因)视为不可信;分支应基于 txId / status,而非 prose。
本地 HTTP listener 本地审批 server 仅绑定 127.0.0.1(端口 TRON_HTTP_PORT,默认 3386,被占用时自增),永远不接受跨主机连接。每个 server session 有唯一 ID,前一次 session 的浏览器标签会被自动失效。 不要把 3386 端口转发到外网。同一台机器不要用相同 TRON_HTTP_PORT 跑两份。
出站 host 白名单(SSRF) signer 只与 Networks 列出的 TronGrid 端点以及本地浏览器通信,工具不接受会被原样请求的用户 URL。 生产环境钉死 TRON_NETWORK、TRON_API_KEY。
API key 处理(token passthrough) TRON_API_KEY 仅在启动时从 env 读取,仅用于到 TronGrid 的出站;不会出现在任何工具响应、错误 details 或 MCP resource 中。server 不接受 MCP 客户端传入的 Authorization header 并转发到上游。 API key 放进 MCP host 的 secret manager,不要写进会提交 git 的 mcpServers 配置。
签名必须 HITL 所有签名工具(send_trx、send_trc20、sign_message、sign_typed_data、sign_transaction)都会打开 TronLink 审批页,不存在程序化绕过。私钥始终留在 TronLink。 不需要运维额外强制 HITL——这是结构性保证。不要试图通过移除浏览器层来"加固"。
浏览器标签劫持 审批页基于 server session ID 验证每次请求,过期的标签会被忽略;心跳检测会在断连时关闭 session。 同一用户跑多个 agent 时,请让每个 agent 启动自己的 signer 实例;跨实例的请求串扰由 session ID 屏蔽,但 UI 层混淆不防。
Confused deputy signer 以已连接的 TronLink 账户身份执行,没有来自 MCP 客户端的逐次授权 scope。 一个 signer 实例 = 一个 TronLink 账户,不要把多个终端用户复用到同一个实例。

环境变量

变量名 说明 默认值
TRON_NETWORK 默认网络(mainnet / nile / shasta) mainnet
TRON_HTTP_PORT 本地 HTTP 服务端口 3386
TRON_API_KEY TronGrid API Key(可选) -

版本与许可证

内联 changelog

本页是下游 README 镜像;以 GitHub releases 与各包 CHANGELOG.md 为准。下方条目只覆盖 MCP 可见面(工具、schema、安全边界),内部重构不列。

v0.1.4 (仅 npm,截至本文写就尚未在 GitHub 打 tag)

仅 patch 修复。无新工具、无破坏性输入/输出 shape 变化。升级后用 list_tools 复核。

v0.1.3 (仅 npm,截至本文写就尚未在 GitHub 打 tag)

仅 patch 修复。无新工具、无破坏性输入/输出 shape 变化。

v0.1.2 — 2026-04-15

与 tronlink-signer@0.1.2 同步发布。审批流大改版;MCP 工具 schema 无破坏性变化。

  • 新增 —— sign_transaction 支持 broadcast: true 同步签名 + 广播(此前仅签名)。
  • 新增 —— connect_wallet 在钱包已连接时自动完成,无需再走一次审批。
  • 新增 —— 交易解析:TRX 转账、TRC10、TRC20、TRC721 NFT、质押/解冻、委托、投票等在审批页以人类可读形式呈现。
  • 改进 —— 单页审批流:一个常驻浏览器标签 + 心跳检测;server 重启后旧标签自动失效。
  • 改进 —— TRC20 金额校验改用 BigInt 小数转换(处理 0 位小数、>18 位小数等边界)。
  • 改进 —— send_trx、sign_transaction 在提交失败时返回真实的 broadcast 错误,不再是空消息。
  • 迁移 —— 无需迁移;MCP 工具 schema 未变更。

v0.1.1 — 2026-04-15

  • tronlink-signer@0.1.1 + mcp-tronlink-signer@0.1.1 首次 npm 发布。
  • 各包 README,含用法与 API 文档。
  • npm package metadata(keywords、repository、license、files)。
  • LICENSE 增加版权声明。

兼容性与迁移策略

  • 语义化版本。 1.0 之前:minor 升级(0.x → 0.y)允许破坏性变更;patch 升级(0.1.x → 0.1.y)不变更 MCP 工具名或输入 schema。1.0 之后:标准 semver,仅 major 允许破坏。
  • 废弃窗口。 当某工具或入参字段被废弃时,下一 minor 至少保留旧形式与新形式并存 一个 minor 周期,schema 内置 meta.deprecated 标记;移除最早发生在再下一周期。
  • 稳定契约。 工具名、status 值(success / pending / failed)属于公开面,patch 不会动。
  • 不稳定契约。 错误 message 文本(匹配错误中列出的已知取值,其他按未知处理)、日志行格式、审批页的视觉布局 不属于 公开面,随时可能变化。
  • 升级后校验。 升级后 必须 重新 list_tools 确认你依赖的名字 + schema 仍存在,再继续工作流。