Skip to main content
Glama

Finance MCP

tests python licence

An MCP server that gives an AI assistant read access to your real brokerage account and the market around it — and gives you, not the assistant, the only button that sends an order.

38 tools over Webull, Saxo, IBKR, Yahoo Finance, SEC EDGAR, BLS, the Federal Reserve and the BEA, plus a Streamlit dashboard that is the sole path to execution. The list is filtered to what your broker can actually serve, so a given account sees 36 or 37 of them — and 28 with no broker at all, which is a working install, not a broken one.

The assistant can draft an order. It cannot place one. Drafts go to a local queue; sending requires a broker preview and your click in the dashboard. That path does not exist on the tool side, so no prompt can reach it.

Every tool declares this to the client rather than only to the reader: 32 of 36 are annotated read-only, one is destructive (cancel_order, which pulls a resting order). A client that respects MCP annotations can wave through a price lookup and stop on the one call that reaches the market.

What this can and cannot do with your account

Asking an unknown repository for brokerage credentials is the hardest trust ask in software, so the answer is here rather than forty paragraphs down.

  • There is no execution path on the tool side. Not gated, not guarded — absent. draft_order writes to a local queue. Sending needs a broker preview and your click in the dashboard, which no prompt can reach.

  • Twenty-eight of the 38 tools never touch a broker. SEC filings, macro, indicators, options maths, earnings. With no credentials at all you get those twenty-eight, and that is a working install rather than a degraded one.

  • Two of the three adapters have never been run. Saxo and Interactive Brokers are built from published API references and have not been executed against a live or paper account. They say so in every tool output that uses them. Only Webull has been run against a real account.

  • The dashboard's submit button is Webull-only. The MCP tools route through the broker protocol; that one button does not, yet.

  • Use a read-scoped key where your broker offers one. Nothing outside the dashboard needs write access.

1,431 tests across 32 files, and CI runs them on every push.

Those all stub the network, which is correct — a suite that goes red because SEC returned a 503 overnight is a suite nobody reads. It is also why two defects survived every one of them: a euro-area series that had stopped publishing eight months earlier and was reported as current, and a filing watcher that answered 403 to every request and called itself healthy. Both needed the real internet to see. tests/test_live_sources.py asks every external source for real and checks that this tool's account of the answer is true — in particular that a series marked fresh actually is. It is opt-in and skipped by default:

FINANCE_LIVE_SOURCES=1 pytest tests/test_live_sources.py -v -s

It also runs weekly in CI, because a check that depends on somebody remembering is a check that eventually stops happening — and discontinued series and broken scrapers are exactly the failures that arrive quietly over weeks. That workflow is inert until FRED_API_KEY and SEC_USER_AGENT exist as repository secrets, and when they do not it says so in the job summary rather than reporting a green tick that verified nothing.


Charts tab

Candles with overlays, a volume pane and the forecast cone. Weekends and market holidays are collapsed, so there are no blank stretches.


What it does

Prices

Live OHLCV from Webull with a Yahoo fallback, behind an integrity gate that checks bar ordering, staleness in trading sessions, and OHLC sanity. Every price says which bar it came from and how old that bar is.

Analysis

96 pinned technical indicators, volume profile with POC and value area, Black-Scholes greeks and implied volatility, backtesting, position sizing from an ATR-aware stop, portfolio concentration and correlation.

Filings

SEC EDGAR parsed rather than forwarded: Form 4 with transaction codes and 10b5-1 status, 8-K by item code, 13F, 13D/G, 144, NPORT, inline XBRL. One Form 4 is ~6,600 tokens of XML; the tool returns the answer instead.

Macro

Economic calendar from BLS, the Fed (FOMC, dot-plot meetings flagged) and BEA (PCE, GDP), each row carrying the print that happened or the prior one, never a forecast.

Execution

Draft, broker preview, human approval. Pre-trade checks block naked shorts, verify per-currency buying power, and refuse orders the broker's own rules would reject.


Related MCP server: FinClaw

What you need

OS

Windows, macOS, Linux. Desktop alerts use each platform's own notifier (PowerShell, osascript, notify-send) and report plainly when a machine has none, which a headless server will not.

Install

uv tool install --with streamlit --with plotly hitl-finance-mcp, then point your client at the finance-mcp command. Scripted installers (install.sh, install.bat) add a config template, client registration and a shortcut.

Python

3.10 or 3.12, both covered by CI. uv is installed for you.

Broker

Optional. Webull, Saxo or IBKR — set FINANCE_BROKER. Only Webull has been run against a live account. With no broker credentials, the account and order tools are not registered, prices come from Yahoo, and the other 28 tools work normally.

Keys

SEC_USER_AGENT (a contact address, required by the SEC for filings) and optionally a free BLS key.

Installation guide → — fifteen minutes, most of it waiting for free API keys.

This places real orders against a real account. The consensus score is a fixed-weight heuristic that underperformed buy-and-hold in backtest and is labelled as such throughout. Not financial advice — see NOTICE.md for the full disclaimers and the third-party data terms.


Brokers

Broker

Status

Webull

Verified end to end — a real order drafted, previewed, placed, watched resting and cancelled.

Saxo Bank

Unverified. Built from Saxo's published OpenAPI reference and never run against their API.

Interactive Brokers

Unverified. Built from the Client Portal Web API reference and never run against it. Needs the local Client Portal Gateway.

Both unverified adapters say so in every tool output that uses them, and refuse rather than guess on the paths the docs did not pin down.

dashboard/broker_protocol.py is the interface; tests/test_broker_conformance.py runs the same suite against every adapter. FINANCE_BROKER=ibkr selects which adapter the protocol and the MCP tools report through.

What works with which broker

28 of the 38 tools are broker-agnostic — indicators, options, SEC filings, insider and institutional data, earnings, macro. They work the same whoever you clear through, though the prices underneath them now come from your broker where it serves bars (see below).

Eight are account and order tools, and they go through broker_protocol.py, so they work with any adapter that declares the capability they need:

Tool

Needs

get_account_info get_open_positions get_open_orders

accounts positions open_orders

draft_order preview_order cancel_order

buying_power preview_order cancel_order

calculate_position_size get_portfolio_risk

buying_power positions

A tool is only registered when the configured broker can serve it. Start with FINANCE_BROKER=saxo and cancel_order is not in tools/list at all — Saxo cancels by its own order id and documents no mapping from ours, so a cancel tool would be a tool that can only refuse. An unusable tool costs a model context on every request and is one more wrong choice available to it.

The same rule covers having no broker. Every adapter constructs lazily, so that listing tools never opens a socket — which meant an empty .env built a broker object quite happily and all eight account tools were offered to someone who could not call a single one of them. They now check for their credentials offline and register only if they have them, so a broker-free install lists 28 tools that all work rather than 36 of which eight cannot. Where the answer is genuinely unknowable offline — IBKR's Client Portal Gateway holds the session after a browser login and wants no token at all — the tools stay registered, because hiding a tool that would have worked leaves nobody a way to find out why.

Two more exist only for the broker that has them: saxo_corporate_actions (dividends, splits, tenders and their election deadlines — Saxo is the only one of the three with them) and ibkr_market_scanner (the exchange-side scan, rather than inferring rotation from eleven ETF price pulls).

Capability is resolved per account, not per broker name, because three different things have to line up:

capability = what the SDK implements
           ∩ what the regional entity serves
           ∩ what this account is entitled to

Webull alone runs twelve independent regional entities on separate hosts, and market-data entitlements are bought per account on top of that — an order book that returns one level means an L1 subscription, not a missing endpoint. dashboard/capabilities.py keeps a cache keyed on broker × entity × account, a probe can only ever withdraw a capability and never invent one, and it records what a call did rather than why. Inferring a cause from an error message is how this file previously came to blame a region for a parameter mistake.

Macro releases

CPI prints at 08:30:00 ET. The calendar carries the print that happened or the prior one, never a forecast — there is no consensus feed here, street estimates are a licensed product, so a "surprise" against a prior reading is not a surprise.

Near a scheduled release the macro cache collapses from six hours to three seconds, so the answer is the freshest available whenever you ask. Set FINANCE_MACRO_WATCH=1 and a background thread also fetches the print as it publishes, so it is already in hand.

Neither bursts. BLS documents 50 requests per 10 seconds; the fast cadence uses ten. Polling faster does not make BLS publish sooner — a burst of identical requests fired at the instant all return the same stale payload, because the wait is on an external event rather than on throughput.

Prices come from your broker

fetch_data tries the configured broker first and Yahoo second, so a Saxo user gets Saxo's /chart/v1/charts and an IBKR user gets /iserver/marketdata/history — for every price in the server, not just the account tools. Before this, supplying Saxo or IBKR credentials still left the whole price feed on the public fallback, which was invisible because the tools still worked. The fallback always announces itself when it is used.

Both broker feeds sort ascending before returning. Webull returned newest-first and nothing sorted it, so every indicator ran on a reversed series and the sector heatmap ranked the worst performers as leaders; that is not a mistake worth making twice.

contract_rules() fetches real tick and lot sizes, and rule_violations() uses them when supplied — the check that catches an order preview prices cleanly and placement then refuses.

The dashboard's submit button is still Webull-only. The MCP tools route through the protocol; the Streamlit approve-and-submit path does not yet, and moving it means putting two adapters nobody has run on the one code path that has been exercised for real. Verification comes first — which is what HELP-WANTED.md is asking for.

IBKR is the Client Portal Web API — plain request/response JSON — not the TWS socket API. That distinction is why it is an adapter and not a rewrite. It also brought the one broker behaviour the protocol did not already have: IBKR can answer a placement with warnings instead of an order, each needing confirmation before anything is transmitted. Client libraries normally answer those from a table of canned replies. This one raises them to the person who approved the order, which is the whole point of the tool.

Help wanted → — an hour with a Saxo simulation token or an IBKR paper account would close the verification gap. The scripts that do it read only; they never place an order.


Works with any MCP client

Nothing in the server is specific to one assistant. It speaks MCP over stdio, so anything that speaks MCP can run it. The installer registers it with every client it finds on the machine; to wire one up by hand, add this to that client's MCP config:

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

Client

Where that goes

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json

Claude Code

claude mcp add finance -- finance-mcp

Cursor

~/.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

VS Code

.vscode/mcp.json, or the user-level MCP settings

Anything else

Whatever that client calls its MCP config; the JSON above is the standard shape

The dashboard is a separate Streamlit app and does not care which client you use. Order approval happens there regardless.


Macro Calendar & Real-Time Filings

Four public sources sit alongside the broker feed, so Claude can see the events that move price as well as the price itself.

Tool

What it gives you

get_economic_calendar

Scheduled US events from three sources — BLS (CPI, PPI, NFP, JOLTS), the Federal Reserve (FOMC decisions, flagged when they carry a dot plot), and BEA (PCE, GDP, trade) — each row carrying the actual print where it has happened and the prior print where it has not.

get_updates

What has changed since a timestamp: new SEC filings, macro releases that printed, and outsized price moves. Answers "anything new?" without refetching everything.

get_macro_data

