Finance MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BLS_API_KEY | No | Optional free BLS API key to raise limit from 25 to 500 queries/day and enable longer history. | |
| SEC_USER_AGENT | No | A descriptive user agent with a real contact address (e.g., 'Your Name (you@example.com)') required for SEC EDGAR tools. Requests are refused locally without one. | |
| WEBULL_APP_KEY | No | Webull app key for OpenAPI. Used for broker feed and account tools. | |
| FINMCP_BAR_CACHE | No | Set to '0' to disable the on-disk bar cache shared between the MCP server and dashboard. | 1 |
| WEBULL_REGION_ID | No | Webull region code. Also controls the Yahoo .BK ticker fallback. | th |
| WEBULL_ACCOUNT_ID | No | Pin a specific Webull account. Required if your login has more than one account; otherwise the server refuses to guess. | |
| WEBULL_APP_SECRET | No | Webull app secret for OpenAPI. | |
| WEBULL_ENVIRONMENT | No | Set to 'prod' (default) for live trading, or 'paper' (aliases: uat, sandbox, simulated) for Webull's sandbox environment. Note: 'paper' repoints the entire client to the sandbox, including quotes. | prod |
| WEBULL_MAX_RETRIES | No | Maximum number of retries for rate-limited Webull API calls before falling back. | 3 |
| WEBULL_PAPER_APP_KEY | No | Optional paper mode app key for Webull's sandbox. Required only if using WEBULL_ENVIRONMENT=paper and you have a separate sandbox app. | |
| WEBULL_RETRY_BACKOFF | No | Base seconds for exponential backoff on HTTP 429 responses from Webull. | 0.75 |
| WEBULL_PAPER_APP_SECRET | No | Optional paper mode app secret for Webull's sandbox. | |
| WEBULL_MIN_REQUEST_INTERVAL | No | Minimum seconds between Webull API calls to avoid rate limiting. | 0.25 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_connectionA | Tests connection to Webull API and Yahoo Finance fallback. |
| get_account_infoA | Fetches account list / information from Webull TH (requires authenticated token). |
| get_market_analysisA | 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. |
| get_technical_indicatorsA | Returns the latest calculated technical indicator values in markdown table format. Use when you want the raw indicator numbers to reason over yourself. If you want the numbers already interpreted into a BUY/SELL verdict, call get_market_analysis instead. |
| log_journal_entryA | Logs a trade, market thesis, or trading theorem to the local Trading Journal database. Includes atomic file writing & de-duplication protection. |
| get_ohlcvA | 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 use get_technical_indicators; for a verdict use get_market_analysis. |
| get_options_chainA | 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. |
| scan_watchlistA | Scans a list of stock tickers, calculates consensus score & regime, and returns a ranked verdict table. |
| get_multi_timeframeA | Performs multi-timeframe analysis across Daily (D), 1-Hour (H1), and 15-Min (M15) for a symbol to compute a Confluence Score. |
| compare_symbolsA | Compares relative strength, price correlation, and return performance between two tickers. |
| get_journal_summaryA | Queries local Trading Journal DB for win rate, total trades, average confidence, and recent trade logs. |
| get_open_positionsA | Pulls open Webull account positions and holdings summary. |
| get_earningsA | 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. |
| get_sector_heatmapA | Scans the 11 major S&P sector ETFs (Technology, Financials, Energy, Healthcare, Industrial, Consumer, Utilities, Real Estate, Materials) by momentum to identify sector rotation. |
| set_alertA | Sets a local price or technical indicator alert for a ticker (e.g. "RSI < 30" or "PRICE > 250"). |
| get_unusual_optionsA | Scans for unusual options activity (Volume > Open Interest or high IV > 50%) to detect smart money positioning. |
| get_short_interestA | Fetches short interest metrics (Short % of Float, Days to Cover / Short Ratio, Shares Short) for squeeze or squeeze-fade thesis. |
| draft_orderA | Drafts an order for human review and approval in the Streamlit Dashboard. For safety, Claude NEVER places orders directly. All orders must be drafted and manually approved. |
| preview_orderA | Asks Webull 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. |
| get_open_ordersA | Fetches all active/pending/working orders on the Webull account. |
| cancel_orderA | Cancels a pending or active order on the Webull account immediately. |
| get_newsA | 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. |
| get_insider_tradesA | Recent insider transactions as Yahoo reports them — a quick summary view. Prefer |
| get_sec_filingsB | Fetches the most recent SEC filings (10-K, 10-Q, 8-K) and their URLs. Provides raw access to corporate regulatory documents. |
| get_company_profileA | 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. |
| calculate_position_sizeA | 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 |
| get_volume_profileA | 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. |
| get_portfolio_riskA | Analyses the live account: position-level P&L, concentration, and portfolio volatility/beta versus SPY. Highlights over-concentration and correlated clusters. |
| get_options_analyticsA | 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. |
| get_company_financialsA | 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. |
| get_insider_activityA | 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". |
| read_filingA | 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. |
| get_institutional_holdingsA | 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. |
| get_data_sourcesA | 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. |
| validate_bls_keyA | 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. |
| get_economic_calendarA | 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. |
| get_macro_dataA | Historical macroeconomic series from the BLS with month-over-month and year-over-year changes — the numbers behind the inflation and labour narrative. |
| get_edgar_filingsA | 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:
|
| get_updatesA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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