MarketTwits news + Russian market data (x402)

io.github.CroomeePublished by GitHub account Croomeev0.1.0Updated Oct 30, 2026

Pay-per-call market news, CBR/MOEX/Rosstat data and Telegram tools; auto-pays USDC on Base via x402

Overview

AI-generated overview

Pay-per-call MCP server for English MarketTwits market news, Russian market data (CBR, MOEX, Rosstat), public Telegram channels and Wildberries prices…

What you can do
  • Search, summarize and digest news: latest, high-importance, keyword search, cursor polling, extractive summaries, sentiment, topics, movers, country news and data surprises
  • Run alert checks: new high-importance news by keyword, FX rate bands and product price targets
  • Fetch Russian market data: CBR key rate and official FX rates, MOEX quotes, indices and movers, Rosstat weekly fuel prices, plus a daily Russia market digest
  • Read public Telegram channels: latest posts and keyword search across up to five channels
  • Look up Wildberries and Ozon product cards, compare products, check price history and monitor target prices
When to use it
Useful when an assistant needs current market news and Russian market indicators, or wants to poll for keyword, rate or price alerts, without building its own data pipeline. Each call costs a small amount of USDC, so it suits occasional or budget-capped queries rather than high-volume polling.
Requirements
Node.js 20+ to run the npm package locally over stdio. A dedicated Base wallet private key in X402_PRIVATE_KEY (or a file path in X402_PRIVATE_KEY_FILE) holding a few USDC; no ETH needed. Optional settings: X402_MAX_PAYMENT_USD, X402_BASE_URL, X402_TOOLS_SOURCE, X402_NETWORK. Network access to the hosted API.
Before you install
Requires a hot wallet private key (X402_PRIVATE_KEY) that signs real USDC payments on Base; the README advises a dedicated wallet and never a main wallet's key. Every successful call spends money, so set X402_MAX_PAYMENT_USD as a per-call cap and avoid tight polling loops. Queries and parameters go to a third-party hosted API. MOEX quotes are delayed about 15 minutes, and Ozon product lookups currently fail.

Installation

