Crypto Sentiment X402

io.github.whatevercat-creatorPublished by GitHub account whatevercat-creatorv0.1.7Updated Nov 8, 2026

Crypto news sentiment for 24 coins: label, score and headlines behind it, paid per call via x402

VerifiedSTDIODesktop onlyFinanceData & Analytics

Overview

AI-generated overview

Gives an assistant crypto news sentiment for 24 coins — label, score and driving headlines — with paid calls settled in USDC over x402.

What you can do
  • Get a coin's current sentiment label, score, sample size, Fear & Greed value and top headlines
  • Retrieve hourly historical sentiment readings for a coin over a date range
  • List the 24 supported tickers and check what the hourly archive covers
  • Read the live x402 price of a sentiment call without paying
When to use it
Useful when an agent needs a quick read on how news coverage is leaning for a specific coin, or how that sentiment moved over recent hours, without building its own news pipeline.
Requirements
Runs locally via uvx from the PyPI package crypto-sentiment-x402-mcp (Python). The free tools need nothing. Paid tools need CDP_API_KEY_ID and CDP_API_KEY_SECRET from a Coinbase Developer Platform account, a CDP wallet holding USDC on Base (plus a little ETH for gas), and network access to the sentiment API.
Before you install
Paid tools spend real money: $0.01 per crypto_sentiment call and $0.05 per get_hourly_history call in USDC on Base mainnet, signed from your own CDP wallet using CDP_API_KEY_ID and CDP_API_KEY_SECRET. X402_NETWORK defaults to mainnet; set it to testnet for free Base Sepolia USDC. Sentiment is news-based, not price prediction or financial advice.

Installation

In SourceWeft

  1. Open Crypto Sentiment X402 in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Crypto Sentiment API (x402)

[Crypto News Sentiment (x402) MCP server – quality and maintenance score on Glama]

News-based crypto sentiment for AI agents and trading bots, paid per call in USDC on Base over x402. No account or API key: call the endpoint, get an HTTP 402 with the price, pay, and get JSON.

Live at https://crypto-sentiment-x402.onrender.com · API docs · llms.txt

What you get

EndpointPriceReturns
GET /sentiment/{symbol}$0.01 per callA bullish / bearish / neutral label, a score from -1 to 1, the sample size, and the up to 5 headlines that moved the score most (title, source, link).
GET /history/{symbol}?start=&end=$0.05 per callHourly readings recorded live at the top of every UTC hour (never backfilled): score, sample size, Fear & Greed value and the top 3 headlines per hour. Default the last 7 days, up to 30 days per call.
GET /archivefreeWhich symbols the hourly archive holds, from when, and how complete it is.

The 402 response is the source of truth for the current price.

24 coins: BTC, ETH, SOL, XRP, DOGE, ADA, AVAX, LINK, MATIC, DOT, SHIB, LTC, BNB, USDC, USDT, NEAR, HYPE, QNT, AAVE, TAO, PEPE, PUMP, ENA, STRK.

Refused calls are never charged. The payment only settles when you get a reading:

  • 404: a symbol that isn't one of the 24 coins (a stock ticker, say).
  • 422: too little recent news about that coin for a reliable reading.
  • /history also refuses (4xx, not charged) an invalid range, a range with no readings, and a range in which every hour had zero matching headlines.

Prefer a monthly bill? The same readings are on GET /v1/sentiment/{symbol} with an X-API-Key header (plans, including a free tier). There's also an MCP server: pip install crypto-sentiment-x402-mcp (see MCP.md).

How it's scored

Sources (all free, no keys required):

  • Crypto news RSS (9 outlets): CoinDesk, Cointelegraph, Decrypt, Bitcoin Magazine, The Block, CryptoSlate, NewsBTC, CryptoPotato, The Defiant (DL News was removed on 2026-10-04: its feed served only April-May 2026 items)
  • Fear & Greed Index: alternative.me