Historical CPI, core CPI, unemployment, payrolls, PPI and wages with MoM/YoY changes. source="markets" gives policy rates, the yield curve and financial conditions from FRED, the ECB and the Bank of England.

get_edgar_filings

SEC filings in three modes: one company's filings, the all-registrant live feed, or full-text search across filing bodies.

get_insider_activity

Parsed Form 3/4/5 — who traded, at what price, whether the sale was under a Rule 10b5-1 plan, and opening positions. forms="144" gives proposed sales, filed ahead of the trade, with the plan-adoption date.

read_filing

Form-aware: executive pay from a DEF 14A, the cover page of a 13D/13G, the press release from an 8-K, a named Item (Risk Factors, MD&A) from a 10-K, or a text search.

get_institutional_holdings

Latest 13F-HR portfolio, positions merged across manager rows. source="NPORT" gives a registered fund's monthly portfolio, including the bonds and derivatives 13F omits.

Filings are parsed, not forwarded. Most of what an analyst wants from a filing is already a machine-readable field. "Was that sale pre-scheduled?" is <aff10b5One> in the Form 4 XML — a boolean. So the server extracts and answers rather than handing over a document: one Form 4 is ~6,600 tokens of raw XML, and a single 10-K is ~610,000 tokens, which is three times a 200k context window. get_insider_activity also separates real decisions (codes P/S) from compensation mechanics — grants, option exercises, and shares withheld for tax — which are routinely misreported as "insiders sold $X".

On latency. EDGAR acceptance timestamps are exact to the second, so an earnings 8-K (item 2.02) is visible as soon as it is accepted. The delay you experience is your own polling interval, not the feed. get_earnings uses that same item code to confirm which quarters were actually released, and flags an upcoming date that Yahoo is only estimating — Yahoo publishes an unset date as a window and a set one as a single day, and the two are indistinguishable once formatted.

No consensus, and it says so. Street forecasts are a licensed product with no free source, so every comparison in the calendar is against the previous print and is labelled that way. A "surprise" measured against a prior reading is not a surprise: the market trades the gap to expectations, and expectations are the one thing not available here.

Rate and quota handling. BLS allows 25 API queries a day unregistered; the release-schedule pages are ordinary web fetches and deliberately do not draw on that budget. Results are cached (6h for macro series, 24h for schedules, 2min for filings), so a repeated calendar call costs nothing. The SEC's 10 req/s ceiling is enforced at the client.

Normalization. Filer names and release text arrive in mixed scripts and number conventions. A dedicated layer folds Unicode to a canonical form, expands atomic Latin letters that have no decomposition (ÆrøAEro, not r), converts non-ASCII digits, and parses numbers written US, European, Swiss or Indian style — including accounting negatives like (1,234.56).

Getting a BLS key (optional, free, ~2 minutes)

Unregistered access is capped at 25 API queries a day. To lift it to 500:

  1. Register at data.bls.gov/registrationEngine — the key arrives by return email.

  2. Add BLS_API_KEY=<your key> to .env and restart the server.

  3. Run the validate_bls_key tool to confirm it was accepted.

That last step matters: a mistyped key does not raise an error, it silently drops you back to the 25/day tier, which only shows up days later as an exhausted quota. Registered access also extends history from 10 to 20 years and returns BLS's own computed percentage changes, which the server checks its own arithmetic against.

Use get_data_sources at any time to see every source's configuration and remaining quota.


Help wanted

Three things where an hour from someone else is worth more than a day from me:

  • Verify the Saxo adapter. Written from Saxo's published reference, never run against their API. A 24-hour simulation token is free and needs no approval, and tests/verify_saxo.py answers the six open questions without placing an order.

  • Verify the IBKR adapter. Same situation, and a paper account is enough. Run the Client Portal Gateway, log in through a browser, then python -m tests.verify_ibkr. It submits nothing — it reads, and it calls IBKR's own non-binding whatif. → HELP-WANTED.md

  • Install it on a clean machine. install.bat and install.sh are covered by unit tests and inspection, never by a fresh OS — the first thing every new user touches is the least proven path here.

Also open: IG Markets (REST, similar shape to Saxo). dashboard/broker_protocol.py is the interface; tests/test_broker_conformance.py runs against anything that implements it.


Where the numbers come from

Not all data carries the same weight, and the tools say which is which.

Class

Source

Validation

Prices & bars

Webull OpenAPI, Yahoo fallback

Full integrity gate: ordering, session-based staleness, OHLC sanity

Filed financials

SEC EDGAR XBRL

Authoritative — the filing itself, stamped with form and filing date

Macro

BLS

Official series; our MoM/YoY cross-checked against BLS's own figures on the registered tier

Third-party fundamentals

Yahoo

Cross-checked against the XBRL filing where a comparable figure exists; disagreements are reported

Consensus score

Computed here

A fixed-weight heuristic, labelled as such — it underperformed buy & hold in backtest

get_company_financials returns the filed figures directly. Where Yahoo and the filing disagree, the filing wins and the tool says so.

IV rank is the one measure that cannot be sourced authoritatively for free: no public feed publishes implied-volatility history. Rather than pretend otherwise, the server records one ATM IV observation per symbol per day as options are queried, and reports a true IV rank once a symbol has 30 days of its own history. Until then it shows a realised-volatility proxy, explicitly labelled, with a count of how many more observations are needed.


Data Integrity

Market data is the foundation everything else rests on, so it is checked rather than trusted. Every price frame — from either source — passes a single gate before any tool sees it:

  • Bar ordering is enforced. The Webull API returns bars newest-first. Frames are sorted ascending and the invariant is asserted, so .iloc[-1] is always the most recent bar. (Without this, tools reported the oldest bar of the window as the current price and computed every indicator on a time-reversed series.)

  • Staleness is measured in trading sessions, using a built-in NYSE calendar — not calendar days, which cannot tell a holiday weekend from an outage.

  • Sanity checks reject NaN prices and impossible OHLC bars.

  • Failures are errors, not text. Tools raise real MCP errors rather than returning "Error: ..." as content, so a failure can never be mistaken for a finding.

  • Source substitution is announced. When the Webull feed fails and Yahoo serves the request, every affected tool says so.

Run the suite with pytest. It is entirely offline — no credentials, no network, no orders.


Installation

Path A — the installer (Windows, no Python required)

  1. Unzip this package anywhere (e.g. your Desktop).

  2. Double-click install.bat.

  3. It installs the uv Python engine if missing, registers the server in %APPDATA%\Claude\claude_desktop_config.json under the name finance, writes a .env template, and drops a Finance MCP Dashboard shortcut on your Desktop.

  4. Fill in .env (see Authentication).

  5. Restart Claude Desktop. The server is only read at startup.

The installer prints an ACTION NEEDED block if WEBULL_APP_KEY or SEC_USER_AGENT are still at their placeholder values, so a half-configured install does not look like a finished one.

Nothing is installed system-wide beyond uv; dependencies are resolved into a cache the first time the server or dashboard runs, so the first launch is slower than the rest.

Path B — clone the repo

No installer, no shortcut. You wire up the two entry points yourself.

git clone <repo> && cd finance-mcp
uv venv && uv pip install -e ".[dev,dashboard]"
cp .env.example .env      # then edit it — see Authentication below

The MCP server (what Claude talks to). Add this to %APPDATA%\Claude\claude_desktop_config.json on Windows, or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, and restart Claude Desktop:

{
  "mcpServers": {
    "finance": {
      "command": "uv",
      "args": ["run", "--with", "pandas", "--with", "numpy", "--with", "fastmcp",
               "--with", "yfinance", "--with", "tabulate", "--with", "lxml",
               "--with", "html5lib", "--with", "webull-openapi-python-sdk",
               "/absolute/path/to/finance_mcp.py"]
    }
  }
}

Use an absolute path, and forward slashes even on Windows. Claude Code users can instead run claude mcp add finance -- uv run /absolute/path/to/finance_mcp.py.

The dashboard (what you look at). Run it from the repo root, not from Module boundaries. dashboard/webull_client.py is the market-data client and the shared signed-request plumbing; dashboard/broker.py is the trading surface (accounts, buying power, positions, the order lifecycle). They are separate because they fail differently: a price feed degrades to a fallback and says so, while an order path must refuse rather than substitute. dashboard/barcache.py is a small on-disk cache of validated bar frames shared between the MCP server and the dashboard — a hit skips the download, never the integrity gate. Disable it with FINMCP_BAR_CACHE=0.

dashboard/app.py resolves its sibling modules and .streamlit/config.toml relative to the working directory, and launching from elsewhere loses the theme:

streamlit run dashboard/app.py            # inside the venv
# or, without activating anything:
uv run --with streamlit --with plotly --with pandas --with numpy \
       --with yfinance --with lxml --with html5lib --with tabulate \
       --with webull-openapi-python-sdk streamlit run dashboard/app.py

It opens on http://localhost:8501. Add --server.port 8899 to move it.

The alert manager (optional, Windows toast notifications). The dashboard starts it automatically in a background thread; to run it standalone:

python -m dashboard.alert_manager

Verify the installpytest runs the whole suite offline, with no credentials and no network:

pytest -q

Then ask Claude to run get_data_sources — it reports which credentials are configured, which feeds are reachable and what quota is left, without touching your account. check_connection confirms the Webull session specifically.


Authentication

  1. Open the newly generated .env file located in this folder.

  2. Paste your Webull WEBULL_APP_KEY and WEBULL_APP_SECRET.

  3. Save the file.

.env and conf/token.txt are gitignored, and SDK logs are credential-redacted at write time — the Webull SDK dumps the full signed request (key, HMAC signature, access token) at ERROR level, which routine rate-limit responses would otherwise write straight to disk.

Optional settings

Variable

Default

Purpose

WEBULL_ENVIRONMENT

prod

prod is the default and trades the real account — which is the point: reads are what the tool is for, and no order leaves without your approval in the dashboard. paper is not "live data, simulated orders" — it repoints the entire client at Webull's sandbox, quotes included, and the sandbox has its own app registry, so production keys return 401 there and nothing works. Use it only with WEBULL_PAPER_APP_KEY/SECRET to rehearse the approval flow. paper (aliases uat, sandbox, simulated) routes every call to Webull's simulated environment for your region, so the whole approval path — draft, preview, approve, submit — can be rehearsed without risking anything. The dashboard shows LIVE or PAPER beside the wordmark and on the Execution tab. If no sandbox host is published for your region the client refuses to start rather than falling through to production.

WEBULL_PAPER_APP_KEY / WEBULL_PAPER_APP_SECRET

Optional, paper mode only. Webull's sandbox is a separate deployment with its own app registry, so a production key authenticates there as 401 UNAUTHORIZED — verified live. Register a sandbox app and set these; paper falls back to the production pair when they are unset, which will 401.

WEBULL_ACCOUNT_ID

(unset)

Pin a specific account. Required if your login has more than one — the server refuses to guess rather than silently trading the wrong account.

WEBULL_MIN_REQUEST_INTERVAL

0.25

Seconds between Webull API calls. Pacing keeps list-sweeping tools (sector heatmap, watchlist scans) off the rate limiter.

WEBULL_MAX_RETRIES

