Finnhub Mcp Server

io.github.cyanheads由 GitHub 账号 cyanheads 发布v0.2.0更新于 Oct 30, 2026

Real-time US-equity quotes, company fundamentals, earnings, analyst trends, and news via Finnhub.

已验证STDIO仅桌面金融数据与分析

概览

AI 生成的概览

Finnhub 行情数据服务器:让助手查询美股代码、实时报价、公司基本面、财报、分析师评级和财经新闻。

可以做什么
  • 把公司名称或部分代码解析为美股代码,优先返回可能属于美股的匹配
  • 获取实时报价并附带市场状态,休市时明确标注为前收盘价
  • 一次调用取得公司简介、主要基本面指标和同行业公司
  • 查询历史财报的实际与预期每股收益及意外幅度,或未来财报日历
  • 获取某只股票在指定日期范围内的新闻,或按类别获取大盘新闻
  • 读取每月分析师买入/持有/卖出评级数量,并提供新闻类别参考资源
适用场景
适合在回答市场问题时需要美股实时价格、基本面、财报或分析师情绪的场景,也适合生成必须说明价格是实时还是前收盘的公司与财报简报。
运行要求
通过 npx(需 Node.js)或 Docker 在本地运行,也可使用 Streamable HTTP。需要免费的 Finnhub API 密钥,放在 FINNHUB_API_KEY 中,缺少时服务器无法启动。可选变量涉及传输方式、HTTP 主机/端口/路径、认证模式、日志级别、存储和 OpenTelemetry。需要能访问 Finnhub API 的网络。
安装前请注意
Finnhub API 密钥会作为 token 查询参数发送,请勿放入共享配置或日志。免费套餐仅限个人使用,向第三方转发或共享 Finnhub 数据需获得书面许可。覆盖范围限于美股和免费套餐,国际或付费代码会返回 not_us_or_paid。启用 LOG_TOOL_FAILURE_PAYLOADS 会记录失败调用的参数和结果,且自由文本中的密钥不会被脱敏。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Finnhub Mcp Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

@cyanheads/finnhub-mcp-server

Real-time US-equity quotes, company fundamentals, earnings, analyst trends, and financial news via Finnhub. STDIO or Streamable HTTP.

6 Tools • 2 Resources


Overview

Real-time US stock data from Finnhub: quotes, company fundamentals, earnings, analyst recommendations, and financial news. Look up a company by name, then pull live pricing, valuation, or news for it.

Ticker inputs are trimmed and uppercased; punctuation such as BRK.B is preserved. Earnings calendar filters may be omitted or blank for market-wide results; earnings history and company news require a nonblank symbol. Search queries retain their original spelling, and market news ignores symbol.

Tools

ToolDescription
finnhub_search_symbolsResolve a company name or partial ticker to stock symbols, best likely-US match first. The entry point for every other tool.
finnhub_get_quoteReal-time price quote for one US symbol, paired with live market-status so the response states whether the price is live or the prior close, including the returned session and named holiday.
finnhub_get_companyFull company context in one call — profile, headline fundamentals (P/E, EPS, margins, growth), and sector peers.
finnhub_get_earningsEarnings in two modes: a symbol's past quarters with actual-vs-estimate surprises (history), or upcoming releases in a date window with an optional symbol filter (calendar).
finnhub_get_newsFinancial news in two modes: recent articles for one symbol over a date range (company), or broad market headlines by category (market).
finnhub_get_recommendationsAnalyst recommendation trends for one US symbol — strong-buy / buy / hold / sell / strong-sell counts per month, newest first.

Resources

ResourceDescription
finnhub://news-categoriesThe four valid market-news categories (general, forex, crypto, merger) with one-line descriptions.
skill://finnhub-guide/SKILL.mdAgent guide for company and earnings briefings, security identity, quote freshness, and coverage gaps.

The news-category reference mirrors the category enum on finnhub_get_news. The finnhub guide also ships with plugin installs, npm, Docker, and the desktop bundle.

Capability reference

finnhub_search_symbols tool

  • Search by company name or ticker fragment with query (1–20 characters) and limit (1–50, default 10).
  • Returns likely-US Common Stock matches first, with an isLikelyUS symbol-format heuristic, total match count, and truncation disclosure. Quote and profile responses remain authoritative.

finnhub_get_quote tool

  • Requires symbol; returns current price, change, session open/high/low, previous close, and an ISO 8601 quote time.
  • priceIsLive distinguishes a live price from the prior close; marketOpen, session, and holiday are nullable when market status is unavailable. Unknown ticker → symbol_not_found; international or paid-only symbol → not_us_or_paid.

