Skip to main content
Glama
benethos-hub

Yahoo Finance MCP Server

by benethos-hub

Unofficial Yahoo Finance MCP Server

CI Coverage License Python

PyPI benethos-yahoo-finance-mcp Container benethos-yahoo-finance-mcp

Sponsor PayPal

An MCP server that exposes Yahoo Finance data to MCP clients (such as Claude Desktop). It runs over stdio (default, for local clients) or an HTTP transport (for standalone / containerized hosting). Market data is sourced through the yfinance library, which uses Yahoo's unofficial endpoints.

Disclaimer

  • This project is not affiliated with, endorsed by, or sponsored by Yahoo. "Yahoo" and "Yahoo Finance" are trademarks of their respective owners.

  • It relies on unofficial Yahoo Finance endpoints via yfinance. Those endpoints can change or break at any time, and Yahoo may rate limit or block requests. Review Yahoo's Terms of Service before use.

  • Data may be delayed, incomplete, or inaccurate. Nothing here is financial advice. Do not rely on it for trading or investment decisions.

  • Provided "as is", without warranty. Intended for personal and educational use. You use it at your own risk. See LICENSE.

  • For commercial use, review Yahoo's Terms of Service and consider a properly licensed market-data provider instead of the unofficial endpoints.

Contents

What it is for

The server lets an MCP client such as Claude Desktop answer questions about markets from live Yahoo Finance data: the price of a share and how it moved, what a company earns, what analysts expect, who owns it, what an ETF holds, and how a sector or a market is doing. You ask in plain language, the client picks the tools, and the answer rests on what Yahoo returns rather than on what the model remembers.

Typical uses:

  • Quick lookups in a chat. A quote, the 52-week range, the next earnings date or the dividend history, without opening a browser.

  • Research on one company. Profile, financial statements, estimates, rating changes, holders and insider trades in one conversation, summarised by the model.

  • Comparisons. Several tickers side by side, the top companies of a sector or an industry, the holdings and weightings of an ETF.

  • Calculations on raw data. Six months of daily closes for an RSI, a MACD or a drawdown, which the model works out from the series.

  • A shared service. Run over HTTP, in Docker, for a team's web front end or an automation such as n8n, with an optional result cache in front of Yahoo.

Everything is read-only. The server places no orders, holds no portfolio and signs in nowhere. The data comes from unofficial endpoints, may be delayed and is no basis for a trading decision, see the disclaimer above.

Example prompts

Once the server is connected, ask the client in plain language and it will pick the tools. Replace the bracketed placeholders with concrete values.

Price & quote

  • "What's the current price of [Ticker], and how far is it from its 52-week high?"

  • "Is [Ticker] trading above or below its 50- and 200-day moving averages?"

  • "Get the daily closes of [Ticker] for the last 6 months and compute RSI and MACD."

  • "What was the deepest drawdown of [Ticker] in the last 12 months?"

  • "Compare [Ticker A] and [Ticker B] over the last 3 months and show which held up better."

  • "Get current quotes for [Ticker A], [Ticker B] and [Ticker C] and compare them in a table."

Company & valuation

  • "Give me P/E, beta, market cap and dividend yield for [Ticker]."

  • "What does [Company name] actually do, and which sector and industry is it in?"

  • "Show the last three annual income statements for [Ticker] and how revenue developed."

  • "How has [Ticker]'s share count changed over the past years, and does that mean buybacks or dilution?"

Analysts & news

  • "What's the analyst consensus for [Ticker], and how far is the average price target from the current price?"

  • "Any upgrades or downgrades for [Ticker] in the last few weeks?"

  • "What are the forward revenue and EPS estimates for [Ticker], and how were they revised recently?"

  • "Summarize the recent news on [Ticker]."

Earnings & calendar

  • "When does [Ticker] report next, and what EPS is expected?"

  • "How did [Ticker] do against estimates in the last few quarters?"

  • "When are [Ticker]'s next earnings and ex-dividend dates?"

Dividends

  • "Show [Ticker]'s dividends over the last ten years and the current yield."

  • "Has [Ticker] cut its dividend in the last 20 years, and did it split the stock?"

Ownership & insiders

  • "Who are the largest institutional holders of [Ticker]?"

  • "What share of [Ticker] is held by insiders versus institutions?"

  • "Has there been notable insider buying or selling in [Ticker] recently?"

Funds & ETFs

  • "What are the top holdings and sector weightings of the ETF [Ticker]?"

  • "What's the asset-class split of [ETF Ticker], and which fund family runs it?"

Filings

  • "Show the most recent SEC filings for [US Ticker] with links."

Options

  • "Which option expiration dates are available for [US Ticker]?"

  • "Show the calls and puts for [US Ticker] expiring [Date]."

Sectors & markets

  • "What are the top companies and industries in the technology sector?"

  • "Show the top-performing companies in the semiconductors industry."

  • "Is the US market open right now, and when does it open next?"

  • "How did the major indices in Europe and Asia close?"

Screening

  • "Find US stocks with a dividend yield above 4 % and a P/E below 15."

  • "Which companies have raised their dividend for at least 25 years in a row?"

  • "List the largest German-listed technology stocks with a positive P/E under 20."

Finding a symbol

  • "Which Yahoo ticker belongs to [Company name] on [Exchange]?"

  • "Resolve the ISIN [ISIN] to a Yahoo ticker."

A daily round-up

  • "For [Ticker A], [Ticker B] and [Ticker C]: pull quote, six months of history, company info and analyst recommendations, then give me a short picture of each."

The server computes nothing itself. It passes through what Yahoo returns, which already includes derived figures such as moving averages, P/E, beta and dividend yield. Anything Yahoo does not carry — RSI, MACD, drawdown, sentiment, total return — the model works out from the raw series.

Related MCP server: YFinance MCP Server

Tools

Every tool only reads, and each one says so to the client with the MCP annotations readOnlyHint and openWorldHint. A client that honours them may run the tools without asking for confirmation each time. Each tool also has a short title, such as "Stock screener", that a client may show in place of its name.

Tool

Description

search

Find instruments by name, ticker, or ISIN, returning Yahoo symbols.

get_quote

Current price and key intraday figures for a symbol.

get_quotes

Compact current quotes for several symbols at once (per-symbol not-found list).

get_history

Historical OHLCV data (period/interval or explicit date range).

get_company_info

Company profile and key statistics (sector, market cap, P/E, …).

get_financials

Income statement, balance sheet, or cash flow (annual/quarterly/ttm).

get_dividends

Dividend and stock-split history.

get_news

Recent news headlines (title, summary, publisher, URL), up to the 10 Yahoo serves.

get_recommendations

Analyst recommendation trend and price targets.

get_options

Option expiration dates and the calls/puts chain for a date, centred on the money.

get_earnings

Upcoming and historical earnings (EPS estimate/actual, surprise).

get_estimates

Forward analyst estimates (earnings, revenue, EPS trend/revisions, growth).

get_upgrades_downgrades

Recent analyst rating changes (upgrades/downgrades).

get_holders

Ownership breakdown (insider/institutional %, top institutional and mutual-fund holders).

get_insider_activity

Insider transactions, 6-month purchases/sales summary, and current roster.

get_sec_filings

Recent SEC filings (type, date, title, EDGAR/exhibit links).

get_calendar

Upcoming earnings and dividend / ex-dividend dates with estimate ranges.

get_shares

Shares-outstanding history (date → shares), the last 18 months unless a start date is given.

get_fund_data

Fund/ETF profile: overview, asset-class & sector weightings, top holdings.

get_sector

Browse a market sector by key: overview, top companies/ETFs/funds, industries.

get_industry

Browse an industry by key: overview, parent sector, top/top-performing/top-growth companies.

get_market

Trading status and headline index summary for a market (US, EUROPE, ASIA, …).

screen

Find stocks by criteria (dividend yield, P/E, market cap, region, sector, …), ranked, with the total number of matches.

Most get_* tools take a Yahoo Finance symbol — either a ticker (AAPL, SAP.DE) or a plain ISIN. Use search to turn a company name into one. Four tools are exceptions: get_sector and get_industry take a sector or industry key (e.g. technology, semiconductors), get_market takes a market key (e.g. US), and screen takes filters such as {"field": "dividend_yield", "op": "gt", "value": 3} and finds the symbols itself.

basic-materials (14) agricultural-inputs, aluminum, building-materials, chemicals, coking-coal, copper, gold, lumber-wood-production, other-industrial-metals-mining, other-precious-metals-mining, paper-paper-products, silver, specialty-chemicals, steel

communication-services (7) advertising-agencies, broadcasting, electronic-gaming-multimedia, entertainment, internet-content-information, publishing, telecom-services

consumer-cyclical (23) apparel-manufacturing, apparel-retail, auto-manufacturers, auto-parts, auto-truck-dealerships, department-stores, footwear-accessories, furnishings-fixtures-appliances, gambling, home-improvement-retail, internet-retail, leisure, lodging, luxury-goods, packaging-containers, personal-services, recreational-vehicles, residential-construction, resorts-casinos, restaurants, specialty-retail, textile-manufacturing, travel-services

consumer-defensive (12) beverages—brewers, beverages—non-alcoholic, beverages—wineries-distilleries, confectioners, discount-stores, education-training-services, farm-products, food-distribution, grocery-stores, household-personal-products, packaged-foods, tobacco

energy (8) oil-gas-drilling, oil-gas-e&p, oil-gas-equipment-services, oil-gas-integrated, oil-gas-midstream, oil-gas-refining-marketing, thermal-coal, uranium

financial-services (15) asset-management, banks—diversified, banks—regional, capital-markets, credit-services, financial-conglomerates, financial-data-stock-exchanges, insurance-brokers, insurance—diversified, insurance—life, insurance—property-casualty, insurance—reinsurance, insurance—specialty, mortgage-finance, shell-companies

