# Valuein — SEC EDGAR Fundamentals & Smart-Money Data MCP server

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

## Links
- Registry page: https://www.getdrio.com/mcp/io-github-valuein-mcp-sec-edgar
- Repository: https://github.com/valuein/valuein
- Website: https://valuein.biz

## Install
- Endpoint: https://mcp.valuein.biz/mcp
- Auth: Not captured

## Setup notes
- Remote endpoint: https://mcp.valuein.biz/mcp

## Tools
- search_companies (Search Companies) - 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.

**Use this tool — NOT `get_pit_universe` — when the user asks about CURRENT S&P 500 members.** To list current S&P 500 members, call `search_companies({ is_sp500: true })` (the `is_sp500` filter is itself a valid search parameter, so no other input is required). This returns the live snapshot as of query time. Example: "List 5 current S&P 500 members" → call `search_companies({ is_sp500: true, limit: 5 })`.

**Use `get_pit_universe` ONLY when the user explicitly needs a survivorship-free historical universe as of a specific past date** (e.g. "S&P 500 members as of March 2018"). If the user says "current," "today," "now," or gives no date, use `search_companies` instead.

**Data details:** `sic_code` is the 4-digit SIC; `industry` is the human-readable label. `sector` is SIC-derived with GICS-style labels — NOT licensed GICS, so industrial conglomerates may map differently from official GICS (e.g. 3M → 'Health Care' by SIC vs Industrials by GICS). S&P 500 membership is sourced from index_membership.parquet (current SP500 = `index_name='SP500' AND removal_date IS NULL`). Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_company_fundamentals (Company Fundamentals) - 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-time: no look-ahead bias — pass `as_of_date` (YYYY-MM-DD) to reconstruct exactly the information set known on that date. This returns the raw as-reported line items; for pipeline-computed ratios (margins, ROE, ROIC, leverage, per-share) use `get_financial_ratios`, and for margins combined with DCF/DDM model inputs use `get_valuation_metrics` — both derive from the figures this tool returns. Endpoint: https://mcp.valuein.biz/mcp
- get_valuation_metrics (Valuation Metrics) - Get comprehensive valuation and profitability metrics for a US public company. Returns per-period data combining computed ratios (gross_margin, operating_margin, net_margin, ROE, ROA, ROIC, debt_to_equity, FCF, FCF margin), price-derived valuation_multiples (current_price, market_cap, pe_ratio, pb_ratio, ev_ebitda, dividend_yield), and optional pre-computed DCF model inputs (WACC, fcf_base_per_share, stage1_growth_rate, terminal_growth_rate, dcf_value_per_share, ddm_value_per_share). Profitability/cash-flow/leverage fields come from fact.parquet (PIT-safe via accepted_at). valuation_multiples are LIVE (schema 2.18.0): they come from ratio.parquet's `valuation` category + stock_price.parquet period-end close (per-period current_price for every fiscal year), derived from EOD prices period-end-aligned. Each multiple is a `{value, unit}` pair (unit varies: x / USD / percent); a null value carries a `null_reasons[field]` PRICE_NOT_AVAILABLE code (no period-end-aligned close). DCF/DDM fields come from valuation.parquet (pipeline-computed, recomputed each run — NOT strictly PIT-safe) and are commonly null (newer tickers, transition periods, or before the valuation pipeline runs). Each null carries a `null_reasons[field]` code — ALWAYS check it before assuming zero (null != 0). For strict-PIT DCF, use the SDK or compute from `get_company_fundamentals`. Use this *instead of* `get_financial_ratios` when DCF/intrinsic value or price multiples matter; use `get_financial_ratios` when you only need the raw ratio table. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_financial_ratios (Financial Ratios) - 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_yield), and the pipeline-emitted forensic, growth, and rank (cross-sectional *_sector_pctile) categories. NOT every category exists for every ticker — omit `categories` to get whatever this ticker has, or read `available_categories` in the CATEGORY_NOT_AVAILABLE envelope. valuation is LIVE (schema 2.18.0): price-derived multiples from EOD prices period-end-aligned — pipeline-derived, NOT strictly PIT (no accepted_at column on these rows). Includes TTM rows alongside annual; each row's `is_calendar_aligned` is TRUE only when period_end sits on the fiscal-year boundary (±7 days) — filter to TRUE when joining ratios to fact-table fundamentals on (entity, fiscal_year). For historical cuts use `as_of_date` (PIT by accepted_at when present, else by period_end — see the param). Use this *instead of* `get_valuation_metrics` when you only need ratios (no DCF wiring); use `get_valuation_metrics` when you also need DCF/DDM. Each ratio is a `{value, unit, category, reason}` entry with a response-level `lineage` (DerivedLineage) pointing to `get_company_fundamentals` / `verify_fact_lineage` for filing-level provenance; a null value carries a `reason` (e.g. INPUT_MISSING) so missing is never a real zero. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_sec_filing_links (SEC Filing Links) - 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 not Inline-XBRL), and `document_url` (a direct link to the rendered primary document itself — opens the actual filing, never the index page, `null` only when primary_document is unknown). Prefer `inline_viewer_url ?? document_url ?? viewer_url ?? sec_url`. Supported form_types (enum): 10-K, 10-Q, 8-K, 20-F, 40-F, 10-K/A, 10-Q/A, 20-F/A, 40-F/A. Other forms (6-K, DEF 14A, Form 4, 13F) are NOT yet exposed by this tool — use `describe_schema` to confirm the parquet has them, then read raw via the SDK. 8-K item codes are filterable via `event_types` (e.g. ['2.02'] for earnings, ['1.01'] for material agreements, ['5.02'] for officer changes). PIT-safe — filings are filtered by accepted_at, never by report_date alone. Use this *instead of* `verify_fact_lineage` when you want a list of filings; use `verify_fact_lineage` when you want one specific fact-to-filing trace. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_capital_allocation_profile (Capital Allocation Profile) - 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-distributing, is growth funded by R&D or M&A, what's the cash-return-ratio trend, or any 'where does the money go' question — including owner-earnings (Buffett-style) and reinvestment-rate (Damodaran-style) analysis. Data sourced from annual 10-K filings; PIT-safe via as_of_date. R&D is included as a deployment category (the primary growth-reinvestment vehicle for knowledge-economy firms), but since it's already deducted before operating cash flow, `rd_pct_ocf` is INFORMATIONAL and `total_deployment_pct_ocf` EXCLUDES R&D to preserve the cash-flow identity (OCF = capex + M&A + dividends + buybacks + debt repayment + Δcash). The `flags` object carries pre-computed booleans: `buybacks_exceed_fcf`, `total_returns_exceed_fcf` (buybacks + dividends > FCF), and `debt_funded_distribution` (over-distribution funded by leverage vs cash). Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_peer_comparables (Peer Comparables) - 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 available for the most current view. Use as_of_date to compare peers at a specific historical date. PIT semantics for the figure leg are data-driven: when the ratio data carries an SEC accepted_at timestamp, as_of_date filters point-in-time by accepted_at (zero look-ahead, _meta.pit_safe=true); when it does not (today's data), the cut is by ratio.period_end (_meta.pit_safe=false). NOTE: peer SELECTION still uses CURRENT S&P 500 membership as a size/relevance ranking proxy regardless of as_of_date (W3-G2). Available on every plan — sample returns the subset covered by the sample bucket. Endpoint: https://mcp.valuein.biz/mcp
- get_pit_universe (Point-in-Time Universe) - 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 historical questions.

Returns a survivorship-free universe valid on a given as_of_date (only companies that existed and were members on that exact date — no hindsight). Supports SP500, RUSSELL1000, RUSSELL2000, RUSSELL3000 via index_membership.parquet (accurate join/leave dates, [) interval semantics). To check one company, pass its ticker + the target date: present = was a member, absent = was not.

Returns per company: CIK, ticker, name, sector, industry, SIC code, and per-row confidence (high/medium/low). `_meta.pit_safe` is true only when every matched row is high-confidence — treat low-confidence rows with caution. `sector` is SIC-derived (GICS-aligned, not licensed GICS) — a screening bucket, not an authoritative label.

Use as the first step of a quantitative backtest before `get_compute_ready_stream`. Returns an empty array (with error detail) if the date is out of range or has no coverage. Available on every plan — sample returns the subset covered by the sample bucket. Endpoint: https://mcp.valuein.biz/mcp
- get_compute_ready_stream (Compute-Ready Stream) - 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 (per-entity partition — requires ticker), ratio (all computed ratios), valuation (DCF inputs), filing (SEC filing metadata), references (company universe), index_membership (historical index composition). Scoped to the caller's tier bucket; the link is signed and cannot be used to list the bucket or read other objects. Endpoint: https://mcp.valuein.biz/mcp
- describe_schema (Describe Data Schema) - 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. Endpoint: https://mcp.valuein.biz/mcp
- verify_fact_lineage (Verify Fact Lineage) - 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 INSTEAD OF `search_companies` when the user already names a company and wants a financial figure with its source filing — `search_companies` only resolves identifiers and returns no financial data. Use this INSTEAD OF `get_company_fundamentals` when the user explicitly wants the filing/form type or the accession ID — `get_company_fundamentals` returns metrics across periods but omits filing provenance.

Two lookup modes: (1) by fact_id (deterministic SHA-256 identity) or (2) by concept name plus a ticker (most recently reported fact). Optionally pin a point-in-time cutoff via as_of_date (YYYY-MM-DD) — returns the latest filing accepted by SEC on or before that date (no look-ahead); check `_meta.pit_safe`.

DURATION: a single 10-K tags BOTH a 12-month figure and a 3-month Q4 stub at the same period_end; on a tie this returns the longer (headline) window, and every result carries `period_type` and `period_span_days` so a 3-month stub is never mistaken for the annual figure.

Provide either fact_id or concept (required). Returns FACT_NOT_FOUND if no matching fact exists. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- compare_periods (Compare Financial Periods) - 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 triage filings — anything > ~3 typically signals a material event worth deeper review. Use period format: 'FY2024' for annual, 'Q1-2024' for quarterly. Pass `period_a` as the EARLIER period and `period_b` as the LATER one — if you invert them the server auto-swaps and sets `swapped: true` in the response so deltas always carry the correct sign (rather than silently flipping). Point-in-time safe via as_of_date. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- screen_universe (Screen Universe by Factor Scores) - 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 shortcut; sort by a specific *_rank column for a single factor. Two modes: full-universe (omit ticker) or single-entity (ticker set — spot-check ONE company's factor profile). Sector filter is SIC-derived (GICS-aligned, not licensed GICS — see `get_pit_universe`). Use this *instead of* `get_financial_ratios` when you want CROSS-SECTIONAL comparison (rank vs peers); use `get_financial_ratios` when you want one company's ratios over time. Supports survivorship-free POINT-IN-TIME screening via `as_of_date` (see the param). Full-universe screens omit rows that don't join to a company (null symbol); pass `exclude_outliers=true` to also drop shell-company rows with implausible factors. Available on every plan — sample returns the subset covered by the sample bucket. Endpoint: https://mcp.valuein.biz/mcp
- get_earnings_signals (Earnings Signals) - 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 carries no consensus feed. It is a deterministic estimate computed from the company's own prior reported EPS, so `eps_surprise_pct` measures how far the print landed from its own trailing trend, not whether it 'beat the Street'. Use it to track earnings/revenue trajectory and momentum, not to claim a consensus beat or miss. Point-in-time safe — pass as_of_date to filter by SEC acceptance (accepted_at) for look-ahead-free backtests. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_stock_price (Stock Price (as-of date)) - 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 (not split/dividend-adjusted); `div_cash` and `split_factor` carry the corporate-action factors for query-time total-return adjustment. This is EOD market data (not a SEC filing fact), so it carries a price_date rather than a fact_id. Coverage follows your plan's tier slice: full = all companies & all history, pro = all companies & last 15 years, sp500 = S&P 500 only, sample = S&P 500 & last 5 years. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_price_history (Price History (date range)) - Daily EOD bar series (OHLCV + adjusted_close) for a company over a date range. Returns up to 252 trading-day bars oldest-first. Each bar carries: open / high / low / close (raw, unadjusted), adjusted_close (vendor split/dividend-adjusted — retroactively restated on each corporate action; use for total-return backtests; NOT PIT-immutable), volume (shares traded), div_cash (ex-dividend cash per share on that date, 0 on non-dividend days), and split_factor (1.0 on non-split days). Omit start_date for the trailing year before end_date. Omit end_date for the latest available close. Coverage follows your plan's tier slice: full = all companies & all history, pro = all companies & last 15 years, sp500 = S&P 500 only, sample = S&P 500 & last 5 years. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- get_pit_valuation_ratios (Point-in-Time Valuation Ratios) - Returns a full snapshot of valuation multiples for a company on a specific historical date — zero look-ahead bias (the 'Compustat + CRSP merge' pattern). The EOD close is sourced from stock_price_daily.parquet at `as_of_date` (or the nearest prior trading day), and all financial figures come from SEC filings with accepted_at ≤ as_of_date so no future information is used. TTM financials are computed by summing the four most recent standalone-quarter values (or using the most recent FY filing when no quarterly series is available). Returns: price snapshot (close, price_date, is_exact_date_match), TTM P&L (revenue, gross_profit, operating_income, EBITDA, net_income, OCF, CapEx, FCF), balance sheet snapshot (shares, cash, debt, book equity), derived market values (market_cap, enterprise_value), valuation multiples (P/E, P/S, P/B, EV/EBITDA, EV/Revenue, FCF yield %), and TTM margins (gross, operating, net). Use for: historical valuation screens, backtesting entry-point multiples, forensic audit of peak / trough valuations, comparing a company's current multiples to its own history. Coverage follows your plan tier: full = all companies & full history, pro = all companies & last 15 years, sp500 = S&P 500 only, sample = S&P 500 & last 5 years. Available on all plans. Endpoint: https://mcp.valuein.biz/mcp
- submit_feedback (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 pass an `idempotency_key` so a retried submission files exactly once (the same key from the same account); guest/sample callers are never deduplicated. Returns a friendly acknowledgment you can relay to the user. Do NOT use this to query data; it is a one-way report channel. Endpoint: https://mcp.valuein.biz/mcp
- submit_artifact_feedback (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, hallucinated_fact), the `request_id` of the turn, the disputed `fact_id`, and an `expected_value` (the value it SHOULD have been, in your words). Available on EVERY tier including guest/sample. This is a one-way intake channel — it records your assertion, it NEVER computes or validates a number, and `expected_value` is stored verbatim, never trusted as data. Retried submissions of the same judgement on the same `request_id` file exactly once. Returns the recorded feedback id. Endpoint: https://mcp.valuein.biz/mcp
- get_insider_transactions (Insider Transactions) - 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 / sp500 / pro return ENTITLEMENT_DENIED with an upgrade link. Endpoint: https://mcp.valuein.biz/mcp
- get_institutional_holdings (Institutional Holdings (by issuer)) - 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 latest data is older than 90 days. Endpoint: https://mcp.valuein.biz/mcp
- get_manager_portfolio (Manager Portfolio (13F by filer)) - 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. Endpoint: https://mcp.valuein.biz/mcp
- get_blockholders (Blockholders (SC 13D / 13G)) - 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 most recent filing per filer.  Use collapse_groups=true to fold multi-person filings into one row. Institutional tier only. Endpoint: https://mcp.valuein.biz/mcp
- get_insider_sentiment (Insider Sentiment (composite)) - 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 the lookback. Institutional tier only. Endpoint: https://mcp.valuein.biz/mcp
- get_top_holders (Top Holders (composite, classified)) - 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 charges separately for INSIDER<GO>, OWNER<GO>, and HDS<GO>; this consolidates them. Endpoint: https://mcp.valuein.biz/mcp
- get_smart_money_flow (Smart Money Flow (composite)) - 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 is — not just the headline number. NOTE: the institutional component is a QoQ share-change signal computed over the top-5 13F filers on a MATCHED current-vs-prior basis (a filer only counts when its prior-quarter book is observable), NOT the issuer's complete institutional book — treat the score as a directional signal, not an exact flow. `coverage.coverage_confidence` (0–1) reports how much of that basis had a real prior quarter; when it is 0 the institutional component is forced to 0 so a 13F ingestion gap can never surface as a false max-conviction buy. See the `coverage` block for holder coverage + staleness. The score is a unitless composite, not a dollar figure. Institutional tier only. Endpoint: https://mcp.valuein.biz/mcp
- save_thesis (Save Investment 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 conclusion, not the question. Pair with `source_report_id` to link the thesis back to a published report so the buyer's thesis-tracking carries provenance.

Tier: all paid + free tiers (sample tier rejected — sample is guest access with no customerId binding). Per-tier cap on # of stored theses: sp500=100, pro=500, full=10,000. Endpoint: https://mcp.valuein.biz/mcp
- list_theses (List Saved Theses) - 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). Endpoint: https://mcp.valuein.biz/mcp
- get_thesis (Get Saved Thesis) - 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). Endpoint: https://mcp.valuein.biz/mcp
- delete_thesis (Archive Saved Thesis) - 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). Endpoint: https://mcp.valuein.biz/mcp
- score_thesis_outcome (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 — does NOT yet include market-price returns. Phase 2 will mix in price data via a partner feed; the response shape is stable. Endpoint: https://mcp.valuein.biz/mcp
- score_due_theses (Score Due Theses (bulk auto-grader)) - Find every thesis past its horizon with no outcome yet, and grade each via `score_thesis_outcome`. Operates on the caller's own theses by default; can target any user when called with `customer_id` from a `full`-tier (admin) token. Returns a summary + per-thesis results. Idempotent — a re-call only re-grades anything not already graded. Endpoint: https://mcp.valuein.biz/mcp
- run_workflow (Run Saved Workflow) - 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, call the named tool/SOP with `args`, accumulate outputs, and apply each step's `skip_if` (skip the step when the previous output's `path` equals `equals`).

Workflows are private state owned by the calling user. Sample-tier callers are rejected. Pair with `list_workflows` (frontend) to discover available workflow_ids. Endpoint: https://mcp.valuein.biz/mcp
- list_public_theses_by_user (List Public Theses by User) - 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. Endpoint: https://mcp.valuein.biz/mcp
- publish_thesis (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 revert to private. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- unpublish_thesis (Unpublish Thesis (back to private)) - 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). Endpoint: https://mcp.valuein.biz/mcp
- save_claim (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 judged, not what it's about: `assertion` = true now, checked against data; `prediction` = resolves at `horizon_days` via `verifiable_condition`; `judgment` = qualitative, not auto-scored. Use `tags` for the topic (financial, valuation, macro, …). Set `eval_mode: 'auto'` + a `verifiable_condition` for deterministic grading, else `'agent'`/`'manual'`.

Tier: all paid + free tiers (sample rejected — guest has no customerId). Verifiable claims must cite evidence. Endpoint: https://mcp.valuein.biz/mcp
- list_claims (List Claims) - 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). Endpoint: https://mcp.valuein.biz/mcp
- get_claim (Get Claim) - 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). Endpoint: https://mcp.valuein.biz/mcp
- delete_claim (Delete Claim) - 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). Endpoint: https://mcp.valuein.biz/mcp
- link_claim_to_thesis (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 scores (they're scored independently). Tier: paid + free (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- unlink_claim_from_thesis (Unlink Claim from Thesis) - Remove the link between a claim and a thesis. Idempotent — succeeds whether or not the link existed. The claim and thesis themselves are untouched. Tier: paid + free (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- list_claims_for_thesis (List Claims for Thesis) - 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). Endpoint: https://mcp.valuein.biz/mcp
- score_claim (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 a no-op.

Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- score_due_claims (Score Due Claims (bulk auto-grader)) - 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 by default; can target any user when called with `customer_id` from a `full`-tier (admin) token. Returns a summary + per-claim results. Idempotent — re-calling only re-resolves what changed. Endpoint: https://mcp.valuein.biz/mcp
- list_public_claims_by_user (List Public Claims by User) - 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; sp500+ only. Endpoint: https://mcp.valuein.biz/mcp
- publish_claim (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). Endpoint: https://mcp.valuein.biz/mcp
- unpublish_claim (Unpublish Claim (back to private)) - 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). Endpoint: https://mcp.valuein.biz/mcp
- save_citation_override (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`) before the correction is stored — a fact_id that doesn't resolve to a real fact is rejected with FACT_NOT_FOUND and nothing is persisted. You therefore must supply the `ticker` the fact belongs to.

Use this when the user notices an inaccuracy in an AI-generated report and wants the fix to persist. Provide `notes` for the rationale (≤500 chars) and `source_report_id` for provenance. Tier caps: sp500=500, pro=5000, full=50000. Endpoint: https://mcp.valuein.biz/mcp
- list_citation_overrides (List Citation Overrides) - 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 respect prior corrections during regeneration. Endpoint: https://mcp.valuein.biz/mcp
- delete_citation_override (Delete Citation Override) - Remove a user-authored citation correction by fact_id. Idempotent — deleting a missing override returns deleted=false without error. Once deleted, reports that previously rendered the corrected value revert to the canonical fact value on next regeneration. Tier: paid + free (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- save_watchlist (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. Endpoint: https://mcp.valuein.biz/mcp
- list_watchlists (List Watchlists) - 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). Endpoint: https://mcp.valuein.biz/mcp
- get_watchlist (Get Watchlist) - 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). Endpoint: https://mcp.valuein.biz/mcp
- delete_watchlist (Archive Watchlist) - 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). Endpoint: https://mcp.valuein.biz/mcp
- watchlist_diff (Watchlist Diff) - Return new SEC filings across the caller's watchlist tickers since a given date. Reads filing.parquet — does not call insider/ratio surfaces (use those tools separately if you need them). Concurrency-bounded; max 50 tickers per call. Endpoint: https://mcp.valuein.biz/mcp
- create_alert (Create Alert) - Persist an alert 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 on any filing on any ticker in a named watchlist.
  * `price_move` (Pro+) — fire when a ticker's close-to-close move over 1/5/21 trading days crosses a percent threshold in a given direction.
  * `fundamental_change` (Pro+) — fire when a standard_concept reports a brand-new period or gets restated.

Delivery channels: `email` (transactional via Resend), `webhook` (HMAC-SHA256-signed POST), `slack` (hooks.slack.com incoming webhook), `dashboard` (in-app inbox), or `agent_run` (Pro+ — runs a standing agent team and delivers the finished artifact to your inbox). The cron evaluator runs every 5 minutes. Use `test_alert` to verify your channel is wired correctly before relying on the cron. Endpoint: https://mcp.valuein.biz/mcp
- list_alerts (List Alerts) - Paginated newest-first listing of the caller's alerts (id, condition, channel, status, trigger_count, evaluator health). Filter by `status` (active/paused/deleted/all). Use the returned alert id with delete_alert or test_alert. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- delete_alert (Delete Alert) - Soft-delete an alert by its id (from create_alert/list_alerts): status flips to `deleted` and it is removed from the cron evaluator index so it stops firing. Alerts are immutable — to change one, delete then create_alert. Idempotent. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- test_alert (Test Alert (synthetic fire)) - Fire a synthetic notification through the alert's configured channel. Use this immediately after `create_alert` to verify the channel (email address valid / webhook URL reachable + HMAC verification on the receiver). The synthetic fire is logged as `attempt=1 channel='test'` so it doesn't affect the real fire counter — the next genuine match still fires normally. Endpoint: https://mcp.valuein.biz/mcp
- list_alert_inbox (List Alert Inbox) - Newest-first listing of the caller's in-app inbox. Items are alert FIRES with a `dashboard` channel — written by the cron evaluator (or `test_alert`) — plus platform notifications written by the edge-gateway (agent run completions, morning briefs, skipped runs); use list_alerts instead for the alert definitions themselves. By default dismissed items are hidden and read items are included. Cursor-paginated by `fired_at`. Sample tier rejected — alerts are a paid-tier feature (sp500+). Endpoint: https://mcp.valuein.biz/mcp
- mark_inbox_read (Mark Inbox Item Read) - Set `read_at` on a single inbox item by its id (from list_alert_inbox or the alerts feed resource) — not an alert 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). Endpoint: https://mcp.valuein.biz/mcp
- dismiss_inbox_item (Dismiss Inbox Item) - Soft-delete a single inbox item by its id (from list_alert_inbox) — not an alert id; sets `dismissed_at`. The row stays queryable via `list_alert_inbox(include_dismissed=true)` for audit. Idempotent. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- stage_action (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/destructiveHint) decide the tier: GREEN (read-only) tools are never staged — this call is then a no-op passthrough (`result: 'not_required'`) and the caller should just invoke the tool directly. AMBER (reversible write to the caller's own state) and RED (destructive or outward-facing) tools ARE staged: this call does NOT execute anything — it only records the proposal and returns a `staged_action_id`. A human (or any client acting on the human's behalf) later calls `approve_staged_action` or `reject_staged_action` to decide it. Tier: sp500+ (sample rejected — guest has no saved state). Endpoint: https://mcp.valuein.biz/mcp
- list_pending_approvals (List Pending Approvals) - 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). Endpoint: https://mcp.valuein.biz/mcp
- approve_staged_action (Approve Staged Action) - 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` is true and `tool_result` carries the underlying tool's own structured result, exactly what a direct call to that tool would have returned. If the underlying tool itself fails, the staged action transitions to 'failed' with a `reason` — this call still succeeds (the approval + execution ATTEMPT is what it promises; a failed underlying write is a normal, inspectable outcome, not a tool error). An id belonging to a different customer's token is indistinguishable from an unknown id (returns NOT_FOUND) — ownership is never leaked. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- reject_staged_action (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_FOUND). Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- schedule_task (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 owner ("scheduled task due: …"). Optionally pass `context: {managed: true, team_id: "<standing_agent id>"}` to ALSO attempt a managed re-run at wake time — this integration is not yet fully wired end-to-end (see `list_scheduled_tasks`'s status field to confirm what actually happened) and always degrades gracefully to the inbox notice alone. Persisted durably in D1 — never lost on a Worker recycle. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- list_scheduled_tasks (List Scheduled Tasks) - 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). Endpoint: https://mcp.valuein.biz/mcp
- cancel_scheduled_task (Cancel Scheduled Task) - 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. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- create_rule (Create Rule) - Persist a trigger -> action rule and register it with the evaluator. Seven 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). ONLY FOUR trigger types actually dispatch today: alert_fired, inbox_item, scheduled_task_wake, schedule_tick — use one of these for a rule that will really fire. price_threshold, filing_event, and manual are accepted and persisted (forward-compatible schema) but have NO live event source wired yet, so a rule created with one of them is saved as enabled:true and simply never fires — check the returned rule's `trigger_wiring_status` field ("live" vs "not_yet_wired") to confirm before relying on it. `condition_expr` is an OPTIONAL single comparison (`"field op value"`, op one of gt/gte/lt/lte/eq, e.g. `"price_change_pct gt 5"`) evaluated against the trigger event's payload — omit to fire on the trigger alone. Deliberately NOT a general expression language (no AND/OR, no loops) — this is both an anti-complexity and an anti-loop guard; compose multiple rules if you need more than one comparison. Use `test_rule` immediately after creating to verify it fires as expected WITHOUT spending a real dispatch. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- list_rules (List Rules) - Paginated newest-first listing of the caller's own rules. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- delete_rule (Delete Rule) - Delete a rule by id (from create_rule/list_rules) — removes it from both the catalog and the evaluator's scan index, so it stops firing immediately. Rules are immutable — to change one, delete then create_rule. Idempotent. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- test_rule (Test Rule (dry run)) - 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. `{price_change_pct: 12}`). Endpoint: https://mcp.valuein.biz/mcp
- get_morning_brief (Get Morning Brief) - Read the caller's Morning Brief — a daily BYO-LLM-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 one — that returns `found: false`, not an error. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- list_agent_runs (List Agent Runs) - 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 or a schedule_task wake) 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 exact `status` match (e.g. "completed", "failed", "running"). Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- get_agent_run (Get Agent Run) - 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 distinguishing signal, by design. Tier: sp500+ (sample rejected). Endpoint: https://mcp.valuein.biz/mcp
- create_report (Create Research 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 a saved thesis (via `save_thesis`) as a frozen narrative report with at-a-glance table, author notes, anchor fundamentals (latest annual), and lineage to the source filing. Later edits to the thesis do NOT propagate — generate a new report to capture new state.

Tier: sample tier rejected — reports are per-author state. Endpoint: https://mcp.valuein.biz/mcp
- get_report (Get Research Report) - 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 downgraded to preview regardless of input. For an archived prior version use `get_report_version`, not this tool. Endpoint: https://mcp.valuein.biz/mcp
- list_my_reports (List My Research Reports) - 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). Endpoint: https://mcp.valuein.biz/mcp
- delete_report (Delete (Soft) Research Report) - 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. Endpoint: https://mcp.valuein.biz/mcp
- publish_report (Publish Report (free)) - 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 listings are a future capability. Endpoint: https://mcp.valuein.biz/mcp
- unpublish_report (Unpublish Report (back to private)) - Revert a published report (listed or unlisted) back to `private` visibility, removing it from the public catalog. Author-only. Idempotent. Endpoint: https://mcp.valuein.biz/mcp
- search_reports (Search Published Reports) - 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. Endpoint: https://mcp.valuein.biz/mcp
- compute_dcf (Compute Forward DCF) - 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 = operating_cash_flow − capex (absolute USD); net_debt = total_debt − (cash + short-term investments). Shares resolve via a fallback chain (valuation row → fact CommonSharesOutstanding → net_income/eps_diluted), reported as `result.shares_source`. The pulled inputs are echoed in `result.inputs_echo` with their source lineage so the valuation is reproducible and traceable. A null `value_per_share_cents` means the model is degenerate (e.g. WACC ≤ terminal growth, or FCF base ≤ 0) or a required input was unavailable — it is NOT a zero valuation; the `reason` field explains. Use the returned figures exactly. Use this when you want to drive the assumptions yourself; for the pipeline's pre-computed DCF/DDM value and inputs (no assumptions needed) use `get_valuation_metrics` instead. Does NOT persist a report — use `create_report` (report_type:'reverse_dcf') for that. Tier: sp500+. Endpoint: https://mcp.valuein.biz/mcp
- forensic_audit (Forensic Audit (Beneish + Sloan + Solvency)) - 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 recoverable subset (SGI + TATA + LVGI) and flag `partial=true`. Tier: sp500+. Endpoint: https://mcp.valuein.biz/mcp
- run_backtest (Run Bounded Factor Backtest) - 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, checks which requested tickers were in the survivorship-free PIT universe on that date (dropping — never erroring on — a ticker not yet listed or already delisted), then pulls each surviving ticker's point-in-time valuation multiples and computes the forward return to the NEXT rebalance date from the raw (unadjusted) close. Returns a flat {rebalance_date, ticker, factor_values, forward_return_pct} grid plus a small factor<->forward-return correlation per requested factor — a quick cross-sectional signal check, NOT a transaction-cost-aware portfolio simulation or a statistically validated backtest result. If the requested grid exceeds 120 cells, this tool does NOT silently truncate — it returns a `stream_fallback` response (signed Parquet download URLs, same shape as `get_compute_ready_stream`) and tells you to use those URLs. For a REAL full-universe, multi-date, survivorship-free backtest, use the Python SDK's AlphaEngine (`pip install valuein-sdk`) looped over `as_of` dates client-side — this tool is explicitly the small complement to that, not a replacement for it. Available on every plan; coverage follows your plan tier same as the two tools it composes. Endpoint: https://mcp.valuein.biz/mcp
- update_report (Update Report Sections) - 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. Bumps `version`. Does NOT change price / tier / visibility — use publish_report for those. Endpoint: https://mcp.valuein.biz/mcp
- list_report_versions (List Report Versions) - 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. Endpoint: https://mcp.valuein.biz/mcp
- get_report_version (Get Report Version) - 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. Endpoint: https://mcp.valuein.biz/mcp
- render_report (Render Report Download URL) - 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` returns a branded Word document with a cover page (logo, title, ticker, tier badge), the report body (abstract, sections, citations table with clickable SEC EDGAR links), and a back page (methodology, sources, disclaimer). The DOCX is cached in R2 alongside the markdown after first build so repeat downloads are instant; pass `force_regenerate: true` to bust the cache (e.g. right after `update_report`).

Tier gate mirrors `get_report`: authors always see their own reports; non-authors below the report's required tier get an upgrade prompt. Endpoint: https://mcp.valuein.biz/mcp
- save_freeform_report (Save Markdown as a Draft 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. No compute, so no citations/lineage — add citations later via `update_report`. Tier: sample rejected (reports are per-author state). Idempotency-key → stable report id. Endpoint: https://mcp.valuein.biz/mcp
- generate_dcf_xlsx (Generate DCF Workbook (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 caller's claimed values. If the claimed figures disagree, the workbook is still produced but stamped with a visible correction banner and the response `verification.status` is 'corrected'. A fabricated per-share value can never appear as Valuein-authoritative.

Pair with `compute_dcf` for a typical analyst flow: agent calls `compute_dcf({ticker, ...})`, then passes the structured result straight to `generate_dcf_xlsx({ticker, dcf_result, ...})` to materialise a shareable file.

Tier: pro+. Endpoint: https://mcp.valuein.biz/mcp
- generate_research_brief_docx (Generate Research Brief (docx)) - Render a structured research brief into a professionally-styled Word document — cover, abstract, optional snapshot table, body sections, and a citations table with clickable SEC EDGAR links. No embedded charts in v1; pair with `generate_dcf_xlsx` / `generate_comps_xlsx` for visuals the analyst pastes in.

SERVER-TRUST: prose, snapshot rows, and citations are rendered as-supplied and are NOT verified by Valuein, so the brief carries a visible 'figures supplied by caller, not verified by Valuein' watermark (response `verification.status` = 'unverified'). Resolve each citation via `verify_fact_lineage` before publishing.

Consumes the same `sections` + `citations` shape `create_report` emits, so the typical flow is two tool calls: `create_report` → `generate_research_brief_docx`.

Tier: pro+. Endpoint: https://mcp.valuein.biz/mcp
- generate_comps_xlsx (Generate Peer Comparables Workbook (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 pass are rendered as-supplied and are NOT re-derived by Valuein, so the workbook carries a visible 'figures supplied by caller, not verified by Valuein' watermark (response `verification.status` = 'unverified'). For authoritative numbers, source them from `get_peer_comparables` / `get_financial_ratios` first.

Pair with `get_peer_comparables` for a typical flow.

Tier: pro+. Endpoint: https://mcp.valuein.biz/mcp

## Resources
- reference://sp500 - S&P 500 universe Current S&P 500 members as a single JSON roster — ticker, CIK, company name, sector, industry, and primary exchange for every active constituent. Reads as the latest membership snapshot from the references table; for survivorship-free historical universes use the get_pit_universe tool with an as_of_date instead. MIME type: application/json
- pricing://current - Pricing & plan tiers Full tier ladder (Sample → Free → Pro → Institutional) with prices, Stripe SKUs, breadth/depth coverage, filing types, and feature flags. Plus the per-tool pay-per-call rate card. Read this first when an agent hits a LIMIT_EXCEEDED response and needs to pick between upgrade vs pay-per-request. The same data backs every remediation menu in tool errors. MIME type: application/json
- valuein://alerts/feed - Alert inbox feed Recent in-app alert fires for the calling customer. Read this resource to drain the same notification stream the frontend dashboard bell shows. Returns up to 50 newest-first items; mirror of `list_alert_inbox` output. Use the tool when you need pagination, the resource for a quick snapshot. MIME type: application/json
- schema://earnings_signals - earnings_signals table schema Trend-based earnings expectations and surprise metrics per entity. eps_trend_est is a proprietary trailing earnings-trend estimate; eps_surprise_pct measures actual EPS against that estimate. revenue_yoy_pct is the year-over-year revenue change. NULL when insufficient prior history exists. Methodology is proprietary. Derived at export time — not stored in Postgres. MIME type: application/json
- schema://entity - entity table schema Legal structure and profile of reporting companies. MIME type: application/json
- schema://fact - fact table schema Standardized financial data points (US-GAAP XBRL mapped to canonical standard_concept labels). MIME type: application/json
- schema://factor_scores - factor_scores table schema Cross-sectional factor scores and percentile ranks per entity, computed across the full universe from recent annual filings. _rank columns are normalized to 0.0–1.0 (1.0 = strongest relative standing); composite_rank is a proprietary blend of the individual factor ranks. Methodology is proprietary. Derived at export time — not stored in Postgres. MIME type: application/json
- schema://filing - filing table schema Metadata for all SEC filings processed. MIME type: application/json
- schema://index_membership - index_membership table schema Historical index constituents (SP500, RUSSELL1000, RUSSELL2000, RUSSELL3000).  Source of truth for ALL membership questions — current OR historical.  Always JOIN ``references.cik = index_membership.cik`` to attach company metadata (name, sector, ticker).  Filter by ``index_name`` for the index, by ``effective_date`` / ``removal_date`` for the as-of window.  Note: ``cik`` is named ``cik`` here (NOT ``entity_id`` like security/filing/fact) so the JOIN with ``references`` uses the same column name on both sides — see migration 0015 for the rationale. MIME type: application/json
- schema://insider_filing - insider_filing table schema Form 3 / 4 / 5 / SC 13D / SC 13G / 144 (and amendments) — the subject-rooted insider DISCLOSURE filing record.  Distinct from ``filing`` (financial-statement forms) so the financial table stays clean.  ``subject_cik`` is the issuer the disclosure is about — a SOFT reference (LEFT JOIN to entity.cik when in the fundamentals universe; may be NULL/unmatched for foreign / pre-IPO / delisted issuers).  ``filer_party_id`` FKs to ``insider_party`` (the insider / holder).  Children ``insider_transaction`` and ``insider_ownership`` FK to this table via accession_id.  FULL bucket only — enterprise tier. MIME type: application/json
- schema://insider_ownership - insider_ownership table schema SC 13D / SC 13G beneficial-ownership disclosures (5%+ stakes).  One row per (filing, reporting person).  Group filings carry multiple reporting persons — each lands as a separate row.  Joins to ``insider_filing`` via accession_id; subject_entity_id is the issuer CIK (the company being held — soft ref, LEFT JOIN to entity).  FULL bucket only — enterprise tier (full plan). MIME type: application/json
- schema://insider_party - insider_party table schema Directory of every insider / reporting person referenced by Form 3/4/5/144.  Keyed on CIK when SEC-registered, otherwise on a normalized name.  Joined to insider_transaction via insider_party_id.  FULL bucket only — enterprise tier (full plan). MIME type: application/json
- schema://insider_transaction - insider_transaction table schema Form 3 / 4 / 5 / 144 line items — each row is one transaction, initial holding, or proposed sale by an insider.  transaction_type is 'transaction' (Form 4/5), 'initial_holding' (Form 3), or 'proposed_sale' (Form 144).  Joins to ``insider_filing`` via accession_id, to ``entity`` (issuer) via entity_id (soft ref), and to ``insider_party`` via insider_party_id.  FULL bucket only. MIME type: application/json
- schema://institutional_filing - institutional_filing table schema Form 13F-HR / 13F-NT (and amendments) — the manager-rooted filing record.  Distinct from ``filing`` (issuer-rooted) because 13F filings have no single subject issuer (the manager reports a portfolio across many issuers).  FK to ``insider_party`` for the manager.  FULL bucket only — enterprise tier. MIME type: application/json
- schema://institutional_holding - institutional_holding table schema Form 13F-HR holdings — institutional managers' quarterly position disclosures.  One row per (filing, CUSIP, share-class, put/call).  Joins to ``institutional_filing`` via accession_id (the 13F filing record); ``filer_cik`` is the manager CIK (denormalised — same value as institutional_filing.filer_cik). ``subject_entity_id`` is the issuer CIK (NULL until the CUSIP→CIK lookup resolves).  FULL bucket only — enterprise tier. MIME type: application/json
- schema://ratio - ratio table schema Pipeline-computed financial ratios per entity per fiscal period. Derived from fact data.  Written append-on-restatement: each row's ``accepted_at`` is the PIT vintage = max(accepted_at) of the input facts that produced it, so a restated period (recomputed from a later-filed fact) is a NEW vintage row rather than an overwrite — mirroring fact.parquet.  Filter as-of with ``accepted_at <= as_of`` then take the latest vintage to avoid look-ahead bias.  No accession_id (ratios derive from multiple filings).  ``accepted_at`` is NULL for cross-sectional rank rows (``*_sector_pctile``) and any year whose source facts lacked an acceptance timestamp; ``computed_at`` tracks the latest computation within a vintage. MIME type: application/json
- schema://references - references table schema Denormalized flat join of entity + security.  One row per security — covers the company universe (CIK + primary identifiers + sector + ticker).  For ANY membership question (current or historical, SP500 or Russell), JOIN with index_membership on cik = cik.  The join column has the same name on both sides — this view does NOT carry index-membership flags because they're inherently snapshot-only and single-index, both of which are footguns the index_membership table avoids by design. MIME type: application/json
- schema://security - security table schema Ticker symbols and tradeable instrument metadata (SCD Type 2 with date ranges). MIME type: application/json
- schema://standard_concept - standard_concept table schema Valuein's curated gold-standard concept catalog (~292 rows) — the dictionary for the ``fact.standard_concept`` column.  Each row is one L1/L2 concept (Revenue, GrossProfit, LongTermDebt, …) with its statement/category, definition, default unit, and Bloomberg/FactSet field equivalents.  Distinct from ``taxonomy_guide`` (the ~11,966-row raw SEC us-gaap tag reference for the ``fact.concept`` column): join ``fact.standard_concept = standard_concept.standard_concept`` for the curated label, ``fact.concept = taxonomy_guide.standard_concept`` for the raw tag.  The 'Other' catch-all row is included. MIME type: application/json
- schema://stock_price - stock_price table schema Coarse end-of-day market-price series per entity — period-end-aligned closes (one per fiscal period_end, for value-vs-price overlays) AND a monthly last-trading-day close history (for charting/backtest scaffolding).  Filter on ``observation`` to pick the grain.  RAW closes (never split/dividend-adjusted — split-invariant ratios need no adjustment); ``div_cash`` / ``split_factor`` carry the corporate-action factors for query-time total-return adjustment.  Point-in-time: ``accepted_at`` = the market-close timestamp, so an ``as_of`` before the close never sees that bar. Sourced from the licensed Tiingo archive; daily granularity is internal-only (derived-data exposure). MIME type: application/json
- schema://stock_price_daily - stock_price_daily table schema Daily OHLCV bar series per entity — one row per trading day (NOT downsampled, unlike the coarse ``stock_price`` table).  Powers as-of-arbitrary-date price lookups (latest close on-or-before any calendar date) and total-return backtests (use ``adjusted_close`` for split/dividend-adjusted returns).  RAW ``close`` is PIT-immutable; ``adjusted_close`` is the vendor-computed retroactively-adjusted series suitable for charting and total-return calculation.  ``div_cash`` / ``split_factor`` carry the corporate-action factors for query-time custom adjustment.  Point-in-time: ``accepted_at`` = the market-close timestamp, so an ``as_of`` filter before the close never sees that bar.  Derived at export time from the internal licensed-Tiingo price archive via the same date-aware ticker→CIK resolution as ``stock_price``.  Sliced + per-CIK partitioned across every tier like the coarse table (full=all, pro=15y, sp500=SP500-only, sample=SP500+5y). MIME type: application/json
- schema://taxonomy_guide - taxonomy_guide table schema Human-readable definitions for all standard_concept values used in the fact table. MIME type: application/json
- schema://valuation - valuation table schema Pre-computed intrinsic value estimates per entity. One row per (entity_id, valuation_date, model_type) — multiple model types (DCF, DDM, GrahamNumber, etc.) coexist for the same valuation_date. Recomputed each pipeline run; not point-in-time. MIME type: application/json

## Prompts
- margin_and_moat_teardown - Margin & Moat Teardown Systematic 5-year analysis of a company's operational efficiency and competitive moat. Chains fundamentals → valuation metrics → peer comparables to produce a structured teardown covering revenue quality, margin trends, ROIC vs WACC spread, and relative positioning vs sector peers. Arguments: ticker
- peer_benchmarking_memo - Peer Benchmarking Memo Produces a structured relative-value memo comparing a company to its closest peers. Chains search_companies → peer_comparables → valuation_metrics → financial_ratios to output an investment committee-ready comparison table with ROIC, valuation multiples, and capital efficiency. Arguments: ticker
- survivorship_free_backtest - Survivorship-Free Backtest Sets up a bias-free quantitative backtest by defining the historical universe and providing Parquet URLs for bulk data access. Chains get_pit_universe → get_compute_ready_stream to produce ready-to-run Python/DuckDB code. Arguments: start_date, end_date, index, sector
- pit_factor_constructor - Point-in-Time Factor Constructor Guides construction of a quantitative factor (Quality, Value, Momentum) across a sector universe using ratio.parquet data. Chains get_pit_universe → get_financial_ratios → get_compute_ready_stream to produce normalized factor scores. Arguments: factor_type, sector, as_of_date
- quality_and_risk_audit - Quality & Risk Audit Evaluates capital structure safety and dividend sustainability for portfolio risk-adjusted sizing. Chains fundamentals → capital_allocation → valuation_metrics → financial_ratios (leverage/liquidity) to produce a structured risk scorecard. Arguments: ticker
- capital_allocation_review - Capital Allocation Review Evaluates management's capital allocation decisions over a multi-year period. Chains capital_allocation_profile → valuation_metrics → financial_ratios to produce a management quality scorecard: does management create value with retained earnings? Arguments: ticker, lookback_years
- ratio_deep_dive - Ratio Deep Dive Comprehensive ratio profile for a single company spanning all 7 ratio categories (profitability, liquidity, leverage, efficiency, per_share, owner_earnings, valuation). Includes TTM and 5-year annual history with trend analysis. Arguments: ticker
- sector_ratio_screen - Sector Ratio Screen Cross-sectional ratio ranking across a sector to surface the highest-quality or best-value companies. Chains get_pit_universe → get_compute_ready_stream to screen the full sector using pipeline-computed ratios. Arguments: sector, screen_type, as_of_date
- earnings_reviewer_flow - Equity Research Brief Single-ticker end-to-end research brief in markdown — fundamentals, valuation, ratios, capital allocation, peer comparison, recent catalysts, and SEC lineage. Three depth modes: 'quick' (3 tools, snapshot), 'full' (8 tools, default — institutional brief), 'forensic' (adds restatement audit + fact-level SEC verification). Streams sections in real time as each data phase completes. Renders as an artifact users can export to Word/PDF. PIT-safe via as_of_date for backtests. Arguments: ticker, depth, as_of_date, peers
- market_researcher_flow - Screen and Shortlist PM idea-generation workflow: build a PIT universe, factor-rank it, QC the leaders with a period-over-period change check, and hand off the top picks to earnings_reviewer_flow for full write-ups. Survivorship-free via get_pit_universe; renders as a markdown shortlist artifact users can export. Arguments: sector, index, objective, as_of_date, top_n
- smart_money_brief - Smart Money Brief Single-ticker smart-money brief: composite flow score, top holders (classified), 13F deltas, blockholder alerts, and insider sentiment overlay. Three depth modes: 'quick' (3 composites only), 'standard' (default, + 13F + blockholders), 'deep' (+ insider transactions + company fundamentals for fundamental context). Renders as an exportable markdown artifact. Institutional tier only. Arguments: ticker, depth, period_end
- activist_surveillance - Activist Surveillance Event-driven surveillance for activist target / takeover candidates. Surfaces filers flipping 13G → 13D within the lookback window (the strongest activist signal in the dataset), then cross-references defensive insider activity and 8-K item 1.01 filings to check whether a corporate response is already in motion. Banker / event-driven desk workflow. Institutional tier only. Arguments: ticker, lookback_days
- forensic_earnings_brief - Forensic Earnings-Quality Brief Hedge-fund-grade earnings-quality red-flag brief for a single ticker. Chains forensic_audit (deterministic Beneish M-Score + solvency-distress proxy + Sloan accruals) → restatement diff → Risk-Factor delta to surface earnings-quality flags and anomalies worth review. These are neutral, thresholded, directional signals — NOT a verdict, and NOT an accusation of fraud or manipulation. Output: structured flag list with citation to specific XBRL tags + 10-K accessions. Arguments: ticker
- morning_briefing - Morning Briefing Daily overnight digest: material SEC filings across the caller's watchlist since the last close. Ranks by likely impact (M-score change candidates, 8-K item types, amendment flags). Arguments: watchlist_name, since
- earnings_pulse - Earnings Pulse Pre-earnings pulse for a single ticker. Pulls last 8 quarters of fundamentals + the existing get_earnings_signals trend + management-credibility cross-check (promise-vs-delivery on key segments). Output: 1-page pre-read for an analyst attending the call. Arguments: ticker
- restatement_radar - Restatement Radar Daily/weekly sweep for 10-K/A and 10-Q/A amendments across a watchlist (or the caller's full ticker set). Surfaces amendments that materially changed reported revenue, cash flow, or earnings — the highest-signal restatement events for a forensic analyst. Arguments: watchlist_name, since
- screen_to_thesis - Screen → Thesis Pipeline End-to-end idea-generation pipeline: screen → forensic audit → save thesis for the top N candidates. Produces both the screening result + a saved thesis on each conviction name. Wraps existing screen_universe + forensic_audit + save_thesis. Arguments: criteria_name, max_results
- portfolio_health_check - Portfolio Health Check End-of-week diagnostic on the caller's saved theses: which are still on track (positive directional momentum) vs. broken (signals diverging from view). Runs score_thesis_outcome over the active set and produces a top-3-issues list.
- deferred_research_loop - Deferred Research Loop Defer a follow-up on a thesis instead of losing it when the conversation ends. Chains initial research (get_company_fundamentals + get_valuation_metrics) → save_thesis → a deliberate choice between schedule_task (one-shot deferred re-check, fires once, up to 90 days out) and create_rule (standing monitoring on an ongoing condition, keeps evaluating until deleted) → test_rule dry-run if a rule was created → list_scheduled_tasks/list_rules confirmation. Explains, accurately, how the caller is notified at wake/fire time (an inbox item always; a managed re-run only if opted in). Tier: sp500+ (theses/scheduled tasks/rules are persisted user state). Arguments: ticker, view, watch_for, recheck_in_days
- smart_money_pulse - Smart-Money Pulse PM digest: 13F + insider activity across the caller's watchlist. Surfaces top fund accumulators, recent insider clusters, and 13D/13G activist filings worth investigating. Institutional tier (full plan) only. Arguments: watchlist_name, lookback_days
- activist_radar - Activist Radar Detect new SC 13D / 13G filings across the watchlist and pull the activist's historical playbook stats. Surfaces 13G→13D conversions (the strongest 'going active' signal). Institutional tier. Arguments: watchlist_name, lookback_days
- sector_overview_flow - Sector Overview Comprehensive sector / industry landscape brief — market dynamics, top 5-10 players, competitive structure, valuation context, and investment debate. Distinct from `sector_ratio_screen` (which is just a screen) and `market_researcher_flow` (single-theme idea generation) — this is full sector context. Adapted from anthropics/financial-services equity-research/sector-overview. Arguments: sector, as_of_date, top_n
- dcf_build_flow - DCF Build (Disciplined) Disciplined forward-DCF construction for a single ticker — pulls fundamentals, justifies each assumption against history + peers, calls `compute_dcf`, and renders the full per-share value + 5×5 sensitivity grid. Wraps Valuein's existing `compute_dcf` math tool with verify-at-each-step discipline. Adapted from anthropics/financial-services financial-analysis/dcf-model. Arguments: ticker, stage1_years, confirm_each_step
- publish_to_build_reputation - Publish to Build Reputation Creator build-in-public workflow: turn finished analysis on a ticker into a public track record. Chains create_report → publish_report (free) → search_reports (catalog verify) → save_thesis/publish_thesis + save_claim/publish_claim → list_my_reports / list_public_theses_by_user. All publishing is free; discovery is keyword catalog search. Tier: sp500+ (publishing + state are gated above sample). Arguments: ticker, handle
- watchlist_and_alert_setup - Watchlist & Alert Setup Operational monitoring setup for a PM/analyst: create a watchlist, attach alert rules, dry-run them, and confirm the inbox is wired. Chains save_watchlist → create_alert → test_alert → list_alerts → list_alert_inbox. Tier: sp500+ (watchlists + alerts are persisted user state). Arguments: watchlist_name, tickers
- claims_ledger_lifecycle - Claims-Ledger Lifecycle Walks an evidence-backed claim through its full lifecycle: record → link to a thesis → grade (single + batch) → read the thesis's claim set → publish → confirm on the public profile. Chains save_claim → link_claim_to_thesis → score_claim / score_due_claims → list_claims_for_thesis → publish_claim → list_public_claims_by_user. Tier: sp500+ (claims are persisted user state). Arguments: ticker, thesis_id
- thesis_state_machine - Thesis State Machine Walks a saved thesis through its full lifecycle: create → batch-grade due theses → score one outcome → re-read state → list the ledger. Chains save_thesis → score_due_theses → score_thesis_outcome → get_thesis → list_theses. Tier: sp500+ (theses are persisted user state). Arguments: ticker
- multi_factor_signal - Multi-Factor Signal Builds a point-in-time-disciplined composite signal across the cross-section. Chains get_pit_universe → get_compute_ready_stream → screen_universe → get_financial_ratios for per-name verification. Enforces an as_of_date through every step so the signal carries zero look-ahead. Arguments: as_of_date, index

## Metadata
- Owner: io.github.valuein
- Version: 2.12.1
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 6, 2026
- Source: https://registry.modelcontextprotocol.io