Scoring: VADER sentiment analysis, extended with a crypto slang lexicon (moon, rekt, rug, hodl, bullish/bearish, etc.) so slang isn't scored as neutral. Each headline is matched and scored on its title plus its feed description with HTML tags, entities, feed footers and the outlet's own name removed (clean_text in app/sources/news.py; method 72h-hl24-v2 from 2026-10-21). Only headlines published in the last 72 hours count, and each headline's weight halves for every 24 hours of age (app/window.py). When the effective sample size is below 5, the label is insufficient recent news and the paid endpoints refuse with a 422 instead of charging. Whether the score leads or lags price is published at /validation, whatever it shows.

News sentiment only: not a price prediction or financial advice.

Running your own copy


1. Get a Base wallet address

You need an address to receive USDC payments. Any standard Ethereum-style wallet works on Base (e.g. Coinbase Wallet, MetaMask configured for Base). You do not need to give this app your private key — only the public address, to receive funds.

2. Run it locally (testnet — free, no real money)

bash
cd crypto-sentiment-x402cp .env.example .env# edit .env and set PAY_TO_ADDRESS to your wallet addresspip install -r requirements.txtuvicorn app.main:app --reload

Visit http://localhost:8000 — you'll see the API description. Calling http://localhost:8000/sentiment/BTC without payment returns an HTTP 402 with payment instructions, exactly what an agent's x402 client would see and act on automatically.

To actually test a paid call, use the official x402 test client (needs Base Sepolia testnet USDC — free from the Base Sepolia faucet):

bash
pip install x402python -m x402.examples.client --url http://localhost:8000/sentiment/BTC

3. Deploy (simplest path: Render.com)

  1. Push this folder to a new GitHub repo.
  2. Go to render.com → New → Blueprint → connect the repo. Render will read render.yaml automatically.
  3. When prompted, set the PAY_TO_ADDRESS environment variable to your wallet address.
  4. Deploy. Render builds the Dockerfile and gives you a public HTTPS URL like https://crypto-sentiment-x402.onrender.com.

That's it — testnet mode is on by default, so nothing costs real money until you flip X402_NETWORK to mainnet (step 4 below).

4. Go live with real USDC payments

  1. Sign up for a free Coinbase Developer Platform account and create an API key — this is required for the mainnet facilitator (production-grade payment verification/settlement).
  2. In Render, set:
    • X402_NETWORK=mainnet
    • CDP_API_KEY_ID=...
    • CDP_API_KEY_SECRET=...
    • PAY_TO_ADDRESS = your mainnet Base address (double-check it's not a testnet-only address)
  3. Redeploy. Calls now settle real USDC on Base mainnet.

Start with a low price (X402_PRICE_USD, default $0.01) while you validate everything works end-to-end.

5. List it so AI agents can find and pay you

This is the x402 Bazaar — Coinbase's discovery layer, essentially a search engine for agents looking for x402 services.

  • If you're using the CDP facilitator (i.e. you're on mainnet per step 4), your service becomes automatically discoverable in the Bazaar once you process your first real payment through it — no separate signup.
  • To improve how well agents can find and understand it, keep the description field in app/main.py's RouteConfig clear and specific (already set) — that text is what shows up in Bazaar search results.
  • You can browse the current Bazaar listing yourself at https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources (public, no key needed) to confirm your service appears after going live.
  • Optional extra distribution: submit your API to x402bazaar.org, a community-run directory of x402 services, separate from Coinbase's own Bazaar.

MCP server (Claude Desktop / Claude Code)

Prefer agents calling this over MCP instead of raw HTTP? mcp_server.py wraps the same API as MCP tools (crypto_sentiment, get_hourly_history and three free info tools) -- the server pays for each call from its own CDP-managed wallet, so callers never touch crypto directly. See MCP.md for setup.

Try it free

Three tools need no wallet, no CDP key and pay nothing. The server starts without any CDP variables, so you can install it and try these first:

  • list_supported_coins — the 24 supported ticker symbols and names.
  • archive_coverage — what the hourly archive holds (GET /archive): first reading, row counts and missing hours per symbol.
  • price_quote(symbol) — makes one unpaid request and reads the 402 payment requirements: price, network, asset and the payTo address.

