Valuein — SEC EDGAR Fundamentals & Smart-Money Data

io.github.valuein/mcp-sec-edgar

Point-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.

Yes, your AI can use this right now.Answered a live MCP handshake in 396 ms with no sign-in needed and exposes 121 tools.

Connect it

Settings → Connectors → Add custom connector
URL: https://mcp.valuein.biz/mcp

121 tools, verified live

Pulled straight from the server with tools/list on 2026-10-18.
search_companiesread-only

Search for US public companies by name, ticker symbol, CIK (SEC identifier), or SIC industry code. Returns ticker, company name, sector, industry, exchange, and current S&P 500 membership status. Use this tool to resolve a company name to ticker/CIK before calling `get_company_fundamentals`, `get_valuation_metrics`, or other tools that require a ticker — they do not fuzzy-match company names. **U

get_company_fundamentalsread-only

Retrieve standardized SEC EDGAR fundamental financial metrics for a US public company. Returns revenue, gross profit, operating income, net income, EPS (diluted), total assets, total liabilities, stockholders' equity, cash & equivalents, total debt, operating cash flow, and capital expenditures for one or more fiscal periods. Data sourced from 10-K (annual) and 10-Q (quarterly) filings. Point-in-t

get_valuation_metricsread-only

Get what a US public company is TRADING AT, plus two parameter-free reference points. This is NOT an opinion of intrinsic worth — for that, call `compute_dcf` with assumptions you state explicitly, and present the result as a scenario, never as "the" fair value. Returns per-period data combining computed ratios (gross_margin, operating_margin, net_margin, ROE, ROA, ROIC, debt_to_equity, FCF, FCF m

get_financial_ratiosread-only

Get pipeline-computed financial ratios from ratio.parquet. Served categories: profitability (margins, ROE, ROA, ROIC), liquidity (current ratio, quick ratio), leverage (D/E, interest coverage, net debt/EBITDA), efficiency (asset turnover, inventory days), per_share (EPS, BVPS, FCF/share), owner_earnings (Buffett FCF, owner yield), valuation (pe_ratio, pb_ratio, ev_ebitda, market_cap, dividend_yiel

get_sec_filing_linksread-only

Get direct links to original SEC EDGAR filings for any US public company. Returns four per-filing deep links: `sec_url` (the EDGAR filing-index page listing every document), `viewer_url` (the cgi-bin Financial-Report viewer for the specific accession), `inline_viewer_url` (the SEC Inline-XBRL viewer opened on the rendered primary document — the strongest provenance link, `null` when the filing is

get_capital_allocation_profileread-only

Get a multi-year capital allocation breakdown for a US public company. Shows how management deploys cash across all six categories — capex, R&D, M&A, dividends, buybacks, and debt — plus pre-computed deployment ratios (% of operating cash flow) and over-distribution flags. Use this tool when the user asks: how does a company allocate capital, what's the buyback-vs-dividend mix, is the company over

get_peer_comparablesread-only

Get ratio-based peer comparison for a company and its closest competitors. Peers are selected by matching 2-digit SIC industry code. Returns pipeline-computed ratios from up to 10 peers alongside the subject company for direct benchmarking. Ratio categories: profitability, liquidity, leverage, efficiency, per_share, owner_earnings, valuation. TTM (trailing twelve months) ratios are used when avail

get_pit_universeread-only

Use this tool to answer questions about historical index membership — e.g. "Was Company X in the S&P 500 on date Y?" or "Which companies were in the Russell 2000 on 2010-01-01?" Use this INSTEAD OF `search_companies` when the question involves a specific historical date or whether a company was an index member in the past — `search_companies` only returns current membership and cannot answer histo

get_compute_ready_streamread-only

Returns a short-lived (15-min) download URL for a bulk Parquet object that can be piped directly into Python/DuckDB/Polars for high-throughput computation that exceeds the MCP context window. The URL streams the object straight from Valuein storage and supports HTTP range reads, so `duckdb.read_parquet(url)` / `pl.read_parquet(url)` work without downloading the whole file first. Datasets: fact (pe

describe_schemaread-only

Returns the Parquet schema for all tables in the Valuein SEC data warehouse. Includes table descriptions, column names, types, primary keys, and foreign-key references. Use this tool to understand the data model before querying with other tools. No data reads required — schema is embedded in the manifest. Available on all plans.

list_sopsread-only

List Valuein's expert research playbooks — the step-by-step procedures a senior equity analyst follows, each encoding the exact tool sequence, parallel-wave grouping, and output structure for one task (research brief, screen and shortlist, forensic quality audit, capital-allocation review, survivorship-free backtest, smart-money brief, thesis lifecycle, and more). CALL THIS FIRST for any multi-st

get_sopread-only

Load one expert research playbook by name (discover names with `list_sops`). Returns the full procedure: the ordered tool sequence, which calls to group into parallel waves, the provenance and citation rules, and the exact output structure. Supply the playbook's arguments (e.g. `ticker`) to get a concrete, ready-to-execute plan. Omit them to read the generic template with `{{ARG}}` placeholders.

verify_fact_lineageread-only

Use this tool when the user asks BOTH what a financial figure is AND which filing reported it — e.g. "What was Apple's most recently reported revenue, and which 10-Q filed it?" or "Show me the accession ID for Tesla's latest net income." Returns a single fact plus its complete filing provenance: entity, concept, period, value, accession ID, filing URL, and form type (10-K, 10-Q, etc.). Use this I

verify_factsread-only

Resolve MANY cited facts to their SEC filings in ONE call — the batch form of `verify_fact_lineage`. Use this whenever you are checking a LIST of figures rather than a single number: reviewing a report's citations, auditing a thesis's evidence, or confirming every figure in a draft before you sign it. A 30-figure report is one call here and 30 calls with `verify_fact_lineage`. Use `verify_fact_li

compare_periodsread-only

Compare a company's core financial metrics across two fiscal periods side-by-side. Shows absolute and percentage changes with significance classification (minor < 5%, notable 5–15%, significant > 15%). The response includes a `material_changes` count: this is the number of metrics whose `significance` ∈ {notable, significant} (i.e. absolute percentage change > 5%). Use it as a quick scalar to tri

screen_universeread-only

Rank companies by cross-sectional factor scores from factor_scores.parquet. Returns the underlying factors (roe, gross_margin, operating_margin, net_profit_margin, revenue_growth_yoy, fcf_to_assets, debt_to_equity, asset_turnover, current_ratio, piotroski_f_score) plus their percentile ranks (1.0 = best in universe, 0.0 = worst). `composite_rank` (the default sort) is a one-number multi-factor sho

get_earnings_signalsread-only

Reported earnings results and a model-derived earnings-trend signal for a company, by fiscal period: actual reported EPS, a trailing-trend EPS estimate (`eps_trend_est`), the deviation of actual vs that trend (`eps_surprise_pct`), reported revenue, and year-over-year revenue growth. IMPORTANT: `eps_trend_est` is NOT Wall Street analyst consensus — Valuein is sourced purely from SEC EDGAR and carri

list_restatementsread-only

List financial-statement restatements — facts a later SEC filing materially changed (>0.5% swing) from what was originally reported. Each event carries the as-reported value, the restated value, the signed delta, a severity bucket, the RAW XBRL tag both filings used (the diff is same-tag, so it is apples-to-apples and checkable), both filings' accession numbers for one-click lineage, an analyst-im

submit_feedback

File product feedback to the Valuein team — a bug, feature request, experience note, or data-quality issue — directly from the agent surface. Available on EVERY tier including guest/sample (no token required), so an agent can report a rough edge in-band without the human leaving the conversation. Provide a `category` and a `message` (other fields optional — see params). Authenticated callers can p

submit_artifact_feedback

File EXPLICIT, structured feedback about a specific artifact you (or the model) produced — a chat message, a report, a thesis, a claim, a tool call, or the schema. Use this (not `submit_feedback`) when you can name WHAT was judged and HOW: pass `target_type` + `target_id` + a `sentiment` (positive/negative/correction), and optionally a structured `reason` (e.g. wrong_number, bad_citation, hallucin

get_insider_transactionsread-only

Form 3 / 4 / 5 / 144 line items for a US public company. Returns each transaction (or initial holding / proposed sale) with the insider's name, role, transaction code, share count, price, and notional. Filters by lookback window, transaction code (P=purchase, S=sale, A=grant, M=option exercise, F=tax withholding, etc.), insider role, and minimum share threshold. Institutional tier only — sample /

get_institutional_holdingsread-only

Returns top-N institutional holders of a US public company at a specific period_end (latest by default), with aggregate institutional shares, total market value, holder count, and HHI concentration (sum of squared share-of-total percentages). Sourced from Form 13F-HR via the by-issuer partition. Institutional tier only. 13F filings carry a ~45-day reporting lag — staleness_warning fires when la

get_manager_portfolioread-only

Returns a 13F filer's full portfolio at a specific period_end (latest by default), with QoQ deltas vs the prior quarter (new / increased / decreased / exited / unchanged). Specify the filer either by filer_cik (preferred) or filer_name (fuzzy match against entity.name; multiple matches raise an ambiguity error so you can disambiguate by CIK). Institutional tier only.

get_blockholdersread-only

Returns SC 13D / SC 13G blockholder disclosures (5%+ stakes) for a US public company. Each row carries percent_owned, sole/shared voting + dispositive split, schedule_type, and the first-class ``going_active`` flag — TRUE when the same filer flipped 13G → 13D within the lookback window (the single most actionable activist signal in this dataset). Use latest_only=true (default) to dedupe to the mos

get_insider_sentimentread-only

Role-weighted insider sentiment score on a fixed [-100, +100] scale for a single issuer over a lookback window. Role weights: CEO/CFO = 3.0 (via officer_title pattern), other NEO Officer = 2.0, 10%-Owner = 1.5, Director = 1.0. P = +1, S = -1; option exercises, grants, and tax withholdings are neutralised. Cluster flag = TRUE when ≥3 distinct insiders transacted within any 30-day window inside t

get_top_holdersread-only

Classification-aware UNION across insider transactions (latest post_transaction_shares per insider), 13F institutional holdings, and SC 13D / 13G blockholder filings for one issuer. Each row carries holder_class ∈ {insider, institutional, blockholder_13D, blockholder_13G}. Dedupes overlapping filers by precedence (13D > 13G > institutional > insider). One call, classified cap table — Bloomberg

get_smart_money_flowread-only

Composite flow score on [-100, +100] aggregating insider transactions, 13F institutional Δ-shares vs the prior quarter, and SC 13D/13G blockholder changes over a lookback window. Each component normalised independently, then combined with configurable weights (default: institutional 0.4, blockholder 0.4, insider 0.2). Returns per-component attribution so an agent can see WHY the score is what it i

save_thesis

Persist a directional investment thesis (bull / bear / neutral) on a ticker. The thesis becomes part of the caller's private research diary; pair with `list_theses` + `score_thesis_outcome` to track conviction-vs-outcome over time. Pass `idempotency_key` for at-most-once semantics from a retrying agent. **Use this AFTER** the agent has finished its analysis, not before — the thesis records the co

list_thesesread-only

Return the caller's saved theses, newest-first. Filters: ticker (exact), view, status. Cursor-based pagination — pass `next_cursor` from the previous response to fetch the next page. Sample tier rejected (no per-user state).

get_thesisread-only

Fetch a single saved thesis by its id. Returns the full record including outcome (if scored). Returns NOT_FOUND if the id is unknown or belongs to another user. For the claims composing a thesis use list_claims_for_thesis; for an individual claim use get_claim. Tier: paid + free (sample rejected).

delete_thesiscan modify

Soft-delete a saved thesis: status flips to `archived` (the row stays for audit / re-scoring). Idempotent — archiving an already-archived thesis succeeds. Hard-delete is not supported by design; future versions may expire archived theses after N years. This does not delete the claims linked to the thesis — use delete_claim for those. Tier: paid + free (sample rejected).

restore_deleted

Undo a delete: restores a thesis, watchlist, signal, claim or report that `delete_*` archived, a rule, citation override or uploaded document that `delete_*` removed, a memory entry removed by `delete_agent_memory` (id = its key), an inbox item hidden by `dismiss_inbox_item` (id = inbox_id), a task cancelled by `cancel_scheduled_task` (id = task_id), or a standing agent removed by `delete_agent` (

score_thesis_outcome

Grade a saved thesis against fundamental momentum since its creation. Pulls revenue / operating-margin / EPS / OCF deltas and aggregates into a score in [-1, +1]. Bull theses are graded by directional alignment, bear by inverse, neutral by closeness-to-flat. The grade is persisted back to the thesis row; re-call to refresh once new fundamentals land. **Note (PR 2)**: scoring is fundamental-only —

score_due_theses

Find every thesis past its horizon with no outcome yet, and grade each via `score_thesis_outcome`. Operates on the caller's OWN theses — omit `customer_id`. Targeting another user's `customer_id` is reserved for Valuein's internal scoring service and is rejected for every plan, including Institutional. Returns a summary + per-thesis results. Idempotent — a re-call only re-grades anything not alrea

run_workflowread-only

Resolve a saved workflow by id and return a structured execution plan for a single ticker. Each plan entry names a real MCP tool or SOP plus its ticker-substituted arguments; the calling agent invokes them in order, applying any `skip_if` predicate against the previous step's output. **This tool does NOT execute the steps server-side.** It plans; the agent runs. Iterate through `plan[]` in order,

list_public_theses_by_userread-only

Return the PUBLIC theses + reputation aggregate for a user identified by Stripe customer_id. Used by the /[handle] profile page to render an analyst's track record. Only entries with visibility='public' are surfaced — private theses never leak. Reputation is correct/(correct+wrong) over graded theses; null when n < 5 (sample too small). Sample tier rejected; sp500+ only.

publish_thesis

Make a saved thesis discoverable by flipping its visibility: `public` (default) surfaces it on the author's /[handle] profile and counts toward their reputation aggregate; `unlisted` makes it reachable at a known direct link but keeps it off the profile. Use AFTER save_thesis to promote an existing thesis (save_thesis sets visibility only at creation). Idempotent. Pair with unpublish_thesis to rev

unpublish_thesiscan modify

Revert a published thesis (public or unlisted) back to `private` — removes it from the author's /[handle] profile and excludes it from the public reputation aggregate. The inverse of publish_thesis. Owner-only, idempotent. Tier: sp500+ (sample rejected).

save_claim

Persist a single falsifiable, evidence-backed CLAIM — the atomic unit of the research graph. Use this for each discrete assertion an analysis produces (e.g. 'NVDA gross margin stays above 70% through FY2026'), then compose claims into a thesis with `link_claim_to_thesis`. Claims are scored independently of theses, so claim accuracy is tracked as its own track record. Pick `claim_type` by HOW it's

list_claimsread-only

List the caller's saved claims, most-recent-first, with AND-composed filters and cursor pagination. Filter by ticker, claim_type (assertion/prediction/judgment), tag, or lifecycle status (open/confirmed/refuted/expired/stale/needs_review). Archived claims are excluded unless include_archived is set. Tier: all paid + free tiers (sample rejected).

get_claimread-only

Fetch a single claim by id, plus the ids of theses it supports/refutes and its full append-only score history. Use this to inspect a claim's evidence, current status, and how its outcome has evolved. Tier: all paid + free tiers (sample rejected).

delete_claimcan modify

Soft-delete a claim by id. The row and its score history are preserved for audit (archived, not erased); the claim drops out of default list_claims results. Idempotent — deleting an already-archived claim succeeds. Tier: all paid + free tiers (sample rejected).

link_claim_to_thesis

Attach a claim to a thesis with a role: 'supports' (the claim, if true, strengthens the thesis), 'refutes' (if true, weakens it — track disconfirming evidence first-class), or 'context' (relevant but not directional). Idempotent — re-linking updates the role. A claim can support one thesis and refute another. This composes theses from claims; it does NOT make the thesis score a function of claim

unlink_claim_from_thesiscan modify

Remove the link between a claim and a thesis. Idempotent — succeeds whether or not the link existed. The claim and thesis themselves are untouched. Undoable: the response carries `prior_role` (supports/refutes/context, null when there was no link), so calling `link_claim_to_thesis` with the same thesis_id, claim_id and role re-creates the link exactly. Tier: paid + free (sample rejected).

list_claims_for_thesisread-only

List the claims composing a thesis, each with its role (supports/refutes/context). This is how you read a thesis as the structured argument it is — its supporting and disconfirming claims with their current statuses. Archived claims are omitted. Tier: paid + free (sample rejected).

score_claim

Resolve a claim's outcome. By default auto-grades an `auto` claim by evaluating its verifiable_condition against SEC fundamentals (confirmed/refuted), or marks it `needs_review` when it can't be resolved deterministically (judgment, antecedent, or missing data). To record a human/agent judgment instead, pass `manual_status` (+ optional score/reason). Idempotent — re-scoring the same resolution is

score_due_claims

Find every auto-gradable claim that is due (assertions in open/needs_review/stale; predictions whose horizon has passed) and resolve each against fundamentals. Operates on the caller's OWN claims — omit `customer_id`. Targeting another user's `customer_id` is reserved for Valuein's internal scoring service and is rejected for every plan, including Institutional. Returns a summary + per-claim resul

list_public_claims_by_userread-only

Return the PUBLIC claims + claim-accuracy reputation for a user identified by Stripe customer_id. Used by the /[handle] profile to render an analyst's claim-level track record — a separate signal from thesis-outcome accuracy. Only visibility='public' claims surface; private state never leaks. Accuracy is confirmed/(confirmed+refuted) over resolved claims; null when n < 5. Sample tier rejected; sp5

publish_claim

Make a saved claim discoverable by flipping its visibility: `public` (default) surfaces it on the author's /[handle] profile and counts toward their claim-accuracy reputation; `unlisted` makes it reachable at a known direct link but keeps it off the profile. Use AFTER save_claim to promote an existing claim. Idempotent. Pair with unpublish_claim to revert to private. Tier: sp500+ (sample rejected)

unpublish_claimcan modify

Revert a published claim (public or unlisted) back to `private` — removes it from the author's /[handle] profile and excludes it from the public claim-accuracy aggregate. The inverse of publish_claim. Owner-only, idempotent. Tier: sp500+ (sample rejected).

save_citation_override

Persist a correction of a citation value. The correction is keyed on the canonical `fact_id` (a stable hash of CIK + accession + concept + period) so it applies to every report that references that same fact — including agent-regenerated reports. Re-saving the same fact_id replaces the prior correction in place (no duplicate row). The `fact_id` is VERIFIED against live SEC data (scoped to `ticker

list_citation_overridesread-only

Author-only newest-first listing of the caller's citation corrections. Filterable by ticker (e.g. all AAPL corrections) or by a single fact_id (returns 0 or 1 row). Pair with `save_citation_override` and `delete_citation_override`. Sample tier rejected. Agent use: call with `ticker` to introspect what corrections the user has previously applied on that ticker — useful for system prompts that resp

delete_citation_overridecan modify

Remove a user-authored citation correction by fact_id. Idempotent — deleting a missing override returns deleted=false without error. UNDOABLE: restore_deleted with kind 'citation_override' brings it back (unless a new save for the same fact_id replaced it). Once deleted, reports that previously rendered the corrected value revert to the canonical fact value on next regeneration. Tier: paid + free

save_figure_review

Record (or update) the review state of ONE figure inside a report — the durable answer to 'has a human traced this number back to its filing?' Upsert keyed on (report_id, figure_key): re-reviewing a figure REPLACES its prior mark, it never appends, so this is always the figure's current state, never a history. `figure_key` is an opaque id you mint yourself for one figure — for a dataset-backed fig

list_figure_reviewsread-only

List every figure review recorded for one report, plus a state-count summary — the coverage view for 'which figures in this report still need a human?' A report with no reviews yet returns an empty list and an all-zero summary; that is a legitimate answer, not an error. Owner-scoped — only returns your own review marks. Tier: sp500+ (sample rejected).

get_research_fileread-only

Fetch the Auditable Research File behind one of the caller's own agent runs — the complete evidence chain an examiner asks for: the originating prompt, every tool the agent called in order, every `fact_id` it cited, every human approval, and which models were used. Assembled from the immutable audit ledger written as the run executed; nothing here is reconstructed or inferred. Name the subject EIT

sign_off_reportcan modify

Request a Valuein compliance certificate for one of the caller's OWN reports — a signed, publicly verifiable attestation at valuein.biz/verify/{id} that every fact the report cited was knowable at the time it was used (absence of lookahead bias). It attests provenance ONLY: it says nothing about whether the report's conclusions are correct or profitable, and must never be presented as though it di

verify_report_figuresread-only

Check EVERY number in one of your own reports against the filing it cites, in one call. Returns a verdict per figure: `matches` (the prose quotes the filing's own rendered string), `differs` (positive evidence the filing says something else — the report is wrong), or `not_checkable` (no comparison was possible). CALL THIS BEFORE `publish_report` OR `sign_off_report`. `publish_report` REFUSES a rep

save_watchlist

Upsert a named watchlist with a list of tickers. Replace semantics — the full ticker list is the source of truth for that name. Use this for both creation AND modification (delete + recreate is not required for edits). 500-ticker cap per list. Names are case-insensitive uniqueness. Optional `weights` (ticker → relative number) marks a list the user HOLDS rather than merely follows; omit it entirel

list_watchlistsread-only

Paginated newest-first listing of the caller's watchlists (id, name, tickers, status, counts). Filter by `status` (active/archived/all). Returns metadata only — use get_watchlist for one list's full ticker set, or watchlist_diff for new filings across a list. Tier: sp500+ (sample rejected).

get_watchlistread-only

Fetch a single watchlist (full ticker set + criteria) by its name, not an id (case-insensitive). NOT_FOUND if the name is unknown to this user. Tier: sp500+ (sample rejected).

delete_watchlistcan modify

Soft-delete a watchlist by its name (not id): status flips to `archived` (still readable via list_watchlists status=all/archived). The name is freed for reuse by a new save_watchlist. Idempotent. Tier: sp500+ (sample rejected).

set_agent_memory

Store or update ONE durable memory entry (key → value) for this user so context survives across sessions — preferences, prior conclusions, working context. Replace semantics per key (reusing a key overwrites it). Do NOT store a number you would later cite as a fact: financial figures come from data tools and carry fact_ids; memory values are never treated as verified figures. Caps: 200 entries / 8

get_agent_memoryread-only

Recall this user's durable memory. Omit `key` (or pass null) to read EVERYTHING you have remembered, newest-first — do this at the START of a task to re-ground yourself. Pass a specific `key` to fetch one entry. An absent key returns an empty list, never an error (absence is a first-class answer). Tier: sp500+ (sample rejected).

delete_agent_memorycan modify

Forget ONE durable memory entry by key — use it when a note you stored is now wrong, superseded, or was only ever scratch. Every entry is re-read into your context at the start of every future run, so leaving a stale one behind means re-grounding yourself in something false; deleting is the correction. Idempotent: deleting a key that is not there returns deleted:false, not an error. Also how you f

watchlist_diffread-only

Return new SEC filings across a set of companies since a given date. Name the companies EITHER with `name` (a watchlist you have already saved) OR with `tickers` (a list you are holding right now) — pass exactly one. Use `tickers` for an ad-hoc question: there is no need to create a watchlist just to ask, and you should not, because a saved watchlist is a durable record in the user's account. Read

create_signal

Persist a signal and register it with the firing pipeline. Five condition shapes: * `filing_event` — fire when a ticker files a chosen form type (8-K, 10-K, etc.). * `ratio_threshold` — fire when a ticker's financial ratio crosses a threshold (e.g. interest_coverage < 1.5). * `watchlist_change` — fire when any ticker in a named watchlist files; takes the same optional `forms` filter as `fili

update_signal

Edit an existing signal IN PLACE — rename it, change what it watches, or change where it delivers — keeping its id, its fire history (`trigger_count`, `last_triggered_at`) and every inbox item and delivery already tied to it. Pass only the fields to change; omitted fields keep their stored value. `channels` REPLACES the whole delivery list (1–4, distinct type+target); a webhook entry that keeps it

list_signalsread-only

Paginated newest-first listing of the caller's signals (id, condition, channel, status, trigger_count, evaluator health). Filter by `status` (active/paused/deleted/all). Use the returned signal id with delete_signal or test_signal. Tier: sp500+ (sample rejected).

delete_signalcan modify

Soft-delete a signal by its id (from create_signal/list_signals): status flips to `deleted` and it is removed from the cron evaluator index so it stops firing. Signals are immutable — to change one, delete then create_signal. Idempotent. Tier: sp500+ (sample rejected).

test_signal

Fire a synthetic notification through EVERY channel the signal is configured with. Use this immediately after `create_signal` to verify the channels (email address valid / webhook URL reachable + HMAC verification on the receiver). The synthetic fire is logged with a `[TEST]` summary so it affects neither the real fire counter nor the one-email-per-day cap — the next genuine match still fires norm

list_signal_inboxread-only

Newest-first listing of the caller's in-app inbox. Items are signal FIRES with a `dashboard` channel — written by the cron evaluator (or `test_signal`) — plus platform notifications written by the edge-gateway (agent run completions, morning briefs, skipped runs); use list_signals instead for the signal definitions themselves. By default dismissed items are hidden and read items are included. Curs

mark_inbox_read

Set `read_at` on a single inbox item by its id (from list_signal_inbox or the signals feed resource) — not a signal id. Idempotent — re-marking does NOT reset the first-read timestamp; there is no unmark. Returns the new unread_count so the agent/UI can update its badge without a follow-up call. Tier: sp500+ (sample rejected).

dismiss_inbox_itemcan modify

Soft-delete a single inbox item by its id (from list_signal_inbox) — not a signal id; sets `dismissed_at`. The row stays queryable via `list_signal_inbox(include_dismissed=true)` for audit. Undoable: `restore_deleted` with kind `inbox_item` and this inbox_id un-dismisses it. Idempotent. Tier: sp500+ (sample rejected).

stage_action

Propose an MCP tool call for human approval BEFORE running it. Call this — instead of calling the tool directly — whenever an autonomous or unattended caller (a scheduled standing agent, an unattended agent-runner run, or any MCP client operating without a human watching) is about to perform a write it knows or suspects is risky. The target tool's OWN registered risk hints (readOnlyHint/destructiv

list_pending_approvalsread-only

List the caller's own staged actions still awaiting a human decision (status='proposed'), newest-first. Use this to check what an autonomous run has queued up before you approve or reject it with `approve_staged_action` / `reject_staged_action`. Tier: sp500+ (sample rejected).

approve_staged_actioncan modify

Approve a staged action by id and RUN the underlying tool call it proposed, using the caller's own current credentials — never the original proposer's. Idempotent and race-safe: an action already decided (approved by a concurrent call, rejected, executed, or failed) is NEVER re-executed — this returns the action's current state with `executed_now: false` instead. On a fresh approval, `executed_now

reject_staged_action

Reject a staged action by id. Terminal — the underlying tool is NEVER called, and a rejected (or otherwise already-decided) action can never be flipped back by a later approve/reject call; `transitioned` tells you whether THIS call is what moved it to 'rejected' or whether it was already decided. An id belonging to a different customer's token is indistinguishable from an unknown id (returns NOT_F

schedule_task

Defer a follow-up task ("re-check AAPL margin compression in 30 days") for up to 90 days. This is an AGENT-facing primitive — call it mid-conversation/mid-run when you decide something is worth re-checking later; it is NOT a human-authorable "new task" form (use the Workspace's standing-agent scheduler for recurring, human-configured monitoring instead). On wake, an inbox item ALWAYS lands for the

list_scheduled_tasksread-only

Paginated newest-first listing of the caller's own scheduled (deferred) tasks — transparency into what an agent has queued for the future. Filter by `status` (pending/completed/cancelled/cancelled_owner_inactive/all). Tier: sp500+ (sample rejected).

cancel_scheduled_taskcan modify

Cancel a pending scheduled task by id (from schedule_task or list_scheduled_tasks). Only a `pending` task can be cancelled — one that already woke (completed) cannot be un-woken. Idempotent: cancelling an already-cancelled task is a no-op. Undoable: `restore_deleted` with kind `scheduled_task` and this task_id re-queues it while its wake time is still in the future and the tier cap has room. Tier:

create_rule

Persist a trigger -> action rule and register it with the evaluator. 7 trigger types accepted (alert_fired, schedule_tick, inbox_item, price_threshold, filing_event, manual, scheduled_task_wake) x six action types (run_team, send_alert, create_report, score_thesis, schedule_task, post_inbox). These trigger types have a live event source and DO dispatch today: alert_fired, schedule_tick, inbox_item

list_rulesread-only

Paginated newest-first listing of the caller's own rules. Tier: sp500+ (sample rejected).

delete_rulecan modify

Delete a rule by id (from create_rule/list_rules) — hides it from the catalog and removes it from the evaluator's scan index, so it stops firing immediately. UNDOABLE: restore_deleted with kind 'rule' brings it back and resumes evaluation (subject to the signal cap). Rules are immutable — to change one, delete then create_rule. Idempotent. Tier: sp500+ (sample rejected).

test_ruleread-only

Dry-run a rule's condition_expr against a SYNTHETIC trigger payload — reports whether it WOULD have fired, but NEVER dispatches the action (no report generated, no team run, no message sent, no inbox write). Use this immediately after create_rule to sanity-check the condition before it starts evaluating against real events. Pass `sample_payload_override` to test against specific field values (e.g.

get_morning_briefread-only

Read the caller's Morning Brief — a daily AI-generated market digest covering overnight moves across the customer's own watchlists and theses, produced by the Workspace. Omit `day` to get the most recent brief available (not necessarily today's); pass a specific `day` (YYYY-MM-DD) to fetch that day's brief. It is normal for no brief to exist yet if the customer hasn't set up or recently generated

list_agent_runsread-only

List the caller's own standing-agent runs, newest first — status, goal, cost, and timing for each. A run may have been kicked off by this same agent (e.g. via create_rule's run_team action, a schedule_task wake, or run_agent) OR by the customer's own Workspace UI; this tool lets any MCP client check on ANY run belonging to the authenticated customer regardless of what triggered it. Filter by an ex

get_agent_runread-only

Fetch full detail for one of the caller's own standing-agent runs by id (from list_agent_runs) — status, goal, tickers, cost, artifact ids, role breakdown, and any error. A run may have been triggered by this same agent or by the customer's own Workspace; this tool works either way. Returns `found: false` (not an error) for an unknown id OR an id belonging to another customer — there is no disting

save_agent

Create or update a standing agent — a saved {goal + tickers + schedule} that fires either a fixed step recipe (agent_type="workflow", free/deterministic) or an AI-directed team (agent_type="autonomous", charged — settles against the owner's BYO key first, falling back to the managed wallet only if funded). Upsert semantics: omit `agent_id` to CREATE a new agent; pass an existing `agent_id` to UPDA

list_agentsread-only

List the caller's own standing agents (id, name, goal, tickers, agent_type, trigger config, schedule, enabled state, last/next run). Optionally filter by `agent_type` ("workflow" or "autonomous"). Use get_agent for one agent's full detail, list_agent_runs for run history, or run_agent to fire one now. Tier: sp500+ (sample rejected).

get_agentread-only

Fetch full detail for one of the caller's own standing agents by id (from save_agent/list_agents). Returns `found: false` (not an error) for an unknown id OR an id belonging to another customer — there is no distinguishing signal, by design, matching get_agent_run's posture. Tier: sp500+ (sample rejected).

delete_agentcan modify

Delete one of the caller's own standing agents by id. Undoable: `restore_deleted` with kind `agent` and this agent_id brings it back as it was (enabled or paused). System agents (is_system:true on get_agent/list_agents — built-in agents the platform provisions) cannot be deleted and are rejected with a clear message. Idempotent in effect: deleting an already-deleted or unknown id returns NOT_FOUND

run_agent

Fire one of the caller's own standing agents now, out of band from its schedule. For agent_type="autonomous" this costs money — it settles against the owner's own BYO LLM key first, falling back to the managed wallet only if funded; agent_type="workflow" runs are free/deterministic. This call can be a legitimate NO-OP: it may report a run was SKIPPED for a real business reason (no usable compute l

create_report

Synchronously generate a research report and persist it under the caller's authorship. Two subtypes: • `reverse_dcf` — solves the stage-1 free-cash-flow growth rate the market price implies, with a 5×5 sensitivity grid across WACC × terminal-growth assumptions. Returns full markdown + structured JSON + every numerical claim's citation chain to the originating SEC accession. • `thesis` — snapshot

get_reportread-only

Fetch the current HEAD of a report by id. `format=markdown` returns the rendered body, `format=json` returns the full structured payload (sections + citations + report-type-specific data), `format=preview` returns abstract-only. Authors see any of their own reports; non-authors only get `preview` of listed reports and need the report's required tier for full bodies. Sample-tier non-authors are dow

list_my_reportsread-only

Cursor-paginated newest-first listing of the caller's own reports (owner-scoped). Filters compose with AND; `status` defaults to 'ready' so pass status='draft' or 'all' to see drafts. Use `cursor` from the previous response's `next_cursor` to fetch the next page (limit max 100). Sample tier rejected (no per-author state).

delete_reportcan modify

Soft-delete a report owned by the caller: status flips to `delisted`, visibility to `private` — not a hard delete, the row and R2 artifact are preserved (90-day audit window). Idempotent (deleting an already-delisted report succeeds). Sample tier rejected.

publish_report

Publish a report for FREE at `listed` or `unlisted` visibility to build your public author profile. `listed` makes it discoverable via `search_reports` (keyword catalog search); `unlisted` keeps it out of the catalog but accessible by direct id (shareable link). Author can set a `tier_required` no higher than their own plan. All listings are free today (omit `price_cents` or set it to 0); paid lis

unpublish_reportcan modify

Revert a published report (listed or unlisted) back to `private` visibility, removing it from the public catalog. Author-only. Idempotent.

search_reportsread-only

Search the catalog of published research reports. All listings are free to read. Filters: free-text (matches title + abstract), ticker, report_type. Sort: `newest` (default) or `oldest`. Tier-gated: callers only see reports their plan tier can read.

compute_dcfread-only

Forward discounted-cash-flow valuation (two-stage Gordon-growth model): caller provides growth + WACC + terminal assumptions, returns per-share intrinsic value (`value_per_share_cents`, cents USD) + 5×5 sensitivity grid. Pulls FCF base + net debt + shares from R2; caller can override any field. Definitions (consistent with `get_financial_ratios` / `get_capital_allocation_profile`): FCF base = oper

forensic_auditread-only

Deterministic forensic-accounting scores for a single ticker: partial Beneish M-Score, Sloan accruals, and a solvency snapshot. Returns a red-flag narrative ranked by severity, with citations to source filings. Used by the `forensic_earnings_brief` SOP. Note: full Beneish needs AR / current assets / PPE / SGA / current liabilities, which aren't in our fundamentals model. We compute the recoverabl

get_stock_priceread-only

End-of-day closing price for a company AS OF any calendar date. Pass `date` to get the close on that day; if the date falls on a weekend or market holiday, it resolves backward to the most recent prior trading day's close (the `price_date` field tells you which day was actually used, and `resolved_backward` flags when it stepped back). Omit `date` for the latest available close. Closes are RAW (no

get_price_historyread-only

Daily EOD bar series (OHLCV) for a company over a date range. Returns up to 252 trading-day bars oldest-first — one bar per trading day. Each bar carries: open / high / low / close (raw, unadjusted), total_return_index (dividends reinvested and splits neutralized, forward-compounded from an arbitrary base so only RATIOS of it are meaningful — TOTAL RETURN BETWEEN TWO DATES IS tri_b / tri_a - 1; it

get_pit_valuation_ratiosread-only

Current and historical valuation multiples for a company. Omit `as_of_date` and it returns today's P/E, P/S, P/B, EV/EBITDA, EV/Revenue and FCF yield, computed from the latest EOD close and the latest TTM financials. Use it for any "what is X's P/E " / "how is X valued right now" question — never derive a multiple yourself by dividing a price by an earnings figure; that is exactly the arithmetic t

run_backtestread-only

A SMALL, BOUNDED, in-Worker sanity-check backtest — NOT a full-universe backtesting engine. Answers a quick question like 'does this factor actually work on these 5 names over the last year' inline, mid-conversation, without leaving MCP. Composes two existing tools (`get_pit_universe` + `get_pit_valuation_ratios`) across up to 10 tickers x 12 rebalance dates (120 cells): for each rebalance date, c

project_three_statementread-only

Linked forward Income Statement / Balance Sheet / Cash Flow projection, seeded from the company's latest historical annual period. The balance sheet ties out (assets == liabilities + equity) EVERY projected year by algebraic construction — each year's `tie_out_ok` field is a live correctness check, not decoration. Interest is computed on beginning-of-period debt balances (no circular cash-sweep/re

compute_lboread-only

Leveraged buyout returns analysis: caller provides entry/exit multiples, leverage, and a hold period; the tool builds a Day-1 pro-forma opening balance sheet from the deal's own sources & uses (cash-free, debt-free convention — entry_debt = leverage_multiple x EBITDA, sponsor_equity = entry_enterprise_value + minimum_cash - entry_debt), then runs it through the same linked three-statement engine a

compute_accretion_dilutionread-only

M&A accretion/dilution: the standard sell-side/banker quick-screen for whether a proposed acquisition adds to (accretive) or subtracts from (dilutive) the acquirer's EPS in the first pro-forma year. Pulls net income + shares outstanding for both companies, and each side's latest EOD close (acquirer's price converts stock consideration into new shares issued; target's price is used only to disclose

update_report

Replace one or more sections of an existing report owned by the caller. Useful for authoring workflows where the agent's first draft (`create_report`) is refined by additional analysis before publishing. Pass `citations` for figures in the edited prose — they are MERGED into the report's existing set, never replacing it, so omitting them preserves the lineage already recorded. Bumps `version`. Doe

list_report_versionsread-only

Author-only newest-first listing of a report's archived version history. Each entry summarises what changed (sections edited, etc.) so the workspace UI can render a clickable history without loading every artifact. Pair with `get_report_version` to fetch a specific version's content for diffing against HEAD.

get_report_versionread-only

Author-only fetch of a specific archived version of one of your reports, by positive-integer `version`. Returns metadata + the full payload (sections, citations, structured, markdown) — enough to render a diff against the current HEAD in the workspace editor. Use after `list_report_versions` identifies the version number you want; for the current HEAD use `get_report` instead.

render_report

Return a 15-minute presigned download URL for a report in the requested binary format. `format=md` presigns the cached markdown — instant, no compute. `format=docx` and `format=pdf` return the SAME branded research-note design in the two media: a masthead-first page 1 (Valuein letterhead — brand rule, wordmark, 'EQUITY RESEARCH' kicker + date), the ticker eyebrow and title, the named analyst's by

save_freeform_report

Save free-form markdown (e.g. a chat synthesis) as a DRAFT report you can refine in the editor and export to Word/PDF. Unlike `create_report` (which computes a structured reverse_dcf or thesis report), this accepts raw markdown and splits it into sections. PASS `citations` with the fact_ids behind the figures you wrote — without them every number in the report reads as unsourced and the report can

get_uploaded_documentread-only

Read the extracted text of a file uploaded via POST /v1/uploads (a plain REST route, not this JSON-RPC endpoint). Use this to pull a user-attached document's content into context by its upload_id. Uploads are ephemeral (24h) and owner-scoped — an expired or missing id both read back as not-found.

list_uploaded_documentsread-only

List the caller's currently-active uploaded documents (filename, size, char count — no full text; call get_uploaded_document for that). Uploads expire 24h after upload.

delete_uploaded_documentcan modify

Delete an uploaded document before its 24h TTL. UNDOABLE: restore_deleted with kind 'uploaded_document' brings it back while it is still within its 24h TTL and its file exists. Deleting a missing/already-expired/foreign id returns deleted:false rather than an error.

generate_dcf_xlsx

Render a forward DCF result into a professional Excel workbook (Summary + 5×5 Sensitivity heatmap + Inputs sheet). Native conditional formatting — no chart images needed. Returns a 15-minute presigned R2 download URL. SERVER-TRUST: the DCF is re-derived in-Worker from the supplied `inputs_echo` (the math is pure + deterministic) and the workbook renders Valuein's recomputed figures — never the ca

generate_research_brief_docx

Render a structured research brief into a professionally-styled Word document — a branded masthead-first page (Valuein letterhead: brand rule, wordmark, 'EQUITY RESEARCH' kicker + date, then the ticker eyebrow, the title as hero, and the named analyst's byline), the body (abstract, optional snapshot table with figures in mono, markdown sections incl. GFM tables, and a citations table with clickabl

generate_comps_xlsx

Render a peer comparables table into an Excel workbook. The Comps sheet is formatted as a named Excel Table (`ValueinPeerComps`) so the user gets one-click Insert Chart on any column — the cleanest workaround for not embedding chart objects server-side. Subject-row highlight makes side-by-side comparison instant. A Summary sheet adds subject vs peer-median deltas. SERVER-TRUST: the ratios you pas

generate_lbo_xlsx

Render an LBO result into a professional Excel workbook (Summary + year-by-year Projection table + Inputs sheet). Returns a 15-minute presigned R2 download URL. SERVER-TRUST: the deal is re-derived in-Worker from the supplied `lbo_result.inputs_echo` (the math is pure + deterministic) and the workbook renders Valuein's recomputed figures — never the caller's claimed values. If the claimed figures

Alternatives in Developer Tools

Compare →
Try “Notion”, “Stripe”, “create invoice”, “browser”