finnhub_get_company tool

  • Requires symbol; returns company profile, nullable headline fundamentals (P/E, EPS, 52-week range, beta, dividend yield, margins, growth, ROE), and sector peers.
  • Failed metrics or peers appear in partial; the profile determines symbol_not_found and not_us_or_paid errors.

finnhub_get_earnings tool

  • history requires symbol and returns past quarters' actual/estimate EPS and surprise, newest first. calendar accepts from / to (default today through +14 days) and an optional symbol, returning release dates, EPS/revenue estimates, and report times.
  • limit (1–100, default 50) caps rows with total and truncation disclosure. History without a symbol → missing_symbol; international or paid-only symbol → not_us_or_paid.

finnhub_get_news tool

  • company requires symbol and accepts a date range (default last 7 days). market uses category: general, forex, crypto, or merger (see finnhub://news-categories).
  • Returns headline, source, ISO 8601 datetime, summary, and URL, newest first. limit (1–100, default 15) caps articles with total and truncation disclosure; company mode without a symbol → missing_symbol, international or paid-only symbol → not_us_or_paid.

finnhub_get_recommendations tool

  • Per-month strong-buy / buy / hold / sell / strong-sell counts, newest first; history depth depends on Finnhub coverage.
  • limit (1–24, default 12) caps available rows; raising it cannot retrieve history absent from Finnhub. Reports total months and discloses truncation.
  • Empty result → no_coverage; it cannot distinguish an invalid symbol from a valid symbol without coverage. International or paid-only symbol → not_us_or_paid.

finnhub://news-categories resource

  • Returns the four valid finnhub_get_news market-mode categories (general, forex, crypto, merger) with one-line descriptions, as application/json
  • Convenience mirror — fully covered by the category enum's .describe() on finnhub_get_news, so tool-only clients lose nothing
  • Live data (quotes, news, earnings) is intentionally not exposed as a resource — it's time-sensitive, so freshness lives only in the tools

Features

The finnhub-guide skill helps agents combine tool results into company and earnings briefings while preserving dates, missing values, and endpoint coverage limits. MCP clients can discover it through skills/list or read its skill://finnhub-guide/SKILL.md resource.

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

Finnhub-specific:

  • Single rate-aware Finnhub client — token injected server-side (never a tool input), with timeout and retry calibrated to the 60 req/min free tier
  • Live market-status pairing on quotes so a closed-market price is reported as the prior close, never as live
  • Status classification at the service boundary: 403 → a clear not_us_or_paid domain error, 401 → loud configuration failure at first call (not "no data"), 429/5xx → retried
  • finnhub_get_company fans out profile + metrics + peers in parallel and degrades to partial results when a leg fails

Agent-friendly output:

  • Honest sparsity — every fundamental is nullable and absent values stay null; Finnhub's thinly-covered names are surfaced as-is, never zero-filled or fabricated
  • Two distinct "not available" signals — symbol_not_found (all-zero quote / empty profile sentinel) vs. not_us_or_paid (international or paid-only, HTTP 403). An empty profile can also reflect missing instrument coverage.
  • ETFs, funds, or trusts may lack company profiles, earnings history, or analyst recommendations. Empty responses retain ticker verification guidance and suggest finnhub_get_quote for price data without promising quote availability.
  • Typed error contracts with recovery hints on every failure, plus the isLikelyUS search heuristic so an agent can prioritize likely free-tier symbols
  • Capped lists report their total count and disclose truncation, so an agent knows when more data exists

Getting started

This server requires a free Finnhub API key (Dashboard → API key). The free tier covers US equities in real time at 60 req/min.

Each user must obtain their own API key. Use is subject to Finnhub's Terms of Service — the free tier is for personal use only, and redistributing or sharing access to Finnhub data with third parties requires written approval from Finnhub.

Add it to Claude Code:

sh
claude mcp add finnhub-mcp-server -e FINNHUB_API_KEY=your-api-key -- npx -y @cyanheads/finnhub-mcp-server

For other clients, add this to your MCP configuration file:

json
{  "mcpServers": {    "finnhub-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/finnhub-mcp-server"],      "env": { "FINNHUB_API_KEY": "your-api-key" }    }  }}

For Docker or a source build, see Running the server.

Configuration

All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:

