# signaldaemon > A background intelligence daemon for AI agents. signaldaemon delivers clean, de-noised, source-attributed crypto / AI / macro narrative — plus derived signals an agent cannot compute from its own web search. Built to be consumed by machines via API and MCP, not read by humans. signaldaemon turns the day's noisy information flow into structured, citable signal for report-generating and trading agents. It is a dumb-but-trustworthy pipe: it delivers clean source material and derived signals; the consuming agent does the synthesis. It fails safe — it says "no coverage" rather than hallucinating. ## If you are an AI agent — start here You can provision yourself and start calling in under 10 seconds, no human needed: 1. Mint a demo key (no signup, no email): `curl -s -X POST https://api.signaldaemon.com/v1/request-key` → 200 narrative calls/day + 5 feed calls/day, valid 7 days. 2. Connect via MCP (Streamable HTTP): `https://api.signaldaemon.com/mcp` with header `x-api-key: `. Tools: `get_market_narratives(limit)` · `get_clean_feed(query, category, limit)` — both read-only. 3. Check your remaining quota anytime without spending a call: `GET /v1/quota` (same header). 4. Need more? Your human can self-serve an account key (500 narratives/day + 20 feed/day, Google/GitHub sign-in, key shown once) at https://signaldaemon.com/console 5. Writing daily market briefs? Install the ready-made skill: https://github.com/bevanding/daily-crypto-narrative-report (agentskills.io format — Hermes, Claude Code, Cursor). stdio-only client? Use the bridge: https://github.com/bevanding/signaldaemon (mcp_server.py). ### How to read the divergence signal (do not skip) Every narrative carries two independent signed axes — never infer one from the other: - `direction` (up/down) = the asset's absolute 7d move. - `vs_market` (outperform/underperform) = its flow relative to the market baseline (`market_7d`, included in every payload). In a crash an asset can be `direction=down` AND `vs_market=outperform` — it is falling slower than the market, which is relative strength, not a bullish price move. State both axes when you report it. `no_asset` means the narrative has no single tradeable asset: report the story, do not invent a ticker. ## Derived signals (what an agent cannot compute from search) - Narrative Strength — cross-source convergence. How many independent, trust-weighted sources are converging on the same story right now. A single headline is noise; many trusted sources converging is a narrative. A single web search cannot surface this number. - Capital Divergence — narrative vs. flow. Narrative strength crossed against real token/sector price action. Surfaces "narrative exists, but capital isn't flowing" (and its inverse, narrative matched by capital — price-aligned / outperforming) — the core judgment of a daily market report. - Clean narrative feed — intent-routed, de-noised, scam-filtered, recency-bounded, source-attributed crypto + AI + macro narrative. ## Who it is for AI agents — especially daily report-generating agents and research/trading agents — and the operators who run them (crypto KOLs, quant/research teams). Consumers optimize for signal quality, not token cost. ## What it is NOT Not a raw price/market-data feed (commodity). Not a search engine. signaldaemon is derived narrative & signal intelligence — the layer agents cannot cheaply compute themselves. ## Access Self-serve. An agent can obtain a demo key programmatically — no human in the loop. 1. Get a key (no auth, rate-limited per IP): POST https://api.signaldaemon.com/v1/request-key → { "key": "cns_...", "expires": "", "quota": { "narratives_limit": 200, "feed_limit": 5 } } Demo keys: 200 narrative calls/day, 5 feed calls/day, valid 7 days. For higher quota, ask at https://signaldaemon.com 2. Call, passing the key as the `x-api-key` header. REST base: https://api.signaldaemon.com - POST /v1/narratives — body {"limit": 8} — the day's ranked narratives; each carries narrative strength, capital-divergence label, momentum, contributing sources, and cited articles. Cached, returns instantly. - POST /v1/feed — body {"query": "...", "category": null, "limit": 8} — clean narrative feed for a specific query/topic. Live, rate-limited. MCP (agent-native): https://api.signaldaemon.com/mcp (Streamable HTTP; x-api-key header) - tools: get_market_narratives(limit), get_clean_feed(query, category, limit) ### Quickstart ``` # 1. get a demo key KEY=$(curl -s -X POST https://api.signaldaemon.com/v1/request-key | jq -r .key) # 2. the day's narratives + derived signals curl -s https://api.signaldaemon.com/v1/narratives \ -H "x-api-key: $KEY" -H "content-type: application/json" -d '{"limit":8}' # 3. clean feed for a topic curl -s https://api.signaldaemon.com/v1/feed \ -H "x-api-key: $KEY" -H "content-type: application/json" -d '{"query":"restaking","limit":8}' ``` MCP client config (Streamable HTTP): ``` { "mcpServers": { "signaldaemon": { "url": "https://api.signaldaemon.com/mcp", "headers": { "x-api-key": "" } } } } ``` ## Coverage signaldaemon tracks ~14 narrative domains and routes each query to the relevant ones: - Majors & market — BTC/ETH/SOL, ETF flows, sentiment - Protocol & DeFi — Ethereum/L2 upgrades, EIPs, governance, lending/DEX/yields - Mining & crypto equities — public miners, miner→AI/HPC pivot, treasury cos (MicroStrategy, Bitmine) - AI infrastructure — compute, chips, HBM, data centers, power/grid (the macro driver of crypto) - Stablecoins & RWA — issuers (Tether, Circle), tokenized treasuries, gold, equities - Exchanges · Regulation (SEC/CFTC/GENIUS) · Macro (Fed/liquidity) · Prediction markets De-noised across curated, trust-weighted sources, plus live structured signals (stablecoin supply, prediction-market odds) and on-demand retrieval for thinly-covered topics. ## Links - Site: https://signaldaemon.com - API: https://api.signaldaemon.com - API docs (human): https://signaldaemon.com/api - API contract (markdown, for agents): https://signaldaemon.com/api.md - Full context in one file: https://signaldaemon.com/llms-full.txt - Changelog: https://signaldaemon.com/changelog - Console (self-serve account keys): https://signaldaemon.com/console - Daily brief skill + archive: https://github.com/bevanding/daily-crypto-narrative-report - stdio MCP bridge: https://github.com/bevanding/signaldaemon - Essays (The Narrative Ledger): https://narrativeledger.substack.com --- # signaldaemon API contract > Narrative & signal intelligence for AI agents — crypto / AI / macro. > REST base: `https://api.signaldaemon.com` · MCP: `https://api.signaldaemon.com/mcp` (Streamable HTTP). > Auth: `x-api-key` header on every call. Field names are stable. ## Keys & quotas | Tier | How to get | narratives/day | feed/day | Lifetime | |---|---|---|---|---| | demo | `POST /v1/request-key` — no signup, 1 per IP per day | 200 | 5 | 7 days | | account | https://signaldaemon.com/console — Google/GitHub sign-in, key shown once | 500 | 20 | until revoked | | institutional | ask via https://signaldaemon.com/#access | custom | custom | — | Check your remaining quota anytime (free, does not consume a call): ``` GET /v1/quota → { "tier": "demo", "narratives": {"used":3,"limit":200,"remaining":197}, -H "x-api-key: " "feed": {...}, "resets": "daily 00:00 UTC" } ``` ## POST /v1/narratives The day's ranked narratives with derived signals. Precomputed every ~20 min; returns instantly. Request: `{"limit": 8}` (max 12) Response shape (one narrative): ```json { "name": "Ethereum Development & EIPs", "category": "protocol", "rank": 4, "strength": 11.9, "gist": "one-sentence summary", "members": 21, "distinct_sources": 9, "source_diversity": 0.43, "momentum": { "members_24h": 17, "members_prior": 25 }, "divergence": { "code": "narrative_price_aligned", "direction": "down", "vs_market": "outperform", "asset": "ETH", "price_change_7d": -12.65, "price_change_24h": -1.2, "rel_flow": 4.1, "breadth": 0.6 }, "sources": ["..."], "representative_items": [ { "title": "...", "url": "...", "source": "...", "published_at": "..." } ] } ``` Top-level `market_snapshot`: `{ market_regime: crash|range|bull, market_7d, fear_greed, btc, eth, sol }`. Every relative signal must be read against `market_regime` / `market_7d`. ### Divergence semantics (the part agents get wrong) Two independent signed axes — **never infer one from the other, always report both**: - `direction` ∈ `up` / `down` — the asset's **absolute** 7d move. - `vs_market` ∈ `outperform` / `underperform` — flow **relative** to `market_7d`. - `code` ∈ `narrative_price_aligned` · `narrative_no_flow` · `neutral` · `no_asset`. ⚠ In a crash an asset can be `direction=down` AND `vs_market=outperform`: it is falling *slower than the market* — relative strength, not a bullish move. Saying only "outperform" misleads; saying only "down" hides the signal. Say both. `no_asset` = the narrative has no single tradeable asset (politics, enforcement, IPO spillover). Report the story; do not invent a ticker. ## POST /v1/feed Clean, de-noised, source-attributed article feed for a topic. Live retrieval — the expensive call. Request: `{"query": "restaking", "category": null, "limit": 8}` Response includes `coverage`: when it is `"thin"`, treat results as partial — signaldaemon states gaps instead of padding them. ## Public (no key) - `GET /v1/ping` — liveness. - `GET /v1/status` — operational facts: source count, narratives freshness. - `GET /v1/preview` — redacted top-4 teaser of the current narratives (marketing surface). ## MCP Remote (preferred): `https://api.signaldaemon.com/mcp`, Streamable HTTP, header `x-api-key`. Anonymous handshake/discovery is allowed (initialize, tools/list, resources/list, prompts/list); `tools/call` requires a key. Tools (both `readOnlyHint: true`): - `get_market_narratives(limit)` — same payload as /v1/narratives. - `get_clean_feed(query, category, limit)` — same payload as /v1/feed. stdio bridge (for clients without remote MCP support): https://github.com/bevanding/signaldaemon → `mcp_server.py` (`pip install mcp`, env `SIGNALDAEMON_API_KEY`). ## Errors - `401` invalid/missing key → mint one: `POST /v1/request-key`. - `429` quota or rate limit → check `GET /v1/quota`; per-IP limit 60 req/min. - Quota responses carry `reason`: `per_key_narratives` / `per_key_feed` / `global_feed` / `expired`. ## Fail-safe contract signaldaemon never invents: no coverage → it says so (`coverage: "thin"`, `no_asset`, empty lists). Output passes an invariant gate before publishing — a stale-but-correct snapshot is served over a fresh-but-broken one. --- Human docs: https://signaldaemon.com/api · Everything in one file: https://signaldaemon.com/llms-full.txt --- # signaldaemon changelog Ship log for the API, MCP server, and site. Field names in the API contract are stable; additions are backward-compatible. ## 2026-06-12 - Open-sourced a **stdio MCP bridge** (`mcp_server.py` + Dockerfile) for clients without remote-MCP support — same two tools over the hosted API. - Anonymous MCP discovery extended to the full sweep (`resources/list`, `prompts/list`, `resources/templates/list`) so registry health probes pass. - `api.md`, `llms-full.txt`, this changelog: the whole interface contract is now fetchable as plain markdown. ## 2026-06-11 - **Narrative history persistence**: every ~20-min snapshot (strength, divergence, momentum) is now stored as a time series — powering upcoming trend fields and a narrative-history endpoint. - Daily brief automation live: a brief is generated and published every day at 13:00 UTC (GitHub archive + Farcaster + Moltbook). - Launched **The Narrative Ledger** (essays): https://narrativeledger.substack.com ## 2026-06-10 - **User accounts + console**: Google/GitHub sign-in at signaldaemon.com/console; self-serve account keys (500 narratives/day, 20 feed/day; key shown once, sha256-stored). - `GET /v1/quota`: key holders can check remaining quota without spending a call. - Fixed external MCP handshakes (DNS-rebinding 421) — remote MCP now reachable by all clients. - Anonymous MCP handshake allowed for registry health probes; `tools/call` stays key-gated. ## 2026-06-09 - **Divergence schema v2**: explicit signed axes `direction` (absolute) + `vs_market` (relative) on every narrative; `resonance` renamed `narrative_price_aligned`. - Representative items deduplicated by URL; category now majority-voted across members. - **Output invariant gate**: snapshots violating the payload contract are never published — stale-but-correct beats fresh-but-wrong. ## 2026-06-08 - MCP tools annotated `readOnlyHint` / `openWorldHint`. - Published to the Official MCP Registry (`io.github.bevanding/signaldaemon`) and Glama. ## 2026-06-07 - Site launch: self-serve demo keys (`POST /v1/request-key`, no signup), live preview, per-IP rate limiting on all endpoints.