SentimentFX

org.sentimentfx由 sentimentfx.org 發布官方發布者v1.0.0更新於 Oct 24, 2026

FinBERT news sentiment and price history for 42 crypto, FX, stock, ETF and commodity tickers.

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取金融資料與分析

概覽

AI 產生的概覽

SentimentFX 透過遠端 MCP 端點提供 42 個加密、外匯、股票、ETF 與商品標的的 FinBERT 新聞情緒評分、每日價格,以及情緒與價格相關性資料。

可以做什麼
  • 列出追蹤的標的,並查詢 API 金鑰的額度、剩餘點數與重置時間
  • 依標的取得近期已評分的新聞標題,包含情緒分數、標籤與來源類型
  • 取得指定天數內的每日情緒平均值與每日收盤價
  • 取得 180 天情緒變動與次日報酬的皮爾森相關性,含 p 值、信賴區間與強度標籤
適用情境
適合需要快速取得結構化市場新聞情緒或價格歷史的研究與監控情境,例如比較情緒與價格走勢、彙整近期報導。它是資料來源而非預測工具,不宜直接用於交易決策。
執行需求
遠端 streamable HTTP 端點,無需本機安裝。需要 SentimentFX API 金鑰,透過 X-API-Key 標頭傳送(無法自訂標頭的用戶端可用 Bearer 權杖)。免費金鑰每 30 天 1,000 次呼叫,付費方案可提高額度。需要能連線至服務商 API 的網路。
安裝前請注意
呼叫依用量計費:get_sentiment、get_summary、get_prices 與 get_correlation 會依回傳列數或天數消耗 API 點數,額度用完後會回傳配額不足錯誤直到重置。付費方案與批次封存資料需付費。API 金鑰屬於機密,應避免寫入共用設定。情緒僅根據新聞標題,提供方明確表示其並非價格預測。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 SentimentFX,將其新增到工作區。
  2. 連接 X-API-Key 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/org.sentimentfx%2Fmarket-sentiment/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "sentimentfx": {
      "type": "http",
      "url": "https://api.sentimentfx.org/mcp",
      "headers": {
        "X-API-Key": "<YOUR_API_KEY>"
      }
    }
  }
}

README

SentimentFX

A news-sentiment dataset for 42 markets across crypto, FX, stocks, ETFs and commodities. SentimentFX scrapes financial headlines, scores each one with FinBERT (a finance-tuned transformer model), and stores the scores next to daily and intraday prices. You can read the data on a dashboard, through a metered REST API, or as tools over MCP for Claude and other AI clients.

The product is the scored archive and live feed. It is not a price forecast: the dashboard shows correlation and backtest results so you can judge the signal yourself, and it makes no claim that sentiment predicts returns.

Live: sentimentfx.org · app.sentimentfx.org · developers.sentimentfx.org · status.sentimentfx.org


What it does

  • Pulls headlines from RSS feeds every 15 minutes (CoinDesk, CoinTelegraph, Yahoo Finance, r/CryptoCurrency and others), plus RSS-less news sites through saved ScraperAI configs
  • Scores each new headline once with FinBERT: positive_prob - negative_prob, giving -1 to +1, shown as 0–100 in the UI
  • Refreshes prices for all 42 tickers every hour through yfinance (daily OHLC and intraday candles)
  • Correlates daily sentiment shifts with next-day returns over 180 days, with a 95% confidence interval and a strength label
  • Publishes a free cross-asset Sentiment Index (0–100, Fear → Greed) built from scored news text, not trader positioning
  • Sells access through Stripe: a Pro dashboard plan, a Data plan for the API, and the full archive on request

Coverage

CategoryTickers
Crypto (5)BTC, ETH, SOL, XRP, DOGE
FX (7)EURUSD, GBPUSD, USDJPY, AUDUSD, USDCAD, USDCHF, NZDUSD
Stocks (20)AAPL, MSFT, GOOGL, AMZN, META, NVDA, TSLA, JPM, BAC, GS, V, MA, XOM, JNJ, AMD, NFLX, WMT, UBER, CRM, PLTR
ETFs (6)SPY, QQQ, GLD, SLV, USO, ARKK
Commodities (4)GC=F (gold), SI=F (silver), CL=F (crude), NG=F (natural gas)