Two tools are paid, from your own CDP wallet in USDC on Base:

  • crypto_sentiment(symbol) — the current reading, $0.01 per call. Unsupported coins and coins with too little recent news are refused and not charged.
  • get_hourly_history(symbol, start, end) — past hourly readings (GET /history/{symbol}), $0.05 per call. Recorded live and never backfilled; start/end are ISO 8601, default the last 7 days, at most 30 days per call. The symbol has to be one archive_coverage lists as logged. Unlogged symbols, invalid ranges and ranges with no readings are refused and not charged.

Wallet setup is in MCP.md.

Subscription tiers (Stripe, no crypto required)

Prefer a monthly bill over pay-per-call USDC? GET /v1/sentiment/{symbol} takes an X-API-Key header instead of an x402 payment, backed by Free / Starter ($15/mo) / Pro ($59/mo) tiers. See BILLING.md for setup, or GET /billing/pricing on a running instance for current pricing.

Sentiment-shift alerts

Watch a symbol and get pinged (webhook / Discord / Telegram) when its sentiment moves, instead of polling /sentiment yourself. Bundled into the Starter/Pro subscription tiers -- see ALERTS.md.

Historical dataset export

Sells access to the history of sentiment readings, not just the current one -- a background job takes one snapshot per symbol per day, and subscribers on the Pro or "Data Access" tier can export everything collected so far as CSV or JSON via GET /dataset/export. See DATASET.md (there's no backfilled history -- it only has data from whenever you turn the snapshot loop on).

Also on RapidAPI

Listed on the RapidAPI Hub for developers who'd rather discover and pay for it through RapidAPI's marketplace instead of Stripe or x402 directly. Same underlying data, served from GET /rapidapi/sentiment/{symbol} -- traffic is only accepted when it's routed through RapidAPI's proxy (validated via a shared secret header), so this endpoint isn't meant to be called directly. Plans there mirror the Stripe tiers: Free (100 req/mo), $15/mo (3,000 req), $59/mo (15,000 req).

Zapier & TradingView integrations

Route sentiment-shift alerts into Zapier (via the existing webhook channel -- no new endpoint needed) or enrich TradingView price alerts with live sentiment before relaying them to your webhook/Discord/ Telegram. See INTEGRATIONS.md.

API reference

EndpointPriceDescription
GET /FreeService info
GET /healthFreeHealth check
GET /sentiment/{symbol}$0.01 (configurable)Aggregate sentiment for a symbol, e.g. /sentiment/BTC

Example paid response:

json
{  "symbol": "BTC",  "name": "Bitcoin",  "overall_sentiment": {    "sample_size": 42,    "average_compound": 0.21,    "label": "bullish",    "positive_pct": 55.0,    "negative_pct": 15.0,    "neutral_pct": 30.0,    "unweighted_compound_72h": 0.17,    "effective_sample_size": 31.4,    "newest_headline_age_hours": 1.6,    "window": "72h-hl24-v2"  },  "drivers": [{ "title": "...", "source": "CoinDesk", "link": "https://...", "published": "...", "score": 0.62, "weight": 0.93, "effect": 0.03 }],  "drivers_summary": "3 of the top 5 headlines are positive, 2 are negative.",  "breakdown": {    "news": { "...": "..." },    "fear_greed_index": { "value": 62, "classification": "Greed" }  },  "sources": ["coindesk.com RSS", "..."]}

Notes and limitations

  • Reddit was removed as a source: Reddit's Responsible Builder Policy prohibits commercial use of their data without written approval, which this paid API would violate. app/sources/reddit.py is left in the repo unused in case that changes in the future.
  • Coin coverage: app/coins.py has a starter list of ~15 symbols. Add more as needed — unmapped symbols still work, just with slightly less accurate news matching (falls back to matching on the symbol itself).
  • Only supports the exact payment scheme on Base/EVM. The x402 SDK also supports Solana (ExactSvmServerScheme) if you want to accept SOL-based USDC too — see the commented-out import in app/main.py's dependencies.
  • Add more paid endpoints (e.g. historical sentiment, multi-symbol batch queries) by adding entries to the routes dict in app/main.py.

Source: README.md at commit 0b94792

Tools

5

crypto_sentiment

Current Crypto Sentiment

Crypto news sentiment for one coin right now: a bullish/bearish/neutral label, a score from -1 to 1, sample sizes, the Fear & Greed value and up to 5 headlines that moved the score. Paid: $0.01 in USDC on Base per call, from this MCP server's own CDP wallet. Use when an agent needs the current news mood for a crypto ticker. Scores headlines from the last 72 hours across 9 crypto news RSS outlets, newest weighted most. For past readings use get_hourly_history. symbol must be exactly one of the 24 uppercase tickers from list_supported_coins (e.g. BTC); any other symbol is rejected by the input schema before a request is sent, so nothing is charged. With too few recent headlines the API refuses with HTTP 422 "insufficient recent news", returned as an error with charged: false (archive_coverage shows each coin's coverage_7d_pct). Without CDP keys the tool returns a no-wallet message and pays nothing.

