Skip to main content
Glama
Yahoo Finance MCP Server

Yahoo Finance MCP Server

README.md
# Yahoo Finance MCP Server ๐Ÿ“ˆ

[![npm version](https://img.shields.io/npm/v/yahoo-finance-mcp-server.svg)](https://www.npmjs.com/package/yahoo-finance-mcp-server)
[![npm downloads](https://img.shields.io/npm/dm/yahoo-finance-mcp-server.svg)](https://www.npmjs.com/package/yahoo-finance-mcp-server)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)

Free Yahoo Finance MCP server with no API key. 18 read-only tools give Claude, Claude Code, Cursor, VS Code, Windsurf, Codex, n8n or any other MCP client live stock quotes, historical prices, financial statements, earnings dates and calendars, analyst ratings and estimates, options chains, insider and institutional holders, stock screeners, ETF and fund holdings, sector overviews and market news. Runs locally with one `npx` command, over stdio or Streamable HTTP.

> **npm package:** [`yahoo-finance-mcp-server`](https://www.npmjs.com/package/yahoo-finance-mcp-server) ยท **GitHub repo:** [`danishashko/yahoo-finance-mcp`](https://github.com/danishashko/yahoo-finance-mcp). The repo name is shorter than the package name; both refer to this project.

## ๐ŸŽฏ What You Get

- ๐Ÿ“Š **Real-time stock quotes** with full market data
- ๐Ÿ“ˆ **Historical prices** (OHLCV) with summary statistics
- ๐Ÿข **Company profiles**, officers, and key statistics
- ๐Ÿ’ฐ **Financial statements** (income, balance sheet, cash flow)
- ๐ŸŽฏ **Analyst ratings**, price targets, and the recent recommendation trend
- โš–๏ธ **Multi-stock comparisons** side by side
- ๐Ÿ“ฐ **Latest financial news** per ticker
- ๐Ÿงพ **Options chains** (calls/puts, strikes, IV, open interest)
- ๐Ÿฆ **Ownership data** โ€” institutional, mutual fund, and insider activity
- ๐Ÿ’ต **Dividend & split history**
- ๐Ÿ”ฎ **Forward analyst estimates** (price targets, EPS/revenue, growth)
- ๐Ÿ”Ž **Symbol search** by company name or keyword
- ๐Ÿ•’ **Market status** (open/closed) and index summary
- ๐Ÿ“… **Earnings dates**: next report, beat/miss history, and a market-wide earnings calendar
- ๐Ÿงฒ **Stock screeners**: day gainers/losers, most active, most shorted, undervalued growth, top ETFs
- ๐Ÿงบ **ETF and fund data**: holdings, expense ratio, sector weights
- ๐Ÿญ **Sector and industry overviews** with their largest, fastest-growing and best-performing companies

Every tool returns human-readable **markdown** by default, or structured **JSON** on request (`response_format: "json"`). Requests share a single browser-impersonating HTTP session to reduce Yahoo Finance rate-limiting.

## ๐Ÿš€ Quick Start

Add this to your Claude Desktop config and restart Claude:

- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "yahoo-finance": {
      "command": "npx",
      "args": ["-y", "yahoo-finance-mcp-server"]
    }
  }
}
```

That is it. On first launch the npx wrapper creates an isolated Python environment and installs the dependencies for you (a one-time step that can take a minute). You only need **Python 3.10+** and **Node.js 16+** on your machine.

### Other clients

**Claude Code**

```bash
claude mcp add yahoo-finance -- npx -y yahoo-finance-mcp-server
```

**Cursor** (`~/.cursor/mcp.json`), **Windsurf** (`~/.codeium/windsurf/mcp_config.json`) and **Gemini CLI** (`~/.gemini/settings.json`) take the same `mcpServers` block as Claude Desktop above.

**VS Code** (`.vscode/mcp.json`)

```json
{
  "servers": {
    "yahoo-finance": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "yahoo-finance-mcp-server"]
    }
  }
}
```

**Codex CLI** (`~/.codex/config.toml`)

```toml
[mcp_servers.yahoo-finance]
command = "npx"
args = ["-y", "yahoo-finance-mcp-server"]
```

**n8n and other URL-only clients:** see [HTTP mode](#-http-mode-n8n-remote-agents-anything-that-connects-to-a-url).

### Prefer a global install?

```bash
npm install -g yahoo-finance-mcp-server
```

```json
{
  "mcpServers": {
    "yahoo-finance": {
      "command": "yahoo-finance-mcp-server"
    }
  }
}
```

## ๐ŸŒ HTTP mode (n8n, remote agents, anything that connects to a URL)

Some clients spawn an MCP server as a child process and talk to it over stdio;
others only take a URL. n8n's **MCP Client Tool** node is the second kind - it
offers HTTP Streamable and SSE and no way to launch a command - so stdio alone
puts the server out of reach.

`--http` serves the same 18 tools over Streamable HTTP at `/mcp`:

```bash
npx -y yahoo-finance-mcp-server --http
# -> http://127.0.0.1:8000/mcp
```

| Flag | Default | What it does |
|---|---|---|
| `--http` | off | Serve Streamable HTTP at `/mcp` instead of stdio |
| `--host` | `127.0.0.1` | Interface to bind |
| `--port` | `8000` | Port to bind |
| `--allowed-host` | see below | Host header to accept, repeatable |
| `--stateful` | off | Keep a session per client instead of stateless |

No authentication is added, so keep it on an interface you trust.

### Reaching it from a container

n8n in Docker is not on your loopback interface, so bind wider and use the
host alias:

```bash
npx -y yahoo-finance-mcp-server --http --host 0.0.0.0 --port 8931
```

Then point the MCP Client Tool node at `http://host.docker.internal:8931/mcp`
with authentication set to **None**.

DNS-rebinding protection stays on when you bind wider. `localhost`,
`127.0.0.1` and `host.docker.internal` on the bound port are accepted by
default; any other name needs `--allowed-host name:port`, and a request
arriving under an unlisted name gets `421 Misdirected Request`.

## ๐Ÿ”ง Available Tools

| Tool | What it returns | Parameters |
|------|-----------------|------------|
| `get_stock_quote` | Current price, change, day and 52-week range, volume, market cap, P/E, EPS, dividend yield | `ticker` |
| `get_historical_prices` | OHLCV history with summary stats and total return | `ticker`, `period`, `interval` |
| `get_company_info` | Business summary, key executives, valuation and financial highlights | `ticker` |
| `get_financial_statements` | Annual income statement, balance sheet, and cash flow | `ticker` |
| `compare_stocks` | Key metrics for multiple tickers side by side, plus quick insights | `tickers` (2 to 10) |
| `get_analyst_recommendations` | Price targets, consensus, recommendation trend, and recent upgrades/downgrades | `ticker` |
| `get_market_news` | Latest news headlines with source, date, summary, and link | `ticker`, `count` |
| `get_options_chain` | Expiration dates, or the calls/puts chain (strike, bid/ask, volume, OI, IV) | `ticker`, `expiration_date`, `option_type` |
| `get_holders` | Institutional, mutual-fund, or major holders, or insider transactions | `ticker`, `holder_type` |
| `get_dividends_splits` | Dividend payment history (with summary) and stock-split history | `ticker` |
| `get_analyst_estimates` | Forward price targets, EPS/revenue estimates by period, and growth estimates | `ticker` |
| `search_symbols` | Find ticker symbols by company name or keyword | `query`, `count` |
| `get_market_status` | Whether a market is open/closed, with timing and a major-index summary | `region` |
| `get_earnings` | Next earnings date (days away, EPS and revenue estimates), ex-dividend date, beat/miss history | `ticker`, `limit` |
| `get_earnings_calendar` | Every company reporting in a date range, with timing and EPS estimate | `start_date`, `end_date`, `min_market_cap`, `limit` |
| `screen_stocks` | Results of a Yahoo predefined screener with price, change, relative volume, P/E | `screener`, `count` |
| `get_fund_data` | ETF or mutual fund holdings, expense ratio, sector weights, asset classes | `ticker` |
| `get_sector_overview` | Sector or industry overview, largest companies, industries, top growers and performers | `sector`, `industry`, `limit` |

Every tool also accepts `response_format` (`"markdown"`, the default, or `"json"`).

Every result also carries the data as MCP **structured content**, described by the tool's published `outputSchema`, whichever text format you ask for. Clients that support structured output read typed fields directly; others read the text. Missing figures are `null`, and a failed call returns `isError: true` with a message saying what to change.

**`get_historical_prices` options:**

- `period`: `1d`, `5d`, `1mo`, `3mo`, `6mo`, `1y`, `2y`, `5y`, `10y`, `ytd`, `max`
- `interval`: `1m`, `2m`, `5m`, `15m`, `30m`, `60m`, `90m`, `1h`, `1d`, `5d`, `1wk`, `1mo`, `3mo`

**`get_options_chain`:** call without `expiration_date` to list available dates, then again with a date. `option_type` is `calls`, `puts`, or `both`. A chain returns the strikes nearest the current price.

**`get_holders`:** `holder_type` is `institutional`, `mutualfund`, `major`, `insider_transactions`, `insider_purchases` (6-month net insider buying), or `insider_roster`.

**`screen_stocks`:** `screener` is one of `day_gainers`, `day_losers`, `most_actives`, `most_shorted_stocks`, `small_cap_gainers`, `aggressive_small_caps`, `growth_technology_stocks`, `undervalued_growth_stocks`, `undervalued_large_caps`, `top_etfs_us`, `top_performing_etfs`, `technology_etfs`, `bond_etfs`, `top_mutual_funds`, `solid_large_growth_funds`, `solid_midcap_growth_funds`, `conservative_foreign_funds`, `high_yield_bond`, `portfolio_anchors`.

**`get_sector_overview`:** `sector` is one of `basic-materials`, `communication-services`, `consumer-cyclical`, `consumer-defensive`, `energy`, `financial-services`, `healthcare`, `industrials`, `real-estate`, `technology`, `utilities`. Call without `industry` to get the list of industry keys.

## ๐Ÿ’ฌ Example Prompts

Once the server is connected, just ask Claude:

- "What's the current price of Apple stock?"
- "Show me Amazon's stock performance over the last year"
- "Tell me about Tesla as a company and who runs it"
- "Show me Apple's income statement"
- "Compare AAPL, MSFT, and GOOGL"
- "What do analysts think about Amazon, and what's the price target?"
- "What's the latest news on NVIDIA?"
- "Show me the SPY call options expiring next month"
- "Who are the biggest institutional holders of Apple?"
- "What's Coca-Cola's dividend history?"
- "When does NVIDIA report next, and has it been beating estimates?"
- "Which large caps report earnings this week?"
- "What are today's biggest gainers?"
- "What's inside QQQ and what does it cost?"
- "Who are the biggest semiconductor companies?"
- "Are Tesla insiders net buying or selling?"

## โ“ FAQ

**Does it need an API key or a paid plan?**
No. It reads Yahoo Finance's public data through the `yfinance` library. There is no key, account or signup.

**Is the data real-time?**
Quotes are near real-time for most US stocks and can be delayed about 15 minutes on some exchanges. Every quote states its exchange, market state and timestamp.

**Which tickers work?**
Any symbol Yahoo Finance lists: US stocks (`AAPL`), class shares (`BRK.B` or `BRK-B`), non-US listings with Yahoo's exchange suffix (`7203.T`, `BP.L`, `SAP.DE`), ETFs and mutual funds (`SPY`, `VFIAX`), indices (`^GSPC`), crypto (`BTC-USD`) and currencies (`EURUSD=X`). Case does not matter. If you only have a company name, `search_symbols` finds the ticker.

**Can it place trades or change anything?**
No. Every tool is read-only.

**Does it work with clients other than Claude?**
Yes. It speaks standard MCP, so any client that supports MCP over stdio or Streamable HTTP can use it. Setup for the common ones is under [Quick Start](#-quick-start).

**How do agents get structured data?**
Every result carries typed `structuredContent` matching the tool's `outputSchema`, whatever text format was asked for. Pass `response_format: "json"` to get JSON text as well.

**Where is the machine-readable summary?**
[`llms.txt`](llms.txt) lists every tool, limit and error behaviour in one page for agents.

## ๐Ÿ› Troubleshooting

**"Command not found" / "Python not found"**
Make sure Python and Node.js are installed and on your PATH. On macOS/Linux, try `python3` instead of `python` in the config.

**"Module not found: yfinance" (manual install only)**
Install the dependencies:

```bash
pip install yfinance curl_cffi pandas tabulate mcp pydantic httpx
```

**Tools not showing up in Claude**
1. Confirm the config file is valid JSON (no trailing commas).
2. Fully quit and reopen Claude Desktop.
3. Check the path in your config actually exists.

**"Error fetching data"**
- Check your internet connection.
- Verify the ticker symbol (for example `AAPL`, not `Apple`).
- Some smaller companies have limited data, and Yahoo Finance can be briefly unavailable.

**Using a different model or provider (LiteLLM, OpenRouter, NVIDIA NIM, a local model)**
This server never talks to a model. Your client starts it as a local process and
speaks JSON-RPC over stdin/stdout, so changing `ANTHROPIC_BASE_URL` or swapping the
model behind your client has no effect on it. If tools stop firing after a switch
like that, check two things: the model has to support function calling, and a proxy
configured to drop unsupported parameters can silently strip your tool definitions,
which produces no error at all. Run `/mcp` in your client (or `claude mcp list`) to
confirm the server is connected before suspecting the server.

## ๐Ÿ› ๏ธ Manual Installation (Alternative)

If you would rather run the Python file directly instead of via npx:

**1. Download the server**

Save `yahoo_finance_mcp.py` somewhere on your machine and install the dependencies:

```bash
pip install yfinance curl_cffi pandas tabulate mcp pydantic httpx
```

(or `pip3` on macOS/Linux)

**2. Point Claude Desktop at it**

```json
{
  "mcpServers": {
    "yahoo-finance": {
      "command": "python3",
      "args": ["/absolute/path/to/yahoo_finance_mcp.py"]
    }
  }
}
```

On Windows use `"command": "python"` and a path like `"C:\\path\\to\\yahoo_finance_mcp.py"` (double backslashes or forward slashes).

**3. Restart Claude Desktop.**

## ๐Ÿ”’ Privacy & Rate Limits

- Uses the free Yahoo Finance API via the `yfinance` library.
- Requests go straight to Yahoo Finance. Nothing is stored or proxied.
- Yahoo Finance rate-limits roughly 2,000 requests/hour per IP.
- Intended for personal, educational, and research use.

## ๐Ÿ“ Notes

- Tickers are case-insensitive, and `BRK.B` is accepted as well as Yahoo's `BRK-B`.
- Some quotes may be delayed 15 to 20 minutes.
- Financial statements are generally available for larger public companies.

## ๐Ÿ“‹ Changelog

See [CHANGELOG.md](CHANGELOG.md) for the full version history.

## ๐Ÿ“š Resources

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [yfinance documentation](https://ranaroussi.github.io/yfinance/)
- [Python downloads](https://www.python.org/downloads/)
- [Claude Desktop](https://claude.ai/download)

## โš–๏ธ Legal Disclaimer

This tool uses Yahoo Finance's publicly available data through the `yfinance` library. Yahoo!, Y!Finance, and Yahoo! Finance are registered trademarks of Yahoo, Inc. This tool is not affiliated with, endorsed by, or vetted by Yahoo, Inc. Please refer to Yahoo!'s terms of use for details on your rights to use the data.

## ๐Ÿ‘ค Author

**Daniel Shashko**
- GitHub: [@danishashko](https://github.com/danishashko)
- LinkedIn: [daniel-shashko](https://linkedin.com/in/daniel-shashko)
- npm: [danielshashko](https://www.npmjs.com/~danielshashko)

## ๐Ÿ“„ License

MIT ยฉ Daniel Shashko

TDQS

A4.5/5.0

Scored across 18 tools

Disambiguation5/5

The tools have clearly distinct purposes, and the descriptions explicitly resolve the few potentially overlapping areas: analyst recommendations vs. estimates, single-stock earnings vs. earnings calendar, and quote vs. compare vs. company info. An agent can select the right tool without much ambiguity.

Naming Consistency5/5

All tool names use consistent snake_case with an action-first pattern such as get_stock_quote, get_historical_prices, search_symbols, screen_stocks, and compare_stocks. There is no mixing of camelCase or inconsistent verb styles.

Tool Count4/5

Eighteen tools is slightly heavy relative to the ideal 3โ€“15 range, but the breadth of Yahoo Finance coverage justifies the size. Each tool appears to earn its place by covering a distinct finance subdomain rather than duplicating functionality.

Completeness4/5

The surface is broad and covers most stock-research workflows: discovery, quotes, history, fundamentals, analysts, ownership, earnings, options, dividends, funds, sectors, news, and screening. Minor gaps remain, such as market-wide news or direct index/FX quote and historical tools beyond market status.

Maintenance

ActivityMaintained
ResponsivenessLimited data