mcpField
T
TAS Guard

TAS Guard

本地服务
tradingagentstack.com金融数据0今天更新

关于 TAS Guard

TAS Guard 是面向 AI 客户端的交易安全代理,位于客户端与经纪商或交易所 MCP 服务之间。它按订单规则执行限制、审批和审计,也支持 Solana 与 EVM 交易检查。

主要功能

  1. 01单笔与每日交易限额
  2. 02交易标的与方向白名单
  3. 03敏感操作人工审批
  4. 04紧急开关与哈希链审计日志
  5. 05Solana 和 EVM 交易检查

适用场景

  1. 01限制 Agent 的单笔及每日交易额
  2. 02要求大额或实盘订单经审批
  3. 03拦截未知工具和不允许的标的
  4. 04通过防篡改日志复核决策

MCP 相关

它位于 MCP 客户端与经纪商或交易所 MCP 服务之间,在转发前检查工具调用,并向客户端提供受保护的交易工具及状态工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"intoapex-tas-guard": {
"command": "npx",
"args": [
"-y",
"tas-guard"
]
}
}
}
启动命令npx -y tas-guard

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmtas-guard0.4.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

TAS Guard

面向交易的 AI Agent 安全代理。 将它放在 AI 客户端(Claude、ChatGPT、Cursor 或你自己的 Agent)与任意经纪商或交易所 MCP 服务之间。它会在订单到达经纪商之前,强制执行单笔和每日限额、交易标的允许列表、人工审批、紧急停止开关和防篡改审计日志。

Agent 的超限订单被拦截,市价单被暂缓,在手机上获批后发送给经纪商

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,模拟交易)

  1. 编写 ~/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} 从环境变量中读取,因此密钥无需保存在文件中。

  1. 将 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

  1. 让 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 调用,按以下顺序检查:

  1. 熔断开关已开启 → 阻止。
  2. 交易标的在 symbols_block 中,或不在 symbols_allow 中(如果已设置)→ 阻止。支持通配符:"BTC/*"。
  3. 交易方向不在 sides_allow 中(如果已设置)→ 阻止。
  4. 每分钟或每天的订单数超过 max_orders_per_minute 或 max_orders_per_day → 阻止。
  5. 订单价值超过 max_order_value,或今天的累计价值将超过 max_daily_value → 阻止。这些是硬性限额;批准也无法覆盖。
  6. 订单价值超过 approve_over、价值未知(按数量下市价单、多腿订单),或使用真实资金且启用了 live_requires_approval → 询问人工。
  7. 否则 → 允许。

只有经纪商实际接受的订单才计入每日总额。被拒绝的订单和 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 @ 2a973a0
  • ccxt-mcp-server:ccxt/ccxt mcp/ @ 310bf4b
  • robinhood-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_signpersonal_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。其他情况均视为通用合约调用。

每笔发送或签名都会依次进行以下检查:

  1. 紧急停止开关已开启 → 拦截(读取仍可进行)。
  2. 发送方不在你的 wallets 中 → 拦截。
  3. 链不在 chains_allow 中、签名所用链与上游不一致,或没有重放保护(pre-EIP-155)→ 拦截。
  4. 超过 max_tx_per_minute 或 max_tx_per_day → 拦截。
  5. 无限授权(≥ 2^255、最大 uint、Permit2 最大 uint160)→ 拦截。setApprovalForAll(…, true) → 拦截。撤销操作(approve(x, 0)、setApprovalForAll(x, false))允许通过。
  6. USD 价值超过 max_tx_usd,或今天的总额将超过 max_daily_usd → 拦截。价值超过 max_tx_usd 的授权同样会被拦截。这些是硬性限制;批准无法覆盖。
  7. 预检回滚:从你的钱包在 latest 区块执行 eth_call 和 eth_estimateGas。任一失败 → 拦截,并显示回滚原因(Vault: deposits are paused、ERC20: transfer amount exceeds balance……)。
  8. 以下情况会询问人工:价值超过 approve_over_usd、无法确定价值(unknown_value)、收款方不在 recipients_allow 中(new_recipient)、合约或 spender 不在 contracts_allow 中(unknown_contract),或操作为授权或 permit(token_approval)。
  9. 其他情况 → 转发。

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_usd100、500硬性限制
max_tx_per_minute、max_tx_per_day3、20硬性限制
approve_over_usd50超过此值时询问
unknown_valueapprove无法确定价值时
recipients_allow / new_recipient[] / approve你自己的钱包始终视为已知
contracts_allow / unknown_contract[] / approve合约调用和授权 spender
token_approvalapprove任何 approve、permit 或 Permit2 操作
unlimited_approval、approval_for_allblock、block
typed_data、personal_sign、eth_signapprove、approve、block
unsupported_methodsblock
preflighttrue
approval_ttl_minutes15
将 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 和代币,而不只是顶层指令所显示的内容。

对每笔交易,按以下顺序检查:

  1. 紧急开关已启用 → 拦截(读取仍可正常进行)。
  2. 未由你的 wallets 中的钱包签名 → 拦截。
  3. 集群不在 clusters_allow 中(从 RPC 的 genesis hash 读取)→ 拦截。
  4. 交易中的任何位置出现 addresses_block 中的账户 → 拦截。
  5. 超过 max_tx_per_minute 或 max_tx_per_day → 拦截。
  6. 网络费加优先费超过 max_fee_sol → 拦截(可捕获失控的优先费;也会读取 v1 的绝对优先费)。
  7. 你的钱包被分配给另一个程序(System Assign),或你的某个代币账户被交给新所有者(SetAuthority),无论是通过指令还是模拟显示的其他程序内部操作 → 拦截(owner_change)。
  8. 无限额代币委托(Approve 的金额为 u64 最大值),无论是通过指令还是模拟显示的操作 → 拦截。其他任何委托都会询问你(token_delegation);价值超过 max_tx_usd 的委托会被拦截。
  9. 模拟失败 → 拦截,并显示程序的错误。
  10. 从你的钱包转出的 USD 价值超过 max_tx_usd、今日总额超过 max_daily_usd,或超过交易所调用程序对应的 program_caps 限额 → 拦截。这些都是硬性限额,无法通过批准绕过。
  11. 以下情况需要人工批准:价值超过 approve_over_usd;无法为转出资产定价(unknown_value);直接 SOL 或代币转账的收款地址不在 recipients_allow 中(new_recipient;Jito 小费账户视为已知);或调用的程序不在 programs_allow 中(unknown_program)。
  12. 否则 → 转发。

价值计算包括 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_usd100、500硬性限额
max_tx_per_minute、max_tx_per_day3、20硬性限额
max_fee_sol0.01网络费和优先费的硬性限额
program_caps{}按程序(或预设)设置:max_tx_usd、max_daily_usd
addresses_block[]如果其中任一地址出现,则硬性拦截
approve_over_usd50超过此金额时询问
unknown_valueapprove无法定价的转出资产
programs_allow / unknown_program[] / approve程序 ID 或预设
recipients_allow / new_recipient[] / approve你的钱包始终视为已知收款方
jito_tipstrueJito 小费账户视为已知收款方
token_delegation、unlimited_delegationapprove、block
owner_change、close_authority_changeblock、approve
unsupported_methodsblock
simulatetrue关闭时,只对已解码的 SOL 和代币转账计价;其他程序会导致金额未知
approval_ttl_minutes15
将 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 交易工具如何使用你的资金。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。