healthcare (11) biotechnology, diagnostics-research, drug-manufacturers—general, drug-manufacturers—specialty-generic, health-information-services, healthcare-plans, medical-care-facilities, medical-devices, medical-distribution, medical-instruments-supplies, pharmaceutical-retailers

industrials (25) aerospace-defense, airlines, airports-air-services, building-products-equipment, business-equipment-supplies, conglomerates, consulting-services, electrical-equipment-parts, engineering-construction, farm-heavy-construction-machinery, industrial-distribution, infrastructure-operations, integrated-freight-logistics, marine-shipping, metal-fabrication, pollution-treatment-controls, railroads, rental-leasing-services, security-protection-services, specialty-business-services, specialty-industrial-machinery, staffing-employment-services, tools-accessories, trucking, waste-management

real-estate (12) real-estate-services, real-estate—development, real-estate—diversified, reit—diversified, reit—healthcare-facilities, reit—hotel-motel, reit—industrial, reit—mortgage, reit—office, reit—residential, reit—retail, reit—specialty

technology (12) communication-equipment, computer-hardware, consumer-electronics, electronic-components, electronics-computer-distribution, information-technology-services, scientific-technical-instruments, semiconductor-equipment-materials, semiconductors, software—application, software—infrastructure, solar

utilities (6) utilities—diversified, utilities—independent-power-producers, utilities—regulated-electric, utilities—regulated-gas, utilities—regulated-water, utilities—renewable

Symbol resolution

All get_* tools expect a Yahoo Finance symbol. Both a ticker (AAPL, SAP.DE) and a plain ISIN (US0378331005) work. An ISIN is resolved by yfinance itself: anything shaped like one is looked up through Yahoo's search the moment the ticker object is created, and the ticker found stands in for it from then on. The server passes the symbol through unchanged apart from trimming and uppercasing, and echoes what it was given. A symbol has at most 32 characters and the shape Yahoo uses, letters, digits and . - ^ = &, as in ^GSPC, EURUSD=X or BRK-B. Anything else, and an ISIN-shaped string that Yahoo cannot resolve, answers as an unknown symbol.

To turn a company name into a symbol, call search first — the same Yahoo search endpoint handles free text, tickers, and ISINs. A ticker is preferable to an ISIN in any case, because the symbol reported back then stays consistent across tools.

Two caveats. That ISINs work is observed behaviour of an unofficial endpoint, not a guarantee: it did not work in earlier versions and it may stop again. And German WKNs resolve nowhere, not through the tools and not through search — Yahoo has no lookup for them, so ask for a ticker, an ISIN or the company name instead.

Compatible clients

MCP is an open protocol, so this server is not tied to one application. Every MCP client can use it. What differs is only which transport the client speaks, and that decides how you start the server.

Locally, over stdio. The client launches the server as a subprocess and talks to it over stdin and stdout. This is the default transport and needs no network. Claude Desktop, Claude Code, Cursor, VS Code (Copilot agent mode), Zed, Windsurf, the JetBrains AI assistants, Cline, Roo Code, Continue and Goose all work this way. Claude Desktop also takes the server as an extension, a single file to open, see Quick start. The configuration file differs per client, but the command is always the one shown under Claude Desktop with uv:

{ "command": "uvx", "args": ["benethos-yahoo-finance-mcp"] }

Over the network, streamable-HTTP. The server runs once and clients connect to http://<host>:8000/mcp, or to https://<domain>/mcp with a bearer token behind the Caddy profile of the production compose file. Start it with --transport streamable-http, or use the Docker image, which serves this transport by default. Browser-based and multi-user front ends need it — Open WebUI supports MCP natively over streamable-HTTP and over no other transport, because a shared web front end cannot hold one stdio process per user. LibreChat and Windsurf accept it alongside stdio.

Over the network, SSE. The older HTTP transport, still expected by some clients. Start it with --transport sse and point the client at http://<host>:8000/sse. The MCP Client Tool node in n8n connects this way.

Both HTTP transports are open by default, guarded by a Host allow-list and an optional bearer token. Read the notes under Running as a standalone server before exposing either one.

Not listed? Client support moves quickly. Check which transport yours speaks, then use the matching command above — the transports are stable even when the list of names is not.

Requirements

  • uv (recommended) — manages Python, the virtual environment, and dependencies in one tool.

  • Or, without uv: Python 3.11+ with pip / venv.

  • git is only needed for the optional install-from-source method.

Installation

Quick start: Claude Desktop extension

The simplest way for Claude Desktop. Nothing needs to be installed first, no uv, no Python and no configuration file: Claude Desktop brings what the extension needs.

  1. Download benethos-yahoo-finance-mcp.mcpb, the extension of the newest release. Every release also carries it under its version, on the releases page.

  2. Open it with a double click, or drag it onto Claude Desktop → Settings → Extensions. Claude Desktop shows the tools and asks to install.

  3. Ask something that needs market data, in a new chat. The first start installs the dependencies and takes a few seconds, later starts are quick.

If the server is also listed in claude_desktop_config.json, remove that entry, or every tool shows up twice. The extension is for Claude Desktop only. Other clients use the command below.

Claude Desktop with uv (manual config)

No clone, no manual virtual environment, no git. uvx fetches and runs it on demand from PyPI (published as benethos-yahoo-finance-mcp).

  1. Install uv, if you have not already — the uv installation page covers every platform. It brings uvx, and that is the only thing needed here.

  2. Add the server to claude_desktop_config.json (Claude Desktop → Settings → Developer → Edit Config):

    {
      "mcpServers": {
        "benethos-yahoo-finance-mcp": {
          "command": "uvx",
          "args": ["benethos-yahoo-finance-mcp"]
        }
      }
    }

    Pin a version for stability with benethos-yahoo-finance-mcp==0.8.7. To enable the optional result cache, add an env block, e.g. "env": { "YF_MCP_CACHE": "1" } (see Caching).

  3. Restart Claude Desktop (quit from the tray, not just close the window). The tools then appear in the client.

Installing from source instead? You can run the unreleased main branch with uvx --from "git+https://github.com/benethos-hub/yahoo-finance-mcp.git" benethos-yahoo-finance-mcp. That path needs git on the PATH of the process the client spawns — some GUI clients don't pass a full PATH, so prefer the PyPI install above.

uvx must be on the PATH the client uses. After installing uv, fully restart the app — or use the absolute path to uvx as command. The first launch downloads the package and its dependencies, so it takes a moment. Later launches use the cache.

Other ways to install

From the MCP Registry. Every release from 0.8.2 on is listed in the official MCP Registry as io.github.benethos-hub/benethos-yahoo-finance-mcp, with the PyPI package and the container image, and since 0.8.4 with the Claude Desktop bundle too (entry). A client that installs from the registry starts it with uvx, or with docker run -i --rm and --transport stdio, and needs no settings. Since 0.8.3 the container entry also runs read-only, without capabilities and without the HTTP health check, as in the hardened docker run example under Docker. The MCP list in VS Code's extension view (@mcp) is GitHub's own selection, and a listing in the registry does not put a server there.

From PyPI with pip (no uv, no clone). Install the published package into a virtual environment and run it as a module. The only platform difference is the venv interpreter path: Windows uses .venv\Scripts\python.exe, Linux/macOS use .venv/bin/python.

# Windows (PowerShell)
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install benethos-yahoo-finance-mcp
# Linux / macOS (bash)
python3 -m venv .venv
.venv/bin/python -m pip install benethos-yahoo-finance-mcp

Point Claude Desktop at the absolute path of the venv interpreter and run the module (no generated console script involved):

{
  "mcpServers": {
    "benethos-yahoo-finance-mcp": {
      "command": "/abs/path/to/.venv/bin/python",
      "args": ["-m", "benethos_yahoo_finance_mcp"]
    }
  }
}

(On Windows use C:\\abs\\path\\to\\.venv\\Scripts\\python.exe as command.)

From source with uv (for development or local changes):

git clone https://github.com/benethos-hub/yahoo-finance-mcp.git
cd yahoo-finance-mcp
uv sync --extra dev          # creates .venv + installs deps from uv.lock
uv run benethos-yahoo-finance-mcp     # run over stdio

Point Claude Desktop at the checkout:

{
  "mcpServers": {
    "benethos-yahoo-finance-mcp": {
      "command": "uv",
      "args": ["run", "--project", "/abs/path/to/yahoo-finance-mcp", "benethos-yahoo-finance-mcp"]
    }
  }
}

From source with venv + pip (no uv). The only platform difference is the venv interpreter path: Windows uses .venv\Scripts\python.exe, Linux/macOS use .venv/bin/python.

# Windows (PowerShell)
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
# Linux / macOS (bash)
python3 -m venv .venv
.venv/bin/python -m pip install -e .

Claude Desktop config uses the absolute path to the venv interpreter:

{
  "mcpServers": {
    "benethos-yahoo-finance-mcp": {
      "command": "/abs/path/to/.venv/bin/python",
      "args": ["-m", "benethos_yahoo_finance_mcp"]
    }
  }
}

(On Windows use C:\\abs\\path\\to\\.venv\\Scripts\\python.exe as command.)

Running as a standalone server

For use outside Claude Desktop — a network-reachable HTTP service — run an HTTP transport (streamable-http or sse). Docker is the simplest way.

Every option has both a CLI flag and an environment variable (handy for containers), with one deliberate exception noted below. Precedence is CLI > environment > default (--help lists the flags):

Flag

Env var

Default

Description

--version

—

—

Print the version and exit. Same value the server reports in the MCP handshake.

--transport

YF_MCP_TRANSPORT

stdio

stdio, streamable-http, or sse.

--host

YF_MCP_HOST

127.0.0.1

Bind host for HTTP transports (0.0.0.0 for remote).

--port

YF_MCP_PORT

8000

Port for HTTP transports (1 to 65535).

--path

YF_MCP_PATH