VariableDescriptionDefault
FINNHUB_API_KEYRequired. Free Finnhub API key from finnhub.io/register. Sent as the token query param; the server fails to start without it.—
FINNHUB_BASE_URLFinnhub REST API base URL. Override for local testing or a proxy.https://finnhub.io/api/v1
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTPort for the HTTP server.3010
MCP_HTTP_ENDPOINT_PATHHTTP endpoint path where the MCP server is mounted./mcp
MCP_SESSION_MODESession handling: auto, stateful, or stateless. The server declares stateless in src/index.ts, so an unset variable resolves there; .env.example and the Docker image set it explicitly too. An explicit environment value takes precedence.stateless
MCP_AUTH_MODEAuth mode: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (RFC 5424: debug, info, notice, warning, error).info
LOG_TOOL_FAILURE_PAYLOADSLog failed tool calls' arguments and results, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). Secrets inside free-form values are not redacted.false
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry instrumentation (spans, metrics, completion logs).false
OTEL_EXPORTER_OTLP_ENDPOINTOTLP base URL for traces (/v1/traces) and metrics (/v1/metrics); signal-specific endpoints override it.—
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTOpt-in OTLP log endpoint, used as-is. The base URL does not enable log export.—

See .env.example for the full list of optional overrides.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+), and a free Finnhub API key.

sh
git clone https://github.com/cyanheads/finnhub-mcp-server.gitcd finnhub-mcp-serverbun installcp .env.example .env# Set FINNHUB_API_KEY in .env.
  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker run --rm -e FINNHUB_API_KEY=your-key -p 3010:3010 ghcr.io/cyanheads/finnhub-mcp-server:latest

The image defaults to HTTP transport, stateless session mode, and logs to /var/log/finnhub-mcp-server. For stdio, add -i -e MCP_TRANSPORT_TYPE=stdio to docker run. To build locally, run docker build -t finnhub-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point — registers tools/resources and inits the Finnhub service.
src/configServer-specific environment variable parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts). Six tools across symbols, quotes, company, earnings, news, and recommendations.
src/mcp-server/resourcesResource definitions (*.resource.ts). News-categories reference.
src/services/finnhubFinnhub REST client — auth, typed endpoint methods, retry, and HTTP-status classification.
skills/Published agent guide, also served as an MCP resource.
tests/Unit and integration tests mirroring src/.

Development guide

See CLAUDE.md / AGENTS.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools and resources via the barrels in src/mcp-server/*/definitions/index.ts
  • Wrap the Finnhub API: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

来源:README.md,提交 82febe2

工具

6

finnhub_search_symbols

Finnhub Search Symbols

Resolve a company name or partial ticker to Finnhub stock symbols. The entry point for every other tool — users say "Microsoft", the rest of the surface needs "MSFT". Returns matched symbols with display symbol, description, and security type, best likely-US match first. Each result carries isLikelyUS, a symbol-format heuristic for likely free-tier availability; quote and profile responses remain authoritative.

输入参数limitquery必填

finnhub_get_quote

Finnhub Get Quote

Real-time price quote for one US stock symbol: current, change, %change, open, high, low, previous close. Pairs the quote with live market-status so the response states whether the price is live or the prior close — never implies a stale price is live. Resolve a name to a symbol with finnhub_search_symbols first. International symbols (with an exchange suffix like ".TO") are not on the free tier and return a clear error.

输入参数symbol必填

finnhub_get_company

Finnhub Get Company

Full company context for one US symbol in a single call: profile (name, exchange, industry, country, market cap, shares outstanding, IPO date, website, logo), headline fundamentals (P/E, EPS, 52-week range, beta, dividend yield, margins, growth), and sector peers. Combines three endpoints so "tell me about Apple" needs one tool call, not three. Resolve a company name with finnhub_search_symbols first. International symbols are not on the free tier.

输入参数symbol必填

finnhub_get_earnings

Finnhub Get Earnings

Earnings data in two modes. 'history': a symbol's past quarters — actual vs. estimate EPS, surprise %, period (the surprise is the market-moving signal, surfaced prominently); requires `symbol`. 'calendar': upcoming releases in a date window — date, EPS/revenue estimates, symbol; uses `from`/`to` and optionally filters by `symbol`. Resolve a company name with finnhub_search_symbols first.

输入参数tofrommode必填limitsymbol

finnhub_get_news

Finnhub Get News

Financial news in two modes. 'company': recent articles for one symbol over a date range — headline, source, datetime, summary, URL ("what's driving AAPL today?"); requires `symbol`. 'market': broad market headlines by category (general, forex, crypto, merger); uses `category`. Resolve a company name with finnhub_search_symbols first for company mode.

输入参数tofrommode必填limitsymbolcategory

finnhub_get_recommendations

Finnhub Get Recommendations

Analyst recommendation trends for one US symbol: strong-buy / buy / hold / sell / strong-sell counts per month, newest first. The consensus view to pair with the live quote and fundamentals from finnhub_get_company. Resolve a company name with finnhub_search_symbols first.

输入参数limitsymbol必填

版本历史

4
  1. v0.2.0最新Oct 30, 2026
  2. v0.1.6Oct 7, 2026
  3. v0.1.5Sep 21, 2026
  4. v0.1.4Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分