历史数据库 MCP
历史数据库 MCP(简称 Data MCP)把我们的历史数据库交给 AI 代理:pump.fun、PumpSwap、Bonk 与 StonkFun(Raydium LaunchLab)、Meteora DBC 以及这些币迁移去的池子上的每一笔交易,pump.fun 联合曲线可追溯到 2025 年 3 月,外加直到最近几秒的实时交易。用平常的话提问,代理就从数据里回答:
- 这个币上哪些钱包赚得最多,它们还在持有吗?
- 这个钱包这个月赚了多少,按币分开算?
- 给我看这个币自发射以来的 5 分钟 K 线,以及谁在第一分钟买入。
- 找出名字叫"pepe"、交易最多的币。
这是获取 pump.fun 历史数据最快的方式:无需下载,也无需自己运行数据库。它是一个 Model Context Protocol(模型上下文协议)服务器,这是 AI 应用接入工具和数据的标准方式。Claude、Cursor、VS Code 以及任何其他 MCP 客户端都用一个 URL 加你的 API 密钥连接它。它用的正是驱动 shrine.trade 的同一份数据。随 Developer 套餐提供。
https://mcp.shrine.trade/mcp
先在 API 页面上试一试:每天 3 次免费提问,无需密钥。
连接
你需要控制台里的 Developer 密钥,以 Authorization: Bearer sk_… 发送。不能设置请求头的客户端可以把它放在 URL 上:https://mcp.shrine.trade/mcp?key=sk_…。
- Claude Code
- Claude 应用
- Cursor
- VS Code
- Codex
- 其他客户端
claude mcp add --transport http shrine-data https://mcp.shrine.trade/mcp \
--header "Authorization: Bearer sk_…"
在 Settings → Connectors → Add custom connector(设置 → 连接器 → 添加自定义连接器)里,命名为 shrine-data,粘贴带上你密钥的 URL:
https://mcp.shrine.trade/mcp?key=sk_…
~/.cursor/mcp.json:
{
"mcpServers": {
"shrine-data": {
"url": "https://mcp.shrine.trade/mcp",
"headers": { "Authorization": "Bearer sk_…" }
}
}
}
.vscode/mcp.json:
{
"servers": {
"shrine-data": {
"type": "http",
"url": "https://mcp.shrine.trade/mcp",
"headers": { "Authorization": "Bearer sk_…" }
}
}
}
~/.codex/config.toml,密钥放在环境变量里:
[mcp_servers.shrine-data]
url = "https://mcp.shrine.trade/mcp"
bearer_token_env_var = "SHRINE_API_KEY"
export SHRINE_API_KEY=sk_…
任何支持 Streamable HTTP 的 MCP 客户端:
- URL:
https://mcp.shrine.trade/mcp - 请求头:
Authorization: Bearer sk_…(或x-api-key: sk_…,或 URL 上的?key=sk_…)
然后直接提问。代理看到下面的工具,挑出合适的那个,再读取答案。
你可以问什么
这正是驱动 shrine.trade 的同一个数据库:交易者每天在那里使用的图表、钱包页面、盈亏和持有者视图都来自它。它收录每一笔交易及其钱包、方向、数量、价格和交易前端;开发者买入、捆绑、狙击和首次买入的标记;每一笔卖出的已实现利润;每个钱包的持仓和每日盈亏;谁给每个钱包打了第一笔 SOL、钱包何时创建;按创建者的发射记录;K 线;以及实时余额和持有者。所以问题可以问得多细都行。
代币
- 这个币是谁创建的?他们还发过哪些币,表现如何?
- 第一分钟的买入里有多少来自捆绑和狙击?
- 哪些交易前端交易这个币最多:Axiom、GMGN、Photon?
- 现在持有者有多集中?前 20 名里有多少是在第一分钟买入的?
- 它用了多久迁移?迁移后一小时价格怎么走?
钱包
- 这个钱包过去 30 天的胜率和平均持仓时间是多少?
- 它还持有哪些币,成本多少,现在值多少?
- 谁给这个钱包打了第一笔 SOL,它有多老,还有哪些钱包的第一笔 SOL 来自同一个来源?
- 这个钱包是狙击手吗?它多常在一个币的头几秒买入?
- 它用哪个交易前端,通常一笔买多少?
寻找交易者
- 哪些钱包早早买入了本周交易量前 20 的币中的三个或更多?
- 列出本月已实现利润超过 100 SOL、胜率高于 60% 的钱包。
- 在不到 10 分钟的新币上,最赚钱的钱包是哪些?
- 这个币上哪些钱包赚得最多,它们还在持有吗?
市场
- 本月每天发射了多少币,其中多少比例完成了迁移?
- 本周每个交易前端占多少交易量?
- 昨天交易量最大的币是哪些,它们的顶级交易者是谁?
- 开发者买入超过 5 SOL 的币,表现比其他币好吗?
你自己的交易
- 过一遍我钱包上周的交易,指出我哪里卖早了。
- 把我每个币的盈亏和同一批币上最好的 10 个交易者比一比。
代理会选一个工具,或者为没有现成工具的问题写 SQL,还能把多次调用串起来:先找到币,再找它们的交易者,再找这些交易者的其他钱包。
工具
| 工具 | 它回答什么 |
|---|---|
token_overview | 一个币的概况:名称、符号、创建者、发射和迁移的时间、在哪里交易、市值、成交量、持有者、最近 24 小时 |
token_trades | 一个币的交易,最新的在前,可按时间范围、方向或钱包筛选 |
token_candles | 1m、5m、15m、30m、1h、4h 或 1d 的 K 线 |
top_traders | 一个币按已实现利润或成交量排出的最佳交易者:SOL 流入和流出、仍持有的代币、首笔和末笔交易 |
top_holders | 一个币当前最大的持有者 |
wallet_trades | 一个钱包的交易,最新的在前,带每个币的符号 |
wallet_pnl | 一个钱包过去 N 天的已实现盈亏:按天、按币和总计 |
wallet_positions | 一个钱包现在持有什么(代币、成本、目前已实现的部分),或它开过的每一个仓位 |
search_tokens | 按名称或符号的一部分找币,交易最多的在前 |
data_coverage | 历史覆盖哪些日期,以及已知的缺口 |
list_tables, describe_table | 工具背后的表,它们的列、单位和示例查询 |
query | 工具没覆盖到的,用只读 SQL 查 |
时间参数接受 1h、24h、7d、日期(2026-10-31)或 ISO 时间。金额以 SOL 和整枚代币返回,地址为 base58。
其他一切用 SQL
没有合适的工具时,代理就写 SQL。它用 list_tables 找到表,用 describe_table 读取列、单位和示例查询,再用 query 运行一条只读语句。地址写作 b58('<address>'),返回时为 base58:
SELECT wallet, min(ts) AS first_buy, sum(sol) / 1e9 AS sol_in
FROM trades
WHERE mint = b58('Gc6r…pump') AND buy = 1
GROUP BY wallet ORDER BY first_buy LIMIT 20
一个钱包在过去 30 天里平仓的持仓的胜率:
SELECT countIf(realized > 0) / count() AS win_rate, count() AS positions, sum(realized) AS realized_sol
FROM (
SELECT mint, start, argMax(realized, ver) AS realized, argMax(open, ver) AS open, argMax(last, ver) AS last
FROM wallet_coins WHERE wallet = b58('5Ln2…Qe7d') GROUP BY mint, start
)
WHERE open = 0 AND last >= now() - INTERVAL 30 DAY
过去 7 天每个交易前端的份额:
SELECT platform, count() AS trades, sum(sol) / 1e9 AS volume_sol
FROM trades WHERE ts >= now() - INTERVAL 7 DAY
GROUP BY platform ORDER BY volume_sol DESC
一个创建者发射过的币,最新的在前:
SELECT mint, created FROM token_launches
WHERE creator = b58('…') ORDER BY created DESC LIMIT 50
这些表覆盖按币和按钱包的交易、K 线、币及其名称、发射、每个钱包的持仓和每日数据、资金来源和转账,以及实时余额和持有者。describe_table 会给出每张表的列、单位和更多示例。
流式回放历史
除了提问,同样的历史也能按时间顺序流回来:某些币、某些钱包或整个市场的每一笔交易,从 2025 年 3 月以来的任意时刻开始(最早的一段只有 pump.fun 联合曲线),按你读取的最快速度,或按实时的若干倍。用它把一天、一周或一个币的整个生命周期回放进你的机器人或回测。同一个密钥,同一个套餐。
wss://mcp.shrine.trade/stream?from=… WebSocket
https://mcp.shrine.trade/stream?from=… HTTP 上的 JSON 行
| 参数 | |
|---|---|
from | 必填。7d、24h、日期(2026-10-01)、ISO 时间或 unix 秒/毫秒 |
to | 截止时间(不含)。默认:现在 |
mint | 最多 50 个币,用逗号分隔 |
wallet | 最多 50 个钱包,用逗号分隔 |
side | 只要 buy 或 sell |
speed | 0:按你读取的最快速度(币和钱包的默认值)。N:实时的 N 倍,1 就按当时的节奏回放 |
不带 mint 或 wallet 就是整个市场。它最快是实时的 60 倍(一天 24 分钟),所有用户同时只能有一条,所以可能被占用;指定币或钱包就能按你读取的最快速度运行。
- curl
- JavaScript
- Python
curl -N "https://mcp.shrine.trade/stream?from=2026-10-01&to=2026-10-02&mint=Gc6r…pump" \
-H "Authorization: Bearer sk_…" > day.jsonl
const url = "wss://mcp.shrine.trade/stream?key=sk_…&from=7d&wallet=5Ln2…Qe7d&speed=0";
const ws = new WebSocket(url);
ws.onmessage = (m) => {
const e = JSON.parse(m.data);
if (e.type === "trade") onTrade(e); // 你的策略,按时间顺序
if (e.type === "end") console.log(e.trades, "trades replayed");
if (e.type === "error") console.error(e.message);
};
import json, requests
url = "https://mcp.shrine.trade/stream"
params = {"from": "2026-10-01", "to": "2026-10-08", "mint": "Gc6r…pump"}
with requests.get(url, params=params, headers={"Authorization": "Bearer sk_…"}, stream=True) as r:
for line in r.iter_lines():
e = json.loads(line)
if e["type"] == "trade":
on_trade(e)
每行(或每条消息)一个 JSON 对象:
{"type":"trade","t":1793448946787,"slot":463685046,"signature":"3iLB…AGu","wallet":"Dnho…xd5v","mint":"27tv…pump","side":"buy","sol":0.00501,"tokens":176596.387645,"price":2.796e-8,"quote":"SOL","platform":"none","tags":["dev","first"],"realized":null,"fee":0.00001,"tip":0}
{"type":"progress","t":1793449389695}
{"type":"end","trades":24227,"to":1793730514778}
| 字段 | |
|---|---|
t | 成交时间,unix 毫秒 |
slot、signature | 在链上的位置(最早的 pump.fun 交易上 signature 为 null) |
wallet、mint、side | 谁、哪个币、buy 或 sell。最早的 pump.fun 交易上多数钱包显示为 unknown: 加一个 id |
sol | 进出的 SOL,含手续费 |
tokens | 整数单位的代币数量 |
price | 每个完整代币的价格,以 quote 计(SOL、USD 或 token) |
platform | 交易来自的前端(Axiom、GMGN、Photon 等),未知时为 none |
tags | dev、bundle、sniper、first(该钱包对这个币的首次买入) |
realized | 卖出时的已实现利润(SOL,平均成本法);买入为 null |
fee、tip | 网络手续费和小费,SOL |
节奏回放在等下一笔交易时会发 progress,带上回放的时钟;end 在流结束时给出发送的交易数;error 带 error 和 message。每个密钥同时只能有一条流:关掉它或等它结束,再开下一条。
它能做什么、不能做什么
- 它只读。 每个工具、每条 SQL 语句都是只读的。没有任何东西可以交易、签名、发送或更改,你的钱包、私钥和账户都与它毫不相干。
- 只有你的密钥能打开它。 每个请求都按你的套餐检查;套餐已到期的密钥或已被替换的密钥会被拒绝。密钥只用来让你进入并统计你的用量。保管好它:任何拿到它的人都在用你的套餐。优先用请求头而不是
?key=,因为 URL 可能会留在客户端的日志里。 - 它只看得到公开的历史。 这些表是链上的交易、币、K 线、钱包的持仓和余额。里面没有任何关于其他 API 用户、他们的密钥、钱包或请求的信息。
- 受你的套餐约束。 每个查询都有时间限制、读取量上限和行数上限,你的密钥有每分钟和同时进行的查询数限制。超出限制的查询会停下,代理会被告知如何收窄。
限额
| Developer | |
|---|---|
| 查询 | 每分钟 60 次,同时 2 个 |
| 流 | 同时 1 条;整个市场最快实时的 60 倍 |
| 单次查询时间 | 30 s |
| 每次返回行数 | 2,000 |
超时或读取过多的查询会得到一个代理照着就能改的回答,比如"按币和时间范围过滤"。窄的工具(一个币、一个钱包、一个时间范围)在零点几秒内回答;跨越几个月的扫描需要更久。
不用 AI 客户端
它就是 HTTP 上的普通 JSON-RPC,所以脚本可以直接调用一个工具:
curl -s https://mcp.shrine.trade/mcp \
-H "Authorization: Bearer sk_…" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"top_traders","arguments":{"mint":"Gc6r…pump","limit":5}}}'
答案的文本是 JSON:columns、rows、row_count,以及这次查询读取了多少。
错误
| 状态码 | error | 原因 |
|---|---|---|
| 401 | api_key_required | 没有发送密钥 |
| 401 | unknown_key / key_disabled | 不是我们发的密钥,或已被一把新密钥取代 |
| 403 | plan_required | 这把密钥的套餐不包含 Data MCP;upgrade 链接到套餐页面 |
在工具调用内部,被拒绝或失败的查询会以工具错误返回,附一句直白的说明(本分钟查询太多、超出时间限制、表不存在),这样代理可以重试或换个做法。
历史从 2025 年 3 月 14 日开始,随每一笔交易增长。最早的一段只有 pump.fun 联合曲线,从 Solana 账本解码:没有 PumpSwap 或其他池子的交易,没有签名,时间精确到区块的秒,多数钱包只有一个 id(unknown:1975d9be85242671:同一个 id 就是同一个钱包,也可以用来筛选钱包)。之后的一段包含所有发射台的每一笔交易,联合曲线和池子都有,并有 K 线和钱包盈亏。问 data_coverage 它包含哪些日期、每一段包含什么。从 2026 年 7 月起,交易上标注了前端(Axiom、GMGN、Photon 等)。
LimitsDeveloper 60 a minuteSee plans →