3

Attempts before a rate-limited call gives up and falls back.

WEBULL_RETRY_BACKOFF

0.75

Base seconds for exponential backoff on HTTP 429.

WEBULL_REGION_ID

th

Webull region. Also gates the Yahoo .BK ticker fallback.

SEC_USER_AGENT

(unset)

Required for the EDGAR tools. The SEC's fair-access policy demands a descriptive User-Agent with a real contact address, e.g. Your Name (you@example.com). Requests are refused locally without one rather than sent anonymously, which risks an IP ban.

BLS_API_KEY

(unset)

Optional. BLS works with no key at 25 queries/day; a free key raises it to 500/day and unlocks longer history.


Using it

From the assistant

Restart your MCP client so it picks up the server, then ask for what you want: "How does NVDA look on the daily?", "What's due on the economic calendar this week?", "Draft a limit buy for 10 AAPL at 300." The last one writes a draft to the queue and stops there.

In the dashboard

Double-click the Finance MCP Dashboard shortcut, or run streamlit run dashboard/app.py from the repo root. Nine tabs:

Tab

What it is for

Charts

Candles with overlays, a volume pane and the forecast cone. Drag to pan, scroll to zoom, double-click to reset; drag a single axis to scale it alone. Weekends and market holidays are collapsed, so there are no blank stretches.

Backtest

Runs the adaptive consensus rules over the loaded window and reports CAGR, Sharpe, max drawdown, profit factor and exposure.

Journal

Theses Claude logged via log_journal_entry, with a drift warning when the logged price has moved away from the market.

Signals

The four indicator verdicts behind the consensus score, and the regime weighting matrix that produced them.

Execution

The approval desk. See below.

Portfolio

Live balance, buying power and open positions with P&L, straight from the broker, plus a value-over-time chart. Position marks are labelled in their own currency — a USD holding inside a THB account is never summed with the account base.

Events

The economic calendar (BLS, FOMC, BEA) with each row's actual or prior print, SEC filings for your watchlist, and a "what changed since" diff over filings and price moves.

Alerts

Price, RSI and MACD-cross alerts; the manager fires Windows notifications and stamps which bar triggered.

Data

Every computed indicator column for the loaded window, newest first.

Events tab

The Events tab: the economic calendar with each row's actual or prior print, earnings dates flagged as confirmed, disputed or estimated, and watchlist filings with a hover preview.

Execution tab

The Execution tab — the only path to the market. Preview with the broker, then approve.

DISPLAY in the top right switches the visual theme (Terminal, the default; Research; Slate), the chart overlay palette and row density.

The Execution tab is the only place an order can be submitted. Submission is two-step by design: 1 — Preview with Webull asks the broker to price the order (non-binding), and only then does 2 — Approve and submit unlock. An order the broker will not preview is never sent, and a failed submission leaves the draft pending rather than marking it executed.

3. What Claude can and cannot do

Read prices, filings, macro series, your balance and your positions

yes

Draft an order to a local JSON file, and preview it with the broker

yes

Submit an order

no — the submit button exists only in the dashboard, and only after a broker preview

There is no configuration flag that grants Claude submission rights. Removing the human from that step would require editing the source.


Disclaimer: This is an open-source project for educational and experimental quantitative research. Algorithmic trading carries significant financial risk.

mcp-name: io.github.Blahaj-gif/hitl-finance-mcp

Available Tools

36 tools
calculate_position_sizeCalculate Position SizeA
Read-onlyIdempotent

Sizes a position from account risk rather than gut feel: how many shares can be bought such that being stopped out costs no more than risk_percent of the account. Also reports the ATR-based stop distance for context.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol (e.g. MU, NVDA).
entry_priceNoPlanned entry. Defaults to the latest close.
risk_percentNoPercent of account equity to risk on this trade (default 1.0).
stop_loss_priceYesThe price at which the thesis is wrong and you exit.
account_currencyNoCurrency line to size against (default USD).USD

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the agent knows it's a safe read-only calculation. The description adds the specific calculation logic (shares such that stop loss costs no more than risk_percent) and the extra ATR-based stop distance output, going beyond the annotation information.

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?

The description is two sentences, front-loaded with the core purpose, and the second sentence adds one useful extra output detail. No wasted words.

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 5 parameters, 100% schema coverage, and no output schema, the description fully explains what the tool computes and what it returns (shares and ATR stop distance). The read-only annotations cover side effects, so no further behavioral context is needed.

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%, with all five parameters described in the schema. The description does not add significant parameter-level meaning beyond what the schema already provides; it's consistent with the schema's definitions of risk_percent and stop_loss_price.

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?

The description uses a specific verb ('sizes a position') and explains the risk-based method, clearly distinguishing it from order-entry tools like draft_order. It also mentions the ATR stop distance, further clarifying its calculation role.

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?

The description implies usage when a risk-based position size is needed ('rather than gut feel'), but it does not explicitly name alternatives or state when not to use. Among siblings like draft_order and get_portfolio_risk, the description gives enough context to infer its purpose, but lacks explicit exclusions.

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

cancel_orderCancel OrderA
Destructive

Cancels a pending or active order on the broker account immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesThe order's **client_order_id** — the id this server generated when the order was drafted (it looks like `DRFT_9a32c8d5`), NOT the broker's own `order_id`. `get_open_orders` shows both in its last column; the cancel path only accepts the client one.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already provide destructiveHint=true and readOnlyHint=false. The description adds the constraint that only pending or active orders can be canceled and that cancellation happens immediately, but does not disclose other side effects or irreversible consequences beyond what annotations indicate.

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?

The description is one concise sentence, front-loading the action and scope. Every word earns its place, with no redundant or vague 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?

For a simple one-parameter mutation tool with useful annotations (destructiveHint, readOnlyHint), the description covers the core action and a key constraint. It lacks explicit alternative guidance, but the schema and annotations fill most informational gaps.

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?

The input schema fully describes the order_id parameter, including its client_order_id format and how to obtain it via get_open_orders. The tool description adds no parameter details, so the baseline of 3 for high schema coverage 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?

The description clearly states the tool cancels a pending or active order on the broker account, with a specific verb and resource. It distinguishes from sibling tools like draft_order (creates) and get_open_orders (lists), leaving no ambiguity about its function.

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 purpose implies usage when an order needs to be canceled, but there is no explicit guidance on when not to use it or comparison with alternatives like preview_order. It is a minimal-viable implied usage, earning a 3.

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

check_connectionCheck ConnectionA
Read-onlyIdempotent

Tests the configured price feed and its Yahoo Finance fallback.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, providing a solid safety profile. The description adds that it tests both the primary feed and its fallback, which is useful behavioral context. However, it does not disclose whether the test performs network calls, its output format, or any potential latency/rate-limit implications. It does not contradict the annotations.

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?

The description is a single sentence of 11 words, front-loaded with the verb 'Tests' and the specific resource. It wastes no words and is easy to parse at a glance.

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 zero-parameter tool with rich annotations, the description adequately conveys the purpose. It could potentially mention what the output looks like (e.g., success/failure status) but given the tool's simplicity and name, the current description is nearly complete.

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?

With 0 parameters, the description does not need to explain parameter details. The input schema is empty and trivially 100% covered, so the baseline of 4 is appropriate.

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?

The description uses a specific verb ('Tests') and identifies a clear resource ('the configured price feed and its Yahoo Finance fallback'). This distinguishes it from sibling data retrieval tools and other validation tools like validate_bls_key, which focus on key validation rather than feed connectivity.

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 intended usage is implied: use this tool to verify that the price feed and fallback are working. However, it does not explicitly state when to use it over alternatives, nor does it mention any exclusions or contexts where it should not be used. Given sibling tools like get_data_sources or validate_bls_key, some contrast would improve clarity.

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

compare_symbolsCompare SymbolsA
Read-onlyIdempotent

Compares relative strength, price correlation, and return performance between two tickers.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbol1YesFirst ticker (e.g. AAPL or QQQ).
symbol2YesSecond ticker (e.g. MSFT or SPY).
period_barsNoNumber of historical daily bars for comparison (default 60).

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already state readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows it's a safe read. The description adds the specific metrics computed, but does not disclose data sources, calculation methods, or limitations. With annotations covering safety, this meets baseline but adds only marginal behavioral context.

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 with no filler words. The description is front-loaded with the action and immediately lists the three comparison aspects, making it easy to parse.

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 comparison tool, the description names the three output areas, which gives a clear expectation of what the result will contain. However, without an output schema, it does not detail the exact return structure or how period_bars affects results, so it is not fully complete. Given the simplicity, a 4 is appropriate.

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% with descriptive parameter definitions (symbol1, symbol2, period_bars). The description adds no parameter-specific semantics beyond what the schema already provides; it focuses on output dimensions. Thus baseline 3 is appropriate.

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?

The description uses the specific verb 'Compares' and names three concrete comparison dimensions (relative strength, price correlation, return performance) against two tickers. This clearly distinguishes it from sibling tools that fetch data or analyze single symbols.

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 the tool should be used when an agent needs to compare two tickers' performance and correlation, but it does not explicitly state when to prefer this over alternatives like get_market_analysis or scan_watchlist. No exclusionary guidance is provided.

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

draft_orderDraft OrderA

Drafts an order for human review and approval in the Streamlit Dashboard. For safety, the assistant NEVER places orders directly. All orders must be drafted and manually approved.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesBUY or SELL.
symbolYesTicker symbol (e.g. AAPL, TSLA).
quantityYesNumber of shares.
order_typeNoLMT (Limit) or MKT (Market).LMT
limit_priceNoThe limit price if order_type is LMT.

TDQS

A4/5.0
Behavior4/5

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

Annotations already indicate non-read-only, non-destructive, and non-idempotent behavior, but the description adds valuable context: the tool does not execute orders, only creates a draft requiring human approval. This discloses a key side-effect limitation. It omits details about whether the draft is persisted or what happens after approval, but the core behavior is transparent.

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?

The description is three concise sentences that front-load the purpose and immediately present the safety rule. Every sentence earns its place with no wasted words or 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?

For a 5-parameter tool with no output schema, the description provides sufficient context: what the tool does, the mandatory manual approval workflow, and the dashboard environment. It lacks explicit return-value or post-approval details, but these are not essential for selecting or invoking the tool 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?

The input schema has 100% coverage for all 5 parameters, so the baseline is 3. The description does not add any parameter-specific guidance beyond what the schema already provides. There are no enums or nested objects requiring further explanation.

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 clearly states the purpose with a specific verb ('drafts') and resource ('an order for human review and approval'). It distinguishes the tool from direct order placement via the safety constraint. However, it does not explicitly differentiate from the sibling preview_order, leaving some ambiguity about when to use draft vs preview.

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?

The description delivers an explicit when-to-use guideline: all orders must be drafted and manually approved, so the assistant should use this tool instead of placing orders directly. This is clear and actionable. It does not explicitly name alternatives or when not to use the tool, but the safety rule is sufficient.

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

get_account_infoGet Account InfoA
Read-onlyIdempotent

