Skip to main content
Glama
nirholas

onchain-agent-wallets

by nirholas

onchain-agent-wallets

给 AI 代理一个真实的 Solana 钱包,但不用交出你的钱。

一个 MCP 服务器,给任何代理发放消费额度,而不是私钥。资金留在你拥有的账户里。代理获得的是 SPL Token 程序在链上限制的委托额度,加上你控制的护栏规则,以及从该额度中支付 x402 API 的能力。你可以用一条指令撤销,不用问代理就能把钱拿回来。

这里没有任何模拟:真实的 SPL Token 委托、真实的 Solana、真实的 x402 结算。

阅读概述 · npm

它解决的问题

如今每个"代理钱包"的做法都一样:你生成一个密钥对,交给代理,然后代理就拥有了里面的一切。没有上限、没有白名单、没有过期时间,也没有办法在竞速中抢在代理之前把资金转走。人们只好往里面放很少的钱,结果代理什么有用的事都做不了。

额度授权是更古老、更好的答案。钱从不转移到代理手里。代理只获得花其中一小部分的权限,而链本身强制执行这个限额。

Related MCP server: Slug Wallet

工作原理

   YOU (Phantom, Solflare, Ledger)
    │  owns the vault, holds the money, can revoke or withdraw at any time
    ▼
  ┌──────────────────────────────────────────┐
  │  vault token account                     │   derived from your address:
  │  owner    = you                          │   createWithSeed(you, "oaw1:<agent>")
  │  balance  = 500 USDC                     │
  │  delegate = the agent  ← capped at 100   │   SPL Token enforces this number
  └──────────────────────────────────────────┘
    ▲
    │  may spend up to the cap, and not one unit more
   AGENT (its own keypair, holds only fee SOL)

两层独立的保护机制守护着你:

  1. 链上。 SPL Token 程序会检查每一笔代理签名的转账,对照 delegated_amount,并在每次消费时递减。我们的代码无法提高这个额度。一次 revoke 就能把它归零。这是 SPL Token 程序自带的功能,不是需要信任的新合约。

  2. 本地。 在服务器签署任何内容之前,它会应用你的规则:单笔交易上限、24 小时滚动上限、收款人白名单、x402 主机白名单、过期时间、暂停开关,以及超过阈值必须人工确认。

代理自己的密钥对里只有一点点 SOL 用来付手续费。就算泄露了,影响范围也仅限于剩余额度,而 revoke_agent_wallet 一笔交易就能关闭一切。

安装

npm install -g @three-ws/onchain-agent-wallets
# or run it ad hoc
npx -y @three-ws/onchain-agent-wallets

配置

Claude Code:

claude mcp add onchain-agent-wallets -- npx -y @three-ws/onchain-agent-wallets

或任何 MCP 客户端(mcp.json):

{
	"mcpServers": {
		"onchain-agent-wallets": {
			"command": "npx",
			"args": ["-y", "@three-ws/onchain-agent-wallets"],
			"env": {
				"OAW_NETWORK": "mainnet"
			}
		}
	}
}

无需密钥即可启动。所有者操作会以未签名交易的形式返回,由你的钱包签署,再由 send_signed_transaction 广播。如果你希望服务器代为签署,可以设置 OWNER_SECRET_KEY。

变量

默认值

作用

OWNER_SECRET_KEY

未设置

所有者密钥,base58 或 JSON 字节数组。可选:不设置时由你在 Phantom 中签署。

OAW_NETWORK

mainnet

mainnet 或 devnet。状态按网络分别保存。

SOLANA_RPC_URL

公共端点

你自己的 RPC。公共端点限流很严。必须是 https。

OAW_STATE_DIR

~/.onchain-agent-wallets

代理密钥对、护栏规则和消费账本的存放位置(0700 目录中的 0600 权限文件)。

REQUIRE_CONFIRM

true

所有涉及资金变动的工具,没有 confirm:true 就拒绝执行。

快速开始

给研究代理 100 USDC 的消费额度,单笔上限 5,每日上限 20,只允许访问一个 API:

create_agent_wallet
  id: "researcher"
  allowance: "100"
  per_tx: "5"
  daily: "20"
  allow_hosts: ["api.example.com"]
  confirm: true

fund_agent_wallet  id: "researcher"  amount: "500"  sol: "0.02"  confirm: true

代理现在可以自己花钱了:

pay_x402  id: "researcher"  url: "https://api.example.com/premium"  confirm: true
agent_pay id: "researcher"  to: "<address>"  amount: "2.50"  confirm: true

而你始终掌控一切:

agent_wallet_status  id: "researcher"      # live balances, remaining allowance, warnings
spend_log            id: "researcher"      # every spend AND every refusal, with reasons
set_guardrails       id: "researcher"  paused: true      # instant, free, no transaction
revoke_agent_wallet  id: "researcher"  withdraw: true  confirm: true   # on-chain kill switch

被拒绝时,它会明确告诉你触发了哪条规则:

{
	"ok": false,
	"error": "over_daily",
	"message": "20.5 would exceed the 20 daily cap (18 already spent)",
	"checks": [
		{ "check": "per_tx", "ok": true, "detail": "2.5 is within the 5 per-transaction cap" },
		{ "check": "daily", "ok": false, "detail": "20.5 would exceed the 20 daily cap (18 already spent)" }
	]
}

