servers / mrmarket-ai
mrmarket.ai MCP server
communitystreamable_httpremotedestructive capablehealthy
Analytical engine for US-listed equities: screens, rankings, and event studies in plain English.
01Tools · 9
| Tool | Risk | Side effects | Approval |
|---|---|---|---|
| getting_started Onboarding tour for mrmarket.ai — call this FIRST in a fresh session, or any time the user
asks "what can you do?" / "how does this work?". Zero LLM cost, zero credits, returns a
structured orientation packet (tools, capabilities, limits, examples, troubleshooting, help).
Default scope ('overview') covers everything in a short tour. Optional `topic` deep-dives a
single area without re-fetching the whole thing:
- tools → tool-by-tool reference for query_data, describe_data, get_symbols,
get_account_status, report_issue.
- examples → 20+ verified working prompts grouped by use case (screens, rankings,
comparisons, cohort-relative, time-series, event-vs-price).
- limits → universe, freshness, what is NOT supported (intraday, options, news,
backtests in one call).
- cost → credit model, which tools are free, how to read `credits_remaining`.
- troubleshoot → error_code → recipe (RATE_LIMITED, INSUFFICIENT_CREDITS, QUERY_NOT_UNDERSTOOD,
empty result, wrong-looking answer).
- help → links + how to reach support; preferred channel is `report_issue`.
Use it to bootstrap your understanding of the server before asking real questions —
that's the fastest path to a useful first answer for the user. | read | false | unknown |
| query_data YOU ARE a research assistant helping a retail investor get answers from mrmarket.ai.
You are NOT a database engineer. Ask questions the way a financial analyst would say
them out loud — plain English, focused on intent. The server has a domain-trained
financial expert that translates your question into the right methodology, picks
appropriate thresholds, and documents every interpretation in the response so the
user can see and correct what was assumed.
Answers analytical financial questions about US-listed equities in a single call.
Send the full natural-language question — not SQL. Returns structured rows + columns.
CAPABILITIES — all handled in one call:
- Top-N / bottom-N rankings by any metric
- Multi-criteria stock screens (combine sector, ratios, growth thresholds, insider activity)
- Computed financial metrics: ROIC, FCF, D/E, margins, ROE, ROA, dividend yield, growth rates
- Derived metrics composed on the fly: any ratio of two fields, growth of any metric,
rolling stats on any series — the data catalog lists ingredients, you may mix them
- Period-over-period changes: QoQ, YoY, multi-year
- Rolling averages, trend slopes, volatility, beta vs a benchmark, correlation,
median/percentiles, quartile buckets, max drawdown, statistical measures
- Multi-symbol comparisons and time-series trends
- Sector/industry rollups and averages
- Cohort-relative analysis (vs sector average, vs universe z-score)
- Forward returns after events (earnings beats, insider buys)
- Price charts with event overlays (earnings dates, insider transactions)
- Consecutive-quarter screening (e.g., 4 quarters of growing FCF)
EXAMPLES — notice how these read like a human asking, not a technical specification:
- "Top 20 stocks by ROIC excluding financials"
- "Companies with 4 consecutive quarters of growing free cash flow"
- "Compare AAPL, MSFT, and GOOGL revenue over the last 5 years"
- "Stocks whose ROIC is at least 1 standard deviation above their sector average"
- "Average 30-day stock return after companies beat earnings by more than 10%"
- "AAPL daily closes for the last 5 years with earnings dates overlaid"
- "Top 20 quality compounders by 5-yr ROIC stability and margin trend"
- "Find undervalued stocks with recent insider buying — low P/E, strong FCF, low debt"
- "Average stock return 90 days after large CEO insider purchases"
HOW TO PHRASE YOUR QUESTION — this matters for best results:
Pass the user's question through with minimal rewording. The server's financial
expert interprets casual language better than you can translate it:
- "large purchase" → appropriate dollar threshold (documented in assumptions[])
- "90 days" → trading-day equivalent (documented in assumptions[])
- "CEO" → executive title matching
- "growing" → positive AND increasing
- "cheap" / "undervalued" → appropriate valuation thresholds
- "Buffett screen" / "quality compounder" → recognized analytical frameworks
DO:
✓ Preserve the user's intent and language faithfully
✓ Use directional terms: "low P/E", "strong cash flow", "high margins"
✓ Add thresholds ONLY when the user stated them explicitly
✓ Ask for aggregated answers when the user wants a summary ("average return after...")
✓ Combine multi-criteria screens into ONE question, not separate calls
DON'T:
✗ Invent numeric thresholds the user didn't specify — the server picks sensible
defaults and surfaces them in assumptions[] so the user can adjust
✗ Specify column lists — the server selects the most relevant columns automatically
✗ Convert calendar days to trading days — the server handles this
✗ Add metrics or time ranges the user didn't request — adds complexity and risk
✗ Use AND/OR boolean syntax — plain English works better
✗ Prefix with jargon like "Event study:" or "Screen:" — just ask the question
GOOD: "Find undervalued stocks with recent insider buying — low P/E, strong FCF, low debt"
BAD: "Screen for companies where insiders have made open-market stock purchases in the
past 3 months AND P/E ratio below 20 AND price-to-book below 3 AND positive free
cash flow AND debt-to-equity below 1. Show symbol, name, sector, P/E..."
GOOD: "Average stock return 90 days after large CEO insider purchases"
BAD: "For all insider buy transactions where title contains 'CEO' or 'Chief Executive'
and transaction value > $100,000, calculate the return 63 trading days after..."
Both versions will work, but the GOOD versions produce better results: the server's
financial expert picks market-appropriate thresholds and documents them in assumptions[]
so the user can see and correct them. Your pre-translations hide these from the user.
ONE QUESTION PER CALL — the unit of work (max 100 words, enforced):
Each call carries exactly ONE analytical question: one deliverable you could present
as a single table or chart. "One question" is NOT "one metric" — a screen with five
criteria, a three-ticker comparison, or an event study at five horizons is still one
question. Questions over 100 words are rejected free of charge (QUESTION_TOO_LONG):
overruns are nearly always several questions clobbered together, or an inline ticker
dump that belongs in `symbols`. Be precise, not redundant — no column lists, no
restated criteria, no boilerplate.
Classify the request BEFORE calling:
1. ATOMIC → one call. The parts share one computation or land in one table. The
server joins fundamentals, prices, earnings, and insider data internally, so
touching several data categories does NOT mean splitting:
- Multi-symbol comparison ("monthly returns for TSLA and SPY" — one call, not two)
- Multi-metric screens ("high ROIC, strong margins, low debt, consistent earnings")
- Cross-metric formulas ("stocks where margin > 2x sector average")
- Cohort relatives ("ROIC ≥ 1 stddev above sector mean"); sector rollups
- Forward-return event studies — and MULTIPLE HORIZONS IN ONE CALL: "returns at
1, 5, 10, 21, and 63 days after earnings" is ONE call, not five; the server
computes all forward windows in parallel.
- Multi-entity retrieval — "ROIC, FCF yield, D/E, 6-month return, and earnings
beat rate for every stock" is ONE call across fundamentals + prices + earnings.
Fetch in one call; score/rank/normalize in code.
- Price + overlay charts; conditional labels ("classify the drawdown as
earnings-driven or multiple-compression")
2. ORTHOGONAL → independent calls, issued in parallel. The request bundles 2+
questions whose answers don't feed each other and that you'd present as separate
tables or sections. Smells: "and also…", "separately…", numbered sub-requests,
two different universes, two analytical verbs ("screen for X… and chart Y"),
unrelated time windows. "Top 10 by ROIC, and also TSLA's margin trend" = 2 calls.
"Full analysis of AAPL" = 3: valuation vs sector / financial trends / insider
activity (announce the plan first).
3. PIPELINE → sequential calls that YOU join, when part B needs part A's output and
the join point is SMALL (a symbol list, a date range, a few values). Cut at the
narrow point: run A → take its symbols → run B passing them via `symbols` →
merge rows client-side on symbol/date. Screen-then-drill ("screen for X, then
pull 5y revenue history for the matches"), backtests with rebalancing, Monte
Carlo (pull returns once, simulate in code), portfolio optimization, custom
multi-factor scoring with user weights (fetch ALL metrics in one call, weight
in code).
When unsure, try ONE call first — the server is compositional and most cross-entity
questions are atomic. If the response carries `meta.needs_decomposition: true`,
retry as parallel calls using `meta.suggested_split`.
COMPUTE IN CODE WHEN YOU CAN. Each query_data call costs credits and can fail. If you
already have data from a previous call, compute locally instead of calling again:
- Aggregations (averages, sums, medians, min/max)
- Percentage changes, ratios, growth rates
- Sorting, filtering, grouping, ranking
- Statistical measures (std dev, correlation, z-scores)
- Percentile normalization, composite scoring, factor weighting
- Pairwise correlations, covariance matrices
Only call query_data when you need NEW data you don't already have.
ANNOUNCE YOUR PLAN FOR 2+ CALLS on vague requests ("full analysis", "comprehensive
overview"). For specific multi-part questions, announce at 3+ calls. Tell the user
in plain language with rough credit cost before proceeding.
OUTPUT SIZE: the MCP tool-result ceiling is ~1MB. Quick math:
- 1 month ≈ 21 trading days, 1 year ≈ 252
- Practical ceilings: ~5,000 price rows or ~2,500 fundamental rows
- PREFER narrowing/summarizing first ("per-stock 6mo return" not "all stocks 6mo daily prices",
or narrow by sector/time range). A focused question is almost always the better answer.
- If a result is still too large, the server no longer fails — it returns page 1 plus a
full-dataset `summary` and a free `pagination.next_cursor`. Call `fetch_page` with that
cursor ONLY when the user genuinely needs every raw row; a summary/ranking is usually enough.
For very large dumps, hand the user `view_url` — their private link to the full dataset in
the web app — instead of paginating.
SCOPE CEILING — the engine is a transactional warehouse, not an OLAP cluster. At most ONE
of these axes can be unbounded per question: universe (all ~7k stocks), history (15-20
years of daily rows), per-row computation (forward returns, rolling windows, pooled
medians). Two or more unbounded axes — "pooled forward returns for every stock-day since
2011", "median daily return across all stocks for all history" — cannot finish in time;
the server now stops the run BEFORE executing and returns `status: "clarification_needed"`
with `error_code: "SCOPE_TOO_LARGE"` + narrowing questions (free of charge), instead of
burning a 40s+ TIMEOUT. How to stay under the ceiling:
- Bound the universe: an index, a sector, a market-cap floor ("above $10 billion"),
or an explicit list via `symbols`.
- Bound the history: a date range ("since 2022", "last 3 years"). Event studies
(returns after insider buys / earnings events) with NO stated range default to the
most recent 5 YEARS of events — disclosed in `assumptions[]`; state a range
explicitly ("since 2010") to widen it.
- Sample instead of exhaustive: "from the first trading day of each month" beats
"from every trading day".
- Split benchmark legs: SPY/QQQ series are single-symbol and cheap alone — ask
"all stocks vs SPY" as two calls and compare in code.
To insist on full scope anyway, answer the returned questions via `clarifications`
("Full universe anyway") — the run is then attempted and may still time out.
OUT OF SCOPE: intraday/tick data, options chains, news/transcripts, macroeconomic series,
portfolio simulation, optimization.
RESPONSE FORMAT — what to expect back:
- `data`: array of row objects keyed by column name (e.g., [{symbol: "AAPL", revenue: 394328000000}, ...])
- `columns`: metadata for each column — `name`, `type` (currency/percent/number/string/date/boolean),
`displayName` (human-friendly label). Use `type` to format values for the user:
currency → "$394.3B", percent → "18.5%", date → "2024-09-30"
- `row_count`: total rows returned
- `assumptions`: what the server assumed on the user's behalf (thresholds, time ranges,
metric interpretations). ALWAYS surface these to the user so they can correct them.
- `caveats`: data-accuracy notes worth passing on — approximation, point-in-time vs
later-restated figures, survivorship, or FX-conversion. `as_of_date` is the
point-in-time anchor the answer is computed as of; `currency_converted: true` flags
that foreign filings were converted to USD so price-relative ratios stay consistent.
- `filters_applied`: scope provenance — which tables were read and which filters were
ACTUALLY applied (per plan: `reads`, `filters`, `group_by`, `windows`, `limit`).
VERIFY this matches the question you asked: if you see a sector/industry/date filter
you did not request, treat the result as wrong and re-ask (and report_issue it).
- `audit`: SQL provenance (success only) — the exact queries behind the answer, written
in the PUBLIC data-dictionary vocabulary (the same entity/field names `describe_data`
uses; intermediate stages numbered step_1…step_N, `params` holds the $1… bind values).
Read it to confirm scope, joins, and point-in-time date bounds — e.g. that there is no
look-ahead past the as-of date. This is the ground truth when a number looks off.
- `warnings`: diagnostic notes (low credit balance, applied defaults)
- `credits_remaining` / `cost_credits`: balance after this call / what this call cost
- `view_url`: a PRIVATE mrmarket.ai link to view THIS result as a chart/table in the web
app — hand it to the user so they can jump from chat into the visual app and see the full
dataset. Only they can open it; to share it with others they publish it from the share view
("Enable public sharing"). Present on success with rows.
- `truncated` + `pagination` (oversize results only): `truncated: true` means this is page 1
of a larger result. `pagination` has `page_index`, `page_count`, `has_more`, `total_rows`,
and `next_cursor` — pass next_cursor to `fetch_page` (FREE) for the next page. `summary` is a
full-dataset per-column digest (min/max/mean/nulls) so you can often answer without paging.
On error: `error_code` + `message` + `retryable` flag. Retry once if retryable is true.
CLARIFICATION HANDLING: when the question is ambiguous, the server resolves it automatically.
If your client supports MCP elicitation, the user is prompted directly. Otherwise the server
applies a sensible default and proceeds. Either way you get a final answer in one call.
Known standing default: event studies with no stated time range cover the past 5 years.
Check `assumptions[]` — always tell the user what was assumed.
Exception: SCOPE_TOO_LARGE narrowing questions are NEVER auto-defaulted — a default universe
would change which stocks the answer covers. Unless a human answers via elicitation, you get
`status: "clarification_needed"` back (free); narrow the question or answer the questions
via `clarifications`.
LIMITS: ONE question of max 100 words per call (longer is rejected free of charge).
60-second timeout (180s with a clarification roundtrip); plans that cannot finish in
time are rejected up front as SCOPE_TOO_LARGE (free — see SCOPE CEILING). No default
row cap. Use `describe_data` to confirm fields exist before composing complex questions. | write | true | unknown |
| fetch_page Fetch the NEXT page of a large query_data result — FREE (zero credits, runs no
new query). Only use this when a prior query_data (or fetch_page) response had
`truncated: true` and a `pagination.next_cursor`.
When to call: the user genuinely needs MORE of the raw rows than page 1 returned.
If a summary, ranking, or the first rows already answer the question — or you only
needed an aggregate (the response carries a full-dataset `summary` on page 1) —
you are DONE; do NOT paginate.
Pass the cursor string from `pagination.next_cursor` VERBATIM — do not edit or
truncate it. Keep calling fetch_page with each new `next_cursor` until it is null.
Snapshots live ~15 minutes; if the cursor has expired, re-run the original question. | destructive | true | true |
| get_account_status Account snapshot — zero LLM cost, no credits charged. Returns which mrmarket.ai
account this MCP connection is authorized as (email), the plan tier, the current
credit balance (and subscription vs top-up split), and per-tier query limits.
Use this to (a) confirm the expected account is connected — a mismatch here explains
an unexpected "out of credits", and (b) check the credit balance before running a
batch of queries. | read | false | unknown |
| describe_data Data catalog — zero cost. Use BEFORE query_data when you're unsure what data is available
or whether a specific field or metric is supported.
The catalog lists RAW INGREDIENTS; query_data accepts RECIPES. Any field can be combined
with any other in one question — ratios of two fields, growth of any metric, rolling
stats, group medians, cohort-relative z-scores, benchmark-relative betas. A metric
missing from the catalog by name is still answerable if it's computable from the fields
(the overview's `composition` section lists the patterns).
Scopes:
- overview → list all data categories (prices, financials, earnings, insider
transactions, etc.) + coverage depth + key fields + computed
metrics + composition patterns. Good first call.
- category → full field list for one data category. Pass entity with the category
name: 'Stock Prices', 'Income Statements', 'Earnings', etc.
- computed_metrics → pre-defined computed metrics (ROIC, FCF yield, D/E, ROE, ROA,
margins, growth/CAGR, volatility, drawdown, beta, z-score, median…).
- search → keyword search across field names, categories, computed metrics,
and composition patterns. Pass search_term: 'volatility', 'capex', etc. | read | false | unknown |
| get_symbols Fast company/sector/industry lookup. Sub-50ms, zero LLM cost.
Use to resolve names → tickers, list sector members, or get the full universe before
fanning out query_data calls (e.g., for backtests or per-symbol price pulls).
Actions: search | list_sectors | list_industries | by_sector | by_industry | all. | read | false | unknown |
| recent_queries List the user's most recent `query_data` calls (newest first). Zero LLM cost, zero credits.
Use this when the user references "that query I ran earlier" / "the AAPL one from before" /
"the slow one" — instead of asking the user to dictate the query_id, look it up here. Each
entry returns:
- query_id (the mcp_<ts>_<n> handle — pass directly to report_issue or quote to support)
- status (success | clarification | timeout | error)
- error_code (null on success; the stable error taxonomy otherwise)
- row_count (rows returned on success)
- prompt_preview (first 120 chars of the original question)
- when (relative — "2m ago" / "1h ago" / "3d ago")
- created_at_iso (raw ISO timestamp for precise ordering)
- execution_time_ms
`limit` defaults to 10, max 50. `status` filters: "all" (default), "success", or "error"
(includes timeouts). | read | false | unknown |
| list_tickets List the user's own report_issue tickets (newest first). Zero LLM cost, zero credits.
Use this to look up a ticket you (or the user) filed earlier — e.g. to quote the full
ticket_id when following up with support, or to check what was already reported before
filing a duplicate. Each entry returns:
- ticket_id (full UUID — quote this in follow-ups)
- category (wrong_data | bug | slow | feature_request | general)
- preview (first 200 chars of the report text)
- query_id (the query the ticket was filed against, when attached)
- created_at_iso | read | false | unknown |
| report_issue Tell support something went wrong, file a bug, request a feature, or flag a slow query.
Zero LLM cost, zero credits.
Call this when:
- A `query_data` result looks wrong or misleading (pass the `query_id` from that response —
support uses it to investigate the issue).
- You hit a confusing error or the same query keeps failing.
- A query took unreasonably long (still pass `query_id` if available).
- You wish mrmarket.ai supported something it currently doesn't.
This is the PREFERRED support channel because it auto-links to the query trace; email is
slower and requires the user to copy/paste the query_id manually.
Categories:
- wrong_data → result was incorrect / numbers look off
- bug → something crashed or the response was malformed
- slow → query took too long or timed out
- feature_request → "I wish it could do X"
- general → catch-all if none of the above fits | read | false | unknown |
02Install & source
https://mcp.mrmarket.ai/mcp
remote_url- repohttps://github.com/codinghaven/mrmarket-mcp
- homepagehttps://mcp.mrmarket.ai/mcp
- licenseMIT
- adoption3 stars · 0 forks
03Access granted
Query a database · writeRead calendar · writeProcess payments · writeMonitoring & logs · write
The access this server can exercise, inferred from its verified tools — not a declared OAuth scope.
05Provenance & freshness
sourcesOfficial MCP Registry [p1]
last_checked2026-07-06 20:50Z
next_check2026-07-08 01:28Z
cadenceevery 29h
verifiedtools_list:passed handshake:passed metadata:passed
index_statusindex — 9 unique facts >= 5
06Badge
Add the “as seen on MCPExplorer” badge to your README.
[](https://mcpexplorer.com/servers/mrmarket-ai)
Next step
This is one server. A loadout combines the right servers, governance, and proven plays for a whole job — assembled deliberately, not tool-dumped.
Explore loadouts →