Lists every account the configured broker credentials can see.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the scoping detail 'configured broker credentials can see', which is useful behavioral context not present in annotations. However, it does not describe the return format or any potential limitations, leaving some transparency gaps.

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?

The description is a single sentence that is directly to the point, using no redundant words. It front-loads the action and scopes the resource efficiently, earning maximum conciseness.

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?

Given the tool's simplicity (no parameters, no output schema) and comprehensive annotations, the description is nearly complete. It states what the tool does and its scope. A minor omission is the lack of detail about what 'account info' includes (e.g., balances, IDs), but this is not critical for a list-all tool.

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?

The tool has zero parameters, so the input schema is empty and the description appropriately omits parameter details. Per the guidelines, a zero-parameter tool gets a baseline of 4, as there is nothing to explain.

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?

The description uses a specific verb 'lists' and clearly identifies the resource ('every account the configured broker credentials can see'). This distinguishes it from sibling tools that focus on specific data types like positions or orders, making its purpose unambiguous.

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 when needing a list of available accounts, but does not explicitly state when to use it over alternatives or provide exclusion criteria. With numerous sibling tools, more explicit guidance would improve clarity, but the simple scope makes the context reasonably clear.

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

get_company_financialsGet Company FinancialsA
Read-onlyIdempotent

Headline financials taken straight from the company's filed XBRL on SEC EDGAR — revenue, net income, diluted EPS, assets, liabilities, cash, equity and shares outstanding. Every figure carries the form and filing date it came from.

Prefer this over get_company_profile when a number has to be right: this is the filing itself, not a third-party summary of it.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol (e.g. MU, AAPL).

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already mark it read-only and idempotent; the description adds valuable behavioral context: data source (SEC EDGAR XBRL), provenance of each figure (form and filing date), and the absence of third-party transformation. No contradictions.

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 short sentences in the first paragraph list concrete data points; the second paragraph is a crisp usage directive. Every sentence serves a purpose with no redundancy.

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 simple single-parameter read-only tool, the description covers what data is returned (with field list), data source, and reliability context. No output schema exists, but the returned items are enumerated, making the tool self-sufficient.

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 has 100% coverage for the single parameter 'symbol' with a clear example. The description adds no additional parameter-level detail, so it remains at the baseline for high schema coverage.

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?

The description clearly states it retrieves headline financials from SEC EDGAR XBRL filings, naming specific metrics (revenue, net income, EPS, etc.). It distinguishes itself from the sibling get_company_profile by emphasizing it uses the actual filing rather than a third-party summary.

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?

Explicitly advises to prefer this tool over get_company_profile when accuracy matters and provides the reason ('filing itself, not a third-party summary'). This is a clear when-to-use directive with an identified alternative.

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

get_company_profileGet Company ProfileA
Read-onlyIdempotent

Everything worth knowing about a company, in one call. Start here.

Answers "tell me about X" without the caller needing to know which of the other tools to reach for: what the business is, what it filed with the SEC, what insiders and the market are doing, and where the stock trades. Sections are fetched concurrently, and each is labelled with how much weight its numbers carry — a figure taken from a filing is not the same kind of fact as one scraped from a third-party feed.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNo"brief" (business, financials, price), "standard" (the default eight), or "full" (everything, including the heuristic verdict and macro calendar).standard
symbolYesTicker symbol (e.g. MU, AAPL).
sectionsNoOverride which sections to include, comma-separated. Available: business, financials, earnings, filings, insiders, proposed, short, price, options, news, consensus, technicals, risk, macro.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, covering safety and idempotency. The description adds meaningful behavioral context: sections are fetched concurrently, each section is labelled with how much weight its numbers carry, and it distinguishes between figures from filings versus third-party feeds. This goes beyond the annotations and helps the agent trust the data quality.

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?

The description is moderately sized, with a strong front-loaded opening sentence. It includes useful context about concurrency and data provenance that earns its place. It is not as terse as a two-sentence ideal but remains well-structured and without redundancy, so a 4 is suitable.

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 no output schema, the description compensates by explaining what the response contains (sections, weighting of numbers, concurrent fetching) and the overall intent of a comprehensive profile. It does not enumerate all return fields, but the sections parameter in the schema lists the datatypes covered, and the description's concepts are sufficient for an agent to understand expected output.

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%, with detailed descriptions for 'symbol', 'detail', and 'sections'. The description adds no parameter-specific semantics beyond the schema, but the schema already provides ample guidance. Since the baseline for high coverage is 3, this score reflects that the description is not required to compensate and does so adequately via 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?

The description clearly states the tool's purpose: 'Everything worth knowing about a company, in one call. Start here.' It specifies the resource (company profile) and differentiates from siblings by framing it as the initial hub tool for 'tell me about X' queries, listing the types of information covered (business, SEC filings, insider activity, market, stock trading).

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?

The description explicitly tells users to 'Start here' and positions the tool as the default entry point for broad company inquiries, eliminating the need to know which other tool to use. It implies using more specialized sibling tools later for depth, but does not explicitly name alternatives or state when not to use this tool, so a 4 is appropriate.

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

get_data_sourcesGet Data SourcesA
Read-onlyIdempotent

Configuration and remaining quota for every external data source, plus how to raise the limits. Use this when a data tool fails or seems rate-limited.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds context about the content (configuration, quota, how to raise limits) and aligns with read-only behavior. However, it does not disclose additional behavioral traits such as return format or potential latency, so with good annotation coverage, a 3 is appropriate.

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?

The description is two sentences, front-loaded with the tool's purpose and followed by a direct usage cue. Every sentence adds value, with no redundancy or filler.

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?

Given the tool's simplicity (no parameters, no output schema) and strong annotations, the description is complete. It covers what the tool returns (configuration, quota, how to raise limits) and when to use it, which is sufficient for a single-purpose read-only tool.

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?

The tool has zero parameters, and schema description coverage is 100% (vacuously). Baseline for 0 params is 4, and the description doesn't need to explain parameter semantics. It communicates the tool's subject matter adequately.

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?

The description clearly states the tool's purpose: 'Configuration and remaining quota for every external data source' plus 'how to raise the limits.' It uses specific verbs and resources without ambiguity, and it distinguishes this tool from siblings like get_account_info or check_connection by focusing on data source quota and configuration.

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?

The description provides clear context for when to use the tool: 'Use this when a data tool fails or seems rate-limited.' It does not explicitly mention alternatives or exclusions, but the usage scenario is specific and actionable.

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

get_earningsGet EarningsA
Read-onlyIdempotent

Next earnings date, historical EPS estimates vs actuals, and — critically — whether the upcoming date is CONFIRMED or merely Yahoo's ESTIMATE.

Yahoo publishes an estimated report date as a window ("Oct 28 - Nov 3") and a set one as a single day. Both look identical once formatted, so an estimated date can read as fact and be wrong by a week. This tool says which it is.

Past quarters are confirmed against the SEC: an 8-K carrying Item 2.02 ("Results of Operations") is the filing a company makes when it actually releases a quarter, and its acceptance timestamp is authoritative to the second.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker (e.g. AAPL, NVDA, TSLA).
confirm_with_secNoCross-check reported quarters against 8-K Item 2.02 filings.

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint), the description reveals significant behavioral nuances: the tool explicitly flags whether a date is confirmed or estimated, explains that both can look identical, and describes the SEC 8-K verification process. This adds critical context for interpreting results.

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?

The description is well-structured with three focused paragraphs: outputs, the critical caveat, and the verification method. Every sentence adds value, and the most important information (confirmed vs estimated) is front-loaded.

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?

Although there is no output schema, the description sufficiently covers the main outputs (earnings date, EPS estimates/actuals, confirmation status) and explains the underlying process. It does not specify the exact return format, but the core functionality is well contextualized.

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% for both parameters, so the baseline is 3. The description briefly mentions SEC confirmation but does not explain the effect of setting confirm_with_sec to false, leaving a small semantic gap that the schema's parameter description already partially covers.

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?

The description clearly states the tool's function: providing next earnings date, historical EPS estimates vs actuals, and crucially distinguishing confirmed vs estimated dates. This is specific and differentiates it from sibling tools like get_company_financials or get_news.

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?

The description implies when to use the tool by highlighting the problem with Yahoo's estimated dates and the importance of SEC confirmation. It doesn't explicitly name alternatives or exclusions, but the context strongly signals the use case for reliable earnings dates.

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

get_economic_calendarGet Economic CalendarA
Read-onlyIdempotent

Upcoming US macroeconomic events with their scheduled date, time and — where the release has already happened — the number that came out.

