Market data, SEC filings and risk tools for Webull, Saxo and IBKR. Only you can send an order.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
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.
Asking an unknown repository for brokerage credentials is the hardest trust ask in software, so the answer is here rather than forty paragraphs down.
draft_order writes to a local queue. Sending needs a broker preview
and your click in the dashboard, which no prompt can reach.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:
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.

Candles with overlays, a volume pane and the forecast cone. Weekends and market holidays are collapsed, so there are no blank stretches.
| 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. |
| 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.
| 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.
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:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/finance-mcp-3)<a href="https://allmcps.com/mcp/finance-mcp-3"><img src="https://allmcps.com/api/badge/finance-mcp-3?style=directory" alt="Finance MCP on AllMCPs" /></a>