Price currency depends on category. Crypto is quoted in GBP (BTC-GBP on Yahoo). FX pairs are raw exchange rates. Stocks, ETFs and commodity futures are in native USD, and no GBP conversion is applied.

Products

Dashboard (app.sentimentfx.org)

  • Sentiment vs price chart, candlestick chart with a sentiment pane, and a 0–100 sentiment gauge
  • Correlation signal, divergence card, interactive backtest simulator and headline-impact panel
  • Headline feed with a per-article score. Editorial news is the default, and social sources are badged.
  • Leaderboard, track record and morning-brief pages
  • CSV export, email sentiment alerts and the morning brief email (Pro)

Alerts only fire for tickers whose backtest passes a quality gate: positive out-of-sample net return, and at least 70% of walk-forward folds positive. The gate is refreshed daily.

Plans

PlanPriceIncludes
Free£015 top tickers (3 per category), 30-day history, candlesticks, backtests, correlation
Pro£11.99/mo or £99.99/yrAll 42 tickers, full history, CSV export, alerts, morning brief, 15,000 API calls/mo
Data£49.99/mo or £499.99/yrEverything in Pro, 200,000 API calls/mo
Free API key£01,000 calls per 30 days, no card, hard stop at the limit

The bulk archive (every scored headline and price row, as CSV or JSONL) is sold separately. Ask through the dataset form on the developer portal.

Developer API (api.sentimentfx.org/v1/)

Authenticate with an X-API-Key header. Full docs are at developers.sentimentfx.org.

EndpointReturnsCost
GET /v1/sentiment/{ticker}?limit=1-100&sources=news|social|allLatest scored headlines, each with a source_kind1 credit per 25 rows returned
GET /v1/summary/{ticker}?days=1-365&sources=news|socialDaily average sentiment1 credit per day returned
GET /v1/prices/{ticker}?days=1-365Daily closes, with a currency field1 credit per day returned
GET /v1/correlation/{ticker}180-day Pearson r, p-value, 95% CI, strength1 credit
GET /v1/usagePlan, usage, allowance, reset date, rate limitsFree

Social posts (Reddit, StockTwits, X) are collected but kept separate. Every sentiment number is news only by default, and sources=social returns the social posts on their own. Calls are counted after the query, on rows actually returned. Nothing is billed per call: a key that uses up its allowance gets a 402 insufficient_quota until it refills, and a higher allowance can be requested. A 404 costs nothing, and out-of-range parameters are rejected with a 422 before any work is done. Every response carries X-Quota-* and X-RateLimit-* headers. Errors use one envelope: {"error": {"type": "...", "message": "..."}}.

bash
# Get a free key (1,000 calls every 30 days, no card)curl -X POST https://api.sentimentfx.org/api/keys/generate \  -H "Content-Type: application/json" \  -d '{"email": "[email protected]"}'
# Use itcurl https://api.sentimentfx.org/v1/summary/BTC?days=7 \  -H "X-API-Key: sfx_your_key_here"

The Sentiment Index is public and needs no key: GET https://api.sentimentfx.org/sentiment-index. Like every other sentiment number, it's built from news only.

MCP server (api.sentimentfx.org/mcp)

The same data is exposed as six Model Context Protocol tools: list_tickers and get_usage (both free), plus get_sentiment, get_summary, get_prices and get_correlation, which bill exactly like their /v1 equivalents. It uses streamable HTTP with the same X-API-Key header, or Authorization: Bearer <key> for clients that can't set custom headers (the Claude API's MCP connector is one). The registry manifest is server.json, and publishing steps are in docs/publishing-mcp-registry.md.

json
{  "mcpServers": {    "sentimentfx": {      "type": "http",      "url": "https://api.sentimentfx.org/mcp",      "headers": { "X-API-Key": "sfx_your_key_here" }    }  }}

Architecture