Three live sources, all free and keyless: the Bureau of Labor Statistics (CPI, core CPI, PPI, the employment situation/NFP, JOLTS), the Federal Reserve (FOMC rate decisions, flagged when they carry a Summary of Economic Projections), and the BEA (PCE — the Fed's target measure — plus GDP and the trade balance).

Each row carries a reading: the actual print for a release that has happened, or the PREVIOUS print for one that has not. There is no consensus/expectations feed here — street forecasts are a licensed product — so every comparison is against the prior reading and is labelled that way. Do not read a "prior" figure as a forecast for the release being waited on.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourcesNoComma-separated subset of bls,fomc,bea. Default all three.bls,fomc,bea
days_backNoHow far back to include recently published releases (default 7).
days_aheadNoHow far forward to look for scheduled events (default 30).
include_latest_dataNoAlso report the latest CPI/core CPI/unemployment/payroll prints.

TDQS

A4.5/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent annotations by explaining the three live sources, the free/keyless nature, the inclusion of actual vs. previous prints, and the labeling of comparisons. This is valuable behavioral context that prevents misuse.

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?

The description is well-structured with a clear main function, followed by source details and a caution about interpretation. Each sentence carries meaningful information without redundancy or fluff.

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 read-only tool with complete schema and annotations, the description fully explains the data content, source coverage, and how to interpret the readings. It is complete for an agent to decide whether to use it and what to expect.

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% with detailed descriptions for all four parameters, so the baseline is 3. The description does not add parameter-specific details beyond the schema, but it does not need to; the schema fully documents them.

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?

The description clearly states the tool's function: listing upcoming US macroeconomic events with scheduled dates/times and actual or previous readings. It distinguishes itself from sibling tools like earnings or news by focusing on macro data releases from specific sources.

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?

Provides clear context about the data scope (US macro, specific sources) and explicitly warns about the lack of consensus/forecasts and the misinterpretation of 'prior' figures. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls just 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_edgar_filingsGet Edgar FilingsA
Read-onlyIdempotent

SEC EDGAR filings, as close to real time as a public feed allows — timestamps carry the second the SEC accepted the document.

Three modes, chosen by what you pass:

  • symbol set → that company's recent filings (earnings 8-Ks, 10-Q, 10-K, Form 4).

  • query set → full-text search across filing bodies, 2001-present.

  • neither → the live firehose of form_type filings from every registrant.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return (default 15).
queryNoFull-text phrase to search for (e.g. "going concern", "tariff").
symbolNoTicker to scope to (e.g. MU, AAPL).
form_typeNoFiling type — 8-K, 10-Q, 10-K, 4, S-1, 13F-HR. Comma-separate for several.8-K

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds substantial behavioral context: real-time feed timing, timestamp precision, full-text search scope (2001-present), and firehose behavior. This goes well beyond the annotations and enriches the agent's understanding of what to expect.

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?

The description is concise despite covering three modes. It front-loads the core purpose, then uses a clean bullet-style list for the modes. Every sentence serves a purpose, and no repetition of schema or annotation content occurs.

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 tool with three modes, four parameters, and no output schema, the description provides complete operational guidance. It explains mode selection, data scope, and timestamp behavior. The annotations cover safety, and the schema covers parameter constraints, so no critical information 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 descriptions already cover all four parameters (100% coverage). The description adds value by explaining how parameter combinations select different modes, which is not explicit in the schema. That relationship between symbol/query and behavior is the key semantic addition.

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?

The description uses a specific verb ("get") and resource ("SEC EDGAR filings") and clearly distinguishes three modes based on parameters. It goes beyond a simple definition by explaining the real-time nature and the scope of each mode, making it easy to differentiate from sibling tools like read_filing or get_earnings.

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?

The description explicitly explains three usage modes based on which parameters are set, giving clear guidance on when to use symbol, query, or neither. It does not name alternative tools for exclusions, but the mode breakdown effectively communicates selection criteria.

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

get_insider_activityGet Insider ActivityA
Read-onlyIdempotent

Parsed SEC Form 4 insider transactions — who traded, when, at what price, and crucially whether the sale was made under a Rule 10b5-1 plan.

That distinction is the whole point: a pre-scheduled 10b5-1 sale carries almost no information about an insider's view, while a discretionary open-market sale does. The tool also separates real decisions (codes P/S) from compensation mechanics — option exercises, grants, and shares withheld to pay tax on vesting — which are routinely and wrongly reported as "insiders sold $X".

ParametersJSON Schema
NameRequiredDescriptionDefault
formsNoWhich ownership forms to read — "4" (changes in ownership, the default), "3" (initial statement filed on becoming an insider — all holdings, no trades), "5" (annual statement of exempt or deferred transactions), or "3,4,5". Use "144" for notices of *proposed* sales, which are filed before the trade and so lead the Form 4 that later reports it.4
limitNoHow many Form 4 filings to parse (default 10).
sinceNoISO date (YYYY-MM-DD); drop transactions before it.
personNoFilter to one insider by name, case- and accent-insensitive (e.g. "Mehrotra").
symbolYesTicker symbol (e.g. MU, AAPL).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds meaningful interpretive context about how the data is categorized (discretionary vs. 10b5-1, compensation mechanics), which helps the agent understand the output's significance. It does not mention potential limitations like filing delays or coverage gaps, but with strong annotations this is acceptable.

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?

The description is about 100 words across two paragraphs, but every sentence earns its place. The bolded 10b5-1 distinction and the explanation of compensation mechanics are substantive and not filler. It is front-loaded with the core purpose, though it could be tightened slightly.

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?

Despite having no output schema, the description effectively communicates the key output dimensions: who traded, when, at what price, and whether the trade is 10b5-1 or a compensation event. This is sufficient for an agent to know what to expect. It does not document pagination or error behavior, but the 'limit' parameter and openWorldHint partially cover that. Given the interpretive complexity, the description is reasonably 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?

All 5 parameters are fully described in the input schema (100% coverage), so the baseline of 3 applies. The description adds no parameter-level details beyond what is in the schema, such as format hints for 'since' or examples for 'person'. It provides no extra semantic value for parameters.

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?

The description opens with a specific verb and resource: 'Parsed SEC Form 4 insider transactions', and immediately enumerates the key data points (who, when, price, and 10b5-1 plan status). This clearly distinguishes the tool from sibling tools like get_edgar_filings or get_institutional_holdings by emphasizing the insider-trading focus and the plan-classification nuance.

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?

The description gives clear context for when to use the tool: when interpreting insider sales, particularly to separate pre-scheduled 10b5-1 sales from discretionary ones, as highlighted by 'That distinction is the whole point.' However, it does not explicitly name alternative tools or state when not to use it, 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_institutional_holdingsGet Institutional HoldingsA
Read-onlyIdempotent

Latest 13F-HR portfolio for an institutional manager — every reported position, largest first. Accepts a ticker (BRK-B) or a raw CIK (1067983).

Positions are merged across the manager rows a fund files separately: Berkshire reports Apple across 12 rows, and reading only the first understates the holding threefold.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many positions to show (default 25).
sourceNo"13F" for quarterly manager holdings (default), or "NPORT" for a registered fund's monthly portfolio, which also covers bonds and derivatives that 13F omits entirely.13F
institutionYesTicker or CIK of the filer (e.g. 1067983 for Berkshire Hathaway).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the bar for added value is lower. The description adds a crucial behavioral nuance—positions are merged across separate fund rows (e.g., Berkshire's Apple across 12 rows)—which prevents undercounting. It also discloses accepted identifiers.

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 sentences, no redundancy: the first states purpose and output order, the second explains a non-obvious data-integrity detail. Every word is useful.

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 read-only list tool with good schema coverage and safe annotations, the description covers the essential behavior, input, and output ordering. It doesn't specify the exact fields in each position, but the merging nuance and input flexibility make it adequate.

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?

The input schema already covers all three parameters with descriptions (100% coverage). The description reinforces the ticker/CIK alternative and the merging behavior but doesn't add parameter-level detail beyond what the schema provides, so 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?

The description opens with 'Latest 13F-HR portfolio for an institutional manager — every reported position, largest first,' using a specific verb and resource, and clarifies input formats (ticker or CIK). This clearly distinguishes it from sibling tools like read_filing or get_edgar_filings by focusing on institutional manager holdings.

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?

It gives clear context: this is for retrieving a manager's complete 13F portfolio, with a note about merging multiple rows. It doesn't explicitly name alternatives or exclusions, but the specificity implies when it's appropriate.

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

get_journal_summaryGet Journal SummaryA
Read-onlyIdempotent

Queries local Trading Journal DB for win rate, total trades, average confidence, and recent trade logs.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds the 'local DB' detail, indicating a local query rather than a network call, which is useful context. However, it does not disclose return format or behavior for empty journals, so it is adequate but not rich.

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 sentence that is front-loaded with the verb 'Queries', lists the data fields, and contains no filler. Every word 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?

For a zero-parameter read-only tool, the description lists all relevant return data categories (win rate, total trades, average confidence, recent trade logs). Even without an output schema, the tool's behavior is fully described for its intended use.

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?

The input schema has no properties, so parameter coverage is trivially 100%. With zero parameters, the description does not need to explain any parameter semantics, and the baseline of 4 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?

The description uses a specific verb 'Queries' and names the resource 'local Trading Journal DB', followed by explicit data fields (win rate, total trades, average confidence, recent trade logs). This clearly distinguishes it from sibling tools like log_journal_entry, which writes to the journal.

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?

The description implies when to use this tool (when you need journal summary statistics) but does not explicitly state exclusions or alternatives. The sibling list includes log_journal_entry as the write counterpart, so the read vs. write distinction is implicit but not spelled out.

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

get_macro_dataGet Macro DataA
Read-onlyIdempotent

Historical macroeconomic series from the BLS with month-over-month and year-over-year changes — the numbers behind the inflation and labour narrative.

ParametersJSON Schema
NameRequiredDescriptionDefault
monthsNoHow many observations to show per series (default 13).
seriesNoComma-separated keys or a list. BLS (default source): cpi, cpi_sa, core_cpi, unemployment, payrolls, ppi, avg_hourly_pay, labor_force. Central banks and markets (source="markets"): fed_funds, fed_target_upper, ecb_deposit, ecb_refi, boe_bank_rate, boe_sonia, boj_call_rate, us_2y, us_10y, us_30y, curve_10y_2y, curve_10y_3m, breakeven_10y, us_cpi, us_core_pce, us_gdp_real, us_unemployment, euro_hicp, dollar_index, vix, hy_spread, mortgage_30y.cpi,core_cpi,unemployment
sourceNo"bls" for US labour statistics (default), or "markets" for policy rates, the yield curve and financial conditions via FRED, the ECB and the Bank of England.bls

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and openWorld. The description adds that the tool returns series with month-over-month and year-over-year changes, a specific behavioral characteristic beyond the annotations. It also notes the 'numbers behind the inflation and labour narrative,' providing context on the data's thematic focus. No contradictions with 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?

The description is a single, readable sentence that front-loads the core function and adds a clarifying phrase. The trailing clause '— the numbers behind the inflation and labour narrative' is slightly ornamental but not wasteful. It is well-structured and concise.

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

Completeness3/5

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

The description covers the BLS data source and the output transformation (MoM/YoY changes), but omits the 'markets' source entirely, which is a substantial capability (policy rates, yield curve, financial conditions). Given the tool's moderate complexity and the absence of an output schema, this omission leaves the description incomplete for guiding the agent to the full range of the tool's functions. Annotations and schema compensate, but the description doesn't fully narrate the tool's scope.

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?

The input schema provides 100% coverage of all three parameters with detailed descriptions and defaults. The description itself adds no parameter-specific information, so per the baseline for high schema coverage, a score of 3 is appropriate. The schema handles 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 clearly identifies a resource (historical macroeconomic series) and a specific verb ('Get' in title) with a focus on BLS data and month-over-month/year-over-year changes. It distinguishes from siblings like get_market_analysis or get_economic_calendar by targeting historical data with period changes. However, it narrowly attributes data to BLS while the schema also supports a 'markets' source, making the description partially incomplete but not ambiguous.

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 the tool is for retrieving historical macro series with MoM/YoY changes, but provides no explicit when-to-use guidance or comparison with alternatives like get_economic_calendar or get_market_analysis. It does not mention the 'markets' source option, which affects when it should be selected. This is implied usage rather than explicit direction.

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

get_market_analysisGet Market AnalysisA
Read-onlyIdempotent

Price action and 50+ technical indicators for a symbol, reported as measured values with each indicator's own standard reading (oversold / overbought, above / below its signal line, inside / outside its band).

This is the usual starting point for a single symbol. For the full picture including fundamentals, filings and insider activity, call get_company_profile instead of chaining calls.

No BUY/SELL score is produced unless you ask for one. The composite verdict is a fixed-weight heuristic that underperformed buy-and-hold in backtest, and an unvalidated score anchors judgment even when it is labelled unvalidated — so the default is to hand back the evidence and leave the call to the reader.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of historical bars to analyze.
symbolYesThe stock symbol (e.g. AAPL, KBANK).
intervalNoBar interval: D (Daily), M1 (1 min), M5 (5 min), M15 (15 min), M30 (30 min), H1 (1 hour), W (Weekly).D
include_verdictNoSet true to also compute the composite BUY/SELL score. Off by default.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnly, openWorld, idempotent, non-destructive), the description adds valuable behavioral details: the default is to return evidence without a composite verdict, and the verdict is a fixed-weight heuristic that underperformed buy-and-hold in backtesting. It also explains the psychological anchoring rationale, which is more than annotations provide and helps the agent set appropriate expectations.

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?

The description is appropriately sized for the tool's complexity. It front-loads the core function in the first sentence, then moves to usage guidance, and ends with a behavioral caveat. Each sentence contributes new information; the final paragraph, while slightly verbose, earns its place by explaining the design decision around verdicts.

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?

Despite lacking an output schema, the description is complete enough for an agent: it states what indicators are returned, how readings are normalized, when to use it, the alternative to call, and the default behavior of the verdict. The 100% schema coverage fills in parameter specifics, and the description covers the non-obvious behavioral nuances.

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. The description adds meaning beyond the schema by explaining the rationale behind the include_verdict default and the consequence of not requesting a score. It does not re-document parameter types or formats, but the context about outputs and the heuristic adds useful non-schema information.

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?

The description opens with a specific verb + resource: "Price action and 50+ technical indicators for a symbol," and clearly states the output format. It differentiates from siblings by positioning this tool as "the usual starting point for a single symbol" and explicitly directing to get_company_profile for fundamentals.

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 provides explicit when-to-use guidance: it is the default for single-symbol technical analysis. It also names an alternative for broader data (get_company_profile) and warns against chaining calls. The note about no BUY/SELL score unless requested clarifies when to set include_verdict, giving actionable context.

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

get_multi_timeframeGet Multi TimeframeA
Read-onlyIdempotent

Performs multi-timeframe analysis across Daily (D), 1-Hour (H1), and 15-Min (M15) for a symbol to compute a Confluence Score.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker (e.g. AAPL, KBANK).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only and idempotent behavior, and the description adds specific details about the analysis performed (timeframes and score). It does not contradict annotations and provides sufficient context for a safe read operation.

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?

The description is a single, straightforward sentence that is front-loaded with the action and includes all necessary detail without waste. It is concise and well-structured.

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?

Given the simple schema and strong annotations, the description covers what the tool does and its key inputs. The lack of an output schema is not a major gap since the tool's purpose is clearly to return a 'Confluence Score', though it doesn't detail the response format or score interpretation.

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?

The single parameter 'symbol' is fully documented in the schema with a clear example. The description only repeats 'for a symbol' without adding new semantics beyond the schema. With 100% schema coverage, this meets the baseline.

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?

The description clearly states the verb 'Performs multi-timeframe analysis' and specifies the exact timeframes (Daily, 1-Hour, 15-Min) and the output ('Confluence Score'). It distinguishes itself from sibling tools like get_ohlcv or get_market_analysis by focusing on this specific analysis type.

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?

The description clearly implies when to use the tool: when a multi-timeframe confluence score is needed for a symbol. It does not explicitly mention exclusionary conditions or alternative tools, but the purpose is narrow enough that context is clear.

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

get_newsGet NewsA
Read-onlyIdempotent

Fetches the most recent news headlines for a given stock using Yahoo Finance. Crucial for analyzing fundamental catalysts or identifying the source of technical momentum breakouts.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of headlines to return (default 10).
symbolYesTicker symbol (e.g. AAPL, TSLA).

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the safety and side-effect profile. The description adds the Yahoo Finance source and recency ('most recent'), but does not disclose additional behavioral traits such as return format or pagination, which is acceptable given annotation coverage.

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?

The description is concise—two sentences with no unnecessary words. The first sentence states the action and resource, and the second provides valuable usage context. Every sentence earns 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?

The tool is simple with only two parameters, no output schema, and strong annotations. The description explains the purpose and use case adequately, and the absence of detailed return valua information is forgivable given the nature of the tool and that annotations cover safety.

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 both parameters (symbol and count), so the baseline is 3. The description adds minimal parameter meaning beyond the schema, only referring to 'a given stock' which maps to symbol; it does not elaborate on count or formatting.

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?

The description clearly states the tool 'Fetches the most recent news headlines for a given stock using Yahoo Finance,' which is a specific verb+resource combination. It is implicitly distinct from sibling tools since no other sibling tool covers news headlines.

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?

The description provides clear usage context by stating it is 'Crucial for analyzing fundamental catalysts or identifying the source of technical momentum breakouts.' This tells the agent when to use the tool, though it does not explicitly mention alternatives or exclusions.

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

get_ohlcvGet OhlcvA
Read-onlyIdempotent

Fetches raw OHLCV (Open, High, Low, Close, Volume) candlestick bars for a symbol. Use when you need the price series itself — to eyeball recent action or do your own maths. For indicators and a reading of them use get_market_analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of bars to return (default 20).
symbolYesThe stock symbol (e.g. AAPL, KBANK).
intervalNoBar interval (D, M1, M5, M15, M30, H1, W).D

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds minimal behavioral context beyond this (e.g., 'raw' data, but no return format, pagination, or rate limits). Given the strong annotation coverage, a score of 3 is appropriate—the description does not contradict annotations but also does not significantly enrich behavioral transparency.

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?

The description is two sentences, front-loaded with the action and resource, and immediately follows with usage guidance and a sibling alternative. Every sentence earns its place—no filler or 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?

For a relatively simple fetch tool with no output schema, the description sufficiently communicates what the tool returns ('candlestick bars') and when to call it. It lacks explicit return-structure details, but the name and description make the likely output clear. Complete enough given the low complexity and rich annotations.

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?

The input schema provides 100% coverage of parameter descriptions, including defaults for count and interval, and the symbol example. The description adds no additional parameter-level meaning beyond what the schema already documents. Baseline 3 is correct when schema does the heavy lifting.

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?

The description clearly identifies the tool as fetching raw OHLCV candlestick bars for a symbol, using a specific verb ('Fetches') and resource ('raw OHLCV candlestick bars'). It also distinguishes itself from get_market_analysis, which provides indicators, making the purpose unambiguous even among siblings.

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?

Explicitly states when to use the tool ('when you need the price series itself — to eyeball recent action or do your own maths') and provides a clear alternative ('For indicators and a reading of them use get_market_analysis'). This is a model of usage guidance, covering both when and when-not.

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

get_open_ordersGet Open OrdersC
Read-onlyIdempotent

Working orders on the configured broker account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds no behavioral context beyond these hints—it does not explain what 'working orders' means, whether it reflects live broker state, or any rate limits/pagination. It is a minimal restatement of the title.

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

Conciseness3/5

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

The description is extremely short ('Working orders on the configured broker account'), making it concise. However, it is under-specifying and reads as a sentence fragment rather than a complete, informative statement. It is not as well-structured as descriptions that use a full sentence.

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

Completeness2/5

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

This is a very simple tool with no parameters and no output schema, but the description is still incomplete. It does not state return format, whether results are sorted, what statuses qualify, or any caveats. The sibling tool 'get_open_positions' suggests a potential confusion point, and the description does not address it.

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?

There are no parameters, so the schema provides full coverage. The description does not need to explain parameters. A baseline of 4 is appropriate given the zero-parameter structure.

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 title 'Get Open Orders' combined with the description 'Working orders on the configured broker account' clearly indicates the tool retrieves open/working orders. The resource is specific and distinct from siblings like 'get_open_positions' or 'draft_order', though the description itself lacks an explicit verb.

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 use this tool versus alternatives. The description is merely a noun phrase and does not mention prerequisites, context, or exclusions. It relies entirely on the tool name for usage context.

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

get_open_positionsGet Open PositionsA
Read-onlyIdempotent

Open positions on the configured broker account, with per-currency marks.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false), so the description only adds context that the tool operates on the configured broker account and returns per-currency marks. It does not disclose edge cases or response format details beyond annotations.

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?