In SourceWeft

  1. Open MarketTwits news + Russian market data (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

x402-markettwits-mcp

MCP server (stdio) for the pay-per-call x402-markettwits-news API: MarketTwits market news in English plus Russian market data (Bank of Russia FX and key rate, MOEX quotes, indices and movers, Rosstat fuel prices), public Telegram channels and Wildberries product prices.

Every API endpoint is one MCP tool (31 tools). Each call costs a fixed $0.001–$0.005 in USDC on Base, paid automatically through x402 from a wallet you configure. Only successful responses are charged; invalid parameters (400), not found (404) and upstream failures (502) are free.

Requirements

  • Node.js 20+
  • a dedicated hot wallet on Base with a few USDC (no ETH needed: payments are gasless EIP-3009 authorizations settled by the facilitator). $3 is enough for 300–2,000 calls. Never use your main wallet's key.

Configuration

EnvDefault
X402_PRIVATE_KEY—0x-prefixed private key of the hot wallet (or X402_PRIVATE_KEY_FILE = path to a file holding it). Without it, tools return a payment_required error with the price
X402_MAX_PAYMENT_USD0.02per-call cap: a 402 asking for more is refused before signing
X402_BASE_URLhttps://x402-markettwits-news.onrender.comAPI base URL
X402_TOOLS_SOURCEautoauto = tools from the live /openapi.json (new endpoints appear automatically), falling back to the bundled snapshot; bundled / live force one
X402_NETWORKeip155:8453eip155:84532 (Base Sepolia) for a testnet deployment

Claude Desktop

claude_desktop_config.json (Settings → Developer → Edit Config):

json
{  "mcpServers": {    "markettwits": {      "command": "npx",      "args": ["-y", "x402-markettwits-mcp"],      "env": { "X402_PRIVATE_KEY": "0x...", "X402_MAX_PAYMENT_USD": "0.02" }    }  }}

Cursor

~/.cursor/mcp.json (or .cursor/mcp.json in a project):

json
{  "mcpServers": {    "markettwits": {      "command": "npx",      "args": ["-y", "x402-markettwits-mcp"],      "env": { "X402_PRIVATE_KEY": "0x..." }    }  }}

Claude Code

bash
claude mcp add markettwits --env X402_PRIVATE_KEY=0x... -- npx -y x402-markettwits-mcp

Docker

bash
docker build -t x402-markettwits-mcp .docker run -i --rm -e X402_PRIVATE_KEY x402-markettwits-mcp

Tools

ToolEndpointPrice
get_latest_news / get_important_news / search_news/news/latest, /news/important, /news/search$0.0015
get_news_since/news/since (cursor polling)$0.001
check_news_alert / check_new_high_alert/news/alerts/check, /news/alerts/new$0.002 / $0.0025
summarize_news / summarize_recent_news/news/summary, /news/summary/recent$0.004 / $0.0035
get_top_topics / get_trending_topics/news/top-topics, /news/topics/trending$0.0025 / $0.002
get_news_movers / get_country_news/news/movers, /news/country$0.0025 / $0.002
get_data_surprises / get_news_sentiment / get_news_digest/news/data-surprises, /news/sentiment, /news/digest$0.003 / $0.0025 / $0.005
get_cbr_fx_rates / get_cbr_key_rate/ru/fx, /ru/key-rate$0.001
get_moex_quote / get_moex_index / get_moex_movers/moex/quote, /moex/index, /moex/movers (delayed ~15 min)$0.0015 / $0.0015 / $0.002
get_ru_fuel_prices/ru/fuel (Rosstat weekly)$0.0015
get_telegram_channel_latest / search_telegram_channels/tg/channel/latest, /tg/search$0.002 / $0.003
get_product_info / compare_products / monitor_product_price / get_product_price_history/product/* (Wildberries)$0.002 / $0.003 / $0.0025 / $0.002
check_price_alert/alerts/price (Wildberries; Ozon currently blocked → 502, free)$0.0025
check_news_keyword_alert/alerts/news (new high-importance news by keywords since an id/time)$0.002
check_fx_rate_alert/alerts/fx (CBR rate outside a min/max band)$0.0015
get_daily_ru_market_digest/digest/daily (key rate, USD/EUR/CNY, fuel, top news)$0.005

Each tool returns JSON: { ok: true, endpoint, data, payment: { price_usd, transaction, payer, ... } }, or { ok: false, error, ... } with isError: true. The error codes are:

  • payment_required: no key
  • price_above_cap
  • invalid_params: 400
  • not_found: 404
  • upstream_unavailable: 502
  • payment_rejected: e.g. insufficient USDC
  • config_error
  • network_error

Development

bash
npm cinpm test       # tools/list over MCP + mocked 402 flow (no real payments)npm run gen    # refresh openapi.snapshot.json from the live API

Source: mcp/README.md at commit 89d5904

Tools

31

check_fx_rate_alert

FX alert: is the official CBR rate of a currency outside your min/max band?

FX alert: is the official CBR rate of a currency outside your min/max band?. Latest official Bank of Russia rate (RUB per 1 unit, as /ru/fx) for one currency vs min and/or max: triggered, rate, breach below_min|above_max|null, distance and the CBR date. Unknown code -> 404, cbr.ru failure -> 502 (neither is settled). GET /alerts/fx — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersmaxmincoderequired

check_news_keyword_alert

Keyword alert: new HIGH-importance news since an id or time

Keyword alert: new HIGH-importance news since an id or time. High-importance MarketTwits news matching any (or all) of 1-10 keywords, newer than since (an item id, same cursor as /news/since, or an ISO time; default last 24h). Returns triggered, count, up to 20 items newest first with matched keywords, and next_since for the next poll. GET /alerts/news — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredmatchsince

check_price_alert

Price-drop alert: is a Wildberries product at or below your target price?

Price-drop alert: is a Wildberries product at or below your target price?. Live price of one product (same chain as /product/monitor) vs target_price in RUB: triggered (current <= target and in stock), current_price, diff. Wildberries works; Ozon URLs are accepted but Ozon's anti-bot currently blocks them (502, payment not settled). GET /alerts/price — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersurlrequiredtarget_pricerequired

get_daily_ru_market_digest

Daily Russia market digest: key rate, USD/EUR/CNY, fuel prices, top news

Daily Russia market digest: key rate, USD/EUR/CNY, fuel prices, top news. One call: CBR key rate, official USD/EUR/CNY rates with change, Rosstat weekly fuel prices and the top high-importance news of 24h with topics. Fuel is null with a note if Rosstat is slow (call still succeeds); 502, not settled, only if both key rate and FX fail. GET /digest/daily — price $0.005 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterslimit

get_moex_index

MOEX index values (IMOEX, RTSI, sector indices) or the index catalogue

MOEX index values (IMOEX, RTSI, sector indices) or the index catalogue. Index level, change/change_pct vs previous close, open/high/low, month/year change, annual high/low and traded value for up to 5 codes (default IMOEX), or code=list for the catalogue of MOEX stock indices (SNDX board + RTS*). Delayed ~15 minutes. Unknown codes -> 404 (not settled). GET /moex/index — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterscode

get_moex_movers

Top gainers and losers on the Moscow Exchange main board (TQBR), with market breadth

Top gainers and losers on the Moscow Exchange main board (TQBR), with market breadth. Ranks TQBR shares by change vs previous close (turnover >= min_value RUB, default 5 mln): top `limit` gainers and losers (default 10, max 50), advancers/decliners/unchanged. Before the session's first trades (mode previous_session) it ranks the last completed session from ISS history. Delayed ~15 minutes. GET /moex/movers — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterslimitmin_value

get_moex_quote

Moscow Exchange stock quote (delayed ~15 min): price, change, volume, bid/offer

Moscow Exchange stock quote (delayed ~15 min): price, change, volume, bid/offer. One MOEX shares-market ticker from MOEX ISS (main board TQBR when listed): price (last trade, or previous close before the session's first trade), change/change_pct vs previous close, open/high/low, bid/offer, volume, value_rub, market cap, trading status. Data is delayed ~15 minutes (delayed: true). Unknown ticker -> 404 (not settled). GET /moex/quote — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterstickerrequired

check_news_alert

Keyword alert check: how many matching items in the last N hours

Keyword alert check: how many matching items in the last N hours. Count of news matching q (same matching as /news/search) published in the last N hours (1-168, default 24), plus the 5 most recent GET /news/alerts/check — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredhours

check_new_high_alert

Is there new HIGH-importance news on a keyword in the last N hours?

Is there new HIGH-importance news on a keyword in the last N hours?. Checks only importance=high news matching q in the last N hours (1-168, default 6): has_new, count and the latest item. Cheap poll for market-moving alerts on a topic/ticker. GET /news/alerts/new — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredhours

get_country_news

News about one country (flag emoji + country keywords) with counts and top topics

News about one country (flag emoji + country keywords) with counts and top topics. Items of the last N hours (1-168, default 24; importance all|high|medium|low) that carry the country's flag emoji or mention it (e.g. RU: Russia/Kremlin/Bank of Russia/MOEX; US: USA/Fed/White House): count, high_count, share_of_window, top_topics and the 10 latest headlines. GET /news/country — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterscoderequiredhoursimportance

get_data_surprises

Macro data and earnings vs. expectations: actual, expected, previous, surprise

Macro data and earnings vs. expectations: actual, expected, previous, surprise. Parses releases like 'US Pending Home Sales (Sep) = -7.3% m/m (exp. -0.5% / prev. +0.3%)' and earnings lines like '3Q REV. $14.58B, EST. $12.87B' from news of the last N hours (1-168, default 24; optional q filter): indicator, actual, expected, previous, unit, surprise (actual - expected), surprise_pct and direction above/below/inline. GET /news/data-surprises — price $0.003 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqhours

get_news_digest

Sectioned briefing: central banks, macro, energy, equities, crypto, geopolitics

Sectioned briefing: central banks, macro, energy, equities, crypto, geopolitics. Groups news of the last N hours (1-48, default 24) into central_banks, macro, energy, equities, crypto and geopolitics by keyword rules (an item may appear in several), each with count, high_count and up to 5 headlines (high first, then newest), plus top_topics of high items. GET /news/digest — price $0.005 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametershours

get_important_news

High-importance news only (newest first)

High-importance news only (newest first). Only importance=high MarketTwits news (newest first), limit 1-50 GET /news/important — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterslimit

get_latest_news

Latest translated MarketTwits news (newest first)

Latest translated MarketTwits news (newest first). Latest translated MarketTwits news (newest first), limit 1-50 GET /news/latest — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterslimit

get_news_movers

Top gainers/losers reported in the news ('#TICKER = ±X%')

Top gainers/losers reported in the news ('#TICKER = ±X%'). Parses '#TICKER [Name] = ±X%' price-move mentions (stocks, indices, crypto; RU/US/... from the flag) in news of the last N hours (1-72, default 6), newest mention per ticker, |move| >= min_pct (default 0): top 10 gainers and top 10 losers with the source item. GET /news/movers — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametershoursmin_pct

search_news

Keyword search in translated news (newest first)

Keyword search in translated news (newest first). Case-insensitive keyword search in translated MarketTwits news (all words must match), limit 1-50 GET /news/search — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredlimit

get_news_sentiment

Heuristic bullish/bearish tone of news on a keyword (lexicon, not a model)

Heuristic bullish/bearish tone of news on a keyword (lexicon, not a model). Scores each item matching q in the last N hours (1-168, default 24) with a keyword/emoji lexicon (rise/beat/upgrade vs. fall/miss/sanctions, ⬆️/⬇️) plus explicit '= ±X%' moves, and returns bullish/bearish/neutral counts, score = (bullish - bearish)/count in [-1, 1], a label and examples. method is always 'heuristic'. GET /news/sentiment — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredhours

get_news_since

Incremental feed: items newer than the id you already have (cursor polling)

Incremental feed: items newer than the id you already have (cursor polling). All stored items with id > id (oldest first, up to limit 1-100, default 50) plus next_id/has_more for the next call. The cheapest way for a bot to poll without duplicates: keep next_id and pass it back. GET /news/since — price $0.001 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersidrequiredlimit

summarize_news

Short extractive English summary of the latest news on a keyword

Short extractive English summary of the latest news on a keyword. 3-5 sentence extractive summary of the latest news matching q (limit 1-50, default 10): lead sentence + de-duplicated headlines, high-importance first GET /news/summary — price $0.004 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredlimit

summarize_recent_news

Extractive English summary of news on a keyword from the last N hours

Extractive English summary of news on a keyword from the last N hours. 3-5 sentence extractive summary of news matching q published in the last N hours (1-168, default 12; up to 50 items), with high_count. Use for 'what happened with X today'. GET /news/summary/recent — price $0.0035 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredhours

get_top_topics

Top 5 keywords/hashtags in high-importance news of the last N hours

Top 5 keywords/hashtags in high-importance news of the last N hours. Top 5 topics (hashtags, names, keywords; counted once per item) across high-importance news of the last N hours (1-72, default 6) GET /news/top-topics — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametershours

compare_products

Compare 2-5 Wildberries products: prices, cheapest, price spread, stock

Compare 2-5 Wildberries products: prices, cheapest, price spread, stock. Fetches 2-5 product URLs (urls=comma-separated, or repeated url=) with the same live chain as /product/info and returns per-item title/price/original_price/in_stock/rating/reviews_count, the cheapest and most expensive item, price_diff (abs RUB and percent of the cheapest), in_stock_count and all_in_stock. Items that fail carry error/detail; returns 502 (payment not settled) only if fewer than 2 items returned a price. GET /product/compare — price $0.003 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersurlsrequired

get_product_price_history

Wildberries price history: weekly CDN points + observed + live price, min/max/avg, 30-day change

Wildberries price history: weekly CDN points + observed + live price, min/max/avg, 30-day change. Wildberries price history for url: weekly points from WB's price CDN, prices observed by this service and the live price. Returns points (oldest first), current, stats min/max/avg, change_30d, and history_limited when only the current price exists. Ozon: live price only. 502 (payment not settled) if no price is available. GET /product/history — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersurlrequired

get_product_info

Wildberries / Ozon product card: title, price (RUB), rating, reviews, stock

Wildberries / Ozon product card: title, price (RUB), rating, reviews, stock. Live product data for a Wildberries (wildberries.ru, wb.ru) or Ozon (ozon.ru) product URL: title, current price in RUB (original_amount = list price before discount when known), rating, reviews_count and availability. Cached 10 min per product. If the marketplace blocks or fails, returns 502 upstream_unavailable and the payment is NOT settled. Can take up to ~40s when the live page has to be rendered. GET /product/info — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersurlrequired

monitor_product_price

Price-target check for one product: is the current price at or below target_price?

Price-target check for one product: is the current price at or below target_price?. Fetches one Wildberries/Ozon product (live, as /product/info) and checks it against target_price (RUB). Returns below_target (current <= target and in stock), current_price, diff_abs/diff_percent, in_stock, product and checked_at. Out of stock: 200 with below_target false, current_price null. 502 (payment not settled) if no product data can be fetched. GET /product/monitor — price $0.0025 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersurlrequiredtarget_pricerequired

get_ru_fuel_prices

Russian retail fuel prices (AI-92/95/98, diesel) — Rosstat weekly averages

Russian retail fuel prices (AI-92/95/98, diesel) — Rosstat weekly averages. Average retail pump prices across Russia from Rosstat's weekly release (rosstat.gov.ru nedel_sred_cen.xlsx): price (RUB/l), as_of, week-over-week change, 4-week and year-to-date change and `weeks` of history per fuel. Rosstat publishes weekly (usually Wednesday, prices as of Monday); cached 6 h, a stale copy (stale: true) is served for up to 14 days if Rosstat is unreachable. GET /ru/fuel — price $0.0015 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersweeks

get_cbr_fx_rates

Official Bank of Russia FX rates (RUB) with day-over-day change

Official Bank of Russia FX rates (RUB) with day-over-day change. CBR official exchange rates from cbr.ru XML_daily.asp for a date (default: the latest set) and optional currency codes: per currency nominal, value (RUB per nominal), per_unit (RUB per 1 unit), previous set's per_unit, change and change_pct. Cached 30 min (past dates 7 days). GET /ru/fx — price $0.001 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersdatecodes

get_cbr_key_rate

Bank of Russia key rate: current level, since when, and recent changes

Bank of Russia key rate: current level, since when, and recent changes. Current CBR key rate (% p.a.) from the cbr.ru DailyInfo web service (KeyRateXML; the hd_base/KeyRate page as fallback): rate, as_of, effective_since, previous_rate, last_change_bp and every change in the last `months` (default 24) newest first, plus min/max in the window. Cached 3 h. GET /ru/key-rate — price $0.001 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersmonths

get_telegram_channel_latest

Latest posts of a public Telegram channel (text, date, views, link)

Latest posts of a public Telegram channel (text, date, views, link). Reads the public web preview t.me/s/<channel> (no login): newest `limit` posts (default 20, max 50) with id, date, text (HTML stripped, emoji kept), views, link, media types and channel title/subscribers. Channels without a public preview or that do not exist -> 404 (not settled). Cached 2 min. GET /tg/channel/latest — price $0.002 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parameterslimitchannelrequired

search_telegram_channels

Search up to 5 public Telegram channels for a keyword

Search up to 5 public Telegram channels for a keyword. Runs Telegram's own channel search (t.me/s/<channel>?q=) on 1-5 public channels, merges the matches newest first (up to `limit`, default 20) with per-channel counts/errors. 404 when no channel exists, 502 when all fail; partial failures are reported in per_channel. GET /tg/search — price $0.003 USDC per call, paid automatically via x402 on Base (only successful responses are charged; 400/404/502 are free).

Parametersqrequiredlimitchannelsrequired

Version history

1
  1. v0.1.0LatestOct 22, 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.