/mcp (/sse for sse)

URL path for HTTP transports.

(none)

YF_MCP_BEARER_TOKEN

unset

Require this bearer token on every HTTP request. Environment only, deliberately: an argument is visible in the process list.

--allowed-hosts

YF_MCP_ALLOWED_HOSTS

see below, or derived from origins

Comma-separated Host header allow-list for the DNS-rebinding guard.

--allowed-origins

YF_MCP_ALLOWED_ORIGINS

derived from hosts

Comma-separated Origin header allow-list.

--log-level

YF_MCP_LOG_LEVEL

INFO

DEBUG/INFO/WARNING/ERROR/CRITICAL.

--cache / --no-cache

YF_MCP_CACHE

off

Enable/disable the persistent result cache.

--cache-dir

YF_MCP_CACHE_DIR

OS cache dir

Directory for the cache file.

--cache-max-entries <N>

YF_MCP_CACHE_MAX_ENTRIES

10000

Most entries the cache keeps, the oldest go first.

--cache-ttl <NAME>=<SECONDS>

YF_MCP_CACHE_TTL_<NAME>

per-tool defaults

Override one tool's TTL.

Logging always goes to stderr, so under stdio stdout stays reserved for the JSON-RPC protocol. At INFO every tool call leaves one line with its symbol, the size of the answer, the time it took and whether the result cache answered, for example get_history SAP.DE 250 rows, truncated, 412 ms. A failed call is a WARNING naming the error's class, and so is a Yahoo rate limit. Over HTTP a refused request (status 400 and up, 401 and 421 included) is logged with the address that tried. DEBUG adds every answered request. The log never contains the bearer token, a search query, a URL's query string, the data Yahoo returned or the text of an error message.

Every line names its source short: server, tools, yahoo, cache, uvicorn for uvicorn's server log and http for requests, and the time as ISO 8601 to the millisecond with its offset, for example 2026-09-30T13:19:02.840+02:00 INFO tools: get_quote AAPL 312 ms. The time is the machine's local time. A container's is UTC (+00:00) unless you set TZ, e.g. TZ=Europe/Berlin. At a terminal the lines come in colour, set NO_COLOR to turn that off. Anywhere else, in a container log say, each line is plain text.

Bearer token (optional). Set YF_MCP_BEARER_TOKEN and every HTTP request must carry Authorization: Bearer <token>. Anything else gets HTTP 401. It is off by default, because the ordinary case is a server on the loopback address of the machine that uses it, where a token guards against nothing. It is a single shared secret compared in constant time, not an OAuth flow — the question is only whether the caller is expected. stdio ignores it: the client owns that process and nothing else can reach it.

A token does not make a port safe to publish. The data here is public and read-only, so the realistic damage is somebody spending your Yahoo rate limit, not reading something private. Beyond a trusted network, put a reverse proxy with real authentication in front.

Host header / DNS-rebinding guard. The MCP HTTP transport validates the Host header. A localhost bind keeps a protective allow-list (localhost/127.0.0.1). An exposed bind (0.0.0.0) accepts any Host by default, so containers and other hosts can reach it out of the box. To lock it down again, set --allowed-hosts (e.g. benethos-yahoo-finance-mcp:8000) — clients whose Host is not on the list then get HTTP 421. --allowed-origins works on its own as well, and either list is derived from the other when only one is given. Both compose files in containers/ set the list for you: localhost:*,127.0.0.1:*,[::1]:*,benethos-yahoo-finance-mcp:*. Without it a web page whose domain an attacker points at 127.0.0.1 could call every tool from a browser on the host. Add the name a proxy in front uses.

Docker

The published image is the shortest path to a running server — no Python, no clone, no build. Every release is pushed to the GitHub Container Registry for linux/amd64 and linux/arm64:

docker run --rm -p 8000:8000 ghcr.io/benethos-hub/benethos-yahoo-finance-mcp:latest
# Server is now reachable at http://localhost:8000/mcp

Pin a version for anything you depend on — :0.8.7 for an exact release, :0.8 to follow its patch releases. :latest moves with every release, and :edge is built from main on demand and is not a release at all.

The image carries the name of the PyPI distribution, and every release from 0.4.0 on is available under it. Up to 0.7.1 it was published as ghcr.io/benethos-hub/yahoo-finance-mcp, and those releases were copied over with the same digest. The 0.7 line was pushed under the old name as well, the same image again. Since 0.8.0 only the new name gets releases.

The image hosts the server over the streamable-HTTP transport. The stdio transport is for local subprocess use and is not what you containerize. Dependencies are installed reproducibly from uv.lock via uv, and the base images are pinned by digest, so a rebuild of the same commit gets the same bytes.

The image is configured entirely through environment variables (see the options table above) — it carries no default command arguments, so overriding a single setting with -e does not disturb the others.

# Build it yourself instead of pulling (e.g. to run an unreleased main),
# from the repository root
docker build -f containers/images/yahoo-finance-mcp/Dockerfile -t benethos-yahoo-finance-mcp .

# Run with the built-in defaults (streamable-HTTP on 0.0.0.0:8000)
docker run --rm -p 8000:8000 benethos-yahoo-finance-mcp
# Server is now reachable at http://localhost:8000/mcp

# Override settings via -e, opt into the cache and persist it in a named volume
docker run --rm -p 9000:9000 \
    -e YF_MCP_PORT=9000 \
    -e YF_MCP_LOG_LEVEL=DEBUG \
    -e YF_MCP_CACHE=1 \
    -v benethos-yahoo-finance-mcp-cache:/cache \
    benethos-yahoo-finance-mcp

The image runs as a non-root user and includes a healthcheck on the configured HTTP port. The healthcheck reads that port from YF_MCP_PORT, so change it with -e YF_MCP_PORT=9000, not with an appended --port 9000, or the container stays unhealthy. The cache is off by default. Enable it with -e YF_MCP_CACHE=1, in which case it is written to /cache (declared as a volume) — mount a named volume there to keep it across container restarts. To require a bearer token on every request, put YF_MCP_BEARER_TOKEN=... in a .env (see containers/production/.env.example) and pass --env-file .env. -e YF_MCP_BEARER_TOKEN=... works as well, but leaves the secret in your shell history. Beyond a trusted network, front it with a reverse proxy that authenticates. Docker keeps the container's log without a cap unless told otherwise, so add --log-opt max-size=10m --log-opt max-file=5 to a docker run that is meant to stay up, or set the same in the daemon's log-opts once for every container.

The container runs with a read-only root file system, as the compose files do, when it gets a writable /tmp and a writable cache for yfinance in the home directory. Without the second, yfinance silently does without its cookie and time zone cache and asks Yahoo again each time:

docker run --rm -p 8000:8000 --read-only --tmpfs /tmp \
    --tmpfs /home/appuser/.cache:uid=10001,gid=10001,mode=0700 \
    --cap-drop ALL --security-opt no-new-privileges:true \
    ghcr.io/benethos-hub/benethos-yahoo-finance-mcp:latest

The server needs a home directory it can resolve, because yfinance keeps a small cache of its own there and looks the location up as soon as it is imported. The image's user has one, and Docker and Kubernetes give any other UID HOME=/, so nothing needs doing in the usual setups. If you run as a UID with no passwd entry and remove HOME, which a hardened pod spec or a systemd unit can do, the server stops at startup with could not determine the home directory. Set HOME or an absolute XDG_CACHE_HOME and it starts.

Docker Compose

Two compose files, each in a folder of its own under containers/:

Folder

For

Image

Port

containers/production/

running the released server, no clone needed

ghcr.io/benethos-hub/benethos-yahoo-finance-mcp at the version in .env

127.0.0.1:8000, with the profile https Caddy on 80 and 443

containers/development/

trying a change, the only way to run an unreleased main

built from this checkout

127.0.0.1:8001

To operate the server, fetch the production folder's three files into an empty folder and start it there:

mkdir yahoo-finance-mcp && cd yahoo-finance-mcp
for file in compose.yaml Caddyfile .env.example; do
  curl -fsSL -o "$file" "https://raw.githubusercontent.com/benethos-hub/yahoo-finance-mcp/main/containers/production/$file"
done
cp .env.example .env      # names the version, set the token here too
docker compose up -d      # pull (if needed) and start in the background
docker compose logs -f    # follow logs
docker compose down       # stop and remove

The server is then reachable at http://localhost:8000/mcp. YAHOO_FINANCE_MCP_VERSION in .env names the image version and has no default, so nothing changes under you on a pull. To update, set the new version there, then docker compose pull && docker compose up -d. From a checkout, docker compose up -d --build in containers/development/ builds and starts the server on port 8001. Their project names differ, so both can run side by side, each with a cache volume of its own. This requires Docker Compose 2.24 or newer.

The port is published on 127.0.0.1 only, so the service is reachable from the host but not from the rest of the network. That is deliberate, since the server is unauthenticated unless YF_MCP_BEARER_TOKEN is set. To expose it, remove the 127.0.0.1: prefix from the ports: entry, set the token at the very least, and put a reverse proxy with authentication in front of it. Set YAHOO_FINANCE_MCP_PORT in .env if the host port is taken.

For clients on other machines, the production folder brings such a proxy along. With COMPOSE_PROFILES=https, YAHOO_FINANCE_MCP_DOMAIN and YF_MCP_BEARER_TOKEN in .env, Caddy starts in front of the server on ports 80 and 443, gets a certificate for the domain from Let's Encrypt, from its own CA or from files you provide (YAHOO_FINANCE_MCP_TLS), and turns away a request without an Authorization header before it reaches the server. The server's port stays on 127.0.0.1. The containers README has the details.

Both files run the container with a read-only root file system, no Linux capabilities and no-new-privileges, with a tmpfs for /tmp and for yfinance's cache. They cap the log Docker keeps of the container at 5 files of 10 MB, the oldest dropped first (x-logging). To keep more, raise max-size or max-file. To keep the log elsewhere, replace the driver, for example with journald, and read it with journalctl CONTAINER_NAME=benethos-yahoo-finance-mcp.