RSS feeds (15 min) ─┐ScraperAI replay ───┼→ scraper.py / ai_sources.py → dedup by URL → FinBERT → headlinesHN Algolia (admin) ─┘
yfinance (hourly) → prices.py / candles.py → prices, candles
headlines + prices → /dashboard, /candles, /correlation, /backtest …  → React dashboard                   → /v1/*  and  /mcp                                → API and MCP clients                   → /sentiment-index                                → public index page

Scheduled jobs (APScheduler, inside the API process):

JobWhenWhat
scrape_rss_onlyEvery 15 minRSS + ScraperAI headlines for all 42 tickers
scrape_allHourly, :00Daily price refresh for all tickers, sentiment alert checks (GNews only if enabled)
scrape_intraday_pricesHourly, :05Intraday candles
Signal-quality refreshDaily, 05:00 UTCRe-runs the backtest that gates alerts
Alert outcome settlementDaily, 06:15 UTCScores past alerts for the track record
Morning briefDaily, 07:00 LondonEmails the Claude-written brief to subscribers
API usage reset1st of monthResets monthly call counts. Free keys are measured on lifetime calls, so this doesn't refill them.

FinBERT only runs on headlines it hasn't seen. The model (~400 MB) downloads and loads on the first scoring call, not at import.

Dormant sources. GNews, StockTwits and X/Twitter fetchers are still in the code but switched off. Set GNEWS_ENABLED, STOCKTWITS_ENABLED or X_ENABLED to true to turn one back on. StockTwits was turned off because Cloudflare blocks the server's IP and retail chat scores poorly with a news-tuned model.

Repo layout

PathWhat
backend/app/main.pyEvery FastAPI route, the scheduler, Stripe webhook and billing
backend/app/scraper.py, ai_sources.pyHeadline fetchers. ScraperAI configs live in app/scraperai_configs/.
backend/app/sentiment.pyFinBERT pipeline
backend/app/prices.py, candles.pyyfinance daily and intraday prices
backend/app/sentiment_index.pyThe cross-asset index (equal-weighted across the 5 categories)
backend/app/mcp_server.pyMCP tools, mounted at /mcp
backend/app/brief.pyClaude-written morning brief
backend/app/trend_signal.py, funding_monitor.pyPersonal-use tooling, not product features
backend/build_scraper_config.pyOffline tool that generates ScraperAI configs. Needs its own venv; not used at runtime.
frontend/React + Vite dashboard
landing/Marketing site, leaderboard, index page and per-ticker SEO pages
developers/Developer portal and API docs
status/Status page

Getting started

Backend

bash
cd backendpython -m venv venvsource venv/Scripts/activate        # Windows (Git Bash); venv/bin/activate on macOS/Linuxpip install -r requirements.txtpython -m uvicorn app.main:app --reload   # http://localhost:8000

There is no .env.example. Create backend/.env with the variables below.

VariableNeeded for
DATABASE_URLPostgreSQL. Required: tables are created at import, so the app won't start without a reachable database.
ANTHROPIC_API_KEYMorning brief. Read at import, so any value lets the app boot.
SUPABASE_URL, SUPABASE_SERVICE_KEYUser accounts and tiers
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRETCheckout and webhook
RESEND_API_KEYWaitlist, alert and API-key emails
ADMIN_SECRET?token= for admin, backfill and cleanup endpoints
MCP_ALLOWED_HOSTSOptional. Hosts the MCP endpoint accepts. Defaults cover localhost and 127.0.0.1 on port 8000; other ports get a 421.
GNEWS_ENABLED, GNEWS_API_KEY, STOCKTWITS_ENABLED, X_ENABLED, X_NITTER_BASEOptional. Dormant sources.

Frontend

bash
cd frontendnpm installnpm run dev      # http://localhost:5173

Set VITE_SUPABASE_ANON_KEY in frontend/.env to enable login (VITE_GA_ID is optional). The API base URL is hard-coded to https://api.sentimentfx.org in src/lib/constants.js, so a local frontend talks to production unless you change it.

Tests

bash
cd backendpip install -r requirements-dev.txtpython -m pytest tests/ -v

Use python -m pytest, not bare pytest: tests/ has no __init__.py, so bare pytest can't import app. The tests are smoke-level only. They check that the app boots and the core routes answer, and they need a reachable DATABASE_URL. CI runs them against a throwaway Postgres on every push to main and every PR. There is no frontend test suite.

Sentiment scoring

score = positive_probability - negative_probability

The range is -1 (most negative) to +1 (most positive), and the UI shows it as 0–100. Neutral headlines land near 0 instead of being forced to exactly 0, which was the problem with the old label × confidence method. FinBERT scores the title only, even when the full article body is stored.

Deployment

  • Backend: Railway via Procfile + nixpacks.toml at api.sentimentfx.org. Starts with uvicorn app.main:app --host 0.0.0.0 --port $PORT. Runs on CPU only.
  • Dashboard, landing, developer portal: separate Vercel projects (frontend/, landing/, developers/), each auto-deploying from main.

來源:README.md,提交 0357f97

工具

6

list_tickers

List every asset SentimentFX tracks. Cheap (free — doesn't hit the billing meter). Returns two groups: `primary` (5 crypto + 7 FX pairs — the ones with full sentiment coverage across the primary RSS feeds), and `background` (US equities, ETFs, commodity futures — coverage is thinner but real). Use the exact ticker string from either group as the `ticker` arg to the other tools.

無需輸入參數。

get_usage

Introspect your API key: included allowance, remaining credits, and when they refill. Free keys get 1,000 calls per 30-day window starting at their first billable call (`resets_at` is null when no window is running); paid plans refill on the 1st of each month. Free — doesn't hit the billing meter. Useful before a large batch of `get_sentiment`/`get_summary` calls to check you have credit headroom.

無需輸入參數。

get_sentiment

Return the most recent FinBERT-scored news headlines for `ticker`. Each headline has a `sentiment_score` in [-1, +1] (positive_prob - negative_prob), a categorical `sentiment_label`, and a `source_kind` (news / reddit / stocktwits / x / youtube). Costs 1 API credit per 25 headlines actually returned — same billing as GET /v1/sentiment/{ticker}. An empty result costs nothing. `limit` is capped at 100. Social posts are kept separate from news: the default `sources="news"` returns editorial news, `"social"` returns only Reddit, StockTwits and X posts, and `"all"` returns both, labelled by `source_kind`. Titles come back reverse-chronological so the first item is the freshest.

輸入參數limitticker必填sources

get_summary

Return daily aggregated news sentiment for `ticker` over the last `days`. Each entry has `avg_sentiment` (unweighted mean of that day's scores), `article_count`, and a directional `label` (positive / negative / neutral, thresholded at ±0.1). `sources="social"` returns a separate daily average of Reddit, StockTwits and X posts; news and social are never averaged together. Costs 1 API credit per day actually returned — same as GET /v1/summary/{ticker}. A window with no coverage costs nothing.

輸入參數daysticker必填sources

get_prices

Return daily close prices for `ticker` over the last `days`, in the ticker's native currency -- see the `currency` field on the response. Costs 1 API credit per day actually returned — same as GET /v1/prices/{ticker}. Prices come back reverse-chronological. Crypto is GBP (yfinance BTC-GBP etc.), FX pairs are a raw exchange rate in the pair's native convention (e.g. USDJPY is yen per dollar), and everything else (stocks/ETFs/commodity futures) is native USD -- there is no currency conversion.

輸入參數daysticker必填

get_correlation

180-day Pearson correlation between daily sentiment shifts and next-day price returns for `ticker`. Returns Pearson `r`, `p_value`, `n_days` overlapping, a 95% confidence interval (Fisher z), and a categorical `strength` (strong / weak / inconclusive). Costs 1 API credit — same as GET /v1/correlation/{ticker}. Requires ≥30 overlapping day-pairs. Under that, returns a `note` field explaining what's missing so a caller can suggest waiting or switching to a higher-coverage ticker.

輸入參數ticker必填

版本歷史

1
  1. v1.0.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。