Parameterssymbolrequired

get_hourly_history

Hourly Sentiment History

Historical crypto news sentiment for one coin: hourly readings (score, sample size, Fear & Greed and the top headlines for each hour), oldest first. Paid: $0.05 in USDC on Base per call, from this MCP server's own CDP wallet. Use when an agent needs how a coin's news sentiment moved over past hours or days, e.g. to line it up with price. For the current reading use crypto_sentiment. Range: omit both bounds for the 7 days up to now. With only end, the range starts 7 days before it; with only start, it runs to now. A reading is included when start <= observed_at < end. The span can be at most 30 days, so split longer periods into several calls. Readings are recorded live at the top of each UTC hour and never backfilled; a missed hour stays missing. Refused and not charged (returned as an error with charged: false): - 400: malformed symbol or time, start not before end, or a span over 30 days. - 404: symbol not in the archive. - 404 no_readings_in_range: no readings in the range (gives first_reading). - 404 no_headlines_in_range: every hour in the range had zero matching headlines (gives rows_in_range and coverage_7d_pct). A range with at least one hour of headlines returns all its rows. For low-coverage coins, check archive_coverage first: its coverage_7d_pct and first_reading show where data exists. Without CDP keys the tool returns a no-wallet message and pays nothing.

Parametersendstartsymbolrequired

list_supported_coins

List Supported Coins

The 24 crypto tickers (symbol and name) that crypto_sentiment and price_quote accept. Free: no wallet needed and no network call. Use when choosing a symbol before calling crypto_sentiment or price_quote. The coin list is fixed per release: new coins come with a new version of this package, never while the server runs. Any other symbol is rejected by those tools' input schema before a request is sent, so nothing is charged.

Takes no parameters.

archive_coverage

Archive Coverage

Free: what the hourly sentiment archive holds (GET /archive). No wallet needed. Per symbol: first and latest reading, row counts, missing hours, and coverage_7d_pct, the share of the last 7 days' logged hours that had at least one matching headline (with hours_with_headlines_7d and hours_logged_7d). Check it before get_hourly_history to pick a symbol and range with data: low-coverage coins often get no_headlines_in_range from get_hourly_history or "insufficient recent news" from crypto_sentiment, both refused and not charged.

Takes no parameters.

price_quote

Price Quote

Free: the live x402 price of one crypto_sentiment call, read from an unpaid request's 402 response. Nothing is signed; no wallet needed. When not to use it: prices are fixed at $0.01 per crypto_sentiment call and $0.05 per get_hourly_history call, so there's no need to call this before every paid call. Use it to confirm the live price and payment requirements, e.g. before funding a wallet. It quotes crypto_sentiment only. symbol must be exactly one of the 24 uppercase tickers from list_supported_coins; lowercase or any other symbol is rejected by the input schema before a request is sent. A low-coverage coin still gets a quote; a crypto_sentiment call for it may then be refused with "insufficient recent news" (not charged).

Parameterssymbolrequired

Version history

6
  1. v0.1.7LatestNov 8, 2026
  2. v0.1.6Oct 26, 2026
  3. v0.1.4Oct 21, 2026
  4. v0.1.2Oct 16, 2026
  5. v0.1.1Oct 5, 2026
  6. v0.1.0Sep 23, 2026

Score

80% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.