Secrets go in the .env beside the compose file, which Compose reads through env_file and git and the Docker build context both ignore. Set YF_MCP_BEARER_TOKEN there, not in compose.yaml. Compose takes YAHOO_FINANCE_MCP_VERSION, YAHOO_FINANCE_MCP_PORT and COMPOSE_PROFILES for itself, hands YAHOO_FINANCE_MCP_DOMAIN and YAHOO_FINANCE_MCP_TLS to Caddy, and everything else to the server. A name set under environment: in compose.yaml wins over the same name in .env. Only Compose reads the file. The server itself never loads it, so for a plain docker run pass --env-file .env, and for a local or Claude Desktop setup keep using the environment.

A setup from the compose file that used to sit at the repository root moves to containers/production/. Its project name is the same, so the cache volume stays.

Manual (uv or venv)

With uv (any OS):

# Streamable HTTP on http://127.0.0.1:8000/mcp
uv run benethos-yahoo-finance-mcp --transport streamable-http

# Bind all interfaces on a custom port / path
uv run benethos-yahoo-finance-mcp \
    --transport streamable-http --host 0.0.0.0 --port 9000 --path /yf

With the venv interpreter directly (Windows: .venv\Scripts\python.exe):

.venv/bin/python -m benethos_yahoo_finance_mcp --transport streamable-http

Caching

An opt-in persistent cache. When enabled, successful tool results are cached in a small SQLite file with a per-tool time-to-live (TTL) to reduce load on Yahoo's endpoints and survive restarts. Fast-moving data has a short TTL, stable data a long one.

Every call asks Yahoo anew, and the cache is what makes a repeat cheap, across restarts and as rate-limit protection. It is off by default because the ordinary case is an interactive session over stdio, where a repeat is rare and fresh data counts for more, and because a file on disk is the operator's choice.

Cache names (used for --cache-ttl <NAME>=<SECONDS> and YF_MCP_CACHE_TTL_<NAME>) and their default TTLs:

Name

Tool

Default TTL

quote

get_quote

30 s

quotes

get_quotes

30 s

history

get_history

10 min

news

get_news

10 min

options

get_options

10 min

screen

screen

10 min

search

search

1 h

company_info

get_company_info

6 h

dividends

get_dividends

6 h

recommendations

get_recommendations

6 h

earnings

get_earnings

6 h

estimates

get_estimates

6 h

upgrades_downgrades

get_upgrades_downgrades

6 h

insider_activity

get_insider_activity

6 h

sec_filings

get_sec_filings

6 h

calendar

get_calendar

6 h

financials

get_financials

24 h

holders

get_holders

24 h

shares

get_shares

24 h

fund_data

get_fund_data

24 h

sector

get_sector

24 h

industry

get_industry

24 h

market

get_market

60 s

  • Off by default. Enable with --cache or YF_MCP_CACHE=1.

  • Location: the OS user cache directory, or --cache-dir / YF_MCP_CACHE_DIR. The file grows with what it holds and shrinks again after expired entries are swept. A file made by an earlier version is rewritten once at start.

  • Size: at most 10 000 entries, the most recently written kept, set with --cache-max-entries / YF_MCP_CACHE_MAX_ENTRIES.

  • Override a TTL: --cache-ttl quote=15 (repeatable) or the YF_MCP_CACHE_TTL_<NAME> env var (e.g. YF_MCP_CACHE_TTL_QUOTE=15). Set a TTL to 0 to bypass caching for that tool.

Precedence is CLI > environment > default. Errors are never cached, and a failing cache never fails a call: a locked or damaged cache file is logged and the data is fetched as if caching were off.

When to enable it

Enable the cache (--cache / YF_MCP_CACHE=1) if you:

  • run the server as a long-running or containerized HTTP service that restarts periodically (the cache survives restarts → instant repeat results).

  • hit Yahoo rate limits or make many repeated identical requests over time.

  • mostly query slow-changing data (search, company info, financials), where staleness is irrelevant.

Leave it off (the default) if you:

  • run it locally over stdio for interactive sessions — a repeat of the same question within minutes is rare there, and fresh data counts for more.

  • need the freshest possible data.

  • use it only occasionally.

Development

How the code is laid out, module by module, is in SPECS.md.

Install the dev extras, then run the test, lint, and type-check steps (the same ones CI runs).

With uv (any OS):

uv sync --extra dev

uv run pytest -q                 # unit tests (offline)
uv run ruff check .              # lint
uv run ruff format .             # format
uv run mypy                      # type check
uv run pytest --cov=benethos_yahoo_finance_mcp   # coverage

With the venv interpreter directly (replace .venv/bin/python with .venv\Scripts\python.exe on Windows):

.venv/bin/python -m pip install -e ".[dev]"

.venv/bin/python -m pytest -q                 # unit tests (offline)
.venv/bin/python -m ruff check .              # lint
.venv/bin/python -m ruff format .             # format
.venv/bin/python -m mypy                      # type check
.venv/bin/python -m pytest --cov=benethos_yahoo_finance_mcp   # coverage

The unit tests mock yfinance and run fully offline. tests/smoke.py performs an ad-hoc check against live Yahoo Finance and is not part of the unit suite. CI also runs across Python 3.11–3.15 and enforces an 80% coverage floor, measured on 3.15, and the coverage badge above shows what that run measured on main. Two more jobs install without the lockfile: fresh-install with the newest versions pyproject.toml allows, lowest-versions with the oldest. Every version in uv.lock and every lowest version is checked for known vulnerabilities against PyPI and OSV.

Trademarks

"Yahoo" and "Yahoo Finance" are trademarks of Yahoo Inc. This project is not affiliated with, endorsed by, or sponsored by Yahoo, and it is not an official Yahoo product.

The names are used here only to describe what the software does, namely read market data from Yahoo Finance through the yfinance library. That is the only accurate way to say it. All trademarks remain the property of their respective owners.

The project itself is published as benethos-yahoo-finance-mcp and is maintained independently under the MIT licence.

Available Tools

23 tools
get_calendarCorporate calendarA
Read-only

Get upcoming corporate-calendar events for a Yahoo symbol.

Returns the next earnings date(s) with analyst estimate ranges and the next dividend / ex-dividend dates. Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds substantive context beyond them, namely the equity-only restriction, the explicit error behavior for non-equity symbols, and a concrete inventory of what is returned. It stops short of noting rate limits or how many future events are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the verb and resource, followed by return contents and then the constraint. Every sentence earns its place with no repetition of the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value structure need not be explained, and the description still sketches the payload. The equity-only behavior and the symbol requirement are both covered. The remaining gap is routing guidance relative to the overlapping get_earnings/get_dividends siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one parameter, so the schema already documents the symbol format, ISIN support and the 'use search first' fallback. The description's only parameter-adjacent content is the equity-only constraint, which is behavioral rather than semantic; baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get upcoming corporate-calendar events for a Yahoo symbol') and enumerates the payload (next earnings date(s) with analyst estimate ranges, next dividend/ex-dividend dates). It is clearly distinguishable from most siblings, though it never contrasts itself with the closely overlapping get_earnings and get_dividends tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope: this is the combined calendar view (earnings + dividends). The 'Equity-only' sentence functions as a real exclusion — an ETF/fund/crypto symbol will error — which is useful when-not guidance. However, it names no alternative for those cases (e.g. get_fund_data) and never tells the agent when to prefer this over get_earnings or get_dividends.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_company_infoCompany profileA
Read-only

Get a company profile and key statistics for a Yahoo symbol.

Returns name, sector/industry, location, employee count, and valuation metrics (market cap, trailing and forward P/E, P/B, beta, 52-week range, dividend yield) plus a business summary. For an ISIN, resolved_symbol names the ticker it stands for.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the ISIN-to-ticker resolution via 'resolved_symbol'. It says nothing about auth, rate limits, or failure modes for invalid symbols.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose in the first sentence, then a dense but useful field enumeration, ending with the ISIN caveat. No filler, though the parenthetical metric list is long enough to border on a return-value dump.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, full parameter coverage, and readOnly/openWorld annotations, the description only needs to frame scope and it does so, including the ISIN edge case. It could be slightly stronger by naming which sibling to use for pure price data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter, so the schema already documents the accepted ticker/ISIN formats and the 'search' fallback. The description's ISIN note is largely redundant with the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a company profile and key statistics') and enumerates the returned data (sector/industry, employees, valuation metrics, business summary), which separates it from get_quote and get_financials. It does not explicitly name a sibling it replaces, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the enumeration of static profile fields signals this is the tool for company-level facts rather than price history or statements. There is no explicit when-to-use/when-not, and the 'use search first for a company name' routing lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dividendsDividends and splitsA
Read-only

Get the dividend and stock-split history for a Yahoo symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile is covered. The description adds that the data is historical (dividend and split history) and scoped to a Yahoo symbol, which is useful but not rich behavioral detail. It does not describe output shape or ordering, though an output schema exists to carry that. A 3 is fair given annotations do the heavy lifting.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource, containing zero filler. Every word earns its place, and there is no redundancy with the schema or annotations. Ideal economy of expression.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only historical data tool with a 100% covered schema and a present output schema, the description is nearly complete. The task of return-value explanation is delegated to the output schema, which is acceptable. The only minor gap is the absence of usage routing relative to siblings like get_history, but nothing an agent needs to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single parameter 'symbol' is fully documented in the schema (including maxLength, ISIN support, and the fallback to 'search' for company names). The description adds no syntax, format, or constraint detail beyond what the schema already provides. Baseline 3 is correct when schema coverage is high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource: 'Get the dividend and stock-split history for a Yahoo symbol.' The scope (dividends and splits, historical) is specific enough for an agent to distinguish from siblings like get_quote or get_history, though it does not name those alternatives explicitly. This is a solid, specific purpose statement that needs no further decoding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (fetch dividend/split history for a given symbol) but offers no explicit when-to-use vs when-not-to-use guidance. It does not tell the agent to prefer get_dividends over get_history when only dividend/split data is needed, nor does it state the conditions that make this the right call. Adequate but thin.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_earningsEarningsA
Read-only

