Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Rotwang9000/seneschal-data-api: Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space. · GitHub
Skip to content

Repository files navigation

Seneschal Data API

cilicense

Free, public REST + Model Context Protocol server exposing real-time and historical DeFi liquidation telemetry for Aave, Morpho, Spark and Compound on Ethereum mainnet, plus block-builder market share data from the operator's own slot-by-slot shadow recorder.

Two paid tiers sit on top, both billed per call over x402 micropayments (USDC on Base — no account, no API key):

  • Private Watch(flagship) — give us a Monero or Zcash view key and a webhook URL; we watch the chain on our own full nodes and POST you an HMAC-signed event for every inbound payment. Credit-metered ($0.02/day + $0.005/call), so small receivers pay pennies and you never run a node. Top up in USDC over x402 or pay in Monero/Zcash directly (POST /v1/private/topup-crypto — free quote, no x402, no key; we detect the coin payment with the same view-key scanner the product sells). Drive it from the API, the MCP tools, or the WalletConnect control panel.
  • Premium data — expected-value-ranked liquidation opportunities, per-builder bid distributions, and Penny Oracle atomic single-fact endpoints (DeFi + Monero/Zcash) from $0.001/call.

Live endpoints

WhatURLAuth
REST APIhttps://api.seneschal.spaceNone
MCP (Streamable HTTP)https://mcp.seneschal.spaceNone
Control panel (Private Watch)https://panel.seneschal.spaceWallet
Docshttps://docs.seneschal.space-
Live stats dashboardhttps://stats.seneschal.space-

Rate limit: 120 requests/min/IP at the REST host. The MCP host pipelines requests over a single transport so the same limit applies per session.

Quick start

REST

curl 'https://api.seneschal.space/v1/liquidations/atrisk?max_hf=1.05&min_debt_usd=1000'

MCP — Claude Desktop / Cursor / Continue

Add this to your MCP client config (e.g. ~/.cursor/mcp.json):

{
"mcpServers": {
"seneschal-data": {
"url": "https://mcp.seneschal.space/"
}
}
}

This server is published to the official MCP Registry as io.github.Rotwang9000/seneschal-data (see server.json), so MCP-aware clients and aggregators can discover it automatically.

Eighteen tools become available to your agent — free read tools, plus paid tools that hand back the exact URL + body to settle over x402:

ToolPurpose
seneschal_healthLiveness + data freshness
seneschal_list_at_risk_borrowersFind liquidatable positions across all DeFi
seneschal_list_borrowersGeneric discovery / pagination over the full borrower set
seneschal_recent_liquidationsRecent on-chain liquidations (won by other liquidators or ourselves)
seneschal_get_borrowerLatest state of one borrower across protocols
seneschal_get_borrower_historyTime-series health-factor traces
seneschal_builder_leaderboardEthereum builder market share (24h, 7d, 30d, all-time)
seneschal_stats_overviewAggregate snapshot powering the public dashboard, incl. operator activity (counts only — no profit fields)
seneschal_flashloan_providersCurated catalogue of mainnet flash-loan providers, incl. LP-side commit-capital paths where applicable
seneschal_paywall_infoFree metadata for the x402 paywall (network, recipient, per-call price)
seneschal_premium_opportunitiesEV-ranked at-risk borrowers with realised market intel (x402, paid)
seneschal_premium_builder_statsPer-builder bid distribution + hourly slot histogram for bundle pricing (x402, paid)
seneschal_qPenny Oracle dispatcher — atomic single facts across DeFi + Monero/Zcash, $0.001/call (x402, paid)
seneschal_private_watch_infoFree metadata for Private Watch: meter, supported chains, NFPT upstream health, security notes
seneschal_private_watch_createSubscribe an XMR/ZEC view key to webhook payment monitoring (x402, paid)
seneschal_private_watch_topupURL + body to top up an existing watch's credit ($0.10 / $1 / $5 tiers)
seneschal_private_watch_topup_cryptoFree quote to top up a watch by paying in Monero/Zcash; poll status until settled (no x402, no key)
seneschal_private_watch_historicalOne-off paid scan returning spendable + spent notes for a view key (x402, paid; key never persists)
seneschal_private_watch_derive_viewkeyFree, rate-limited Zcash UFVK derivation from a BIP-39 mnemonic (with a loud security warning)

REST endpoints

MethodPathNotes
GET/v1/healthLiveness + freshness probe
GET/v1/liquidations/atrisk?protocol&max_hf&min_debt_usd&limit
GET/v1/liquidations/recent?since_ms&protocol&limit
GET/v1/borrowers?protocol&min_hf&max_hf&min_debt_usd&max_debt_usd&sort_by&sort_dir&limit&offset
GET/v1/borrowers/:addressCross-protocol borrower snapshot
GET/v1/borrowers/:address/history`?protocol=aave
GET/v1/builders/leaderboard`?window=24h
GET/v1/stats/overviewAggregate snapshot for dashboards
GET/v1/flashloan/providers?chain&max_fee_bps&multi_asset

Full details, parameter tables, and worked examples at https://docs.seneschal.space.

Why this exists

Seneschal operates an Ethereum block builder (extra_data = Seneschal/0.1) and a vertically-integrated liquidation searcher. The searcher already tracks ~500 Morpho borrowers, 1,300+ Spark borrowers, every Aave V3 mainnet position with non-trivial debt, and the winning builder of every slot since May 2026. Nobody else publishes this combination, so we expose it.

