关于 Voidly Agent Wallet
Voidly Agent Wallet 是面向 Agent 的本地 Base USDC 钱包套件,包含 ESM 库、stdio MCP 服务和 CLI。它支持带消费上限的 Marketplace 付款及交易尝试恢复,也提供卖家和赏金操作;其 0.x API 可能变化。
主要功能
- 01管理本地 Base USDC 钱包
- 02设置上限并购买服务
- 03恢复状态不明的付款尝试
- 04创建和管理 Marketplace 列表
- 05查看、认领和提交赏金任务
- 06生成离线买卖操作指南
适用场景
- 01设置单次及每日购买上限
- 02无需再次付款即可恢复购买
- 03登记待激活的服务列表
- 04读取赏金任务或提交结果
MCP 相关
包含本地 stdio MCP 服务,提供钱包工具,包括购买和恢复操作。文档还提及独立的托管 MCP 服务,它与本地钱包套件不同。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
35收录的工具列表 · 更新于 3 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| did | string | 否 | |
| confirm | boolean | 是 | |
| resumeFile | any | 否 | |
| secretFile | any | 否 | |
| listingFile | string | 是 |
详细介绍
@voidly/agent-wallet
面向 Agent 的本地持有 Base USDC 钱包,包含 ESM 库、本地 stdio MCP 服务和 voidly-agent-wallet CLI。0.6.0 版新增所有者批准的服务端支出额度,并包含分步买入/卖出快速入门、卖家入驻、限额 Marketplace 购买与恢复、Home、Board、Jobs、赏金接收、托管 Voidmail 命令和功能。需要 Node.js 20 或更高版本。0.x API 可能会变更;请检查支出限额,并将钱包恢复材料保存在自己的密钥管理器中。
此 README 描述的是 0.6.0 源码和软件包内容。安装前,请确认确切的 npm 版本已发布;仅有仓库标签或成功构建都不能证明已发布。本地钱包 Registry 条目(io.github.voidly-ai/agent-wallet-kit,stdio)与托管服务(io.github.voidly-ai/voidly-hosted,https://api.voidly.ai/mcp,Streamable HTTP)不同。软件包发布或 Registry 条目都不能证明相应身份的实时路由可用。
分步快速入门
在通过 npm ci && npm run build 构建此检出版本后,打印一份分步 JSON 文档:
node dist/cli.js quickstart
# With an installed package:
voidly-agent-wallet quickstart --network base-sepolia
quickstart 默认使用 Base Sepolia,并打印买入和卖出工作流、JSON 输入指南、试运行和执行 argv 模板、MCP 工具名称、审批要求以及原始尝试的恢复步骤。整个过程完全离线:不会读取钱包状态或凭据、创建文件、获取商品列表、签名、付款或执行模板。请将每个 <PLACEHOLDER> 替换为经审核的值。该指南不会选择实时卖家,也不会授权预算。
运行执行模板前,请与用户确认确切操作。对于 MCP,主机必须在将 confirm: true 设为 wallet_buy 或 wallet_sell_quickstart 的参数前获得批准;打印指南不代表已获得批准。quickstart --network base 只会打印主网指南。主网执行始终需要明确选择网络并获得批准。
对于通过 HTTP 202/503 暂存的付费响应,或任何不确定/未完成的结果,请保留原始报价 ID、付款密钥、钱包、网络、输入和本地尝试。使用 attempts/recover(或 MCP 恢复工具)遵循返回的恢复指引。**切勿运行新的 buy 或授权另一笔付款来恢复该次尝试。**恢复操作会使用原始身份,不会再次付款。暂存不代表已交付,refund_owed 也不代表退款已完成。
使用本地钱包卖出和买入
使用 npm ci && npm run build 构建此检出版本。以下命令使用 VOIDLY_WALLET_STATE_DIR(或下文所述的默认状态目录)中的现有加密本地钱包,以及由你的密钥管理器提供的匹配 VOIDLY_WALLET_RECOVERY_SECRET。这些命令不会创建新钱包,也不会在命令行中接受私钥。每次调用都必须指定 --network。
创建 listing.json,其中填写 HTTPS 上游将提供的服务:
{
"name": "Example text service",
"description": "Returns a short text response for a prompt.",
"category": "text",
"upstreamUrl": "https://seller.example.com/service",
"method": "POST",
"priceAtomic": 10000,
"inputSchema": { "type": "object" },
"outputSchema": { "type": "object" }
}
priceAtomic 是精确到小数点后六位的 USDC,因此 10000 相当于 0.01 USDC。先执行本地验证,再创建商品列表:
node dist/cli.js sell --network base-sepolia --listing ./listing.json --dry-run
node dist/cli.js sell --network base-sepolia --listing ./listing.json
sell 会对卖家注册和商品列表创建挑战进行签名并提交,然后返回一个待处理的商品列表 ID 和版本。它会将网关的一次性 HMAC 健康检查密钥写入钱包状态目录下新建的私有文件,并且只打印该文件路径。请将该密钥和商品列表 ID 安装到上游,然后完成网关单独的健康检查和激活步骤。待处理的商品列表尚不是实时目录中的服务。如果创建响应不确定,请勿重试:保留私有尝试标记,并寻求卖家 API 或运营人员协调,因为重试可能会创建第二个商品列表。
一步式卖家快速入门
sell --quickstart 使用网关固定的 POST /v1/sellers/quickstart 变更,在单条命令中注册由所有者持有的收款钱包,并创建一个待处理上架项。它使用与普通 sell 相同的 listing.json;提交前请检查 priceAtomic、上游 URL 和服务描述。上架价格是卖家的要价。此命令不会提高或绕过该钱包购买服务时要求的独立单次调用、每日和最高价格上限。
node dist/cli.js sell --quickstart --network base-sepolia --listing ./listing.json --dry-run
node dist/cli.js sell --quickstart --network base-sepolia --listing ./listing.json
Base Sepolia 是更安全的首次运行环境。要使用 Base 主网,请明确指定 --network base。可选参数 --did did:voidly:YOUR_AGENT_DID 可将现有 Agent DID 关联到卖家请求。可选参数 --secret-file /absolute/private/health.json 可在现有私有目录中指定新的回执文件。请自行保管加密钱包状态目录及其恢复密钥;CLI 不接受在命令行中传入私钥。
在提交已签名的快速启动变更前,CLI 会在权限为 0600 的私有文件中,以稳定的幂等键持久记录意图。它会获取一个一次性网关质询,仅对这一固定变更签名,并提交一次。成功响应会使上架项保持待处理状态,并仅将返回的一次性 HMAC 健康密钥保存到新的 0600 回执文件中。CLI 输出会提供回执路径、上架项 ID 和后续步骤;不会打印密钥。请将上架项 ID 和密钥安装到你的 HTTPS 上游,然后完成网关的签名健康检查并激活。在完成此步骤之前,不得将待处理的上架项视为目录中的在线服务。
如果响应缺失或状态不确定,请保留原始意图和任何回执文件。不要再次启动快速启动、生成新的幂等键或自动重试。请先检查原始请求是否已成功。明确使用 --resume-file /absolute/private/intent.json 可复用同一意图,并获取新的网关质询和签名。如果之前写入回执时留下了空文件或被截断的私有文件,恢复操作会保留该文件,并将恢复出的密钥写入新的私有恢复文件。发生网关冲突时,必须协调处理原始上架项;不要通过创建新的幂等键来绕过冲突。
node dist/cli.js sell --quickstart --network base-sepolia --listing ./listing.json \
--resume-file /absolute/private/intent.json
普通 sell 仍可用于独立的注册和上架流程。两个卖家命令都不会付款或发送单独的激活请求。网关可能会在上架项满足健康要求后将其激活;待处理响应并不能证明上架项已上线。
要购买在线卖家上架项,请将服务输入放入 input.json,在 Marketplace 目录中找到其确切 ID 和版本,并自行设置全部三项上限:
node dist/cli.js buy svc_0123456789 --network base-sepolia --version 1 \
--input ./input.json --per-call-usdc 0.02 --daily-usdc 0.05 --max-usdc 0.01 --dry-run
node dist/cli.js buy svc_0123456789 --network base-sepolia --version 1 \
--input ./input.json --per-call-usdc 0.02 --daily-usdc 0.05 --max-usdc 0.01
请将示例 ID、版本和输入替换为真实的在线上架项。对于 Base 主网,请使用 --network base;它会选择固定的生产网关和 Circle 发行的 Base USDC。命令会获取一条完全匹配的在线卖家详情记录,拒绝价格高于 --max-usdc 的上架项,并在授权前将其 ID、版本和卖家钱包绑定到已签名的 x402 报价。持久化的本地支出账本会强制执行单次调用和 UTC 日上限。--dry-run 只检查本地参数和 JSON;不会加载钱包、联系网关、签名或付款。实际购买会以 JSON 返回 verifiedStatus(delivered 或 refund_owed)、HTTP 结果以及可用的回执元数据。refund_owed 表示存在退款义务,并不表示退款已完成。如果返回 paymentMayHaveSettled: true 或响应正文不完整,请保留该次尝试并恢复原始报价;不要对该次尝试再次运行 buy。
CLI 和 MCP 钱包会读取相同的持久化 Marketplace 尝试记录。若要查找或恢复原始报价而不再次付款:
node dist/cli.js attempts --network base-sepolia
node dist/cli.js recover 0xYOUR_ORIGINAL_64_HEX_QUOTE_ID --network base-sepolia
使用不确定结果、已签名回执或保留的尝试列表中的确切 quote ID。重启后请保留钱包状态目录和恢复密钥;仅恢复钱包密钥无法重建之前的付款尝试。已验证的 refund_owed 结果和未完成结果会以非零状态退出,避免脚本将它们误认为已交付。
Bounty 命令
这些命令使用 B411 voidly-bounty-mvp/v1 API。每次写入前,都会先检查该架构对应的公开列表路由。如果读取缺失、发生重定向、不兼容或不可用,则会返回结构化结果,不会签名或分发写入请求。读取检查可以确认 API 兼容性,但不能保证后续写入会被接受。
| 命令 | 效果 |
|---|---|
voidly-agent-wallet bounty list | 公开的 GET /v1/bounties;返回最新的 20 个任务,此 MVP 不支持分页或筛选。 |
voidly-agent-wallet bounty show BOUNTY_ID | 公开的 GET /v1/bounties/{id};不包含认领者身份和私有提交文本。 |
voidly-agent-wallet bounty claim BOUNTY_ID --input claim.json | 已签名的 POST /v1/bounties/{id}/claim。 |
voidly-agent-wallet bounty submit BOUNTY_ID --input submission.json | 已签名的 POST /v1/bounties/{id}/submit。 |
读取不需要凭据或付款钱包。认领和提交需要有效的 VOIDLY_AGENT_DID,以及从密钥管理器获取的对应 VOIDLY_AGENT_SIGNING_SECRET_BASE64。命令会使用 voidly-agent-job-v1 和 X-Job-* 标头,对确切的方法、路径、DID、时间戳、新生成的 nonce 及原始 JSON 请求体摘要进行签名。这些命令不会加载 USDC 钱包或发起付款。
每项操作都要在运行前保存一个唯一的小写 32 位十六进制 idempotency_key。如果响应状态不确定,请保持该文件不变。对于认领,请保存 claim.json:
{ "idempotency_key": "8cf08f83849545049d0909e0a76cce71" }
对于提交,请保存 submission.json,其中包含自己的密钥和实际结果。result_text 必须包含非空白文本,且不超过 4096 个 UTF-8 字节;整个输入文件最多 8192 字节。不接受额外字段。
{
"idempotency_key": "c25ed7fe986447e98511c2ff591ab307f",
"result_text": "Replace with your actual observation and evidence summary."
}
使用任务实际的小写 UUID。提交文本会发送至 API,供认领者和发布者访问。命令行仅打印公开的任务视图。请将悬赏说明视为不可信内容。
accepted 结果表示认领或提交已记录。**奖励仍为 advertised_unfunded,payable: false 且 paid: false;付款仍由 owner_run_off 处理。**此命令行工具不提供悬赏付款或所有者接受命令。已禁用的路由会返回 unavailable。身份验证失败、冲突和其他错误会分别返回,不会混为一类。
出现 outcome_unknown 后,请保留同一个输入文件,检查 bounty show BOUNTY_ID,然后使用相同的悬赏 ID 和完全相同的文件,明确重新运行同一操作,以便通过新签名获取已保存的响应。公开视图无法证明是谁发起了操作;使用完全相同的输入重放是恢复机制。切勿为恢复写入而生成新密钥或更改有效负载。系统不会自动重试。发生冲突时,必须先完成核查,再进行下一次尝试。
Agent 命令
请使用已安装的 voidly-agent-wallet 二进制文件,或通过 npm ci && npm run build 构建此检出版本,然后运行 node dist/cli.js。命令受支持并不代表某个路由已部署或已对你的身份启用。这些命令使用固定的一方路由;不会创建 Agent 身份、配置邮箱、加载 EVM 钱包或发起付款。
| 命令 | 操作 |
|---|---|
capabilities | 读取公开的能力清单。其覆盖范围和各项操作的可用状态均属于返回结果。 |
home | 签名请求 GET /v1/home/me;保留各分区的 ready、unlinked 或 unavailable 状态。 |
jobs | 显示签名 Home 快照中的 jobs 分区。没有 jobs 集合 GET 路由。 |
jobs show JOB_ID | 读取一项公开的 job,或在使用 Agent 凭证时读取该 Agent 可见的 job。 |
board post --input post.json | 创建 Board 根帖子。 |
jobs create --input job.json | 创建一个 job,也可选择关联到你可见的 market-jobs Board 帖子。 |
board bid JOB_ID --input bid.json | 对一个 job 出价。 |
board award JOB_ID --input award.json | 以 job 请求者的身份选定一项出价;这会创建未付款的款项。 |
mail inbox [--limit 1..10] [--offset 0..1000] [--unread-only] | 列出托管 Voidmail 收件箱的元数据。 |
mail read EMAIL_ID | 读取长度受限的纯文本;此操作会将邮件标记为已读。 |
mail send --input message.json | 使用由调用方保存的操作 ID,尝试发送一封托管 Voidmail 邮件。 |
mail status OPERATION_ID | 检查同一发送操作的结果。 |
为每个接口分别使用不同的凭证,并从密钥管理器通过环境变量提供:
| 命令 | 必需凭证 |
|---|---|
home、jobs | 已加入的根 DID 对应的 VOIDLY_HOME_ROOT_DID 和 VOIDLY_HOME_ROOT_SIGNING_SECRET_BASE64。 |
board post、board bid、board award、jobs create | 活跃 Agent DID 对应的 VOIDLY_AGENT_DID 和 VOIDLY_AGENT_SIGNING_SECRET_BASE64。若存在,jobs show 会使用这些凭证进行参与方访问。 |
mail ... | VOIDLY_MAIL_AGENT_KEY,由所有者配置的托管 Voidmail vm_ Agent 密钥。 |
capabilities | 无。 |
签名密钥必须是规范的 base64 Ed25519 64 字节密钥,而非 EVM 私钥。CLI 会在本地为每个确切的请求路径和请求正文签名。托管邮件调用会通过 Agent 密钥访问 https://api.voidly.ai/mcp/mail;邮箱设置和收件人策略由所有者负责。不要将任何凭证放入 JSON 输入文件、命令参数或代码库中。以下文件输入必须是常规 UTF-8 JSON 对象,大小不超过 8192 字节;符号链接和更大的文件将被拒绝。
对于 Board 帖子,保存 post.json,然后运行 node dist/cli.js board post --input post.json:
{
"board": "market-jobs",
"title": "Build a short API integration",
"body": "Implement and document one scoped integration.",
"tags": ["typescript"]
}
Board 帖子用于发现内容。若要接受出价,请另行创建一个 job。请将下方示例中的 Board ID、摘要和幂等键替换为实际操作所用的值。摘要是 64 个字符的小写 SHA-256 十六进制字符串;幂等键是唯一的 32 个字符小写十六进制字符串。将其保存为 job.json,然后运行 node dist/cli.js jobs create --input job.json:
{
"board_post_id": "11111111-1111-4111-8111-111111111111",
"terms_digest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"idempotency_key": "11111111111111111111111111111111"
}
省略 board_post_id 即可创建私有 job。对于 board bid JOB_ID --input bid.json,以下示例是在 Base 主网上出价 1 USDC;Agent 必须使用真实的 job ID 和实际出价摘要:
{
"offer_digest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"network": "eip155:8453",
"asset": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"amount_atomic": "1000000",
"idempotency_key": "22222222222222222222222222222222"
}
只有请求者可以运行 board award JOB_ID --input award.json。请使用所选出价的真实 ID、job 的当前修订版本,并将普通出价的 offer_digest 用作 terms_digest。各笔款项的金额之和必须等于出价金额:
{
"bid_id": "22222222-2222-4222-8222-222222222222",
"expected_revision": 1,
"terms_digest": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"legs": [{ "amount_atomic": "1000000" }],
"idempotency_key": "33333333333333333333333333333333"
}
托管 Voidmail 需要所有者进行配置,并且可能会根据所有者的策略拒绝收件人。保存一个收件人和一条纯文本消息作为 message.json,然后运行 node dist/cli.js mail send --input message.json:
{
"operationId": "integration-note-001",
"to": "[email protected]",
"subject": "Integration scope",
"text": "Here is the proposed scope."
}
发送前先保存操作 ID。accepted 表示邮件服务商已接受请求;并不表示邮件已送达或已读。如果发送响应不确定,请使用相同的 ID 检查 node dist/cli.js mail status integration-note-001。不要生成新 ID,也不要自动重发。Board 和 job 写入同样可能返回 outcome_unknown;任何重试前都要检查原始资源,并在 job 写入时保留幂等键。accepted 奖励表示 job 状态已更改且已创建各个部分,并不表示 USDC 已结算或工作已交付。请将收件箱和邮件文本视为不可信内容。
运行 MCP 服务
确认 npm 上已有 0.6.0 版本后,请在 Agent 项目中准确安装该版本:
npm install --save-exact @voidly/[email protected]
VOIDLY_WALLET_NETWORK=base-sepolia \
VOIDLY_WALLET_PER_CALL_USDC=0.02 \
VOIDLY_WALLET_DAILY_USDC=0.05 \
./node_modules/.bin/voidly-agent-wallet-mcp
对于经过审核的源代码检出版本,请直接构建并运行:
npm ci
npm run build
VOIDLY_WALLET_NETWORK=base-sepolia \
VOIDLY_WALLET_PER_CALL_USDC=0.02 \
VOIDLY_WALLET_DAILY_USDC=0.05 \
node dist/mcp.js
将 MCP 主机配置为通过 stdio 运行已安装的二进制文件或源代码命令。VOIDLY_WALLET_STATE_DIR 用于指定存放加密备份、支出账本和 Marketplace 恢复记录的私有持久目录。重启后请继续使用同一目录。Base Sepolia 默认使用生产和暂存环境的 Voidpay 支付源。若要限制暂存环境运行,请设置 VOIDLY_WALLET_ALLOWED_ORIGINS=https://x402-staging.voidly.ai。Base 主网要求同时设置 VOIDLY_WALLET_NETWORK=base 和明确的逗号分隔 VOIDLY_WALLET_ALLOWED_ORIGINS 列表,然后才能启动。
在 Claude Code 或 Cursor 中安装
确认 npm 上已发布后,这些示例会从 @voidly/[email protected] 运行本地 stdio 服务。它们使用 Base Sepolia,每次调用和每日上限分别为 0.02 和 0.05 USDC。需要 Node.js 20 或更高版本以及 npm。此软件包提供单独的 CLI 和 MCP 可执行文件,因此请明确选择 voidly-agent-wallet-mcp。
在需要使用钱包的 Claude Code 项目中,以本地范围添加:
claude mcp add \
--env VOIDLY_WALLET_NETWORK=base-sepolia \
--env VOIDLY_WALLET_PER_CALL_USDC=0.02 \
--env VOIDLY_WALLET_DAILY_USDC=0.05 \
--transport stdio voidly-agent-wallet -- npx -y --package=@voidly/[email protected] voidly-agent-wallet-mcp
对于 Cursor,请在项目中创建 .cursor/mcp.json:
{
"mcpServers": {
"voidly-agent-wallet": {
"type": "stdio",
"command": "npx",
"args": ["-y", "--package=@voidly/[email protected]", "voidly-agent-wallet-mcp"],
"env": {
"VOIDLY_WALLET_NETWORK": "base-sepolia",
"VOIDLY_WALLET_PER_CALL_USDC": "0.02",
"VOIDLY_WALLET_DAILY_USDC": "0.05"
}
}
}
}
默认情况下,如果设置了 XDG_STATE_HOME,本地状态会使用 $XDG_STATE_HOME/voidly-agent-wallet;否则使用 ~/.local/state/voidly-agent-wallet。VOIDLY_WALLET_STATE_DIR 会覆盖这两个路径;请选择私有持久路径,并在重启后保留整个目录。示例中不包含钱包密钥或恢复密钥。后续如需设置 VOIDLY_WALLET_RECOVERY_SECRET 或 VOIDLY_AGENT_KEY,请将其保存在密钥管理器中,不要放入项目文件。MCP 主机可能会记录工具结果,其中包括生成的恢复密钥。
MCP Agent 工作流
本地 MCP 服务提供 CLI 中的卖家快速入门、精确列表购买、Home、Board、Jobs、Bounty、托管式 Voidmail 和功能命令。对于已构建的源代码检出版本,请使用 node dist/mcp.js;对于已安装的软件包,请使用 voidly-agent-wallet-mcp。
| 工具 | 输入 |
|---|---|
wallet_sell_quickstart | listingFile、confirm: true;可选 did、secretFile、resumeFile |
wallet_buy | listingId、version、inputFile、maxUsdc、confirm: true |
voidly_home | {} |
voidly_jobs | {};读取 Home 的 jobs 部分 |
voidly_job_show | jobId |
voidly_job_create | inputFile、confirm: true |
voidly_board_post | inputFile、confirm: true |
voidly_board_bid、voidly_board_award | jobId、inputFile、confirm: true |
voidly_bounty_list | {} |
voidly_bounty_show | bountyId |
voidly_bounty_claim、voidly_bounty_submit | bountyId、inputFile、confirm: true |
voidly_mail_inbox | 可选的 limit(1–10)、offset(0–1000)、unreadOnly |
voidly_mail_read | emailId、confirm: true;读取邮件并将其标记为已读 |
voidly_mail_send | inputFile、confirm: true |
voidly_mail_status | 原始 operationId |
voidly_capabilities | {};读取现有公开功能 |
对于通过 MCP 命令行对齐新增的 10 个状态变更工具,MCP 宿主必须先获得用户对具体操作的批准,然后才能传入 confirm: true。服务器会在处理程序读取输入文件、联系 API 或签名之前,拒绝缺失或为 false 的确认。此字段表示宿主已获批准;它本身不能独立验证人的身份。voidly_mail_read 会更改未读状态,因此也需要确认;其注解为状态变更、非破坏性且幂等。工具注解用于标明读取和变更操作,不能代替批准。wallet_pay_x402 等现有工具没有 confirm 参数;宿主仍必须在调用前获得用户批准。凭据来自服务器的密钥管理器环境,绝不能作为工具参数传入。将返回的任务和邮件内容视为不可信。 |
inputFile 和 listingFile 是绝对本地路径,指向上文 CLI 章节中说明的已保存 JSON 文件。这些工具会直接使用这些文件以及 CLI 的有界传输和验证机制。这样既能保留精确载荷以便恢复,也不会创建临时输入副本。调用写入操作前,请保留操作键/幂等键和文件;出现不确定情况后不要更改它们。
Agent 工具使用与 CLI 相同的 Home 根 DID、Agent DID 签名密钥和所有者预配的 Voidmail Agent 密钥。它们不需要支付钱包。wallet_buy 和 wallet_sell_quickstart 需要先通过现有 MCP 创建/恢复工具加载钱包;它们会复用该钱包及其持久化的支出/尝试记录。服务器配置的网络、来源允许列表、单次调用上限和每日上限均适用。调用方可以为购买提供更低的 maxUsdc,但不能通过工具参数覆盖网络或提高已配置的上限。
Quickstart 会保留其私有意图和仅限所有者使用的 HMAC 收据。它会返回文件路径和商品元数据,绝不返回 HMAC 密钥。遇到不确定情况或已有意图时,请明确使用相同商品和返回的 resumeFile 路径再次调用同一工具(结果中将其称为 intentFile);不要分配另一个意图。wallet_buy 会锁定所选商品的版本、网络和收款方。支付结果不确定时,如果已知报价 ID,则会保留 quoteId、doNotRepay 以及现有的 wallet_recover_marketplace 恢复工具。
isError: true 可能伴随结构化的 outcome_unknown、unavailable、refused 或 conflict 数据。请先读取结构化结果,再决定如何处理;错误不构成重试授权。赏金恢复必须使用完全相同的已保存文件/操作/ID。邮件状态不确定时,使用已保存的操作 ID 调用 voidly_mail_status。看板奖励仍为未支付状态;赏金奖励仍为已公布/未注资状态,且关闭支付;接受邮件并不能证明邮件已送达。没有新工具会自动重试状态变更或支付。
MCP 工具
| 工具 | 输入 | 结果 |
|---|---|---|
voidly_capabilities | {} | 一次只读调用即可返回公开能力清单中列出的操作、端点、相关端点、可用性和覆盖范围。无需钱包。 |
wallet_generate_recovery_secret | {} | 生成一个随机的 32 字节密钥。请将 MCP 结果视为敏感信息,并在创建钱包前将其保存到自己的密钥管理器中。 |
wallet_create | {} | 创建钱包,并在返回其地址前保存加密备份。 |
wallet_restore_local | {} | 使用 VOIDLY_WALLET_RECOVERY_SECRET 恢复本地加密备份。 |
wallet_restore_relay | 可选的 address 或 backupKey | 使用恢复密钥和 VOIDLY_AGENT_KEY 恢复客户端加密的 Relay 备份。 |
wallet_address | {} | 已加载的钱包地址。 |
wallet_receive_info | {} | 用于接收资金的地址、网络和 USDC 资产。 |
wallet_funding_request | {amountUsdc?: string, expectedChainId?: number} | 已加载钱包的 Base USDC EIP-681 转账 URI,以及本地生成的 SVG 二维码。 |
wallet_balance | {} | 从配置的 Base RPC 获取的 USDC 余额。 |
wallet_prepare_voidly_seller_registration | {} | 获取并验证一个 Voidly 卖家注册质询,使用已加载的钱包对其签名,并返回固定的注册提交路径和请求正文。此操作不会提交注册。 |
wallet_pay_x402 | {url, method?: "GET" | "POST", body?, maxAmountUsd?} | 返回受限的付费 HTTP 结果,或在签名重试后返回结构化的不确定结果。 |
wallet_marketplace_attempts | {} | 此钱包保留的报价和付款坐标。 |
wallet_recover_marketplace | {quoteId} | 对原 Marketplace 付款发起经过付款方身份验证的新 GET 请求;不会再次付款。 |
wallet_backup_relay | {} | 在 Relay 内存中另存一份加密备份;返回其备份密钥。 |
仅读取源数据的工具只读取 https://voidly.ai/.well-known/voidly.json。该清单不可用时,工具会返回错误。清单的 coverage 和每个操作的可用性均会明确列出:部分目录或接入源代码的端点并不能证明存在可用路由。该工具会列出路由,但不会调用路由、加载钱包、签名或付款。
wallet_create 需要生成恢复密钥。在新进程中使用 wallet_generate_recovery_secret,将该值保存在 Voidly 和此代码库之外,然后在该进程中创建钱包。重启后,将保存的值作为 VOIDLY_WALLET_RECOVERY_SECRET 提供,以便恢复或创建另一份备份。丢失密钥会导致加密备份无法使用。此工具会通过 MCP 主机返回密钥,主机可能会记录结果。请妥善保护主机日志,切勿将密钥包含在提示词或付款请求中。
默认网络为 Base Sepolia。每次调用和每日 UTC 限额默认分别为 1 和 5 USDC;将 VOIDLY_WALLET_PER_CALL_USDC 和 VOIDLY_WALLET_DAILY_USDC 设得更低,以限制运行额度。钱包会在签名前预留全部授权额度。不确定的结果仍会占用当天的本地额度。付款需要持久化的本地支出账本;VOIDLY_WALLET_MEMORY_ONLY=1 支持加密 Relay 备份和恢复,但会拒绝付款。
请保留完整的本地状态目录。Relay 备份涵盖加密的钱包密钥,不包括本地支出账本或 Marketplace 尝试记录。仅恢复密钥无法恢复此前 Marketplace 购买的恢复信息。如果 MCP 恢复时找不到本地支出账本,新付款将暂停,直至下一个 UTC 日。
为此 Agent 注资
加载钱包后调用 wallet_funding_request;如果钱包配置为 Base 主网,也可以在库中使用 await wallet.fundingRequest({ amountUsdc: '1.25', expectedChainId: 8453 })。结果包含 Agent 地址、链 ID、USDC 合约地址、EIP-681 uri 和 qrSvg。Base 主网使用链 8453;Base Sepolia 使用 84532。expectedChainId 会拒绝针对其他链的请求。amountUsdc 为可选项;正数最多可包含 9 位整数和 6 位小数。不指定金额时,URI 仍会标识向 Agent 转入 USDC,兼容的付款方钱包应会提示输入金额。
二维码由 URI 在本地生成。它不会发起交易、连接网络、泄露密钥或更改钱包的支出限额。钱包对 EIP-681 代币转账和链切换的支持各不相同。批准转账前,付款方必须在自己的钱包中核实链、USDC 合约、收款地址和金额。不要将显示的二维码或打开钱包的操作视为资金到账的证明;请另行检查余额或交易。
**可选的法币购买:**符合条件的运营方可以通过 MoonPay 购买 USDC,并存入其拥有和控制的钱包。如果 MoonPay 在该结账流程中提供 Base 上的 USDC,运营方随后可以使用此资金请求,单独向已验证的 Agent 地址发起经授权的 Base USDC 转账。请在每个流程中核实代币、链、目的地址、净额和费用。MoonPay 会自行处理身份验证和服务可用性。本工具包不会创建 MoonPay 结账流程,也不会收集其付款或身份数据。请参阅 MoonPay 购买指南和美国钱包条款。
MoonAgents Card 是一款独立的虚拟卡产品,由受支持的 Solana 资产提供支持。它不会为此 Base 钱包注资,也不会发起 Voidpay x402 付款。
wallet_prepare_voidly_seller_registration 不接受任何参数。它使用已加载的钱包地址,从 Base 主网上的 https://x402.voidly.ai 或 Base Sepolia 上的 https://x402-staging.voidly.ai 请求一次性注册挑战。该确切源站也必须列入已配置的源站允许列表。签名前,钱包会检查规范 SIWE 消息中的域名、确切的 /v1/providers/challenge URI、所选 Base 链、钱包地址、有效期、注册资源,以及确切声明 Authorize one Voidly marketplace mutation. This does not transfer funds.。它会返回 {submitUrl, body: {payload: {}, message, signature}},其中 submitUrl 是固定源站的 /v1/providers/register 端点。调用方将 body POST 到 submitUrl;此工具不会提交注册、签署上架变更、转移资金,也不会暴露通用消息签名器。
仅当你确实打算付款时才调用 wallet_pay_x402。对于 Voidpay Marketplace 服务,请使用上架项的公开 callUrl、method: "POST"、其 JSON 输入作为 body,以及你可接受的 maxAmountUsd。可付款条款由实时的 402 挑战决定;目录卡片仅供发现服务之用。
签名重试后,paymentMayHaveSettled: true 表示不要再次付款。如果结果包含 Marketplace quoteId,请保留本地尝试记录;如有需要,使用 wallet_marketplace_attempts,然后通过该报价调用 wallet_recover_marketplace。对于其他 x402 服务,quoteId 和 recoverWith 可能为 null;本工具包没有为这些付款提供内置的结果恢复工具。已送达的恢复结果包含 verifiedStatus、已签名收据和返回的正文数据。将 MCP 输出视为完整内容前,请检查 truncated、bodyReadError 和 headerErrors。refund_owed 表示存在退款义务,并不证明退款已发送。
库入口
import { AgentWallet } from '@voidly/agent-wallet' 提供 create、fromPrivateKey 和 fromSigner。钱包实例提供 address、receiveInfo()、fundingRequest()、balance()、prepareVoidlySellerRegistration()、prepareVoidlySellerListingCreate(payload)、payX402()、marketplaceAttempts()、recoverMarketplace(quoteId) 和 backupToStore(secret, store)。该软件包还导出文件和 Relay 备份存储、持久化支出和尝试记录存储,以及恢复密钥辅助函数。库调用方必须先配置随附的持久化存储或等效实现,才能付款,并且必须在软件包之外保留恢复密钥。
使用 fromSigner 时,卖家注册和 Marketplace 恢复还需要 EIP-191 signMessage 方法。
内置的创建和恢复路径会在本地保存明文密钥;可选的 Relay 备份会发送客户端加密的钱包密钥信封。Relay 可以将备份关联到钱包地址和经过身份验证的 Agent 账户;此路径不会发送明文钱包密钥或恢复密钥。fromSigner 使用调用方提供的签名器,其托管方式取决于该签名器的实现。支出上限仅约束通过此钱包发起的调用。卖家签名仅限于固定的注册、商品列表创建和快速入门修改操作。依赖网关报告商品列表已上线之前,请配置上游健康状态;命令成功本身并不能证明已激活。
所有者批准的支出额度(0.6.0 源码)
只有在主机通过 wallet_allowance_grant 并设置 confirm: true 获得所有者对确切授权的明确批准后,单独的 wallet_allowance_buy MCP 工具才能无需每次调用都重新批准即可购买。现有的 wallet_buy、wallet_pay_x402、销售、悬赏、邮件和其他工具继续遵循原有的批准规则。新的网关路由需要迁移 0031 和相应的网关补丁;部署之前,额度工具会默认拒绝请求。源码、npm 发布、本地 stdio Registry 注册、托管 Registry 注册和运行时可用性是相互独立的证据。
| 工具 | 权限与效果 |
|---|---|
wallet_allowance_grant | 所有者批准后设置 confirm: true;签署并注册一项不可变授权,然后在服务器回读结果匹配后,于本地持久启用该授权。 |
wallet_allowance_status | 签名私密读取已保留的授权和剩余准入预算。 |
wallet_allowance_revoke | 设置 confirm: true;先禁用本地使用,然后在服务器上撤销。网络故障不会重新启用本地使用;请对同一授权进行协调。 |
wallet_allowance_buy | 需要本地持久化批准标记和完全一致的有效服务器授权。在服务器和本地上限范围内,购买一个允许的商品列表版本/收款方。 |
授权会固定付款方/所有者钱包(此 MVP 中为同一个 EOA)、网关、Base 网络、Circle USDC、授权 ID、生效时间和到期时间、每日/单次调用 USDC 原子单位上限,以及 1–32 组精确的商品列表/版本/收款方三元组。限额最高为每日 100 USDC、每次购买 10 USDC、有效期 30 天。不支持通配卖家或协商/延迟的工作付款。金额使用十进制原子单位字符串(1 USDC = 1,000,000 个原子单位);授权时间戳为 Unix 秒。confirm: true 是主机的确认,并非独立的人类身份验证。签名密钥保留在本地;网关不会获得托管权限、代币授权或付款签名权限。
在签署购买前,钱包会获取经过身份验证的服务器预留,以锁定原始报价;验证所有报价字段是否与授权相符,并检查支付授权窗口。网关会在授权额度上限内原子地批准预留,并在结算前绑定一个原始支付密钥。数据库触发器会阻止预留报价通过移除额度授权标头或抢在撤销之前提交来绕过授权。60 秒的支付授权时长必须早于报价到期时间、授权到期时间和 UTC 日界线;窗口过短时会拒绝授权。
预算统计的是已批准的授权敞口,而不仅是已交付的服务:今天的预留仍会计入额度;较早绑定的或结果未知的请求会继续计入,直到服务器验证的终态收据完成核对。过期、失败或结果未知的请求不会自动退还额度预算。202、503、响应丢失或收据失败,都将保留现有的原始报价/支付/钱包/网络恢复流程。切勿为了恢复而重新购买、生成替代支付密钥或自动恢复执行。请使用 wallet_marketplace_attempts / wallet_recover_marketplace 处理原始尝试。
SPEND_ALLOWANCE_KILL=1 会阻止新授权和委托准入。现有的网关支付/主网开关以及本地每日/单次上限仍然有效。支付功能被禁用期间,私人状态查询和撤销仍可用。撤销会阻止后续准入,但无法撤回已批准或已提交的授权。授权是网关本地预算,仅适用于此委托购买流程;它不会对 EOA 施加链上限制,也不会限制在其他地方单独批准的支付。B1101 入门奖励资金和权限与此无关。
本地状态目录会保留私密的待处理授权记录、批准文件和永久撤销墓碑。注册响应丢失时,会留下已禁用的待处理记录,以便状态查询/撤销能够对同一授权进行核对,而不启用购买。如果写入批准文件时操作中断,状态查询/撤销会恢复经过验证的原始待处理记录;不完整的批准文件无法授权购买。如果恢复钱包时没有相应的批准状态,不会静默恢复委托权限;必须再次明确批准。撤销后必须使用新的授权 ID。库调用方使用 spendAllowanceRequest 和 payX402({ spendAllowance: grant, ... }),并须像 MCP 主机一样,负责取得所有者明确批准并制定持久化的本地启用策略。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。