Get upcoming and historical earnings for a Yahoo symbol.

Returns the earnings calendar (upcoming and past dates with EPS estimate, reported EPS, and surprise %) plus the recent earnings history. Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of earnings rows to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly and openWorld, so the bar is lower; the description adds real value by disclosing the equity-only restriction and the resulting error, plus the returned fields (EPS estimate, reported EPS, surprise %). It stops short of describing pagination or limit interaction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight, front-loaded sentences: purpose first, return content second, constraint third. No filler, and all content earns its place, though the return-detail sentence partly overlaps the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with an output schema and annotation coverage, the description is essentially complete; the equity-only caveat is a helpful addition. Since return values are already captured by the output schema, the description need not do more.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both 'symbol' and 'limit' are fully documented in the schema. The description reinforces that a Yahoo symbol is expected but adds no syntax or format detail beyond what the schema already provides, matching the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('upcoming and historical earnings') for a Yahoo symbol, making the tool's function immediately clear. It does not explicitly distinguish itself from overlapping siblings like get_estimates or get_calendar, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource name rather than stated. It notes the equity-only constraint (ETF/fund/crypto returns an error), which is useful, but gives no explicit when-to-use guidance or named alternatives vs get_estimates/get_calendar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_estimatesAnalyst estimatesA
Read-only

Get forward analyst estimates for a Yahoo symbol.

Returns earnings and revenue estimates, EPS trend and revisions, and growth estimates (small tables keyed by period). Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds value beyond that by disclosing a failure mode not present in any structured field: non-equity symbols (ETF, fund, crypto) return an error saying so, and results are 'small tables keyed by period'. It stops short of describing rate limits or auth, but the error behavior is a useful behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core purpose before the return contents and the equity-only caveat. The middle sentence restating return values is mildly redundant given an output schema exists, but it is brief and earns most of its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param read tool, the definition covers purpose, output shape, and the key failure mode, and annotations plus an output schema carry the safety and return-value burden. The only real gap is the absence of sibling routing, which is minor given how self-descriptive the tool is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single 'symbol' parameter is already fully documented in the schema (Yahoo ticker or ISIN, with the search fallback for company names). The description adds no format or syntax detail beyond that, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Get forward analyst estimates for a Yahoo symbol') and enumerates the returned content (earnings/revenue estimates, EPS trend/revisions, growth estimates), which lets an agent distinguish it from broader siblings like get_financials. However, it never explicitly contrasts itself with the closest sibling, get_earnings, leaving some differentiation to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent infers it should call this when it wants forward-looking analyst estimates. The 'Equity-only' note functions as a genuine exclusion (ETF/fund/crypto will fail), but there are no explicit alternatives or when-to-use routing against siblings such as get_earnings or get_recommendations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_financialsFinancial statementsB
Read-only

Get a financial statement for a Yahoo symbol.

Each row is a line item and each column a reporting period, most recent first.

ParametersJSON Schema
NameRequiredDescriptionDefault
freqNoReporting frequency: 'annual', 'quarterly', or 'ttm' (trailing twelve months, income and cashflow only).annual
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.
statementNoWhich statement: 'income' (income statement), 'balance' (balance sheet), or 'cashflow' (cash flow).income

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine value by disclosing the return layout (rows are line items, columns are reporting periods, most recent first), but says nothing about frequency/statement interactions or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the purpose front-loaded and no filler. The second sentence earns its place by describing the data orientation, which is not obvious from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and annotations plus full schema coverage handle safety and parameters. The layout note rounds it out; only minor usage-routing context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so freq, symbol, and statement are all fully documented in the schema, including the 'ttm' restriction to income and cashflow. The description adds no parameter meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get a financial statement'), which is clearly distinct from siblings like get_earnings, get_quote, and get_company_info. However, it never names an alternative, so differentiation is inferred from the resource noun rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use or when-not-to-use guidance and names no alternative tool. The useful routing hint ('For a company name, use search first') lives only in the symbol parameter's schema description, not in the tool description itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fund_dataFund profileA
Read-only

Get fund/ETF profile data for a Yahoo symbol.

Returns the fund overview, asset-class and sector weightings, and the top holdings. Fund/ETF-only, raises for stocks and crypto, which have no fund data.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of top holdings to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely useful behavior the annotations don't: it will raise/error on stocks and crypto, telling the agent how failure manifests. It does not discuss rate limits or pagination of holdings beyond the limit param.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose, then the return payload, then the key restriction. No filler or restated title content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be detailed, yet the description still summarizes the payload; identifiers, scope, error behavior, and safety are all covered. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'symbol' (ticker/ISIN format, search-first hint) and 'limit' (1-100 max holdings) fully documented in the schema. The description only echoes 'Yahoo symbol' and adds no format or default detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('Get') plus resource ('fund/ETF profile data') and an explicit enumeration of what comes back (overview, asset-class and sector weightings, top holdings). The asset-class scope ('Fund/ETF-only') cleanly separates it from the company/equity siblings like get_company_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States a clear when-not condition: it 'raises for stocks and crypto, which have no fund data,' which steers the agent away from using it on regular equities. It stops short of naming the sibling to use instead (e.g. get_company_info or get_sector).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyPrice historyA
Read-only

Get historical OHLCV (open/high/low/close/volume) data for a symbol.

Query a look-back period or an explicit start/end range. Results are capped at the most recent 250 rows, with truncated set when cut.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd date 'YYYY-MM-DD', exclusive: for one day pass the day after. Used only together with 'start'.
startNoStart date 'YYYY-MM-DD'. Overrides 'period' when set.
periodNoLook-back window: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max, or any count of d, wk, mo or y such as 7mo. Ignored when 'start' is given.1mo
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.
intervalNoBar size. One of: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 4h, 1d, 5d, 1wk, 1mo, 3mo. Intraday intervals only cover recent dates.1d

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral context beyond the annotations: the 250-row cap and the fact that a `truncated` flag is set when results are cut.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core purpose front-loaded, then query modes, then the truncation caveat. No filler, though the middle sentence partly duplicates schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage and an output schema present, the description need not explain return values, and it covers the key non-obvious behavior (row cap, truncated flag). Complete enough for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's note that period and start/end are alternatives largely restates what the schema already states ('Overrides period when set', 'Ignored when start is given'), adding little new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get historical OHLCV data for a symbol'), which clearly separates it from siblings like get_quote/get_quotes that return current pricing. It stops short of naming the alternative explicitly, so the differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to query (period vs. start/end range) but does not say when to choose this tool over siblings such as get_quote or screen. Usage is implied by the resource rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_holdersHoldersA
Read-only

Get the ownership breakdown for a Yahoo symbol.

Returns the high-level holder summary (insider/institutional percentages) plus the top institutional and mutual-fund holders. Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of institutional/mutual-fund holders to return per list.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real value beyond them by disclosing the equity-only failure mode and the exact composition of the response. It omits any note on data freshness/delay, which is the main remaining behavioral gap for a market-data read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, then return contents, then the constraint. No filler and nothing redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description still covers the one gotcha an agent would hit (non-equity symbols erroring). It is nearly complete, lacking only peripheral context such as data recency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both 'symbol' (ticker/ISIN format plus the 'use search first' hint) and 'limit' (per-list cap) are fully documented in the schema. The description adds no syntax or format detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get the ownership breakdown for a Yahoo symbol') and enumerates exactly what comes back: insider/institutional percentages plus top institutional and mutual-fund holders. The equity-only clause implicitly separates it from get_fund_data and get_insider_activity, so an agent can distinguish it from siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-not rule: ETF, fund or crypto symbols return an error saying so, which prevents wasted calls on non-equity tickers. It does not name alternatives (e.g. get_fund_data for funds, get_insider_activity for transaction-level detail), so routing guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_industryIndustryA
Read-only

Browse an industry by its Yahoo key (not a ticker symbol).

Returns the industry overview, its parent sector, top companies, and the top-performing and top-growth companies. Discover valid industry keys from the industries list returned by get_sector. This takes an industry key like semiconductors — not a ticker symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesA Yahoo industry key (lowercase, hyphenated), e.g. 'semiconductors' or 'software-infrastructure'. Discover valid keys from the 'industries' list returned by get_sector.
limitNoMaximum number of top companies to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint and openWorldHint, so safety is covered. The description adds real context beyond that: the data source convention for the key and the fact that the response mixes several curated company lists. It does not discuss failure modes for invalid keys, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the single most common mistake. The 'not a ticker symbol' warning appears twice (opening line and closing line), which is redundant but defensible as emphasis on a high-frequency misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be detailed further. Key acquisition, format caveat, and limiting behavior are all covered; nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the `key` format and `limit` bound (1-100, default 25) are already documented. The description's key-vs-ticker note largely repeats the schema's own wording rather than adding new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Browse an industry by its Yahoo key' and it enumerates the payload (overview, parent sector, top companies, top-performing/growth). It also quietly distinguishes itself from the nearby get_sector, so an agent can tell the two apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete discovery path (valid keys come from the `industries` list returned by `get_sector`) and an explicit exclusion ('not a ticker symbol'). It lacks a stated when-not/conditional alternative, but the routing guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_insider_activityInsider activityA
Read-only

Get insider trading activity for a Yahoo symbol.