The description is a single, concise sentence that front-loads the main action and avoids unnecessary words. It is efficiently structured and easy to parse.

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, no-parameter, read-only tool with no output schema, the description provides sufficient context about the resource (open positions), scope (configured account), and a useful detail (per-currency marks). It could clarify what 'marks' mean, but overall it is adequate for its simplicity.

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?

The input schema has zero parameters, so the description has no parameter burden. Per the baseline rule for 0 params, a score of 4 is appropriate. The description adds no parameter-related ambiguity.

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?

The description clearly states that the tool retrieves open positions on the configured broker account, with per-currency marks. This specific verb+resource combination distinguishes it from siblings like get_open_orders or get_account_info.

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 provides no explicit guidance on when to use this tool versus alternatives, nor does it mention any exclusions or direct comparisons to sibling tools. The agent must infer usage solely from the tool's name and basic description.

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

get_options_analyticsGet Options AnalyticsA
Read-onlyIdempotent

Options analytics beyond a raw chain: implied-volatility rank and percentile against the past year of realised volatility, the ATM straddle's implied move, put/call skew, and Black-Scholes greeks for near-the-money strikes.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesTicker symbol (e.g. MU, NVDA).
expirationNoExpiry as YYYY-MM-DD. Defaults to the nearest expiry.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the bar is lower. The description adds valuable context about the specific analytics computed (e.g., IV rank against past year, ATM straddle move), which helps the agent understand what to expect. No contradictions with annotations.

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?

The description is a single, well-structured sentence that front-loads the key concept ('beyond a raw chain') and then enumerates the metrics. Every word earns its place with no waste.

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 read-only analytics tool with two parameters and no output schema, the description lists the key returned metrics, providing sufficient context. It could mention the default expiration behavior, but that is already in the schema, so the completeness is good.

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%, with both symbol and expiration already described in the schema. The description does not add additional parameter-level details, 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?

The description clearly states what the tool does: it provides advanced options analytics (IV rank/percentile, ATM straddle move, put/call skew, greeks) beyond a raw chain. This differentiates it from sibling tools like get_options_chain and get_unusual_options.

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?

The phrase 'beyond a raw chain' implies the tool is for users needing analytics rather than raw option data, giving clear context. However, it does not explicitly name alternative tools or state when not to use it, so it falls 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_options_chainGet Options ChainA
Read-onlyIdempotent

Option chain around the money, with IV rank and the market-implied expected move at the top — the two numbers that tell you whether the board is cheap or dear and how far it is priced to travel.

Strikes are selected to bracket spot, not taken from one end of the ladder. For greeks and put/call skew as well, call get_options_analytics; to hunt unusual flow call get_unusual_options.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesThe stock symbol (e.g. AAPL, SPY, NVDA).
strikesNoHow many strikes either side of spot to show (default 6).
expirationNoExpiry as YYYY-MM-DD. Defaults to the nearest.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful context beyond annotations by disclosing the output highlights (IV rank, expected move) and the strike selection methodology (bracket spot). This is useful behavioral detail without contradicting annotations.

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 compact sentences, each with specific value. The first communicates the core output, the second explains strike selection and directs to siblings. No filler or 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?

Despite lacking an output schema, the description effectively communicates what the tool returns and why it matters. It covers the key outputs, the strike selection rationale, and sibling tools for extended needs. Minor gaps exist around exact response format or edge cases, but for a read-only data retrieval tool this is sufficiently 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?

Schema coverage is 100% with descriptive parameter entries for symbol, strikes, and expiration. The description does not add new parameter-level details beyond what the schema already provides, so the baseline score of 3 is appropriate.

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?

The description clearly identifies the tool as retrieving an option chain around the money, with IV rank and expected move. It explicitly distinguishes itself from siblings by naming get_options_analytics and get_unusual_options as alternatives for different needs.

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?