工具

托管(你来签署)

工具

作用

create_agent_wallet

生成代理密钥对,创建金库,设置委托额度,配置护栏规则。一次调用完成。

fund_agent_wallet

向金库转入代币,并向代理转入 SOL 作为手续费。

approve_agent_allowance

提高、降低或补充链上委托额度。取代之前的额度。

withdraw_from_vault

从金库取回资金。即使没有活跃的委托也能操作。

revoke_agent_wallet

紧急开关。将委托额度归零,并可选地在同一笔交易中把余额转回。

send_signed_transaction

广播你的钱包签署的交易。

护栏规则

工具

作用

set_guardrails

per_tx、daily、allow_recipients、allow_hosts、expires_at、confirm_over、paused。即时生效,免费。

消费(代理来签署)

工具

作用

agent_pay

向收款人发送代币,受限额约束。

pay_x402

调用 x402 API,从额度中支付。

查看

工具

作用

agent_wallet_status

实时链上状态、护栏规则、24 小时和 7 天消费汇总、警告信息。

list_agent_wallets

所有代理及其余额。

spend_log

审计日志,包括被拒绝的记录。

部署

工具

作用

deploy_agent_onchain

为代理铸造 Metaplex Agent Registry 身份,链上属性中记录其支付地址。

export_agent_runtime

导出 mcp.json 和身份凭证,让代理在其他地方运行。

护栏规则

规则

作用

执行方

allowance

代理在获得新授权前总共可花费的额度

SPL Token 程序,链上

vault

代理不能花金库里没有的钱

SPL Token 程序,链上

per_tx

单笔交易最高金额

本服务器

daily

24 小时滚动窗口内的最高消费

本服务器

allow_recipients

只有这些地址可以收款。为空则不受限制。

本服务器

allow_hosts

只有这些主机可以通过 x402 收款。子域名继承。为空则不受限制。

本服务器

expires_at

此时间戳之后拒绝一切消费

本服务器

confirm_over

超过此金额的消费需要显式的 confirm:true

本服务器

paused

立即拒绝一切,免费

本服务器

区别在于出事的时候:如果这台机器被攻破了,本地规则可以被绕过,但链上额度依然无法突破。所以额度应该设为刚好够代理干活的最小数字,需要时再补充,而不是把全部余额都放进去。

x402

pay_x402 会先探测端点是否收费,所以在任何资金移动之前就能知道价格,护栏规则也能看到真实数字。然后它从金库中精确取出所需金额,完成支付,代理账户里不留余额。

以下情况它会拒绝支付:

  • 非 Solana 链(no_solana_option)

  • 错误的网络环境,比如用 devnet 钱包支付 mainnet 价格(wrong_cluster)

  • 代币类型与额度不匹配(asset_mismatch)

  • 超过 max_price,这是独立于常设护栏的每次调用上限(over_max_price)

如果端点不收费,内容直接返回,什么都不花。

代理做不到的事

  • 无论怎么提示,都不能超过额度消费。决定权在 Token 程序,不在模型。

  • 不能转移金库、关闭金库或更换所有者。它不是所有者。

  • 不能阻止你提款,也不能阻止撤销操作。

  • 不能提高自己的额度。只有所有者签署的 approve 才能做到。

  • 不能碰你钱包里的任何其他东西。金库是一个独立账户,只存放你放进去的东西。

已在 test/token-delegation.test.mjs 中验证:该测试在进程中运行真实的 SPL Token 程序,断言在剩余额度为 60 时尝试消费 61 会在链上失败,而金库中保留着 460。

在 devnet 上免费演练

OAW_NETWORK=devnet npx -y @three-ws/onchain-agent-wallets

状态按网络分别保存,所以 devnet 演练绝不会影响你的 mainnet 代理。

作为库使用

托管模型就是纯粹的 @solana/web3.js 和 @solana/spl-token,不依赖 MCP 也能用:

import { createVaultInstructions, readVault, spendableUnits } from '@three-ws/onchain-agent-wallets/lib/vault';

const { vault, instructions } = await createVaultInstructions({
	connection,
	owner: ownerPubkey,
	agentId: 'researcher',
	mint: usdcMint,
	delegate: agentPubkey,
	allowance: 100_000_000n, // 100 USDC
	decimals: 6,
});
// sign `instructions` with the owner, then:
const state = await readVault({ connection, vault });
console.log(spendableUnits(state)); // what the agent may spend right now

@three-ws/onchain-agent-wallets/lib/policy 单独导出了护栏引擎,如果你想在不同运行时中使用相同的规则。

测试

npm test

运行护栏单元测试、x402 选择测试,以及针对真实 SPL Token 程序的委托集成测试。

相关项目

  • @three-ws/metaplex-agent-mcp 将代理身份铸造到 Metaplex Agent Registry 中。deploy_agent_onchain 将其作为库使用,它的 prepare_agent_mint 是浏览器钱包铸造路径。

  • three.ws 是这些代理获得形象、头像和家园的地方。

许可证

见 LICENSE。

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server providing policy-gated Solana access for AI agents, with read-only operations and guarded transfers that require policy checks and simulation, returning unsigned transactions.
    7
    MIT