Returns individual insider transactions, a 6-month purchases/sales summary, and the current insider roster. Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of insider transactions/roster rows to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds real context on top: the three-part return shape and, importantly, the equity-only constraint with a defined failure mode for ETF/fund/crypto symbols. It does not discuss pagination or how the 6-month window is computed, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then returns, then the constraint. No filler, no restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with full schema coverage, annotations covering the safety profile, and an output schema covering the response, the description supplies everything else an agent needs: what comes back and the one input class that fails.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters (symbol formats, limit bounds) are fully documented in the schema, so the baseline of 3 applies. The description adds no format or default information beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Get insider trading activity for a Yahoo symbol" pairs a specific verb with a specific dataset, then itemizes the three payloads (individual transactions, 6-month purchases/sales summary, insider roster). That distinguishes it from the nearest sibling, get_holders, without the agent needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: call it with a symbol when insider data is wanted. There is no explicit when-to-use or when-not-to-use versus siblings such as get_holders or get_company_info, and the 'use search first for a company name' routing lives in the schema, not the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_marketMarket statusA
Read-only

Get the trading status and headline index summary for a market.

Answers questions like whether the market is open, when it opens or closes next, and how the major indices are doing. Takes a market key such as US or EUROPE — not a ticker symbol. status (open/closed plus the next open and close times) is only available for US and is null for every other key, which is an upstream limitation rather than an error. The index summary, with price, previous close and change, works for all keys.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoA Yahoo market key (uppercase). One of: US, GB, ASIA, EUROPE, RATES, COMMODITIES, CURRENCIES, CRYPTOCURRENCIES. Only 'US' reports a trading status, the others return the index summary with 'status' set to null.US

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only read-only/open-world safety, and the description adds a genuinely valuable behavioral disclosure: `status` is populated only for `US` and is null elsewhere, explicitly framed as an upstream limitation rather than an error. That pre-empts an agent misreading a null as a failure — exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in one sentence, then qualifies input semantics and the US-only status caveat. Every sentence earns its place, though the prose runs slightly longer than a single-parameter tool strictly needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-shape detail is not required, yet the description still sketches what the index summary contains (price, previous close, change) and covers the one edge case an agent would otherwise trip on. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the key enum is documented there, but the description still adds meaning: it reinforces that `key` is a market key rather than a ticker, gives concrete examples (`US`, `EUROPE`), and ties the parameter to the null-status behavior. Marginal but real value above the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the trading status and headline index summary for a market') and immediately scopes it apart from ticker-oriented siblings by noting it takes a market key 'such as `US` or `EUROPE` — not a ticker symbol'. An agent can distinguish this from get_quote/get_quotes without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Enumerates the questions it answers — market open, next open/close, index performance — which gives clear context for when to reach for it. It does not name an explicit alternative tool to prefer when the agent wants per-symbol data, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_newsNewsB
Read-only

Get recent news headlines for a Yahoo symbol (up to limit, 1-10).

Each article includes title, summary, publisher, publish time, and URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of headlines to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-source profile is covered. The description adds no behavioral context beyond that — no rate limits, freshness window, or coverage caveats — and its return-field list is redundant with the existing output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action and free of filler. The second sentence duplicates the output schema's content, which is a small waste but not enough to hurt readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only lookup with an output schema present, the description covers purpose and scope adequately; return values need not be re-explained. The only real gap is the absence of any routing hint toward or away from sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are fully documented in the schema itself. The description restates the 1-10 limit range but adds no new semantic detail (e.g., defaulting or behavior when the symbol has no news), making this the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get recent news headlines') scoped to a Yahoo symbol, which an agent can distinguish from sibling tools like get_quote or get_sec_filings. It is clear but never explicitly contrasts itself with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to prefer this tool over siblings, nor on prerequisites beyond the schema's own note about using 'search' for company names. Usage must be inferred entirely from the name and the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_optionsOption chainA
Read-only

Get the option chain for a Yahoo symbol.

Call without expiration to list available expiration dates. Call with an expiration (YYYY-MM-DD from that list) to get the calls and puts for that date, up to 60 strikes each centred on the current price, with truncated set when a wider chain was cut. Yahoo carries chains for US-listed instruments only, so a non-US symbol has none and that says nothing about the symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.
expirationNoExpiration date 'YYYY-MM-DD' from the list returned when called without it. Omit to list available expiration dates.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/openWorldHint annotations, it discloses real behavioral traits: a 60-strike cap centred on current price, a `truncated` flag when a wider chain is cut, and the US-listing-only coverage rule with an explicit warning against misreading an empty result. This is exactly the context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then two tight sentences covering the two invocation modes and the coverage caveat. No filler; every sentence carries information an agent needs to call correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return structure need not be spelled out, yet the description still flags the `truncated` field an agent should check. Combined with the mode switching and the non-US caveat, nothing needed to invoke or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: `expiration` must be a value drawn from the list returned by the parameterless call, and it changes the response shape from an expiration list to calls/puts. The two-mode semantics are explained rather than restated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the option chain') for a named source (Yahoo symbol), which is clearly distinct from siblings like get_quote, get_history or get_financials. An agent can identify this as the derivatives-data tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly branches usage: call without `expiration` to enumerate available expiration dates, call with one to retrieve calls/puts for that date. It also flags the case where a non-US symbol yields nothing and warns that this says nothing about the symbol itself, preventing a wrong inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quoteQuoteB
Read-only

Get the current price and key intraday figures for a Yahoo symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-data profile is covered. The description adds what data is returned ('current price and key intraday figures'), which is mild value, but says nothing about staleness, delays, rate limits, or errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the payload description front-loaded and zero filler. Nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is not required, and the one-param schema plus annotations cover the rest. The only real gap is that it never clarifies its relationship to the sibling 'get_quotes', which an agent selecting between them would want.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter and 100% schema description coverage, the schema already documents the symbol format (ticker/ISIN) and the search fallback. The description adds no syntax or format detail beyond that, so the baseline 3 for fully-covered schemas applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('current price and key intraday figures') for a Yahoo symbol, which is clear and concrete. However, it does not distinguish itself from the near-identical sibling 'get_quotes' (plural), leaving the agent to guess which one to call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use or when-not-to-use guidance and never names an alternative. The only routing hint ('For a company name, use search first') lives in the parameter schema, not the description, so the description itself contributes nothing here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quotesQuotes for several symbolsA
Read-only

Get compact current quotes for several Yahoo symbols in one call.

Use this to compare or fetch prices for multiple tickers at once. Each symbol is looked up individually and returns currency, last price, previous close, open, day high/low, and market cap. Symbols that return no data are listed under not_found rather than failing the whole call, and truncated is set when more than 50 were passed.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolsYesYahoo tickers or ISINs, e.g. ['AAPL', 'MSFT', 'SAP.DE']. Not company names. Up to 50, extras are dropped.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the read-only/open-world safety profile, and the description adds genuinely new behavior: per-symbol independent lookup, partial failure routed to `not_found` instead of aborting, and `truncated` being set past 50 symbols. The field list adds little because an output schema already exists, but the failure and truncation semantics are real added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core capability, then usage, then return/failure semantics. No filler and no repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter batch quote tool with an output schema, the description covers everything the agent needs: what is fetched, the cap, partial-failure handling, and the truncation flag. Return value details are correctly left to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single `symbols` parameter, so the schema already documents tickers/ISINs, the 50-item cap, and the no-company-names rule. The description restates the cap and ties it to the `truncated` output flag, which is a marginal addition rather than new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (get quotes) plus a clear scope qualifier ("several Yahoo symbols in one call"), which implicitly but unambiguously separates it from the singular get_quote sibling. An agent can pick the batch tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this to compare or fetch prices for multiple tickers at once" gives a concrete when-to-use condition. It never names the single-symbol alternative (get_quote) or states an exclusion, so it stops just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recommendationsAnalyst recommendationsA
Read-only

Get analyst recommendation trends and price targets for a Yahoo symbol.

Returns the buy/hold/sell trend over recent months plus current/high/low/ mean/median analyst price targets when available.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuine context beyond them: it enumerates the returned data (buy/hold/sell trend, current/high/low/mean/median price targets) and flags the 'when available' caveat that these fields may be absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core purpose and followed by the return contents. No filler or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be spelled out, yet the description helpfully summarizes them. The single well-documented parameter and covered safety profile leave little missing, though a note on empty/absent data handling or sibling differentiation would make it complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, with the schema itself clarifying ticker/ISIN format and the search-first fallback. The description adds no further parameter meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get analyst recommendation trends and price targets') plus the data shape it returns, so the agent knows exactly what it fetches. It does not explicitly distinguish itself from related siblings like get_upgrades_downgrades or get_estimates, leaving the agent to infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied by the purpose; there is no explicit when-to-use, when-not, or named alternative. A hint to use 'search' for a company name lives in the schema, not the description, so the description itself adds no routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sec_filingsSEC filingsA
Read-only

Get recent SEC filings for a Yahoo symbol.

Each entry has the filing date, type (e.g. 10-K, 10-Q, 8-K), title, the Yahoo EDGAR URL, and exhibit links. Only issuers registered with the U.S. SEC file there, so a non-US symbol has none, and neither do ETFs, funds or crypto. An empty result says nothing about the symbol.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of filings to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly and openWorld, so the safety profile is covered; the description adds real substance on top by listing the returned fields and warning that an empty result is uninformative. It does not mention rate limits or ordering guarantees, but that is minor given the read-only annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in the first sentence, then elaborates on entry contents and coverage limits without padding. The closing 'empty result says nothing about the symbol' slightly restates the prior coverage caveat but sharpens the interpretation, so it still earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still summarizes the return shape and, more importantly, sets expectations for empty results - the main failure mode for this tool. Combined with a fully documented 2-parameter schema and read-only annotations, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% - the schema already documents 'symbol' format (ticker/ISIN, with search-first guidance) and 'limit' bounds. The description adds no syntax or interpretation beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get') and resource ('recent SEC filings') scoped to a 'Yahoo symbol', and enumerates what each entry contains (date, type, title, EDGAR URL, exhibit links). No sibling tool covers SEC filings, so the domain is unambiguous against get_news, get_company_info, or get_financials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear applicability context: only U.S. SEC-registered issuers file there, so non-US symbols, ETFs, funds and crypto return nothing, and an empty result is not evidence about the symbol. It does not name a fallback sibling for non-US coverage, so it stops short of explicit alternative-routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sectorSectorA
Read-only

