关于 Solana Pulse: agent safety layer
Solana Pulse 为 Solana AI Agent 及其开发者提供交易分析服务,可在签名前模拟交易影响、核对意图并检查代币风险。
主要功能
- 01模拟钱包资产变动
- 02核对交易是否符合意图
- 03评估代币诈骗风险
- 04解释失败原因并提供修复建议
- 05查看钱包、费用和交易历史
适用场景
- 01在 Agent 签署转账前进行检查
- 02核实兑换的代币、金额和收款方
- 03排查代币的已知诈骗迹象
- 04诊断失败交易或追踪资金转移
MCP 相关
通过 `/mcp` 的 Streamable HTTP 和 `/mcp/sse` 向 MCP 客户端提供 Solana Pulse 工具,涵盖交易检查、代币安全、余额、费用、历史记录等数据。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcpclaude mcp add --transport http timothymycompc-solana-pulse-gateway https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp{"mcpServers":{"timothymycompc-solana-pulse-gateway":{"type":"http","url":"https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp"}}}在 Cursor 中打开{"servers":{"timothymycompc-solana-pulse-gateway":{"type":"http","url":"https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp"}}}在 VS Code 中打开{"mcpServers":{"timothymycompc-solana-pulse-gateway":{"type":"http","url":"https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp"}}}{"mcpServers":{"timothymycompc-solana-pulse-gateway":{"serverUrl":"https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
15| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| tx | string | 是 | 以 base64 编码的交易。可以已签名,也可以未签名。Legacy 和 v0 均可。在签名前从钱包 SDK 获取:Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64')。或者使用聚合器 API 提供的交换交易。 |
| network | enum | 否 | 要读取的 Solana 网络。默认值为 "mainnet-beta"(真实资金)。主网使用时可省略。仅测试钱包时使用 "devnet"。mainnet-beta | devnet |
详细介绍
Solana Pulse
连接 Solana 与 AI Agent 的智能层。 它会在 Agent 签署交易前检查交易,确认交易确实实现了 Agent 的意图,提供代币安全判定,解释失败原因,并根据链上真实精度换算金额,避免 Agent 因幻觉产生的数值而蒙受损失。
- 一分钟内将其添加到 AI 应用中(Claude、ChatGPT、Cursor、VS Code、Codex 等):请参阅 Connect 页面中的分步说明
- 在线服务:https://solana-pulse-gateway-1021990235790.us-central1.run.app
- MCP 端点:
POST /mcp(Streamable HTTP)或/mcp/sse - 已在官方 MCP Registry 中列出,名称为
io.github.Timothymycompc/solana-pulse-gateway - 开源(MIT)且免费使用:每种工具每天提供 25 次免费调用
- 基于我们的原则构建:提供带来源的真实数据,用“未知”代替猜测,不提供链上虚假数据。安全检查并不能让代币变得安全,也无法做到这一点。它会检查人们已知的代币诈骗手段。“安全”真正意味着“我们已知的陷阱一个也不存在”。每条规则都对应一种真实骗局。
原因
自动化账户在 Solana 上的失败频率远超人们的预期:一项针对超过 15 亿笔失败交易的研究发现,机器人有 58% 的时间会失败(我的交易为什么会失败?,ISSTA 2025)。对 AI Agent 来说,常见原因是模型会自信地犯下这些错误:精度错误、山寨代币代码、编造地址或签名、区块哈希过期、优先费使用了错误单位,以及签署效果无人核查的交易。这里的每种工具都会消除其中一种错误,并给出判定、原因和修复方法。
工具
| 工具 | 可防止的问题 | 价格 |
|---|---|---|
check_tx | 为资金抽干交易签名,或签署必定失败的交易:显示每个钱包的确切收益和损失,标记授权、权限变更和账户关闭、已过期的区块哈希以及过高的手续费 | $0.02 |
tx_matches | 交易与请求不符(例如“向 X 转账 5 USDC”或“用 1 USDC 兑换 JUP”):比对代币、确切金额、收款方和发送方,检查兑换所得代币是否返还给你,并标记任何额外操作 | $0.02 |
token_safety | 买入诈骗代币:根据真实持有者的模拟卖出结果、流动性是否可被抽走、创建者的跑路记录、内部人士钱包网络、铸造和冻结权限、Token-2022 陷阱、验证状态、流动性、持有者和代币年龄,给出 SAFE / CAUTION / AVOID 评估 | $0.02 |
explain_tx | 根据日志猜测:显示钱包的实际余额变化、使用的程序以及失败原因 | $0.01 |
find_token | 识别仿冒代币代码:查找某个代币代码对应的已验证代币地址,并统计仿冒代币数量 | $0.01 |
fee | 避免手续费单位错误:提供低价、正常和快速档位的每计算单元微 lamports 价格,以及 SOL 精确费用 | $0.01 |
wallet | 避免垃圾空投抬高总额:显示持仓及其美元价值,并区分有价格与无价格、已验证与未验证的代币 | $0.01 |
trace | 避免猜测资金被抽走后的去向:显示每笔交易的 SOL 和代币净变化及交易对手、资金的主要去向(以及该地址是否为钱包或受程序控制的地址),并列出资金抽取模式及证明这些模式的交易(与他人共同支付手续费而被一扫而空、直接转出、账户被清空、仿冒地址尘埃攻击、陌生人发送尘埃),以及一份可直接使用的报告:用一句话概述问题、列出每笔交易的 Solscan 链接和调用者的本地时间、给出置信度及理由、指出可能的去向,并提供后续步骤 | $0.02 |
convert | 避免小数位错误:根据代币实际小数位数,将常规金额转换为精确的原始单位 | $0.01 |
why_failed | 避免盲目重试:用通俗语言解释 Solana 错误代码,并提供修复方法 | $0.01 |
whats_this | 避免将资产发送到错误类型的地址:识别钱包、代币账户、代币、程序等 | $0.01 |
token_account | 避免使用错误的代币账户:提供兼容 Token-2022 的地址、账户是否存在,以及创建账户的费用 | $0.01 |
balance | 避免依赖聊天早前记下的余额:查询实时 SOL 余额 | $0.01 |
tokens | 避免虚假持仓:按美元价值排序显示所持代币,并标记未验证的代币(通常是垃圾代币) | $0.01 |
history | 避免使用虚构的交易 ID:查询钱包近期交易,结果真实且可验证 | $0.01 |
blockhash | 避免使用已过期的区块哈希:获取新的区块哈希及其剩余有效秒数 | $0.01 |
每个输入和返回字段都有通俗易懂的说明:输入要查找什么以及如何获取,返回值代表什么以及如何计算(GET /api/tools/<name>)。这些工具及其字段于 2026 年 10 月更名为简短易懂的名称(preflight_transaction 更名为 check_tx,transaction 更名为 tx,walletChanges 更名为 balance_changes)。旧的工具名称和输入名称仍可使用。
每个工具每天有 25 次免费调用,超出后才会收费。
每个工具都对每项输入(包括如何获取)和每个返回字段(包括其含义和确切计算方式)作出说明:GET /api/tools 和 GET /api/tools/<name>。GET /api/tools/<name>/example 会根据实时主网数据返回可直接运行的输入。
调用方式
HTTP:
curl -X POST https://solana-pulse-gateway-1021990235790.us-central1.run.app/api/tools/convert \
-H 'content-type: application/json' -d '{"token":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","amount":"5"}'
MCP,地址为 https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp:
- Claude(claude.ai 和 Claude 应用):自定义,连接器,添加自定义连接器,粘贴 URL,选择 No sign in。
- Claude Code:
claude mcp add --transport http solana-pulse https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp - ChatGPT(网页端,在 Business、Enterprise、Edu 或 Pro 上启用开发者模式):ChatGPT 插件,加号按钮,添加自定义 MCP 服务,粘贴 URL,身份验证:无身份验证,创建为插件。
- Gemini CLI:
gemini mcp add -s user --transport http solana-pulse https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp - Antigravity(已取代 Gemini CLI,面向免费账户和 Google One 账户):在
~/.gemini/config/mcp_config.json中添加{ "mcpServers": { "solana-pulse": { "serverUrl": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - Cursor(
~/.cursor/mcp.json)以及大多数接受 URL 的其他客户端:{ "mcpServers": { "solana-pulse": { "url": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - VS Code(Copilot):
code --add-mcp '{"name":"solana-pulse","type":"http","url":"https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp"}',或在.vscode/mcp.json中配置servers和"type": "http" - Windsurf(
~/.codeium/windsurf/mcp_config.json):{ "mcpServers": { "solana-pulse": { "serverUrl": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - Cline(
cline_mcp_settings.json):{ "mcpServers": { "solana-pulse": { "type": "streamableHttp", "url": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - Codex CLI:
codex mcp add solana-pulse --url https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp - Zed(settings.json):
{ "context_servers": { "solana-pulse": { "url": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - OpenCode(
opencode.json):{ "mcp": { "solana-pulse": { "type": "remote", "url": "https://solana-pulse-gateway-1021990235790.us-central1.run.app/mcp" } } } - ElizaOS 和 Coinbase AgentKit:在连接页面进行设置。
Solana Agent Kit(SendAI):agent-kit/ 中的插件(npm 上的 solana-agent-kit-plugin-pulse)会将每个工具转换为一个操作(PULSE_CHECK_TX、PULSE_TOKEN_SAFETY 等)和一个方法(agent.methods.pulseCheckTx(agent, { tx }))。其工具列表由同一注册表生成(npm run agent-kit),如果列表落后,tests/agent-kit.test.ts 会报错。
Agent 模板:templates/ 中有五个可供派生的小型 Agent(Vercel AI SDK、Claude Agent SDK、LangChain、elizaOS、Coinbase AgentKit)。每个模板都会在签名前使用 check_tx(必须为 OK)和 tx_matches(必须为 MATCH)检查每笔转账;如果 Pulse 无法回答,则会拒绝操作;默认情况下为试运行。
定价与付款
- 所有调用都按 IP 限流,每分钟最多 120 个请求。
- 每个工具每天为每位调用者提供 25 次免费调用(于 00:00 UTC 重置;根据调用者网络的带密钥哈希计数,HTTP 和 MCP 共享),之后每次调用收费 $0.01 USDC(
check_tx、tx_matches和token_safety为 $0.02)。正常使用不收费;付款针对高频自动化使用。使用 Solana Foundation 的pay工具的调用者从首次调用起就需要付费,因为其目录(Pay.sh)只列出会返回402的工具。 - 使用 x402 v2(方案
exact,基于 Solana 主网的 USDC)按请求付款。HTTP 会通过PAYMENT-REQUIRED标头返回402;MCP 会返回 PaymentRequired 工具结果,并通过_meta["x402/payment"]接受付款。Coinbase 的 x402 facilitator 负责验证、结算并支付网络费用;如果启动时无法连接 Coinbase,则以 PayAI 的 facilitator 作为备用。返回错误的调用绝不收费。 - 无账户、API 密钥或储存的余额。
- 使用记录包含路由、状态、客户端名称和调用者网络的带密钥哈希,绝不记录 IP 地址。对于工具调用,记录还会保留工具的输入和结果(每项最多 32 KB)30 天,之后清除。网站访问也以相同方式记录,包括页面和引荐网站。所有者可使用所有者密钥在
/owner查看款项(按工具统计,并列出每个工具更名前的名称下所收的款项)、工具运行记录、调用者、访客和最新运行记录;每项各占一个标签页。 - 每个付费工具都会发布一条 x402 发现列表(Bazaar 扩展:描述、输入架构和真实示例),因此 Coinbase 的 x402 Bazaar 和 PayAI 等 facilitator 目录会在该工具通过它们首次收到付费调用后将其列出。
付款方式的演变
版本 1(2026 年 9 月至 10 月)是我直接在 Solana 上构建的预付费额度系统。其代码保留在 v1-sol-credits 标签中。
- 钱包登录:服务器发放登录消息,并验证钱包对该消息的 ed25519 签名(tweetnacl)。消息 5 分钟后过期,且不能重复使用。登录会返回 API 密钥,服务器只储存其 SHA-256 哈希。
- 存款:Helius webhook 使用共享密钥进行身份验证,并以恒定时间比较方式验证;它会报告发送到收款钱包的 SOL。每个交易签名只记录一次,因此重复发送的 webhook 不会重复入账。每 0.0022 SOL 可购买一次调用。
- 计量:通过一次条件式
UPDATE扣除额度,因此并发调用不会重复使用同一额度,失败的调用则会退还额度。
版本 2 改用 x402,因为买家是 AI Agent。在 v1 中,Agent 必须登录、储存密钥、存入款项并等待入账,才能进行首次付费调用,而且还得使用专为这项服务编写的客户端。使用 x402 时,Agent 可在需要付款的请求中直接付款,采用 Agent 付款库已支持的标准。此切换还将价格单位从 SOL 改为 USDC,并移除了账户、储存的余额、webhook 和四张数据库表。
我会修正 v1 的问题:服务器没有储存自己发放的登录消息,因此会接受任何带有近期时间戳的签名消息;此外,低于单次调用价格的存款不会增加额度。
架构
- 工具注册表(
server/tools/):每个工具都有一份定义,其中包含使用时机说明、文档、实时示例和代码。MCP 工具、HTTP 路由、/api/tools、llms.txt、/.well-known/mcp.json和演练场都由它生成,因此文档不会与实际行为脱节。 - 交易分析(
server/tools/decode.ts):解码 System、SPL Token、Token-2022、Compute Budget、Associated Token Account 和 Memo 指令,解析地址查找表,根据实时状态模拟交易,并计算每个钱包的余额变化。 - 支付(
server/x402.ts、server/meter.ts、server/pricing.ts):准入门控(免费工具、所有者密钥、免费调用或 x402)、官方@x402/express和@x402/mcp集成,以及已结算付款的收入账本。 - 服务端:运行于 Google Cloud Run 上的 Node.js、Express、TypeScript,使用 Cloud SQL 上的 PostgreSQL(每日免费调用次数、匿名使用统计、支付账本)。
- 前端:采用 React、Vite、Tailwind 构建,由注册表驱动的演练场。
本地开发
npm install
cp .env.example .env # set DATABASE_URL at minimum
npm run dev # Express + Vite on http://localhost:3000
npm run build # type-check, then bundle frontend and server into dist/
请参阅 DEVELOPING.md,了解文件夹布局,以及如何添加工具、更改价格、调整网站配色或部署。
测试
npm test # 152 tests, offline, about a minute
npm run test:record # re-record the mainnet scenarios (reads and simulations only)
npm run benchmark # score the 10 attack cases
npm run everyday # replay the 200 everyday transactions
- Solana Agent 安全基准测试(benchmark/README.md、
tests/benchmark.test.ts):包含 10 个基于真实主网账户构建、并针对实时主网状态模拟的用例:正确转账(必须通过)、错误收款人、错误金额、错误代币、额外指令、隐藏转账、恶意程序、余额耗尽、交易过期和重复支付(这些都必须失败)。Solana Pulse 能以正确原因拦截 9 起攻击,无误报。benchmark/score.ts可用相同用例为任何检查器评分。 - 对 200 笔真实交易的误报测试(
benchmark/everyday.ts、tests/everyday.test.ts):从最新主网区块中选取的 200 笔实际成功的普通交易,按照钱包在签名前收到交易的方式进行检查。没有 BLOCK;80 笔转账均为 OK 且 MATCH;27 笔兑换中有 26 笔为 MATCH(另一笔向交易机器人支付了 1.54%);被标记为 REVIEW 的交易调用了check_tx无法识别的程序。构建该测试时发现,无法读取 version 1 交易,而且没有计算限制时手续费计算有误;这两个问题现已修复,现在所有 200 笔交易的手续费都与主网实际收取的金额一致。 - 在真实清空钱包案例和普通钱包上进行追踪(
tests/trace.test.ts、benchmark/trace-everyday.ts):重放了两起记录于主网的真实清空钱包案例。对于 @KunalxWeb3 的钱包,它发现 2.03 SOL 在到账 7 秒后被转出,手续费由另一个钱包支付,原钱包被清空,目的地址由程序控制(根据调查,很可能是桥);对于 @Adilak7777 的钱包,它指出了攻击者钱包,以及转入该钱包的确切数量:2,176.26 JTO、5,375.82 RAY 和 1,446,074 PUMP。对近期主网区块(2026-10-27)中的普通活跃钱包进行测试时,仅凭时间就将 40 个钱包中的 14 个标记为中转钱包,因此收紧了规则:现在,中转钱包必须转出到账金额的 90%;而每种单独迹象(中转钱包 8 个、由另一个钱包支付手续费 7 个、钱包被清空 3 个,共 45 个)只会作为提示,因为交易所充值地址、桥和手续费赞助方也会出现同样情况。清空并转走资金的模式会触发警告;45 个钱包中有 1 个符合该模式。几小时后对同一批 45 个地址重新运行测试(它们最新的交易已经变化),有 5 个符合该模式:两个一次性交易机器人钱包,以及三个看起来像交易所充值地址的钱包。区块链无法区分这类地址和被清空的个人钱包,因此每当触发警告时,摘要都会说明这一点。相似地址投毒 dust 检查未匹配到其中任何一个,并在一次实时调查涉及的两个钱包中发现了真实投毒;来自陌生人的普通 dust(dust_received,会作为提示,也是投毒前的探测手段)匹配了 45 个钱包中的 4 个。结果见benchmark/trace-everyday-results.txt和-results-2.txt。 - 一位真实新手买入的 628 种代币(
benchmark/first-wallet.ts、tests/first-wallet.test.ts):根据token_safety检查这些代币的后续情况。购买当天存在铸币或冻结权限的代币中,有 413 种如今已没有市场(Jupiter 不再为其报价),其中 400 种被标记;仍在交易但大部分价值已损失的 37 种中,有 4 种被标记;保住价值的 20 种中,一种也没有被标记(样本较少)。另有 158 种情况未知。因此,权限警告标记的是后来停止交易的代币,而非仍在交易但价值下跌的代币。测试还发现,没有市场的代币此前仅被标记为 CAUTION;现在,当 Jupiter 表示无法交易时,会将其标记为 AVOID。 - 安全检查(
tests/safety.test.ts)使用记录在tests/fixtures/中的真实主网交易进行测试:排水者的代币授权(BLOCK)、通过隐藏的额外指令转移 SOL、小数位数差 10 倍,以及向陌生人额外转账 USDC(均为 MISMATCH);还包括必须通过的正常转账,其中一笔会创建收款人的代币账户。 - 免费调用计量(
tests/meter.test.ts)在内存中的 Postgres(PGlite)上运行真实 SQL:每日额度、失败调用退款、每日重置,以及经过百分号编码的工具名称。 - 单位测试(
tests/units.test.ts):精确金额计算、错误说明和指令解码。 - 基于真实结果的准确性测试(
server/accuracy.ts、tests/accuracy.test.ts):在 Google Cloud 上,Cloud Scheduler 会从 Jupiter 的活跃列表中抽取 100 种上市时间不足 3 天、流动性至少为 $10,000 的代币,记录token_safety的完整判定结果和每项检查的结果,并在一周后再次检查:买家是否损失了大部分资金(价格或流动性下跌 90% 以上,或 RugCheck 将其标记为 rug)?npm run accuracy会回答四个问题:每种判定对应的代币有多大比例损失了大部分价值;有多少亏损代币被判为 AVOID 或 SAFE;哪些检查能提供有效信号;以及有多少知名代币被判为 SAFE。 - 代币监控(
server/watch.ts、tests/watch.test.ts):Pulse 会在首次检查年轻代币后的 7 天内持续重新读取其数据(每天最多从 Jupiter 的活跃列表中选取 10 种,加上用户运行token_safety检查的年轻代币):每 2 小时检查一次流动性、价格、持有人、前 10 名持有者的占比,以及铸币和冻结权限;每次通过一次批量 Jupiter 查询和一次批量链上读取完成。随后,token_safety会添加一份history,记录此后发生的变化(流动性被撤走、价格暴跌、权限发生转移)。它会在准确性测试周期中运行,因此无需单独安排计划。 - 公开追踪记录(
/track-record、GET /api/track-record、server/track-record.ts):展示准确性测试的结果和监控数据,按 Pulse 最初给出的判定分类。仅提供聚合数据和公开的代币地址。 - 发现列表(
tests/discovery.test.ts):每个付费工具的 x402 列表都通过 Bazaar 扩展自带的验证器检查,且其示例是有效输入。 GitHub Actions 会在每次推送时运行类型检查、工具检查和测试。
如果 Pulse 对你有帮助,请在 GitHub 上点个 ⭐,让其他开发者也能发现它。
许可证
MIT。详见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。