Provides explicit guidance: 'For greeks and put/call skew as well, call get_options_analytics; to hunt unusual flow call get_unusual_options.' Also clarifies that strikes bracket spot rather than being pulled from one end, which shapes appropriate use.

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

get_portfolio_riskGet Portfolio RiskA
Read-onlyIdempotent

Analyses the live account: position-level P&L, concentration, and portfolio volatility/beta versus SPY. Highlights over-concentration and correlated clusters.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable context by specifying exactly what is analyzed (P&L, concentration, volatility/beta) and what it highlights (over-concentration, correlated clusters), going beyond the generic safety hints without contradicting them.

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?

The description is two sentences, front-loaded with the primary action, and every phrase contributes specific information (scope, metrics, and risk flags). There is no filler or redundancy, making it highly efficient.

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 zero-parameter tool with no output schema, the description conveys the purpose, the analysis targets, and the key outputs (highlights). It could be slightly improved by explicitly stating the return format (e.g., 'returns a risk report'), but given the simple nature and strong annotations, it is adequately complete.

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?

The tool has zero parameters and the input schema is empty with 100% coverage. Per the rubric, a zero-parameter tool receives a baseline of 4. The description naturally does not need to explain parameters, and it does not introduce any ambiguity.

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?

The description uses a specific verb 'Analyses' with a clear resource 'the live account' and enumerates concrete aspects (position-level P&L, concentration, volatility/beta vs SPY). This distinguishes it from siblings like get_account_info (general account details) and get_open_positions (raw positions) by focusing on risk analysis.

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?

The description clearly implies when to use this tool: when the user needs a risk assessment of the live portfolio, including volatility, concentration, and correlation analysis. It does not explicitly name alternatives or exclusions, but the context is unambiguous given the specific risk-oriented wording.

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

get_sector_heatmapGet Sector HeatmapA
Read-onlyIdempotent

Scans the 11 major S&P sector ETFs (Technology, Financials, Energy, Healthcare, Industrial, Consumer, Utilities, Real Estate, Materials) by momentum to identify sector rotation.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds the specific sector list and momentum-based methodology, but does not disclose any other behavioral aspects such as output format or potential limitations. This is acceptable but not rich, consistent with a 3 given the strong annotation coverage.

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?

The description is a single, well-structured sentence that front-loads the action and includes only essential details (sector list, momentum approach, purpose). No wasted words, and it is easily skimmed by an agent.

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

Completeness3/5

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

For a tool with no output schema, the description does not explicitly describe what the agent will receive (e.g., a heatmap, momentum scores, or a rotation ranking). The core purpose is clear, but the lack of return-value information leaves a gap for an agent deciding whether this tool satisfies its need.

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?

The tool has zero parameters, and the schema trivially covers 100%. The description does not need to explain parameters, and the baseline score of 4 is appropriate because the description avoids unnecessary parameter noise and does not mislead.

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?

The description clearly states a specific action: 'Scans the 11 major S&P sector ETFs' to 'identify sector rotation'. This distinguishes it from siblings like get_market_analysis (broad market) or scan_watchlist (user-defined symbols), and the verb+resource+outcome is unambiguous.

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 when sector rotation analysis is needed, but it does not explicitly state when to use this tool over alternatives, nor does it mention any exclusions or alternative tools. The use case is clear but not directly contrasted with siblings.

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

get_short_interestGet Short InterestA
Read-onlyIdempotent

Fetches short interest metrics (Short % of Float, Days to Cover / Short Ratio, Shares Short) for squeeze or squeeze-fade thesis.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker (e.g. GME, TSLA, NVDA).

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds the specific data fields returned, which is useful but does not address potential limitations like data source or latency. This is acceptable but not rich.

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?

The description is a single, focused sentence that front-loads the action and lists the key metrics. Every word contributes value with no redundancy or filler.

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 one-parameter read-only tool with strong annotations, the description adequately conveys what the tool returns. It does not explain output structure, but no output schema exists and the metric names are self-explanatory, so the context is sufficiently 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?

The input schema already provides 100% coverage for the single parameter 'symbol' with a clear example list. The description adds no additional parameter-level 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?

The description uses a specific verb ('Fetches') and clearly identifies the resource (short interest metrics) with the exact metrics enumerated (Short % of Float, Days to Cover, Shares Short). This distinguishes it from sibling market data tools like get_market_analysis or get_options_chain.

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?

The phrase 'for squeeze or squeeze-fade thesis' provides clear context for when to use this tool, implying it is for short-interest-related analysis. It does not explicitly name alternative tools, but the context is sufficient for a reasonable agent to select it.

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

get_unusual_optionsGet Unusual OptionsA
Read-onlyIdempotent

Scans for unusual options activity (Volume > Open Interest or high IV > 50%) to detect smart money positioning.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker (e.g. AAPL, NVDA, TSLA).

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds meaningful behavioral context by specifying the exact conditions (Volume > OI or IV > 50%) that define 'unusual', which goes beyond what annotations or schema provide. It does not mention return format, but the annotations lower the bar for safety disclosure.

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?

The description is a single, well-structured sentence that immediately states the action and the key criteria. Every word adds value, with no redundancy or filler, making it appropriately concise.

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 only one required parameter and no output schema, the description is largely sufficient. It covers what the tool does, what qualifies as unusual, and the underlying purpose. It could be enhanced by mentioning the lookback period or return format, but for a simple read-only scan of a single symbol, this is adequately complete for an agent.

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 only parameter 'symbol' is clearly described with examples). The tool description does not add significant meaning to the parameter beyond what the schema already provides, but it does place the symbol in the context of the scan. This aligns with the baseline of 3 when schema covers parameters.

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?

The description uses a specific verb 'Scans' and clearly identifies the resource as 'unusual options activity', with concrete criteria (Volume > Open Interest or high IV > 50%) that distinguish it from sibling tools like get_options_chain or get_options_analytics. The phrase 'to detect smart money positioning' adds a clear purpose.

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 when to use this tool (when you want to detect unusual options activity/smart money positioning) but gives no explicit guidance on when not to use it or which sibling alternative to choose. There are no exclusions or named alternatives, so it relies on the inferred use case.

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

get_updatesGet UpdatesA
Read-onlyIdempotent

What has actually changed since a point in time: new SEC filings, macro releases that have printed, and outsized price moves.

Every other tool here answers "what is true now". Answering "what is new" without this means refetching everything and diffing by hand, which is expensive and easy to get wrong. This does the diff against a timestamp you supply.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoA window ("24h", "3d", "2w"), a date ("2026-08-01"), or an ISO timestamp ("2026-08-01T13:30:00Z"). Default 24h.24h
symbolsNoTickers to check, comma-separated or a list. Filings and price moves are per-symbol; leave empty for macro only.
include_macroNoInclude economic releases that printed inside the window.
move_threshold_pctNoReport a price move only if it is at least this large.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read. The description adds behavioral context beyond annotations by explaining that the tool performs a diff against a supplied timestamp and covers specific categories (filings, macro, price moves). It doesn't describe the return format, but given the strong annotation coverage, the additional context earns a 4.

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 paragraphs: the first defines the tool's purpose, the second explains why it exists relative to alternatives. Every sentence earns its place, with no filler or redundancy. It is concise yet information-dense.

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?

The tool has 4 parameters, no output schema, and many data-retrieval siblings. The description covers purpose, usage, and update categories, which is enough for an agent to select and invoke it correctly. It could mention return structure or pagination, but the core context is adequately covered given the tool's moderate complexity.

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 mention of 'timestamp you supply' only echoes the 'since' parameter's schema description without adding new meaning. It does not clarify parameter interactions or edge cases beyond what the schema already provides.

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?

The description opens with 'What has actually changed since a point in time' and enumerates specific update types (SEC filings, macro releases, outsized price moves), giving a clear verb+resource+scope. It also distinguishes itself from siblings by stating 'Every other tool here answers what is true now', making its unique role unambiguous.

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 states this tool answers 'what is new' and warns that doing so without it means 'refetching everything and diffing by hand, which is expensive and easy to get wrong.' This directly tells the agent when to use this tool versus alternatives, fulfilling the dimension's requirement for explicit when-to-use guidance.

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

get_volume_profileGet Volume ProfileA
Read-onlyIdempotent

Volume-by-price for a symbol: point of control, value area, and the high and low volume nodes around the current price.

Answers "where did this market previously agree on value, and where did it refuse to trade" — the auction-theory reading that price and oscillators cannot give. High volume nodes are shelves the market accepted and tends to revisit; low volume nodes are thin prices it rejected, and price usually travels through them quickly, so they act as breakout levels.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYesStock ticker (e.g. AAPL, NVDA).
bucketsNoPrice bins; higher is a finer profile (default 20).
intervalNoBar size — D, W, M, H1, M30, M15, M5, M1 (default D).D
lookbackNoBars in the profile window (default 100).
value_area_pctNoFraction of volume inside the value area (default 0.70).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds valuable interpretive context about high and low volume nodes—calling them 'shelves' and 'breakout levels'—which helps the agent understand the behavioral meaning of the output beyond raw numbers. No contradiction with annotations.

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?

The description is concise—three sentences that front-load the core definition and then enrich it with a meaningful interpretive paragraph. Every sentence earns its place: the first defines, the second frames the purpose, and the third explains the significance of the outputs. No wasted words.

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?

Without an output schema, the description carries the burden of explaining what the agent will receive. It enumerates the key components (point of control, value area, high/low nodes) and interprets them, which is sufficient for an agent to understand the result. It does not specify the exact return structure, but the conceptual completeness is strong given the tool's complexity.

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?

All 5 parameters have schema descriptions covering 100%, so the structural burden is already met. The description does not directly elaborate on parameters, but its conceptual explanation of volume profile indirectly clarifies why parameters like buckets and value_area_pct matter. This meets the baseline for high schema coverage without adding extra semantic depth.

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?

The description clearly states that the tool provides volume-by-price data for a symbol, listing specific outputs (point of control, value area, high/low volume nodes). It distinguishes itself from price and oscillator tools by emphasizing the auction-theory perspective, making its unique purpose unmistakable.

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?

The description provides a clear use case: when you need to understand where the market previously agreed on value and where it refused to trade. It contrasts itself with price and oscillators, implying these alternatives cannot give this reading. However, it does not explicitly name sibling tools or provide when-not-to-use guidance, so it stops short of full explicit alternatives.

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

log_journal_entryLog Journal EntryA

Logs a trade, market thesis, or trading theorem to the local Trading Journal database. Includes atomic file writing & de-duplication protection.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeYesSize of the trade in number of shares (0 for thesis only).
priceYesPrice per share of the asset at entry/thesis.
actionYesThe trade action: BUY, SELL, HOLD, or SYSTEM THESIS.
symbolYesThe stock symbol (e.g. AAPL, KBANK).
rationaleYesStructured reason, thesis logic, or mathematical theorem why this trade/position is entered.
confidenceNoConfidence level from 1 (lowest) to 10 (highest).

TDQS

A4/5.0
Behavior4/5

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