Browse a market sector by its Yahoo key (not a ticker symbol).

Returns the sector overview (company count, market cap/weight, description), its top companies, ETFs, and mutual funds, and the constituent industries. Each industry's key can be passed to get_industry to drill down, or to screen as its industry filter. This takes a sector key like technology or healthcare — not a ticker.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesA Yahoo sector key (lowercase, hyphenated). One of: basic-materials, communication-services, consumer-cyclical, consumer-defensive, energy, financial-services, healthcare, industrials, real-estate, technology, utilities.
limitNoMaximum number of top companies to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral constraint by repeating that the key is a sector key and not a ticker, preventing a common misuse. It does not mention limits or error behavior, but with annotations the bar is lower.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and follows with return contents and routing guidance, all of which earn their place. The 'not a ticker' warning is stated twice (once parenthetically, once as a closing line), which is mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description still usefully previews them. It covers the drill-down path to get_industry and screen. Nothing essential is missing for a two-parameter, read-only browse tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already enumerates every valid sector key plus the limit bounds, so baseline is 3. The description's examples ('technology', 'healthcare') and the key-vs-ticker clarification add only marginal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Browse a market sector') and disambiguates it from its siblings by explaining the key is a Yahoo sector key, not a ticker symbol. An agent can tell it apart from get_industry, get_market, and search without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent onward: industry keys feed get_industry for drill-down or screen as an industry filter. This gives clear context and named alternatives. It does not state exclusions (e.g. when to prefer get_market instead), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sharesShares outstandingA
Read-only

Get the shares-outstanding history for a Yahoo symbol.

Each point is a date and the reported shares outstanding. Only the most recent limit points are returned. Without start the series covers the last 18 months, so pass one for anything older.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd date 'YYYY-MM-DD' to bound the series (optional), after 'start'.
limitNoMaximum number of (most recent) data points to return.
startNoStart date 'YYYY-MM-DD'. Without it the series covers the last 18 months only.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral context: the return shape (date + shares outstanding), that only the most recent `limit` points come back, and the 18-month default window. It doesn't mention pagination beyond limit or rate limits, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with zero waste: purpose first, then return shape, then the limiting constraint and its remedy. The most actionable caveat (18-month window) is front-loaded enough to be caught before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values in depth, and it covers purpose, windowing, and limit behavior adequately. The only gap is the absence of routing guidance relative to sibling history/fundamental tools, which is minor given the clear resource name.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description's notes on limit being most-recent-only and start defaulting to 18 months largely restate what the schema says, adding little new meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Get the shares-outstanding history for a Yahoo symbol' — which is distinct from siblings like get_financials and get_holders. An agent can tell at a glance this returns a time series of share counts, not a snapshot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives conditional guidance for the start parameter ('pass one for anything older' than 18 months), which is useful. However, it never names an alternative tool or says when to prefer get_shares over get_financials/get_holders, so usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_upgrades_downgradesRating changesA
Read-only

Get recent analyst rating changes (upgrades/downgrades) for a Yahoo symbol.

Each entry is a firm's rating change with the from/to grade and action, most recent first. Equity-only: an ETF, fund or crypto symbol answers with an error that says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of rating changes to return.
symbolYesA Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, openWorldHint), and the description adds useful behavior: entries are the from/to grade and action, ordered most-recent-first, and non-equity symbols fail with an explicit error. It does not mention rate limits or the size/shape of the underlying response beyond the entry description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short, front-loaded sentences: purpose, return content, and the equity-only constraint. No filler, and the most decision-relevant information comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, annotations covering safety, and full parameter docs, the description only needs to add what structured fields cannot; it does that via the equity-only error behavior and ordering. The lone gap is that 'recent' is never quantified, leaving the agent unsure of the time window.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both 'symbol' and 'limit' are already fully documented (including the ISIN/ticker examples and the 'use search first' tip). The description adds no parameter-level syntax or constraints beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get recent analyst rating changes (upgrades/downgrades)') scoped to a Yahoo symbol, which an agent can distinguish from sibling tools like get_recommendations or get_estimates. It also declares the shape of each entry (firm, from/to grade, action), so the agent knows what it will get.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a real when-not condition: 'Equity-only: an ETF, fund or crypto symbol answers with an error that says so,' which steers the agent away from misuse. It does not name an alternative when the symbol is not an equity or when analyst-recommendation summaries are wanted, so routing to siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenStock screenerA
Read-only

Find stocks by criteria, e.g. dividend payers in a region or cheap large caps.

Fields are these aliases, or a raw Yahoo screener field name:

  • market: market_cap, price, change_percent, change_52w_percent, volume, avg_volume_3m, beta

  • valuation: pe_ratio, peg_ratio, price_to_book, price_to_sales, ev_to_ebitda

  • dividend: dividend_yield, forward_dividend_yield, dividend_growth_years

  • profitability and growth: return_on_equity, return_on_assets, net_margin, revenue, revenue_growth, eps_growth

  • balance sheet: debt_to_equity, current_ratio

  • ownership: insider_percent, institutional_percent, short_percent_of_float

  • esg_score

  • categories, eq or is-in only: region (country code, 'us', 'de'), exchange (Yahoo code, 'NMS', 'GER'), sector ('Technology'), industry (a key or name from get_sector)

