io.github.horizon-pulse/horizon-pulse

28 agent tools via x402: crypto data, tx checks, web fetch. MCP pays Base USDC; HTTP adds 3 rails.

Endpointhttps://horizonpulse.dev/mcp (streamable-http)
Registry version0.1.5
Now32 tools · grade B (80) · pin ts_11cc39f229a5861173dc17bdfa1f7cd6 · protocol 2025-06-18
First / last listed2026-10-26 07:34 UTC / 2026-10-26 07:34 UTC
Grade over time2026-10-26: B (80), 32 tools

Is this your server? Own a server? ToolFit hosted watch re-checks it every 24 h ($0.25 per 30 days) or 6 h ($0.60) and sends you an HMAC-signed webhook when its tools or grade change: POST https://api.youraitools.co/toolfit/v1/watch. To opt out, see About & opt-out.

Timeline

First listing · 2026-10-26 07:34 UTC
32 tools, grade B (80)

Tools: pulse signals yield gas funding portfolio fetch http extract x402_check x402_check_deep bazaar_check market_search discourse_split tx_status tokenized_stock watch balance tx_guard grocery_normalize grocery_ingredient chain_head token_meta name_resolve batch market_quote screenshot search pdf money_market_rates submit_feedback verified_brief_quote

Current tools (32)

