关于 TAS Guard
TAS Guard 是面向 AI 客户端的交易安全代理,位于客户端与经纪商或交易所 MCP 服务之间。它按订单规则执行限制、审批和审计,也支持 Solana 与 EVM 交易检查。
主要功能
- 01单笔与每日交易限额
- 02交易标的与方向白名单
- 03敏感操作人工审批
- 04紧急开关与哈希链审计日志
- 05Solana 和 EVM 交易检查
适用场景
- 01限制 Agent 的单笔及每日交易额
- 02要求大额或实盘订单经审批
- 03拦截未知工具和不允许的标的
- 04通过防篡改日志复核决策
MCP 相关
它位于 MCP 客户端与经纪商或交易所 MCP 服务之间,在转发前检查工具调用,并向客户端提供受保护的交易工具及状态工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
TAS Guard
面向交易的 AI Agent 安全代理。 将它放在 AI 客户端(Claude、ChatGPT、Cursor 或你自己的 Agent)与任意经纪商或交易所 MCP 服务之间。它会在订单到达经纪商之前,强制执行单笔和每日限额、交易标的允许列表、人工审批、紧急停止开关和防篡改审计日志。

AI client ──► TAS Guard ──► Alpaca / CCXT / any trading MCP server ──► your account
│
├─ blocks: over-limit orders, off-list symbols, withdrawals, leverage changes
├─ asks you: large orders, live money, "close everything"
└─ logs: every decision, hash-chained
零依赖。约 2,000 行纯 JavaScript,一次就能读完。
0.4 版新增:Solana 模式。 tas-guard sol-rpc 会模拟 Solana Agent 发送的每笔交易,并拦截资金抽取模式(隐藏授权、账户接管)、失控的优先费以及任何超出限额的交易,还支持按程序设置限额,例如“pump.fun:每笔交易 $20,每日 $100”。立即试用:npx tas-guard sol-demo。
另有:链上(EVM)模式,适用于持有自有 EVM 钱包的 Agent:tas-guard rpc 是一个本地 JSON-RPC 端点,Agent 将其用作 RPC URL。
10 秒快速体验(无需经纪商账户)
tas-guard demo 会在内置的模拟经纪商前运行安全代理,并使用模拟价格。将它作为 MCP 服务添加到 AI 应用中:
{ "mcpServers": { "tas-guard-demo": { "command": "npx", "args": ["-y", "tas-guard", "demo"] } } }
(Windows 上请使用 "command": "cmd", "args": ["/c", "npx", "-y", "tas-guard", "demo"]。)然后让 Agent 买入 1 股 SPY,价格为 $580(允许);买入 2 股 SPY,价格为 $580(暂缓,等待你审批);买入 10 股 SPY(拦截:超过 $2,000 的单笔限额);或买入 1 股 TSLA(拦截:不在允许列表中)。使用 npx tas-guard approve <id> 批准暂缓的订单。
为什么不用通用 MCP 网关?
通用网关按工具做决策:“createOrder 是关键操作,需要审批。”它们无法区分 $50 的订单和 $50,000 的订单,因此你最终只能批准所有订单,或者一个也不批。
TAS Guard 会读取订单本身。它知道 Alpaca 的 place_option_order 有 100 倍合约乘数,ccxt 的 cost 是计价货币的值,而 amount 是基础货币单位,并且 ccxt 会对第一笔实时订单返回预览。这让“允许小额订单、大额订单需审批、每日绝不超过 $2,000”成为可能。
| 经纪商连接器 | 自身功能 | 使用 TAS Guard 后 |
|---|---|---|
| Alpaca MCP(TAS 安全评分 68) | AI 可以直接下单;工具集可以限制其权限 | 单笔和每日限额、交易标的允许列表、超过阈值需审批 |
| CCXT MCP | 有自身的限额和确认步骤 | 在你使用的所有交易所之间统一策略和审计日志 |
| 其他任何交易 MCP | 各不相同 | 启发式配置;无法识别的操作一律拦截 |
安全评分和订单限制信息:tradingagentstack.com。
快速开始(Alpaca,模拟交易)
- 编写
~/tas-guard/alpaca.json(或运行npx tas-guard init alpaca-mcp-server):
{
"name": "alpaca",
"profile": "alpaca-mcp-server",
"upstream": {
"command": "uvx",
"args": ["alpaca-mcp-server"],
"env": {
"ALPACA_API_KEY": "${ALPACA_API_KEY}",
"ALPACA_SECRET_KEY": "${ALPACA_SECRET_KEY}",
"ALPACA_PAPER_TRADE": "true"
}
},
"policy": {
"max_order_value": 500,
"max_daily_value": 2000,
"approve_over": 250,
"symbols_allow": ["SPY", "QQQ", "AAPL", "MSFT"]
}
}
${VAR} 从环境变量中读取,因此密钥无需保存在文件中。
- 将 MCP 客户端指向安全代理,而不是 Alpaca。Claude Desktop 的配置文件为
claude_desktop_config.json:
{
"mcpServers": {
"alpaca": {
"command": "npx",
"args": ["-y", "tas-guard", "run", "--config", "/Users/you/tas-guard/alpaca.json"],
"env": { "ALPACA_API_KEY": "...", "ALPACA_SECRET_KEY": "..." }
}
}
}
对于 Claude Code:claude mcp add alpaca -- npx -y tas-guard run --config ~/tas-guard/alpaca.json
- 让 Agent 调用
tas_guard_status,查看它所遵循的限额。
没有配置文件?npx tas-guard run --profile alpaca-mcp-server -- uvx alpaca-mcp-server 会使用默认策略。
它如何判定
每个工具都会被归入一个类别:有已验证的连接器配置时依据该配置;没有配置的服务则根据名称启发式规则和 MCP 注释进行判定。
| 类别 | 示例 | 默认操作 |
|---|---|---|
read | 报价、持仓、余额 | 允许 |
benign_write | 观察列表 | 允许 |
cancel、close | 取消一笔订单、平掉一个仓位 | 允许(熔断开关开启时也允许) |
order | 下单 | 检查限额 |
modify、cancel_all、close_all、other_write | 替换订单、取消所有订单(包括止损单)、行使期权 | 询问人工 |
leverage、funds_out、account、raw_write、unknown | 设置杠杆、提款、转账、账户设置、“调用任意端点”、任何无法识别的操作 | 阻止(并对 Agent 隐藏) |
对于 order 调用,按以下顺序检查:
- 熔断开关已开启 → 阻止。
- 交易标的在
symbols_block中,或不在symbols_allow中(如果已设置)→ 阻止。支持通配符:"BTC/*"。 - 交易方向不在
sides_allow中(如果已设置)→ 阻止。 - 每分钟或每天的订单数超过
max_orders_per_minute或max_orders_per_day→ 阻止。 - 订单价值超过
max_order_value,或今天的累计价值将超过max_daily_value→ 阻止。这些是硬性限额;批准也无法覆盖。 - 订单价值超过
approve_over、价值未知(按数量下市价单、多腿订单),或使用真实资金且启用了live_requires_approval→ 询问人工。 - 否则 → 允许。
只有经纪商实际接受的订单才计入每日总额。被拒绝的订单和 ccxt 预览不计入。订单逐笔执行,并在发送前重新检查限额,因此并行调用无法绕过每日上限。
策略参考
{
"max_order_value": 500, // hard, per order, in the profile's quote currency
"max_daily_value": 2000, // hard, sum of executed orders today (local time)
"max_orders_per_day": 20,
"max_orders_per_minute": 3,
"approve_over": 250, // soft: above this, a human approves
"symbols_allow": [], // empty = any symbol
"symbols_block": [],
"sides_allow": [], // e.g. ["buy"] for no selling
"unknown_value": "approve", // allow | approve | block when the value can't be computed
"live_requires_approval": true, // every live-money order needs a human
"classes": { "close_all": "allow", "unknown": "approve" }, // override any class
"hide_blocked_tools": true,
"approval_ttl_minutes": 15
}
审批
当某项操作需要审批时,守护程序会询问你,绝不会询问 Agent。
- **在客户端中:**如果你的 MCP 客户端支持 elicitation,应用中会出现提示(“批准此操作?”)。只有人工才能作答。
- **在终端中:**否则,该调用会被暂停并分配一个 ID。运行
npx tas-guard approve <id>(或deny <id>),然后由 Agent 重试该调用。每次批准仅对这次特定调用有效一次,且有效期为 15 分钟。
已在 Claude Desktop(Windows,2026 年 10 月)上使用 Alpaca 模拟账户进行测试:Claude Desktop 不会显示应用内提示,因此其中的审批需通过 npx tas-guard approve <id> 完成。Claude 会转交请求 ID 并等待你处理。
npx tas-guard pending
npx tas-guard approve 3f9a1c
手机审批与熔断开关(Telegram)
在手机上接收被暂停的操作,并通过批准和拒绝按钮进行处理;在订单被阻止时接收提醒,还可以随时触发熔断开关。它使用你自己的 Telegram 机器人,因此所有内容都不会经过我们的服务器。
npx tas-guard telegram-setup --config ~/tas-guard/alpaca.json
它会引导你通过 @BotFather 创建机器人,等待你在机器人对话中按下 Start,然后将机器人令牌和你的聊天 ID 保存到守护程序配置中。之后请重启 AI 应用。
你将获得:
- **批准 / 拒绝按钮。**Agent 的调用会等待最多 45 秒(
wait_seconds)以接收你的点击,然后在同一次调用中继续执行。如果你操作较慢,Agent 会收到通知,要求在你批准后重试。 - **提醒:**当订单类调用被阻止时发送(默认启用
notify_blocked);也可以选择在订单发送给经纪商时发送提醒(notify_executed)。 - 手机命令:
/status(限额和今日用量)、/pending(重新发送所有待处理事项)、/kill、/resume。 - **仅限你操作:**来自其他 Telegram 账户的点击和命令都会被忽略。
- **仅限手机审批:**设置
"cli": false,即可让tas-guard approve拒绝处理来自此守护程序的请求。这样可以避免拥有 shell 访问权限的 Agent 自行运行批准命令。
"approvals": {
"cli": false,
"telegram": {
"bot_token": "${TAS_TELEGRAM_BOT_TOKEN}",
"chat_id": "123456789",
"wait_seconds": 45,
"notify_blocked": true,
"notify_executed": false
}
}
多个守护程序可以共用一个机器人。由正在监听的守护程序处理点击,其他守护程序则从共享状态中读取审批结果。
熔断开关
npx tas-guard kill "market looks wrong" # every guard blocks new orders immediately
npx tas-guard resume
熔断开关开启时,读取、取消订单和平仓操作仍可正常使用,因此你(或 Agent)仍然可以平掉所有仓位。
审计日志
每项决策都会追加到 ~/.tas-guard/audit.jsonl:工具、类别、参数(已隐藏机密)、决策、原因、订单金额,以及是否已执行。每一行都包含上一行的哈希。
npx tas-guard log --tail 20
npx tas-guard verify-log # detects edited or deleted lines
连接器配置
配置文件说明服务器的每个工具可以如何处理资金,以及其订单字段位于何处。架构见 schema/connector-profile.v1.json。内置配置文件均通过服务器的源代码或官方文档进行核验,并记录对应的提交或页面:
alpaca-mcp-server:alpacahq/alpaca-mcp-server @ 2a973a0ccxt-mcp-server:ccxt/ccxtmcp/@ 310bf4brobinhood-trading-mcp:Robinhood 托管的 Trading MCP,依据 Robinhood 文章 "Trading with your agent" 中的 94 个工具表(2026-10-21)。该服务器是闭源的,Robinhood 未公开参数名称,因此无法读取订单金额:所有订单都需要审批,而symbols_allow列表会拦截订单。
使用没有配置文件的服务器?"profile": "auto" 会根据工具名称和 MCP 注释对工具进行分类,并拦截无法识别的工具。欢迎通过 PR 提交更多经纪商的配置文件。
链上(EVM)模式
对于自行签署并发送交易的 Agent(AgentKit、viem、ethers、web3.py 或自有机器人),tas-guard rpc 会运行一个本地 JSON-RPC 端点。将 Agent 的 RPC URL 指向该端点,而不是指向你的服务提供商:
AI agent ──► http://127.0.0.1:8547 (TAS Guard) ──► your RPC provider (Alchemy, Infura, a node...)
│
├─ reads (balances, calls, logs, gas...): passed through untouched
├─ sends and signatures: decoded, checked, then forwarded, held for you, or refused
└─ logs: every decision, in the same hash-chained audit log
无需链、密钥或资金即可试用:npx tas-guard rpc-demo 会在内置的 Base 模拟节点前启动防护程序,并打印可分别获得放行、暂挂和拦截结果的 curl 命令。
检查内容
只有可能转移资金的方法会经过检查;其他所有请求都会直接转发给你的服务提供商。
| 方法 | 保护机制读取的内容 |
|---|---|
eth_sendRawTransaction | 解码已签名的交易(legacy、EIP-2930、EIP-1559):链 ID、to、value、calldata。其 nonce 必须与某个 wallets 中的钱包匹配。 |
eth_sendTransaction | 交易对象;from 必须是 wallets 中的钱包之一。 |
eth_signTypedData_v4(以及 v1/v3) | ERC-2612 和 DAI permit,以及 Uniswap Permit2(PermitSingle、PermitBatch、PermitTransferFrom)会被视为代币授权:spender、token、amount、deadline。其他 typed data 会询问你。 |
personal_sign / eth_sign | personal_sign 会询问你;eth_sign(签署原始哈希,可能是交易)会被拦截。 |
任何其他 eth_send*、eth_sign*、personal_*、wallet_* | 拦截:保护机制无法解码这些方法(eth_signTransaction、eth_sendUserOperation、wallet_sendCalls、personal_sendTransaction……)。 |
calldata 按 4 字节选择器读取:原生代币转账、ERC-20 transfer、transferFrom、approve、increaseAllowance、ERC-721/1155 setApprovalForAll 和 Permit2 approve。其他情况均视为通用合约调用。
每笔发送或签名都会依次进行以下检查:
- 紧急停止开关已开启 → 拦截(读取仍可进行)。
- 发送方不在你的
wallets中 → 拦截。 - 链不在
chains_allow中、签名所用链与上游不一致,或没有重放保护(pre-EIP-155)→ 拦截。 - 超过
max_tx_per_minute或max_tx_per_day→ 拦截。 - 无限授权(≥ 2^255、最大 uint、Permit2 最大 uint160)→ 拦截。
setApprovalForAll(…, true)→ 拦截。撤销操作(approve(x, 0)、setApprovalForAll(x, false))允许通过。 - USD 价值超过
max_tx_usd,或今天的总额将超过max_daily_usd→ 拦截。价值超过max_tx_usd的授权同样会被拦截。这些是硬性限制;批准无法覆盖。 - 预检回滚:从你的钱包在
latest区块执行eth_call和eth_estimateGas。任一失败 → 拦截,并显示回滚原因(Vault: deposits are paused、ERC20: transfer amount exceeds balance……)。 - 以下情况会询问人工:价值超过
approve_over_usd、无法确定价值(unknown_value)、收款方不在recipients_allow中(new_recipient)、合约或 spender 不在contracts_allow中(unknown_contract),或操作为授权或 permit(token_approval)。 - 其他情况 → 转发。
USD 价值来自你的配置,而非价格源:每条链的 native_usd 和 tokens 列表(稳定币使用 "usd_price": "stable")。只有上游已接受的发送才会计入每日总额。发送会逐笔处理,并在转发前重新检查限额。
配置(Base、USDC)
{
"name": "base-agent",
"upstream_rpc": "https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
"listen": "127.0.0.1:8547",
"wallets": ["0xYourAgentWalletAddress"],
"onchain": {
"chains_allow": [8453],
"native_usd": { "8453": 3000 },
"tokens": {
"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913": { "symbol": "USDC", "decimals": 6, "usd_price": "stable" }
},
"max_tx_usd": 100,
"max_daily_usd": 500,
"approve_over_usd": 25,
"max_tx_per_minute": 3,
"max_tx_per_day": 20,
"recipients_allow": [],
"contracts_allow": [],
"unlimited_approval": "block"
},
"approvals": {
"telegram": { "bot_token": "${TAS_TELEGRAM_BOT_TOKEN}", "chat_id": "123456789" }
}
}
ALCHEMY_API_KEY=... npx tas-guard rpc --config ~/tas-guard/base.json
${VAR} 从环境中读取。上游 URL(及其中的任何密钥)绝不会被记录日志、审计或返回给 Agent;仅显示其主机名。完整架构及每项设置和默认值见 schema/onchain-guard.v1.json。不接受未知设置,因此拼写错误不会悄悄回退到默认值。
| 设置 | 默认值 | |
|---|---|---|
chains_allow | [](任意) | 链 ID;其他链会被拦截 |
max_tx_usd、max_daily_usd | 100、500 | 硬性限制 |
max_tx_per_minute、max_tx_per_day | 3、20 | 硬性限制 |
approve_over_usd | 50 | 超过此值时询问 |
unknown_value | approve | 无法确定价值时 |
recipients_allow / new_recipient | [] / approve | 你自己的钱包始终视为已知 |
contracts_allow / unknown_contract | [] / approve | 合约调用和授权 spender |
token_approval | approve | 任何 approve、permit 或 Permit2 操作 |
unlimited_approval、approval_for_all | block、block | |
typed_data、personal_sign、eth_sign | approve、approve、block | |
unsupported_methods | block | |
preflight | true | |
approval_ttl_minutes | 15 |
将 Agent 指向它
- viem / AgentKit(
ViemWalletProvider):http("http://127.0.0.1:8547", { timeout: 900_000 })。viem 默认的 10 秒超时比人工审批所需的时间短。 - ethers v6:
new JsonRpcProvider("http://127.0.0.1:8547")。请求会在 5 分钟后超时;如果你之后批准了,Agent 重新发送同一笔已签名交易即可完成审批。 - web3.py:
Web3(Web3.HTTPProvider("http://127.0.0.1:8547", request_kwargs={"timeout": 900}))。
Agent 可以在 RPC 上调用 tas_guardStatus,查看限制和今日用量。
审批、紧急停止开关和审计日志
它们的工作方式与 MCP 模式完全相同,并共用同一状态。待审批的请求会保持打开状态,直到你通过 npx tas-guard approve <id> 或手机批准(Telegram 消息会显示链、合约、代币、金额、美元价值和原因),然后请求会被转发,Agent 会收到交易哈希。如果请求被拒绝或在 approval_ttl_minutes 规定的时间内未获答复,Agent 会收到 JSON-RPC 错误。如果 Agent 的客户端先放弃,等你批准后再发送同一笔已签名交易即可完成操作。
npx tas-guard kill(或在手机上发送 /kill)会阻止所有 guard 上的每笔发送和签名操作,但读取操作仍可正常进行。npx tas-guard log 和 verify-log 也会记录链上决策。
局限性(链上)
- 必须配置钱包。 guard 不具备 secp256k1 公钥恢复功能,因此无法证明是谁签署了原始交易。它会将交易的 nonce 与你的
wallets匹配,并阻止不符合条件的交易。如果另一把密钥签署的交易恰好使用了匹配的 nonce,它也会被视为你的交易,不过仍会对其内容执行所有策略检查。 - 预检只是回滚检查,并非完整模拟。 在
latest区块执行eth_call和eth_estimateGas,可以检测回滚和资金不足,但不会显示余额变化,而且链的状态可能在检查后、交易纳入前发生变化。 - 通用合约调用只按其原生币价值计价。 调用内部转移的代币(例如通过你已批准的路由器进行兑换)不会计入 USD 限额。因此,默认情况下,未知合约和所有授权操作都会要求你审批;请尽量缩短
contracts_allow。 - 价格是静态的。
native_usd和usd_price来自你的配置;未列出的代币不会计价(unknown_value)。 - 它只保护使用此 RPC URL 的 Agent。 通过自己的 API 广播交易的钱包(Coinbase CDP 服务端钱包、ERC-4337 打包器、第二个 RPC)可以绕过它。User operation、EIP-7702 和 Blob 交易会被阻止,不会被解码。
- 此处仅支持 EVM。 Solana 请参阅 Solana 模式。
- 与 MCP 模式相同的注意事项: 如果 Agent 可以访问 shell,它可能会自行运行
tas-guard approve,除非你使用手机审批并设置"cli": false。
Solana 模式
对于自行签署交易的 Solana Agent(Solana Agent Kit、@solana/web3.js 或 @solana/kit 机器人、Jupiter 和 pump.fun 脚本),tas-guard sol-rpc 会运行本地 Solana JSON-RPC 端点。将 Agent 的 RPC URL 指向该端点,而不是你的服务提供商:
AI agent ──► http://127.0.0.1:8890 (TAS Guard) ──► your Solana RPC (Helius, Triton, QuickNode...)
│
├─ reads and WebSocket subscriptions: passed through untouched
├─ sendTransaction: decoded, simulated, checked, then forwarded, held for you, or refused
└─ logs: every decision, in the same hash-chained audit log
无需密钥、网络连接或资金,即可查看它的运行效果:
npx tas-guard sol-demo
Agent 通过 guard 向内置模拟链发送七笔已签名交易:未超过限额的 pump.fun 买入会通过;超过单个程序限额的买入会被阻止;向新地址发送的交易会暂缓并等待审批;会悄悄将盗币账户设为你的 USDC 代理的虚假“空投领取”会被阻止;无限额授权、超过单笔交易限额的发送,以及 0.14 SOL 优先费也会被阻止。
它无法保护的情况: 托管式 Telegram 交易机器人(Trojan、BullX、Axiom 等)会将你的密钥保存在其服务器上,且不会通过你的 RPC 发送交易,因此本地 guard 无法监控它们的交易。使用这类机器人前,请先检查其链接:tradingagentstack.com/check。
检查内容
只检查 sendTransaction;其他 send* 方法(sendBundle……)会被拦截,因为无法检查。所有交易格式都会解码:legacy、带地址查找表的 v0(从链上读取这些表),以及 v1(SIMD-0385,自 2026 年 9 月起在主网上运行)。解码器已与 @solana/web3.js 进行了双向交叉验证,并针对 314 笔包含全部三个版本的真实 devnet 交易进行了验证,结果均与节点对每笔交易的视图一致。
接着,防护程序会模拟交易(使用可写账户的前后状态调用 simulateTransaction)。这样就能衡量实际从你的钱包转出的资产,包括在其他程序内部转移的 SOL 和代币,而不只是顶层指令所显示的内容。
对每笔交易,按以下顺序检查:
- 紧急开关已启用 → 拦截(读取仍可正常进行)。
- 未由你的
wallets中的钱包签名 → 拦截。 - 集群不在
clusters_allow中(从 RPC 的 genesis hash 读取)→ 拦截。 - 交易中的任何位置出现
addresses_block中的账户 → 拦截。 - 超过
max_tx_per_minute或max_tx_per_day→ 拦截。 - 网络费加优先费超过
max_fee_sol→ 拦截(可捕获失控的优先费;也会读取 v1 的绝对优先费)。 - 你的钱包被分配给另一个程序(
System Assign),或你的某个代币账户被交给新所有者(SetAuthority),无论是通过指令还是模拟显示的其他程序内部操作 → 拦截(owner_change)。 - 无限额代币委托(
Approve的金额为 u64 最大值),无论是通过指令还是模拟显示的操作 → 拦截。其他任何委托都会询问你(token_delegation);价值超过max_tx_usd的委托会被拦截。 - 模拟失败 → 拦截,并显示程序的错误。
- 从你的钱包转出的 USD 价值超过
max_tx_usd、今日总额超过max_daily_usd,或超过交易所调用程序对应的program_caps限额 → 拦截。这些都是硬性限额,无法通过批准绕过。 - 以下情况需要人工批准:价值超过
approve_over_usd;无法为转出资产定价(unknown_value);直接 SOL 或代币转账的收款地址不在recipients_allow中(new_recipient;Jito 小费账户视为已知);或调用的程序不在programs_allow中(unknown_program)。 - 否则 → 转发。
价值计算包括 SOL(含包装 SOL 及代币账户中的租金,因此创建和关闭账户后净额相抵)、网络费,以及你拥有的账户中余额减少的所有代币。代币价格根据你的配置确定:sol_usd,以及 tokens 列表("usd_price": "stable" 或数字)。USDC 和 USDT 默认按 1 美元计算。你出售的 Memecoin 如果未列出,就没有价格;因此,在默认设置 unknown_value: "approve" 下,出售未列出的代币会询问你。购买的价值按转出的 SOL 计算。
programs_allow 和 program_caps 的程序预设:jupiter、pumpfun、pumpswap、raydium(AMM v4、CPMM、CLMM)、orca(Whirlpool)、meteora(DLMM、dynamic AMM)。程序 ID 来自各项目自己的文档,并已于 2026 年 10 月核验。核心程序(System、Token、Token-2022、Associated Token、Compute Budget、Memo)始终允许,因为防护程序会自行解码这些程序。
配置(mainnet、Jupiter 和 pump.fun)
npx tas-guard init solana 会打印此起始配置:
{
"name": "solana",
"upstream_rpc": "https://mainnet.helius-rpc.com/?api-key=${HELIUS_API_KEY}",
"listen": "127.0.0.1:8890",
"wallets": ["YourAgentWalletAddress"],
"solana": {
"clusters_allow": ["mainnet"],
"sol_usd": 150,
"max_tx_usd": 50,
"max_daily_usd": 200,
"approve_over_usd": 25,
"max_fee_sol": 0.005,
"programs_allow": ["jupiter", "pumpfun", "pumpswap"],
"program_caps": { "pumpfun": { "max_tx_usd": 20, "max_daily_usd": 100 } },
"recipients_allow": []
},
"approvals": {
"telegram": { "bot_token": "${TAS_TELEGRAM_BOT_TOKEN}", "chat_id": "123456789" }
}
}
HELIUS_API_KEY=... npx tas-guard sol-rpc --config ~/tas-guard/solana.json
完整架构见 schema/solana-guard.v1.json;不接受未知设置。
| 设置 | 默认值 | |
|---|---|---|
clusters_allow | [](任意) | mainnet、devnet、testnet、localnet |
sol_usd | 无 | SOL 的美元价格;未设置时,SOL 不计价 |
tokens | {} | { "<mint>": { "symbol": "BONK", "usd_price": 0.00002 } } |
max_tx_usd、max_daily_usd | 100、500 | 硬性限额 |
max_tx_per_minute、max_tx_per_day | 3、20 | 硬性限额 |
max_fee_sol | 0.01 | 网络费和优先费的硬性限额 |
program_caps | {} | 按程序(或预设)设置:max_tx_usd、max_daily_usd |
addresses_block | [] | 如果其中任一地址出现,则硬性拦截 |
approve_over_usd | 50 | 超过此金额时询问 |
unknown_value | approve | 无法定价的转出资产 |
programs_allow / unknown_program | [] / approve | 程序 ID 或预设 |
recipients_allow / new_recipient | [] / approve | 你的钱包始终视为已知收款方 |
jito_tips | true | Jito 小费账户视为已知收款方 |
token_delegation、unlimited_delegation | approve、block | |
owner_change、close_authority_change | block、approve | |
unsupported_methods | block | |
simulate | true | 关闭时,只对已解码的 SOL 和代币转账计价;其他程序会导致金额未知 |
approval_ttl_minutes | 15 |
将 Agent 指向它
@solana/web3.js:new Connection("http://127.0.0.1:8890", "confirmed")。如果 URL 中包含端口,web3.js 会在该端口号加 1 的端口上查找 WebSocket,因此 guard 也会监听 8891;订阅(confirmTransaction会用到)会转发到你的提供商的 WebSocket。@solana/kit:createSolanaRpc("http://127.0.0.1:8890")和createSolanaRpcSubscriptions("ws://127.0.0.1:8890")。- Solana Agent Kit: 将 guard 的 URL 作为 RPC URL 传入。
- 如果你的提供商的 WebSocket URL 不是将 RPC URL 的协议换成
wss://后得到的地址,请设置upstream_ws。
Agent 可以在 RPC 上调用 tas_guardStatus,查看限额、今日用量和各程序的累计用量。
审批与过期的区块哈希
Solana 交易通常会在构建约一分钟后过期,往往比人工审批所需的时间短。如果你在决定期间区块哈希过期,Agent 会收到:“已批准,但交易的区块哈希已过期;请使用新的区块哈希重新构建相同交易并再次发送”。重新签名的副本无需再次询问即可通过,因为审批会匹配去除签名和区块哈希后的交易。使用新报价重新构建的 swap 属于不同交易,会再次请求审批。
紧急停用开关、手机审批和审计日志的工作方式与其他模式完全相同,并共用同一份状态。
限制(Solana)
- 模拟只是状态快照。 它会显示交易发送前一刻在链上状态下可能产生的效果。swap 仍可能在你的滑点设置范围内以更差的价格成交,而且状态可能会在交易纳入区块前发生变化。
- 价格是静态的。
sol_usd和代币价格取自你的配置。 - 它只保护通过此 RPC URL 发送交易的 Agent。 其他 RPC、Jito bundle 端点、钱包即服务 API 或托管式机器人都能绕过它。
- Durable-nonce 交易在通过 guard 发送时会接受检查,但之后从其他地方发送的副本不会。
- **与其他模式相同的注意事项:**如果 Agent 可以访问 shell,除非你使用
"cli": false的手机审批,否则它可以自行运行tas-guard approve。
Windows 和 Claude Desktop 说明
已于 2026 年 10 月在 Windows 上使用 Microsoft Store 版本的 Claude Desktop 进行测试。
- 将 API 密钥放在 guard 文件中(
alpaca.json中的upstream.env),不要放在 Claude Desktop 的配置文件中。Claude Desktop 会为每个服务保存一份独立的设置,因此你在其配置文件中更改的密钥可能无法传到服务。guard 文件中的密钥始终优先。guard 的日志会显示上游收到的密钥(仅显示最后 4 个字符),例如credential ALPACA_API_KEY: ...PBYR (from guard config)。 - 在
claude_desktop_config.json中使用cmd /c启动 npx:"command": "cmd", "args": ["/c", "npx", "-y", "tas-guard", "run", "--config", "C:\\Users\\you\\tas-guard\\alpaca.json"]。 - 只有在 Claude Desktop 完全退出时才编辑其配置文件(在系统托盘中选择“退出”)。应用运行时会重写该文件。Store 版本将配置文件保存在
%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\下。 - **加快启动速度:**运行一次
uv tool install alpaca-mcp-server,并在 guard 文件中设置"command": "alpaca-mcp-server", "args": []。否则,uvx会在每次启动时重新解析服务,这会额外花费 10 到 20 秒。 - **审批:**Claude Desktop 不会显示应用内审批提示。请使用手机审批(
telegram-setup),或使用npx tas-guard approve <id>批准暂存的操作。
限制(请阅读)
- 拥有 shell 访问权限的 Agent 可以自行运行
tas-guard approve,除非你使用带有"cli": false的手机审批。即便如此,能够编辑~/.tas-guard中文件的 Agent 仍可篡改状态,因此应尽可能让交易 Agent 在无法访问主目录的情况下运行。 - **数值使用订单自身的价格。**按数量下达的市价单没有价格,因此默认需要审批。实时价格查询已列入路线图。
- **目前尚无基于盈亏的止损机制。**每日限额限制 Agent 可以交易的金额,而非其可能亏损的金额。
- ccxt 的报价货币因交易对而异(BTC/USDT 使用 USDT,ETH/BTC 使用 BTC)。使用
symbols_allow,让限额保持合理。 - **这是安全带,不是保证。**经纪商自身的控制仍然很重要。不构成财务建议。
开发
npm test # 78 tests: unit, end to end through a mock broker over real MCP stdio, the phone flow against a mock Telegram API,
# onchain mode (transaction decoding, policy, and the RPC proxy against a mock EVM node), and Solana mode
# (decoder, policy, and the RPC + WebSocket proxy against a mock Solana chain that executes transactions)
采用 MIT 许可。由 TradingAgentStack 构建,这是一个独立目录,展示 AI 交易工具如何使用你的资金。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。