Percentages are in percent, 3 means 3 %. A loss makes pe_ratio negative, so pair lt with gt 0. region is where a stock is listed, not where the company sits, so 'de' includes foreign companies traded in Germany, and a company appears once per listing. Preferred shares are listings too (on US exchanges symbols like JPM-PD), carrying the common stock's eps and market cap, so their pe_ratio means nothing. Returns total (all matches) and one row per match with price, valuation and dividend figures. A row's dividend_yield can be missing or differ markedly from the filter, which holds for Yahoo's screener data, not for that column. The other filters' figures are not in the rows: get_company_info adds beta and forward P/E, get_holders the ownership shares, get_financials the statements behind margins, growth and debt.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matches to return.
offsetNoMatches to skip, for the next page.
filtersYesConditions that must all hold, e.g. [{"field": "dividend_yield", "op": "gt", "value": 3}].
sort_byNoA numeric field or alias to sort by.market_cap
sort_descNoLargest first.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral nuance beyond that: results are the total match set with one row per listing, a row's dividend_yield can be missing or diverge from the filter, and preferred shares carry meaningless pe_ratio values. It does not discuss rate limits or latency, but the disclosure is rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then organizes aliases by category, then records caveats. The alias enumeration is long but each entry is load-bearing reference material. Slightly dense, but no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't detail return values, yet it still clarifies row contents and the one caveat that matters (dividend_yield mismatch). Combined with alias coverage, op restrictions, and sibling pointers, nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the schema only says field is 'an alias or a raw Yahoo screener field'. The description goes well beyond it by enumerating every valid alias grouped by category, and by documenting the op semantics (categories/region/exchange/sector/industry accept eq or is-in only), the percent convention, and the btwn value shape.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Find stocks by criteria') and immediately scopes it with concrete examples ('dividend payers in a region or cheap large caps'). An agent can distinguish this from the many sibling getters (get_quote, get_financials) because it is the only filter-driven discovery tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context via examples and explicitly routes the agent to companions for data the rows lack ('get_company_info adds beta and forward P/E, get_holders the ownership shares'). It does not, however, state when to prefer the sibling 'search' tool over screening, so the alternative-selection guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 23 tool updatesv0.8.6
    • Changedget_calendar3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_calendarArguments"
      • removedOutput schema / title
        Removed value: -"get_calendarDictOutput"
    • Changedget_company_info3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_company_infoArguments"
      • removedOutput schema / title
        Removed value: -"get_company_infoDictOutput"
    • Changedget_dividends3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_dividendsArguments"
      • removedOutput schema / title
        Removed value: -"get_dividendsDictOutput"
    • Changedget_earnings4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_earningsArguments"
      • removedOutput schema / title
        Removed value: -"get_earningsDictOutput"
    • Changedget_estimates3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_estimatesArguments"
      • removedOutput schema / title
        Removed value: -"get_estimatesDictOutput"
    • Changedget_financials5 fields changed
      • removedInput schema / properties / freq / title
        Removed value: -"Freq"
      • removedInput schema / properties / statement / title
        Removed value: -"Statement"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_financialsArguments"
      • removedOutput schema / title
        Removed value: -"get_financialsDictOutput"
    • Changedget_fund_data4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_fund_dataArguments"
      • removedOutput schema / title
        Removed value: -"get_fund_dataDictOutput"
    • Changedget_history7 fields changed
      • removedInput schema / properties / end / title
        Removed value: -"End"
      • removedInput schema / properties / interval / title
        Removed value: -"Interval"
      • removedInput schema / properties / period / title
        Removed value: -"Period"
      • removedInput schema / properties / start / title
        Removed value: -"Start"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_historyArguments"
      • removedOutput schema / title
        Removed value: -"get_historyDictOutput"
    • Changedget_holders4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_holdersArguments"
      • removedOutput schema / title
        Removed value: -"get_holdersDictOutput"
    • Changedget_industry4 fields changed
      • removedInput schema / properties / key / title
        Removed value: -"Key"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_industryArguments"
      • removedOutput schema / title
        Removed value: -"get_industryDictOutput"
    • Changedget_insider_activity4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_insider_activityArguments"
      • removedOutput schema / title
        Removed value: -"get_insider_activityDictOutput"
    • Changedget_market3 fields changed
      • removedInput schema / properties / key / title
        Removed value: -"Key"
      • removedInput schema / title
        Removed value: -"get_marketArguments"
      • removedOutput schema / title
        Removed value: -"get_marketDictOutput"
    • Changedget_news4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_newsArguments"
      • removedOutput schema / title
        Removed value: -"get_newsDictOutput"
    • Changedget_options4 fields changed
      • removedInput schema / properties / expiration / title
        Removed value: -"Expiration"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_optionsArguments"
      • removedOutput schema / title
        Removed value: -"get_optionsDictOutput"
    • Changedget_quote3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_quoteArguments"
      • removedOutput schema / title
        Removed value: -"get_quoteDictOutput"
    • Changedget_quotes3 fields changed
      • removedInput schema / properties / symbols / title
        Removed value: -"Symbols"
      • removedInput schema / title
        Removed value: -"get_quotesArguments"
      • removedOutput schema / title
        Removed value: -"get_quotesDictOutput"
    • Changedget_recommendations3 fields changed
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_recommendationsArguments"
      • removedOutput schema / title
        Removed value: -"get_recommendationsDictOutput"
    • Changedget_sec_filings4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_sec_filingsArguments"
      • removedOutput schema / title
        Removed value: -"get_sec_filingsDictOutput"
    • Changedget_sector4 fields changed
      • removedInput schema / properties / key / title
        Removed value: -"Key"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"get_sectorArguments"
      • removedOutput schema / title
        Removed value: -"get_sectorDictOutput"
    • Changedget_shares6 fields changed
      • removedInput schema / properties / end / title
        Removed value: -"End"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / start / title
        Removed value: -"Start"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_sharesArguments"
      • removedOutput schema / title
        Removed value: -"get_sharesDictOutput"
    • Changedget_upgrades_downgrades4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / symbol / title
        Removed value: -"Symbol"
      • removedInput schema / title
        Removed value: -"get_upgrades_downgradesArguments"
      • removedOutput schema / title
        Removed value: -"get_upgrades_downgradesDictOutput"
    • Addedscreen
    • Changedsearch5 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"searchArguments"
      • removedOutput schema / properties / result / title
        Removed value: -"Result"
      • removedOutput schema / title
        Removed value: -"searchOutput"
  2. 18 tool updatesv0.7.0
    • Changedget_calendar1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_company_info1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_dividends1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_earnings1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_estimates1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_financials1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_fund_data1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_history4 fields changed
      • changedInput schema / properties / end / description
        Previous value: -"End date 'YYYY-MM-DD'. Used only together with 'start'."New value: +"End date 'YYYY-MM-DD', exclusive: for one day pass the day after. Used only together with 'start'."
      • changedInput schema / properties / interval / description
        Previous value: -"Bar size. One of: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo. Intraday intervals only cover recent dates."New value: +"Bar size. One of: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 4h, 1d, 5d, 1wk, 1mo, 3mo. Intraday intervals only cover recent dates."
      • changedInput schema / properties / period / description
        Previous value: -"Look-back window. One of: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max. Ignored when 'start' is given."New value: +"Look-back window: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max, or any count of d, wk, mo or y such as 7mo. Ignored when 'start' is given."
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_holders1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_insider_activity1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_news1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_options1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_quote1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_quotes1 field changed
      • addedInput schema / properties / symbols / items / maxLength
        Added value: +32
    • Changedget_recommendations1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_sec_filings1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_shares2 fields changed
      • changedInput schema / properties / end / description
        Previous value: -"End date 'YYYY-MM-DD' to bound the series (optional)."New value: +"End date 'YYYY-MM-DD' to bound the series (optional), after 'start'."
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
    • Changedget_upgrades_downgrades1 field changed
      • addedInput schema / properties / symbol / maxLength
        Added value: +32
  3. 2 tool updatesv0.6.0
    • Changedget_news1 field changed
      • changedInput schema / properties / limit / maximum
        Previous value: -30New value: +10
    • Changedget_shares1 field changed
      • changedInput schema / properties / start / description
        Previous value: -"Start date 'YYYY-MM-DD' to bound the series (optional)."New value: +"Start date 'YYYY-MM-DD'. Without it the series covers the last 18 months only."
  4. 19 tool updatesv0.4.0
    • Changedget_calendar1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_company_info1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_dividends1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_earnings1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_estimates1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_financials2 fields changed
      • changedInput schema / properties / freq / description
        Previous value: -"Reporting frequency: 'annual', 'quarterly', or 'ttm' (trailing twelve months; income and cashflow only)."New value: +"Reporting frequency: 'annual', 'quarterly', or 'ttm' (trailing twelve months, income and cashflow only)."
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_fund_data1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_history1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_holders1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_insider_activity1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Addedget_market
    • Changedget_news1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_options1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_quote1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_quotes1 field changed
      • changedInput schema / properties / symbols / description
        Previous value: -"A list of native Yahoo Finance ticker symbols, e.g. ['AAPL', 'MSFT', 'SAP.DE']. Each must be a native ticker, never an ISIN, WKN, or company name; resolve those via 'search' first. Up to 50 symbols; extras are dropped (the result flags this as truncated)."New value: +"Yahoo tickers or ISINs, e.g. ['AAPL', 'MSFT', 'SAP.DE']. Not company names. Up to 50, extras are dropped."
    • Changedget_recommendations1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_sec_filings1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_shares1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
    • Changedget_upgrades_downgrades1 field changed
      • changedInput schema / properties / symbol / description
        Previous value: -"A native Yahoo Finance ticker symbol, e.g. 'AAPL', 'MSFT', 'SAP.DE', or 'BMW.DE'. This is NOT an ISIN, a WKN, or a company name, and must NOT be built by appending an exchange suffix to an ISIN (e.g. 'US0378331005.DE' is invalid). If you only have a name or ISIN, call the 'search' tool first and pass the 'symbol' value it returns."New value: +"A Yahoo ticker or an ISIN, e.g. 'AAPL', 'SAP.DE' or 'US0378331005'. For a company name, use 'search' first."
  5. 21 tool updatesv0.2.2
    • First observedget_calendar
    • First observedget_company_info
    • First observedget_dividends
    • First observedget_earnings
    • First observedget_estimates
    • First observedget_financials
    • First observedget_fund_data
    • First observedget_history
    • First observedget_holders
    • First observedget_industry
    • First observedget_insider_activity
    • First observedget_news
    • First observedget_options
    • First observedget_quote
    • First observedget_quotes
    • First observedget_recommendations
    • First observedget_sec_filings
    • First observedget_sector
    • First observedget_shares
    • First observedget_upgrades_downgrades
    • First observedsearch

TDQS

A3.9/5.0

Scored across 23 tools

Disambiguation5/5

Each tool targets a clearly distinct data type or action (quotes, history, financials, dividends, news, options, etc.). The single-vs-batch quote pair and the minor overlap between get_calendar/get_earnings are well explained in descriptions, so an agent can reliably select the right tool.

Naming Consistency5/5

All tool names use snake_case, with a strong and predictable get_<resource> pattern for retrieval and search/screen for discovery. The two verb-only names are natural exceptions and do not break consistency.

Tool Count3/5

23 tools is on the heavy side for an MCP server; while each tool maps to a distinct Yahoo Finance endpoint, the surface is large enough to feel overwhelming and could benefit from consolidation or grouping.

Completeness5/5

The set covers the broad Yahoo Finance domain very well: lookup, quotes, historical prices, profiles, financial statements, dividends, news, calendar, shares, analyst data, ownership, insider activity, SEC filings, options, fund data, sector/industry browsing, market status, and screening. No significant gaps in the core lifecycle are apparent.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

  • Financial data MCP server for Claude, ChatGPT, Cursor and Codex. Real-time stock quotes, financial statements, options flow, SEC filings, insider trades, 13F holdings, macro data and market news from gloom.sh, the open-source Bloomberg Terminal alternative.

  • A Model Context Protocol server exposing real-time and historical Colombo Stock Exchange (CSE) data to AI agents and LLM applications. Provides quotes and OHLCV price history, full financial statements (income, balance sheet, cash flow), pre-computed technicals (moving averages, RS ratings, volume signals), macroeconomic indicators, corporate actions, and rule-based screening across CSE stocks and sector indices, everything needed to build CSE-aware trading assistants, research tools, and market-analysis agents. This is the official MCP server of www.ceyloncharts.com

  • MCP server for Financial Modeling Prep API with 250+ financial data tools

  • Research US-listed companies and funds with the StockPortfolio.pro MCP server. Tools cover SEC filing-grounded financials, filing timelines, company comparisons, watchlist screens, fund profiles, and cited filing questions. Filed figures include their fiscal period and EDGAR source URL; missing filing data is returned as null. Public tools work without authentication; optional API-key or OAuth access is supported. US-listed, USD-reporting companies only. Keyless access includes 3 free AI questions per rolling 30-day window. To get more now, choose the Dev plan ($19.99/month, 200 credits) at https://www.stockportfolio.pro/register?plan=dev, then follow https://www.stockportfolio.pro/docs/api-mcp to connect with OAuth or an API key. Or wait for the free allowance to renew.

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    A Model Context Protocol (MCP) server that provides comprehensive access to Yahoo Finance data through 18 specialized tools for pricing, financials, options, holders, and news.
    18
    45 PyPI
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A comprehensive MCP server that provides seamless access to Yahoo Finance stock market data, enabling retrieval of real-time quotes, historical data, charts, financial summaries, and market searches.
    21 npm
    ISC
  • A
    license
    A
    quality
    D
    maintenance
    Enables querying stock data, financial information, news, and historical prices from Yahoo Finance through a set of MCP tools.
    5
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP server wrapping yfinance to provide stock market data, financials, and analytics via 24 tools.
    -