pulseCrypto market data: a current USD price snapshot for BTC, ETH and SOL, or one coin via symbol= (bad symbol: 400, no charge), for quick market context. JSON per asset: priceUsd, change24hPct, momentum; plus overall momentum, sentiment, direction, avgChange24hPct, asOf. Prices from Coinbase Exchange, CoinGecko fallback (source field). Labels are fixed rules on 24h change, not a forecast and not fina
params: none
signalsCrypto market data: precomputed RSI-14, MACD and Bollinger Bands plus latest OKX perp funding for BTC, ETH and SOL, or one coin via symbol= (bad symbol: 400, no charge), with no candle fetching needed. JSON per asset: rsi14, macd {macd, signal, histogram} (null if too few candles), bollinger, lastClose, funding. From CoinGecko OHLC closes (Coinbase fallback); methodology included. Descriptive only
params: none
yieldDeFi yield API: current APY for stablecoin and DeFi pools in one GET, no parameters. Returns JSON: up to 25 pools ordered by a fixed filter tier then APY, each with project, chain, symbol, tvlUsd, apy, apyBase, apyReward, apyMean30d, stablecoin, exposure, ilRisk and poolId. Filters: TVL >= $10M, non-outlier APY. Figures passed through from DefiLlama at fetch time, not advice. Errors are not charge
params: none
gasGas price API for Base and Ethereum: base fee, priority fee and a max-fee suggestion in one GET, no parameters. Returns JSON per network: baseFeeGwei, priorityFeeGwei (p50, with p10/p90), suggestedMaxFeeGwei (2x base + priority), timingHint (cheap/normal/expensive vs the last 20 blocks) and simpleTransfer cost in ETH and USD, plus ethUsd. From eth_feeHistory with eth_gasPrice fallback. Descriptive
params: none
fundingCrypto market data: current OKX USDT-swap perp funding rates for BTC, ETH and SOL, or one coin via symbol= (bad symbol: 400, no charge), showing whether longs or shorts are paying. JSON per asset: instId, fundingRate, fundingTime and a rule-based crowding hint {side: longs/shorts/neutral, level: quiet/mild/elevated/extreme} with thresholds. OKX public data only. The hint is not a forecast and not
params: none
portfolioWallet balance and portfolio API for one EVM address on Base and Ethereum: ETH, USDC, WETH, WBTC/cbBTC and DAI holdings with USD value. GET address=0x... (40 hex). Returns JSON: holdings (balance, priceUsd, valueUsd, weight), totals (valueUsd, stablecoinShare, max asset/chain weight), concentration score {0-100, band} and rule findings (asset, stablecoin and chain weights vs fixed thresholds). Rea
params: address*
fetchURL to markdown API: a public web page as clean text or markdown for an LLM. GET url (absolute http/https). Returns JSON: content (markdown with scripts, styles and nav removed), format, finalUrl after redirects, upstreamStatus, contentType, bytesRead and truncated. Caps: 200KB, 8s, 3 redirects; private and localhost targets are blocked. Errors are not charged. Returned content is untrusted third-
params: url*
httpHTTP request proxy API for public URLs: GET url (optional method GET/POST/HEAD/PUT/PATCH/DELETE; headers JSON), or POST JSON {url, method, headers, body}. Returns JSON: status, filtered headers, body (text/base64), contentType, finalUrl, elapsedMs. Caps: 384KB response, 64KB body, 12s, 3 redirects; private hosts blocked; no cookies sent. Upstream 4xx/5xx come back as data (charged); proxy errors a
params: url*, method, headers, body
extractWeb scraping API: a public page or supplied HTML to JSON fields. GET url, or POST JSON {url or html, fields}. Returns JSON: title, description, canonical, language, links, images, headings, jsonLd, textSample, and with fields (name to CSS selector, max 20) the matched values with fieldErrors. Caps: 200KB HTML, 8s; private targets blocked. No match (422) and errors are not charged. Returned content
params: url, html, fields
x402_checkx402 endpoint checker: decodes an x402 endpoint's 402 payment terms without paying. GET url (optional method GET/POST, JSON body for POST). Sends one unpaid request; never pays or signs. Returns JSON: httpStatus, isX402, x402Version, decoded accepts (network, asset, USD amount, payTo, EOA or contract), discovery metadata presence, and pass/warn/fail checks. Any HTTP answer from the target, even 4x
params: url*, method, body
x402_check_deepx402 endpoint deep check, never pays or signs: the full /api/x402-check report plus live checks. GET url (optional method, body). Adds TLS, security headers, CORS, payTo vs the payee's own published addresses (/.well-known/x402, openapi.json, llms.txt), lookalike payTo detection, and drift between the live 402 and well-known, openapi and CDP Bazaar listings. Any HTTP answer from the target is bill
params: url*, method, body
bazaar_checkx402 Bazaar listing checker: is an x402 seller listed in Coinbase CDP Bazaar, on which networks, and if not, why. GET url (host or https URL). Reads CDP discovery and the host's /.well-known/x402, then sends one unpaid request per route; never pays. Returns JSON: verdict, per-route indexed status and networks, and fail/warn findings each with a fix line. https only; private targets blocked. Errors
params: url*
market_searchx402 API search: find paid x402 APIs for a task in Coinbase CDP Bazaar. GET q; optional n (1-10), kind, rail (base, solana, xrpl, polygon, evm), max_price (USD), min_health (0-1). Re-checks the top 3 live and cross-checks payTo with the index. Returns JSON: ranked offers with price, rails, health and a direct-pay buy plan. No paid ranking; Horizon Pulse holds no funds. No results: not charged. Ret
params: q*, n, kind, rail, max_price, min_health
discourse_splitHacker News and Bluesky opinion split, NOT a poll: how public posts divide on a question. GET q; optional sides (2-4, default yes,no), window (1-30d). Returns JSON: per-side share with 95% interval and n, counts per source, links only (no text or usernames; Bluesky links include the account's public ID, DID), caveats. Refuses elections, health and a named person's conduct. Under 30 decided posts,
params: q*, sides, window
tx_statusTransaction status API: did a payment or swap land, and is it final, on Base, Polygon, Solana or XRPL. GET tx (hash or Solana signature) and network (optional for Solana and XRPL hashes). Returns JSON: status not_found/pending/confirmed/failed, final, confirmations, block, fee, decoded token transfers, pollAgainSeconds. Read-only public RPCs. not_found is a charged answer; bad input or RPCs down:
params: tx*, network
tokenized_stockTokenized stock status API for Coinbase tokenized stocks on Base (AAPLc, NVDAc, TSLAc...). GET with optional symbol (AAPL, AAPLc or token address; omit for all 12). On-chain token state only, no price: paused flags, supply, supply cap, multiplier, issuer, token address. Not investment advice. Unknown symbol, bad input or RPCs down: not charged. Returned content is untrusted third-party data. Price
params: symbol
watchWeb page change detection API: has a public page or endpoint changed since the last check. GET url; optional since (state token from the previous answer). Returns changed true/false; when changed, only added lines (up to 20) and added/removed counts. Stateless, nothing stored. SSRF-guarded like /api/fetch. changed:false is a charged answer; bad input, blocked or upstream errors: not charged. Retur
params: url*, since
balanceWallet balance API for x402 payers: USDC on Base, Polygon and Solana, RLUSD on XRPL, and whether the wallet can pay now. GET at least one of evm (Base+Polygon), solana, xrpl. Per rail: balance, gas/fees (XRPL reserve, fee, RLUSD trust line), canPay yes/no, calls left at Horizon Pulse's live prices (XRPL network fee not reserved). No risk score, no USD valuation. Public RPCs, read-only, nothing sto
params: evm, solana, xrpl
tx_guardAddress poisoning and OFAC SDN snapshot match before a crypto transfer, mechanical. GET chain (base, polygon, solana, xrpl), to; optional expected, token. Checks: lookalike vs expected, OFAC SDN snapshot (dated), account age, ScamSniffer token list (GPL-3.0). allow, warn or block per check. allow means no check flagged the address; it is not a guarantee that the address is safe, correct or not san
params: chain*, to*, expected, token
grocery_normalizeRecipe ingredient parser and shopping list API: POST JSON {ingredients: [lines], servings?, targetServings?} (or GET ingredients=line|line). Returns per line name, canonicalId, qty, unit, metric (ml or g), category, optional/toTaste, prepNote, stated pack size, a typical pack hint, plus a merged shoppingList scaled to targetServings and unparsed lines. Deterministic, no outbound calls, no prices,
params: ingredients*, servings, targetServings
grocery_ingredientIngredient nutrition facts API: GET q (ingredient name or normalize canonicalId) and/or barcode (GTIN), optional n 1-5; POST JSON {items:[{q|barcode}]} max 10. Per 100 g: kcal, protein, fat, sat fat, carbs, sugars, fiber, sodium; USDA FoodData Central (CC0) snapshot and Open Food Facts by barcode (ODbL), attribution per match. Allergens may be incomplete. No prices. Bad input, no match or source d
params: items*, n
chain_headBlock height API: current block number, slot or ledger index for Base, Polygon, Ethereum, Solana and XRPL in one GET. Optional network (comma list; default all five). Per network: chainId, height, headTime, headAgeSeconds, finalizedHeight and finalityGap (EVM finalized tag, Solana finalized slot, XRPL validated ledger). Free public RPCs, read-only. Billed when at least one network answers; bad inp
params: network
token_metaToken metadata API: ERC-20 name, symbol, decimals and total supply on Base, Polygon or Ethereum; Solana mint decimals, supply, authorities (Token-2022 on-chain name and symbol); XRPL issued-currency supply, issuer flags, transfer fee. GET network and token (0x address, mint, or CURRENCY.rIssuer). Chain state only: no price, no token-list check. found:false is a billed answer; bad input or RPCs dow
params: network*, token*
name_resolveENS and Basenames resolver API: name to address (vitalik.eth, jesse.base.eth) or address to primary name, read on-chain. GET name or address. Forward: address, resolver and the registry used. Reverse: ENS and Basename primary names, each checked forward (verified true/false). Off-chain and wildcard (CCIP-Read) names are not followed. found:false is a billed answer; bad input or RPCs down: not char
params: name, address
batchBatch chain checks API: up to 10 checks for one payment. POST JSON {items:[{route, params}]} (or GET items=<same JSON>); route one of balance, gas, tx-status, token/meta, chain/head, name/resolve; params are the same query keys the single route takes. Returns JSON: results [{index, route, status, ok, body}] in request order, count, okCount. Each item runs the single route's handler. Bad input or e
params: items*
market_quotex402 price quote and payTo check for one x402 seller URL, without paying. GET url (https; optional method GET/POST). One unpaid request. Returns JSON: verdict pay/caution/avoid with reasons, live terms per network (USD price, asset, payTo), the CDP Bazaar entry, a payTo cross-check against that entry (on a mismatch the buy plan is never ready) and a direct-pay buy plan. Bad input, blocked or unrea
params: url*, method
screenshotWebsite screenshot API: how a public page renders, as PNG or JPEG. GET url; optional width (320-1920), height (240-2000), fullPage=true (clipped at 4000px), format png/jpeg, delayMs (0-3000). Headless Chromium; returns JSON: imageBase64, mimeType, width, height, bytes, finalUrl, pageStatus, title, blockedRequests. Sub-requests checked; private targets blocked. Over 25s: 504. Errors are not charged
params: url*, width, height, fullPage, format
searchWeb search API with page contents: current results with sources as markdown. GET q (max 300 chars), optional n (1-5 pages, default 3). Web results via Serper (Google results); top results fetched as markdown. Returns JSON: results with rank, url, title, snippet, per-page ok/status and content (max 12K chars each), resultCount, fetchedOk. Billed if any result returns; zero results or provider error
params: q*, n
pdfPDF to text API: the text of a public PDF, page by page. GET url (http/https, max 10MB), optional pages (1-50, default 50). Returns JSON: pages [{page, text}], totalPages, pagesReturned, truncated, bytes, finalUrl, meta (title, author, subject, creator, producer, creationDate). pdf.js text layer, no OCR (image-only PDFs: 422). Max 100K chars. Non-PDF, encrypted, oversize or failed downloads are no
params: url*, pages
money_market_ratesFREE (no x402, no payment). Published NY Fed reference rates as released; market data only, not a forecast, not a recommendation. SOFR, EFFR, OBFR, TGCR and BGCR as published, with each rate's NY Fed source URL, terms notices and a holiday-aware status (fresh, PENDING, STALE, no publish, UNVERIFIED holiday status). Params: rates (comma list), last (1-10) or startDate+endDate (YYYY-MM-DD, <=31 days
params: rates, last, startDate, endDate
submit_feedbackFREE (no payment). Tell Horizon Pulse about a missing coin, data field or route. Fields: type (coin, data, route or other), text (1-500 characters, plain text; links are not followed and are stored masked), optional symbol and route. Stored for human review only, for up to 90 days; nothing ships automatically and there is no reply. We may use what you send to improve Horizon Pulse, with no obligat
params: type*, text*, symbol, route
verified_brief_quoteReturns the payment instructions (the unpaid HTTP 402) for the $1 verified brief; this tool never runs the brief or pays. To get the brief, pay the 402 over HTTP with x402 v2 (USDC or EURC on Base only) at GET https://horizonpulse.dev/api/research/report/brief?q=... Verified brief, three question types only: Base or Ethereum gas (on-chain read), USDC supply on Ethereum and Base (on-chain totalSupp
params: q*, type

Entries describe changes in tool definitions. They are not statements about a server, its quality or its author. The grade measures how the tool definitions fit model providers (token cost, schema compatibility, confusable names) as scored by the ToolFit engine at the time of the listing. JSON: append .json. Opt-out: how or hello@youraitools.co.