The annotations provide minimal behavioral hints (all false), so the description carries the burden of disclosure. It adds valuable context by mentioning 'atomic file writing' (ensuring data consistency) and 'de-duplication protection' (preventing duplicate entries), which are non-obvious behavioral traits beyond what schema fields convey.

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?

The description is two concise sentences. The first sentence states the primary purpose, and the second adds two key behavioral details. No filler or redundancy, and it is well-structured and front-loaded.

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 write-only journal tool with six fully documented parameters and no output schema, the description adequately covers what it does and key implementation traits (atomicity, de-duplication). It does not mention return values, but that is not essential given the absence of an output schema. The description is sufficiently complete for effective tool selection and invocation.

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?

The description does not elaborate on individual parameters, but the input schema has 100% coverage, with each parameter already having a meaningful description. Therefore, the description adds no significant parameter-level value, and the baseline of 3 is appropriate.

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?

The description uses the specific verb 'Logs' to state the tool's action, names the resource types ('trade, market thesis, or trading theorem'), and specifies the destination ('local Trading Journal database'). This clearly distinguishes it from sibling read-only tools like get_journal_summary and get_open_positions.

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 the tool is for logging journal entries, but it does not explicitly state when to use it versus alternatives, nor does it mention any exclusions or prerequisites. No alternative tools are named in the description, so usage guidance is only 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.

preview_orderPreview OrderA
Read-onlyIdempotent

Asks the broker to price and validate an order WITHOUT placing it. Non-binding and safe. Returns the broker's estimated cost and transaction fee, plus a buying-power comparison. Use this before draft_order to check affordability and fees.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesBUY or SELL.
symbolYesTicker symbol (e.g. AAPL, MU).
quantityYesNumber of shares (fractional allowed).
order_typeNoLMT (Limit) or MKT (Market).LMT
limit_priceNoRequired when order_type is LMT.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, and the description reinforces this with 'Non-binding and safe' and 'WITHOUT placing it'. It adds new behavioral context by specifying the return values (estimated cost, transaction fee, buying-power comparison), which the schema and annotations do not convey.

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?

The description is three sentences, with the core purpose front-loaded. Every sentence contributes value: what it does, what it returns, and when to use it.

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?

The tool is simple, the schema is thorough, and the description covers purpose, safety, return info, and usage guidance. With annotations handling the safety profile, no critical gaps remain.

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?

Input schema describes all 5 parameters with 100% coverage. The description does not elaborate on parameter usage, but the schema already provides default values and constraints, 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?

The description immediately identifies the tool as a validation/preview action ('price and validate an order WITHOUT placing it'), using a specific verb and resource. It clearly distinguishes from sibling draft_order by emphasizing no order is placed.

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?

Explicitly instructs to 'Use this before draft_order to check affordability and fees', naming the alternative and providing a concrete use case. This exceeds a simple when-to-use statement.

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

read_filingRead FilingA
Read-onlyIdempotent

Read a named section out of a company's latest filing, or search its text.

Filings are far too large to hand over whole — a Micron 10-K is ~610,000 tokens raw and ~97,000 after stripping markup — so this locates what you asked for and returns it under a character budget.

ParametersJSON Schema
NameRequiredDescriptionDefault
formNoFiling type — 10-K, 10-Q, 8-K, S-1, DEF 14A.10-K
queryNoInstead of a section, return excerpts around each match of this phrase.
budgetNoMaximum characters of section text to return (default 6000).
symbolYesTicker symbol (e.g. MU, AAPL).
sectionNoItem number to extract: 1 (Business), 1A (Risk Factors), 3 (Legal), 7 (MD&A), 7A (Market Risk), 8 (Financial Statements), 9A (Controls).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral detail about the character budget (with a concrete token-size example) and the 'latest filing' semantics, which clarifies that no filing date parameter is needed. It aligns with annotations and provides context beyond the structured fields.

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?

The description is two sentences, front-loaded with the core purpose. The second sentence uses a concrete Micron 10-K example to justify the budget limit, earning its place. No fluff or repetition.

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?

Given the absence of an output schema, the description provides a reasonable picture of behavior: it returns a portion of text under a character budget. Combined with annotations (read-only, idempotent) and a thorough schema, it is complete enough for a content-extraction tool. It could mention what happens if a section isn't found, but that's a minor gap.

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. The description adds value by explaining the relationship between section and query modes ('Read a named section... or search its text') and by introducing the 'character budget' concept tied to the budget parameter. It also clarifies 'latest filing' implications, which helps interpret the symbol/form parameters.

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?

The description clearly states the tool's specific function: 'Read a named section out of a company's latest filing, or search its text.' This identifies the verb (read/search), the resource (company filing), and distinguishes it from siblings like get_edgar_filings (which likely lists filings). The scope is precise and actionable.

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?

The description provides clear context: it explains that filings are too large to hand over whole, and this tool locates and returns sections under a character budget. It implies use cases (extracting a specific section or searching) without explicitly naming alternatives or saying when not to use it. This is 'clear context, no exclusions'.

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

scan_watchlistScan WatchlistA
Read-onlyIdempotent

Scans a list of stock tickers, calculates consensus score & regime, and returns a ranked verdict table.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolsYesSymbols as a comma-separated string ("AAPL, TSLA, NVDA") or a list (["AAPL", "TSLA"]).
intervalNoBar interval (D, M15, H1).D

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare this as read-only, idempotent, and non-destructive. The description adds context about the computation ('consensus score & regime') and the output form ('ranked verdict table'), which goes beyond annotations without contradicting them.

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?

The description is a single, tightly worded sentence that front-loads the action and ends with the output artifact. Every word earns its place, with no redundancy or filler.

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?

Given full schema coverage, clear annotations, and the absence of an output schema, the description adequately explains the input and the qualitative output. It stops short of detailing the exact fields in the verdict table or explaining the 'regime' concept, but it is sufficient for an agent to understand the tool's role.

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?

The input schema provides complete descriptions for both parameters (symbols and interval), achieving 100% schema coverage. The description does not add any meaningful parameter-level details beyond what the schema already specifies.

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?

The description clearly states what the tool does: it scans a list of tickers, calculates a consensus score and regime, and returns a ranked verdict table. The verb 'scans' is specific and the resource is defined, making it distinct from siblings like get_market_analysis or compare_symbols.

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?

The description implies this is for processing multiple tickers (a watchlist), which is clear context. However, it does not explicitly name alternatives or state when not to use it, though the 'list of stock tickers' wording differentiates it from single-symbol tools.

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

set_alertSet AlertA

Sets a local price or technical indicator alert for a ticker (e.g. "RSI < 30" or "PRICE > 250").

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoRationale or note for why this alert is set.
symbolYesTicker symbol (e.g. NVDA, AAPL).
conditionYesOne of PRICE_ABOVE, PRICE_BELOW, RSI_BELOW, RSI_ABOVE, MACD_CROSS_BULL, MACD_CROSS_BEAR. Anything else is refused rather than saved as an alert that can never fire.
target_valueYesThe price or indicator threshold value.

TDQS

A4/5.0
Behavior3/5

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

The annotations are minimal (readOnlyHint=false, etc.), and the description adds only the qualifier 'local' and example conditions. It does not disclose behavior on trigger, persistence, or side effects, but the annotations do signal a non-read mutation, lowering the bar for additional disclosure.

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?

The description is a single sentence, front-loaded with the action and object, and includes examples in parentheses. There is no wasted text or 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?

The tool is low complexity (4 params, no output schema, no nested objects), and the schema covers all parameters. The description and schema together specify the essential behavior; the absence of return-value documentation is acceptable for a simple mutation tool.

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?

The input schema already provides 100% coverage of all parameters, so the baseline is 3. The description adds practical examples ('RSI < 30', 'PRICE > 250') that illustrate how condition and target_value combine, providing extra semantics 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?

The description clearly states the action ('Sets') and the object ('a local price or technical indicator alert'), with concrete examples ('RSI < 30' or 'PRICE > 250'). This distinguishes it from the many read-oriented sibling tools such as get_ohlcv and get_market_analysis.

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 when to use the tool (when you want to set an alert) but does not explicitly state when-to-use vs alternatives or provide exclusion criteria. The sibling list contains no other alert-setting tool, so context is clear but not formally articulated.

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

validate_bls_keyValidate Bls KeyA
Read-onlyIdempotent

Test a BLS registration key against the live API and report which tier it unlocks.

A mistyped key does not raise an error — it silently drops you to the 25/day unregistered limit, which only surfaces days later as an exhausted quota. Run this once after setting BLS_API_KEY.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey to test. Omit to test whatever BLS_API_KEY is currently set to.

TDQS

A4.5/5.0
Behavior5/5

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

Although annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, the description adds a critical behavioral nuance: a mistyped key does not raise an error but silently drops to the unregistered 25/day limit. This warning goes beyond simple safety metadata and informs the agent of a failure mode that would otherwise be invisible until days later.

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?

The description is compact, front-loaded with the core purpose in the first sentence, and the second paragraph adds essential context without repetition. Every sentence earns its place, and there is no padding or redundancy.

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 simple tool with one optional parameter and no output schema, the description is complete. It covers what the tool does, why it exists, when to run it, and a critical pitfall. No further information is needed for an agent to use 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 coverage is 100%: the key parameter is fully described in the input schema, including the omission behavior. The description reinforces the context (testing after setting BLS_API_KEY) but does not add new semantic details about the parameter itself beyond what the schema provides. Baseline 3 is appropriate.

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?

The description clearly states the tool's purpose: 'Test a BLS registration key against the live API and report which tier it unlocks.' This uses a specific verb, resource, and outcome. It is distinct from sibling tools like check_connection or get_account_info, which serve broader or different functions.

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?

The description provides explicit usage context: 'Run this once after setting BLS_API_KEY.' It also explains why this is necessary—a mistyped key silently downgrades to the unregistered limit—giving the agent a clear decision rule. It doesn't explicitly name alternatives, but the context is sufficient for a single-purpose validation tool.

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

TDQS

A3.8/5.0
Disambiguation5/5

Each tool targets a distinct resource or action; even overlapping areas like company profile vs financials or options chain vs analytics are explicitly differentiated in descriptions. The tools are clearly separated by domain and purpose.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern, with data retrieval using 'get_' and actions using specific verbs like 'draft', 'cancel', 'set', 'scan', and 'validate'. The naming scheme is uniform and predictable.

Tool Count2/5

With 36 tools, the server exceeds the 'too many' threshold (25+). While the finance domain is broad, the sheer number of tools makes it heavy and potentially overwhelming for an agent, despite each tool having a clear purpose.

Completeness4/5

The tool set covers a comprehensive finance/trading workflow—account management, orders, market analysis, fundamentals, SEC filings, options, macro data, portfolio risk, and journaling. Minor gaps exist, such as no direct order execution (by design) and no watchlist management, but these are not critical.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    MCP server that provides AI assistants access to stock market data including financial statements, stock prices, and market news through a Model Context Protocol interface.
    11
    2,282
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that provides AI agents with financial tools including real-time quotes, backtesting, technical analysis, and multi-exchange data via a simple CLI interface.
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Blahaj-gif/Finance-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server