Two protocols, one backend:

  • REST API — dashboards, monitoring tools, anything that speaks HTTP.
  • MCP server — AI agents (Claude, Cursor, Continue, etc.) using the Model Context Protocol.

Local dev

git clone https://github.com/Rotwang9000/seneschal-data-api
cd seneschal-data-api
npm install
SENESCHAL_MEV_LOGS_DB=/path/to/your-mev-data.sqlite \
SENESCHAL_MORPHO_BORROWERS=/path/to/morpho-borrowers.json \
SENESCHAL_SPARK_BORROWERS=/path/to/spark-borrowers.json \
SENESCHAL_SHADOW_BLOCKS=/path/to/shadow-blocks.jsonl \
node bin/rest.mjs
# in another shell:
curl http://127.0.0.1:8810/v1/health

Docker

A Dockerfile is provided for self-hosting the MCP server:

docker build -t seneschal-data-api .
docker run -p 8811:8811 -v /path/to/your-data:/data seneschal-data-api
# point your MCP client at http://localhost:8811/

The data sources are SQLite + JSONL files written by the Seneschal bot. Schemas are documented in src/db.js; if you have your own writer producing the same shapes you can point this server at it.

Tests

npm test

539 jest tests covering the query layer (in-memory SQLite fixtures), the Fastify REST routes (via fastify.inject), the MCP server (both in-process via InMemoryTransport and end-to-end via StreamableHTTPClientTransport), the x402 paywall + bazaar-discovery wiring, the Private Watch credit meter / poller / surge pricing, and the ops watchdog. Plus test/live-smoke.mjs which exercises the live mcp.seneschal.space endpoint over Streamable HTTP.

Architecture

services/data-api/ ← this repository
├── bin/
│ ├── rest.mjs systemd entry — Fastify REST listener
│ └── mcp.mjs systemd entry — MCP HTTP listener
├── src/
│ ├── config.js env-driven config (ports, paths, limits)
│ ├── db.js better-sqlite3 read-only handle + JSON cache
│ ├── queries.js pure functions used by both REST and MCP
│ ├── rest-server.js Fastify app: `buildApp()` for tests, `start()` for prod
│ └── mcp-server.js McpServer + StreamableHTTPServerTransport
├── docs/ public docs served at docs.seneschal.space
└── test/ queries / rest-server / mcp-server tests

Shared design rule: both REST and MCP layers are thin wrappers around queries.js. Any new endpoint goes in queries.js first (with tests), then both wrappers in the same commit.

Premium tier (x402 paywall)

src/queries-premium.js plus src/x402.js add per-call payment to a small family of /v1/premium/* endpoints (and seneschal_premium_* MCP tools). The paywall is off unless the operator sets X402_RECIPIENT_ADDRESS. Once set, unsigned requests get HTTP 402 with machine-readable payment requirements, and an x402 facilitator settles a signed EIP-3009 transferWithAuthorization for USDC on Base mainnet.

Configure

Env varDefaultNotes
X402_RECIPIENT_ADDRESS(empty — paywall off)Recipient wallet on the chosen network. 0x-prefixed 20-byte hex.
X402_NETWORKeip155:8453 (Base mainnet)Any CAIP-2 EVM network the facilitator supports.
COINBASE_API_KEY + COINBASE_API_SECRET(empty)Recommended. A CDP API key. When both are set, settlement routes through Coinbase's hosted facilitator (api.cdp.coinbase.com/platform/v2/x402) and the service is auto-listed in the Coinbase x402 Bazaar. No business/KYB verification needed; 1k free settlements/month. Accepts X402_CDP_API_KEY_ID / CDP_API_KEY_ID aliases.
X402_FACILITATOR_URLhttps://facilitator.openx402.aiFallback facilitator used only when no CDP credentials are set.
X402_FEED_PRICE$0.05Money-formatted ($0.05) or atomic units (50000).
X402_PAYWALL_DESCRIPTIONShown on /, /v1/paywall, and the stats dashboard.
X402_MAX_TIMEOUT_SECONDS120Maximum settlement window per call.

Free metadata endpoint (zero cost, no signature required):

curl https://api.seneschal.space/v1/paywall

returns the live network/recipient/price/route table so agents can budget a session before opening a paid request.

Support

  • Per-call payments (preferred for agents): pay $0.05 USDC on Base to call GET /v1/premium/opportunities. See /v1/paywall for the live recipient + rails.
  • GitHub Sponsors: the Sponsor button at the top of the repo (.github/FUNDING.yml).
  • Direct tips: ETH / BTC addresses are surfaced on stats.seneschal.space once the operator sets SENESCHAL_DONATE_ETH / SENESCHAL_DONATE_BTC.
  • Questions / allow-list bumps: Telegram @OrknetP.

Seneschal runs on a single Helsinki box; every cent helps keep it online.

License

MIT — see LICENSE.

Operator contact

Seneschal is a single-operator Ethereum block builder and searcher running an rbuilder fork from a co-located server in Helsinki. Builder on-chain extra_data is Seneschal/0.1. Contact @OrknetP on Telegram (checked periodically).

About

Agent-payable Monero & Zcash payment watching (view-key webhooks, historical scans, native XMR/ZEC top-ups) plus DeFi liquidation + Ethereum builder data. REST + MCP, paid per call via x402 USDC on Base — no account, no API key. Live at api.seneschal.space.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages