Valuein — SEC EDGAR Fundamentals & Smart-Money Data
REMOTE · MCP.VALUEIN.BIZ · SCANNED AUG 3
Point-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security66
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_thesis). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability75
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 35169 tokens (~253/item across 139 items; 113 tools + 26 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · mcp.valuein.biz
claude mcp add --transport http valuein-mcp-sec-edgar https://mcp.valuein.biz/mcp
[mcp_servers.valuein-mcp-sec-edgar] url = "https://mcp.valuein.biz/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"valuein-mcp-sec-edgar": {
"type": "remote",
"url": "https://mcp.valuein.biz/mcp",
"enabled": true
}
}
} openclaw mcp add valuein-mcp-sec-edgar --url https://mcp.valuein.biz/mcp --transport streamable-http
mcp_servers:
valuein-mcp-sec-edgar:
url: "https://mcp.valuein.biz/mcp" {
"mcpServers": {
"valuein-mcp-sec-edgar": {
"type": "http",
"url": "https://mcp.valuein.biz/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 2 Aug 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- New tool “sign_off_report”, which the server declares destructive security
- Tool “update_report” rewrote its description, which is the text the model reads security
- Tool “save_freeform_report” rewrote its description, which is the text the model reads security
- Schema quality: good → excellent functional
- New prompt “review_and_signoff” functional
- Server version: 2.68.0 → 2.78.0 functional
- New tool “save_figure_review” functional
- New tool “list_figure_reviews” functional
- New tool “get_research_file” functional
- “update_report” added an optional parameter “remove_section_ids” cosmetic
- “update_report” added an optional parameter “citations” cosmetic
- “save_freeform_report” added an optional parameter “citations” cosmetic
- “update_report” reworded the description of “sections” cosmetic
- “get_company_fundamentals” reworded the description of “response_format” cosmetic
- 1 Aug 26 +1
- Tool “score_due_claims” rewrote its description, which is the text the model reads security
- Tool “score_due_theses” rewrote its description, which is the text the model reads security
- Server version: 2.67.0 → 2.68.0 functional
- “score_due_claims” reworded the description of “customer_id” cosmetic
- “score_due_theses” reworded the description of “customer_id” cosmetic
- 31 Jul 26 0
- Tool “get_price_history” rewrote its description, which is the text the model reads security
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- Server version: 2.65.0 → 2.66.0 functional
- 30 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Jul 26 +1
- Tool “save_citation_override” rewrote its description, which is the text the model reads security
- Tool “save_thesis” rewrote its description, which is the text the model reads security
- New resource “investment_adviser_private_fund schema” functional
- New resource “investment_adviser schema” functional
- Server version: 2.64.1 → 2.65.0 functional
- Server version: 2.64.0 → 2.64.1 functional
- 28 Jul 26 +2
- Tool “restore_deleted” rewrote its description, which is the text the model reads security
- Schema quality: good → excellent functional
- Server version: 2.63.0 → 2.64.0 functional
- Server version: 2.62.0 → 2.63.0 functional
- New tool “restore_deleted” functional
- “restore_deleted” reworded the description of “kind” cosmetic
- 27 Jul 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 64
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://mcp.valuein.biz/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=valuein.biz | CN=WE1,O=Google Trust Services,C=US | 31 Jul 2026 | 29 Oct 2026 | ECDSA 256 | ECDSA-SHA256 | 76dc5aa63b68f26c0ec7944f45f23884 |
| SANs: valuein.biz, mcp.valuein.biz, *.mcp.valuein.biz | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
DNSSEC secure
Validation of mcp.valuein.biz. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| biz. | present | 11044 | 8 | Verified |
| valuein.biz. | present | 2371 | 13 | Verified |
| mcp.valuein.biz. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000; includeSubDomains; preload |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.valuein.biz/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.valuein.biz/mcp | HTTPS enforced | 301 | https://mcp.valuein.biz/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
reject_staged_action Reject Staged Action ~137
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).
| Name | Type | Req | Description |
|---|---|---|---|
| reason | string | — | Optional free-text reason recorded on the staged action. |
| staged_action_id | string | yes | Id of the staged action to reject. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| staged_action | object | yes | — |
| transitioned | boolean | yes | True if this call moved the action proposed→rejected; false if it was already decided. |
No examples provided.
render_report Render Report Download URL ~388
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 (title as the hero, the named analyst credited directly beneath it, a small 'Built on Valuein' credit linked to valuein.biz) followed by the report body on page 2 (masthead repeating the analyst's name, abstract, sections, citations table with clickable SEC EDGAR links), with a running footer (ticker, page number, a single disclosure line) repeated on every page. 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.
| Name | Type | Req | Description |
|---|---|---|---|
| author_name | string | — | Display name of the report's author, shown as a named byline ('By {name}') on the docx masthead — the way a real research note credits an analyst. Omit to show just the date. Only affects `format=doc… |
| force_regenerate | boolean | — | If true, ignore the cached DOCX and re-render. No effect on md (markdown is canonical). |
| format | string | yes | md = raw markdown (the same body the editor renders). docx = branded Word document — cover page crediting the named analyst, masthead repeated on page 2, running footer. |
| report_id | string | yes | Id from create_report or list_my_reports. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| content_type | string | yes | — |
| expires_at | string | yes | — |
| expires_in_seconds | integer | yes | — |
| filename | string | yes | — |
| format | string | yes | — |
| from_cache | boolean | yes | — |
| size_bytes | — | yes | — |
| url | string | yes | — |
No examples provided.
restore_deleted Restore a Deleted Item ~253
Undo a soft-delete: restores a thesis, watchlist, alert, claim or report that `delete_*` archived. The record returns to the state it held before the delete — a closed thesis comes back closed, a paused alert comes back paused. When the item was deleted before the server began recording its prior state, `prior_status_known` is false and the response says which default was used. A restored report returns to its prior status AND visibility, so a report that was public comes back public and one that was private stays private; when that state predates the change that began recording it, the report returns private and `prior_status_known` is false rather than guessing at publication. Citation overrides are NOT restorable (that delete removes the row outright) — use the approval flow. Idempotent: restoring a live item succeeds and changes nothing. Tier: paid + free (sample rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The record's id. For a watchlist this is the `watchlist_id` returned by `delete_watchlist` — NOT its name, because deleting a watchlist frees its name for reuse. |
| kind | string | yes | Which record type to restore. Citation overrides are not restorable. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| id | string | yes | — |
| kind | string | yes | — |
| prior_status_known | boolean | yes | — |
| status | string | yes | — |
No examples provided.
run_backtest Run Bounded Factor Backtest ~508
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.
| Name | Type | Req | Description |
|---|---|---|---|
| factors | array | — | Which of get_pit_valuation_ratios's own output fields to include as factor_values. One or more of: pe_ratio, ps_ratio, pb_ratio, ev_ebitda, ev_revenue, fcf_yield_pct, gross_margin_pct, operating_marg… |
| rebalance_dates | array | yes | 1-12 historical dates (YYYY-MM-DD) to snapshot valuation multiples on. Order does not matter — the tool sorts them chronologically. Forward return is computed from each date to the NEXT one in the so… |
| tickers | array | yes | 1-10 stock ticker symbols, e.g. ["AAPL","MSFT"]. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| capped | boolean | yes | — |
| caveats | array | yes | — |
| cells | array | — | — |
| cells_computed | integer | yes | — |
| dropped | array | yes | — |
| factors | array | yes | — |
| grid_cells | integer | yes | — |
| method | string | yes | — |
| next_step | string | — | — |
| note | string | yes | — |
| pit_safe | — | yes | — |
| rebalance_dates | array | yes | — |
| source_tools_used | array | yes | — |
| streams | array | — | — |
| summary | object | — | — |
| tickers | array | yes | — |
No examples provided.
run_workflow Run Saved Workflow ~296
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.
| Name | Type | Req | Description |
|---|---|---|---|
| ticker | string | — | US-listed ticker the workflow should run against, e.g. 'AAPL'. Pass either `ticker` (single) or `tickers` (batch up to 50). Exactly one is required. |
| tickers | array | — | Batch mode — array of US-listed tickers, up to 50. When provided, the response has `plans[]` (one plan per ticker) instead of `plan`. Parity with the frontend batch-runner so agents can request 'plan… |
| workflow_id | string | yes | Workflow id returned by the frontend workflow builder. |
| Name | Type | Req | Description |
|---|---|---|---|
| instructions | string | yes | — |
| meta | object | yes | Provenance envelope — data lineage for every MCP response |
| plan | — | yes | — |
| plans | — | yes | — |
| ticker | string|null | yes | — |
| workflow | object | yes | — |
No examples provided.
save_citation_override Save Citation Override ~390
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. Flat 10,000-override anti-abuse cap per account (deleting frees a slot; never a tier limit).
| Name | Type | Req | Description |
|---|---|---|---|
| corrected_value | string | yes | User-corrected value, stringified. The frontend interprets it based on the fact's known datatype (number, string, ISO date). |
| fact_id | string | yes | Canonical fact identifier — usually returned in a citation's `fact_ids` array by get_report or any compute tool. Stable across report regenerations. Verified against live SEC data (scoped to `ticker`… |
| notes | string | — | Optional free-form rationale, ≤500 chars. |
| source_report_id | string | — | Optional report id the user was viewing when they applied the correction (provenance). |
| ticker | string | yes | Ticker the fact belongs to (REQUIRED) — scopes fact_id resolution against live SEC data and denormalises the row for fast filtering (the workspace UI's 'my corrections on AAPL' view). |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| capacity | object | yes | — |
| created | boolean | yes | — |
| override | object | yes | — |
No examples provided.
save_claim Save Claim ~569
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.
| Name | Type | Req | Description |
|---|---|---|---|
| antecedent | — | — | Scenario precondition — the claim only resolves when this holds. Null = unconditional. |
| claim_type | string | yes | Epistemic type — drives scoring. assertion=true now (verified vs data); prediction=future (resolves at horizon via verifiable_condition); judgment=qualitative (not auto-scored). |
| confidence | number | yes | Author confidence in [0,1]. Used as the Brier/log-loss weight when scored. |
| direction | string | yes | Directional polarity of the claim. |
| eval_mode | string | — | How the outcome is resolved: auto (deterministic grade vs data via verifiable_condition), agent (an LLM judges at resolution), manual (a human marks it). |
| evidence | object | — | Evidence grounding the claim. |
| horizon_days | — | — | Resolution horizon in days (predictions). Null for assertions/judgments. |
| idempotency_key | string | — | Optional client key for at-most-once semantics from a retrying agent. |
| source_report_id | string | — | Optional id of a report that contains the supporting analysis. |
| statement | string | yes | The atomic, falsifiable statement. One claim, not a paragraph. |
| tags | array | — | Topical labels (controlled vocab). Multi-valued; drives filtering + learning segmentation, not scoring. |
| tickers | array | yes | Entities referenced (uppercased). 1 for most claims; 2+ for a comparison claim. |
| verifiable_condition | — | — | Machine-evaluable condition for eval_mode='auto'. Null otherwise. |
| visibility | string | — | 'private' (default) owner-only; 'unlisted' visible at a direct URL; 'public' surfaces on the author's profile and contributes to the claim-accuracy reputation. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| capacity | object | yes | — |
| claim | object | yes | — |
| deduplicated | boolean | yes | — |
No examples provided.
save_figure_review Save Figure Review ~430
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 (common shapes: `fact:{fact_id}` for a dataset-backed figure, `raw:{hash}` for free-text prose) — reuse the exact same key to update that figure's review later. `state`: verified (traced and correct) | corrected (wrong — supply `corrected_value`) | external (legitimately not from Valuein data) | rejected (unsupported, should be removed). `corrected_value` is REQUIRED when state='corrected' and must be omitted otherwise. Owner-scoped — your reviews never leak to or from another user. Tier: sp500+ (sample rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| corrected_value | string | — | The correct value. REQUIRED when state='corrected'; must be omitted for every other state (a corrected_value on a non-corrected review is rejected). |
| figure_key | string | yes | Opaque id you mint for one figure inside the report. Never parsed or validated beyond length — use the exact same key to update this figure's review later. Common shapes: 'fact:{fact_id}' for a datas… |
| note | string | — | Optional free-text reviewer note (e.g. what was checked, or why it was rejected). |
| report_id | string | yes | Identifier of the report the figure belongs to, as returned by create_report / list_my_reports / save_freeform_report. |
| state | string | yes | verified = traced to its filing and correct. corrected = wrong (supply corrected_value). external = legitimately not from Valuein data (analyst's own source). rejected = unsupported, should be remove… |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| ok | boolean | yes | — |
| review | object | yes | — |
No examples provided.
save_freeform_report Save Markdown as a Draft Report ~281
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 never be signed off. Tier: sample rejected (reports are per-author state). Idempotency-key → stable report id.
| Name | Type | Req | Description |
|---|---|---|---|
| abstract | string | — | Optional 1–2 sentence summary. |
| citations | array | — | Lineage you already hold for the figures in `markdown` — pass it rather than dropping it. Each claim should quote the figure exactly as the prose writes it, so figure review can link the two. Persist… |
| idempotency_key | string | — | Optional key for at-most-once semantics. Same key from the same user always yields the same report id. |
| markdown | string | yes | Free-form markdown body (≤100k chars). Headings become sections. |
| ticker | string | — | Optional ticker for context/catalog. Case-insensitive. |
| title | string | yes | Report title. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| report | object | yes | — |
| report_id | string | yes | — |
| status | string | yes | — |
| version | integer | yes | — |
No examples provided.
save_thesis Save Investment Thesis ~482
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). Flat 10,000-thesis anti-abuse cap per account (archiving frees a slot; never a tier limit).
| Name | Type | Req | Description |
|---|---|---|---|
| conviction | integer | yes | 1 = low conviction (gut feel) → 5 = high conviction (deep analysis). |
| horizon_days | integer | yes | Investment horizon in days. 1 day–5 years (1825d). The grader uses this to pick the as-of period. |
| idempotency_key | string | — | Optional client-supplied key. If a previous `save_thesis` from the same user used this key, the existing thesis is returned instead of creating a duplicate. |
| notes | string | — | Free-form rationale, ≤4000 chars. Stored verbatim; trim before submitting. |
| source_report_id | string | — | Optional id of a report (from `create_report` / `publish_report`) that contains the supporting analysis. |
| thesis_at_price_cents | integer | — | Optional snapshot of the ticker's market price (integer cents) at thesis creation. Used by future versions of the grader that mix in price returns; null for now is fine. |
| ticker | string | yes | US-listed ticker. Case-insensitive — normalised to upper. E.g. 'AAPL'. |
| view | string | yes | Directional view: bull (expect outperformance), bear (under), neutral (mean-revert). |
| visibility | string | — | Phase 3: 'private' (default) is owner-only; 'unlisted' is visible at a known direct URL; 'public' surfaces on the author's /[handle] profile and contributes to their reputation score. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| capacity | object | yes | — |
| deduplicated | boolean | yes | — |
| thesis | object | yes | — |
No examples provided.
save_watchlist Save Watchlist ~115
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.
| Name | Type | Req | Description |
|---|---|---|---|
| criteria | string | — | Optional free-form screening criteria description. |
| name | string | yes | Unique-per-user display name. |
| tickers | array | yes | US tickers. Normalised to uppercase, deduped. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| created | boolean | yes | — |
| watchlist | object | yes | — |
No examples provided.
schedule_task Schedule Task ~314
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 kick off a managed agent re-run at wake time — this is LIVE: it fires a real run of that standing-agent team, grounded in the saved context. It degrades to the inbox notice alone only if this deploy can't reach the run endpoint (report the actual outcome, never assume). Persisted durably in D1 — never lost on a Worker recycle. Tier: sp500+ (sample rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| context | object | — | Saved thesis/claim/report ids and any other state needed to reconstitute a fresh prompt at wake time. Set `managed: true` + `team_id: "<standing_agent id>"` to also kick off a live managed re-run of… |
| task | string | yes | Human-readable description of the deferred work. |
| wake_in_days | number | yes | How many days from now this task becomes due (0 < n <= 90). |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| status | string | yes | — |
| task_id | string | yes | — |
| wake_at | string | yes | ISO 8601 timestamp when this task becomes due. |
No examples provided.
score_claim Score Claim ~202
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).
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | — | Snapshot date for the fundamentals window (auto mode). Defaults to today UTC. |
| claim_id | string | yes | Id of the claim to resolve. |
| manual_reason | string | — | Explanation for a manual resolution. |
| manual_score | — | — | Outcome score in [-1,1] for a manual resolution. Null for non-scored statuses. |
| manual_status | string | — | Provide to record a human/agent outcome instead of auto-grading. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| basis | string | yes | — |
| claim | object | yes | — |
| deduplicated | boolean | yes | — |
| mode | string | yes | — |
| reason | string | yes | — |
| resolved_status | string | yes | — |
| score | number|null | yes | — |
No examples provided.
score_due_claims Score Due Claims (bulk auto-grader) ~193
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 results. Idempotent — re-calling only re-resolves what changed.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | — | Snapshot date for the fundamentals window. Defaults to today UTC. |
| customer_id | string | — | Target user's Stripe customer_id. Defaults to the caller's own — leave it unset. Supplying a DIFFERENT customer_id is restricted to Valuein's internal scoring service and is rejected on every plan, I… |
| max | integer | — | Soft cap on claims scored per call (default 100). |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| due | integer | yes | — |
| errors | integer | yes | — |
| needs_review | integer | yes | Could not be auto-resolved; flagged for review. |
| results | array | yes | — |
| scanned | integer | yes | — |
| scored | integer | yes | Resolved to confirmed/refuted. |
| skipped | integer | yes | — |
| target_customer_id | string | yes | — |
No examples provided.
score_due_theses Score Due Theses (bulk auto-grader) ~210
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 already graded.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | — | Snapshot date for the 'current' fundamentals window. Defaults to today UTC. |
| customer_id | string | — | Stripe customer_id of the target user. Defaults to the caller's own — leave it unset. Supplying a DIFFERENT customer_id is restricted to Valuein's internal scoring service and is rejected on every pl… |
| max | integer | — | Soft cap on theses scored per call. Defaults to 100. The frontend cron walks users serially so a low cap per user keeps each MCP request bounded. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| due | integer | yes | Subset that were past their horizon AND ungraded. |
| errors | integer | yes | Per-thesis errors caught + logged. |
| results | array | yes | — |
| scanned | integer | yes | Total active theses inspected. |
| scored | integer | yes | Successfully scored + persisted. |
| skipped | integer | yes | Skipped because already graded or not yet due. |
| target_customer_id | string | yes | — |
No examples provided.
score_thesis_outcome Score Thesis Outcome ~179
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.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | — | Snapshot date for the 'current' fundamentals window. Defaults to today UTC. The scorer picks the fiscal period closest to this date. |
| thesis_id | string | yes | Id returned by `save_thesis` or `list_theses`. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| outcome | object | yes | — |
| thesis | object | yes | — |
No examples provided.
screen_universe Screen Universe by Factor Scores ~602
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.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of_date | string | — | Point-in-time cutoff (YYYY-MM-DD). When set, the screen is reconstructed as of this date via factor_scores.accepted_at — each entity ranked at its latest-knowable period, zero look-ahead, survivorshi… |
| exclude_outliers | boolean | — | Optional data-quality guard (default false). When true, additionally drops rows with implausible raw factor values (non-finite, or e.g. asset_turnover > 50x, |FCF/assets| > 10) from shell companies w… |
| limit | integer | — | Number of results to return (1-100). Defaults to 25. |
| offset | integer | — | Zero-based row offset for paging within the requested `limit` window. At most 250 rows are inlined per call; if the response carries a `truncation` envelope, pass its `next_offset` here. Defaults to… |
| sector | string | — | Filter to a specific sector (case-insensitive partial match). E.g. 'Technology', 'Healthcare'. |
| sort_by | string | — | Which factor rank to sort by (see the enum). Defaults to composite_rank. An unrecognized column is rejected with INVALID_ARGUMENT (no silent fallback). |
| ticker | string | — | If provided, show only this ticker's factor scores (single-entity mode). Omit to screen the full universe. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| as_of_date | string | — | Present only when a point-in-time as_of_date was supplied |
| data | array | yes | Ranked factor-score rows for the screened universe |
| lineage | object | — | Provenance for pipeline-derived values (ratio.parquet / factor_scores.parquet): source table + pipeline computed_at, plus a pointer to the tools that return filing-level lineage. NOT point-in-time (r… |
| note | string | — | — |
| pit_safe | boolean | — | Present (and true) only when as_of_date was supplied — the screen was filtered by factor_scores.accepted_at with zero look-ahead |
| plan | string | yes | Caller's data plan used to scope the screen |
| results_returned | integer | yes | — |
| sector_filter | string | — | Present only when a sector filter was applied |
| sort_by | string | yes | — |
| ticker | string | — | Present only when a single-ticker lookup was requested |
| truncation | object | — | Present only when the inline-row cap withheld rows. Page with `next_offset` (keep the same `limit`) or pull the full set via get_compute_ready_stream. |
No examples provided.
search_companies Search Companies ~536
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cik | string | — | SEC CIK identifier (exact match). E.g. '0000320193' for Apple. |
| is_active | boolean | — | Filter to active (currently trading) companies only. |
| is_sp500 | boolean | — | Filter to current S&P 500 members only. |
| limit | integer | — | Maximum number of results to return (1–50). Defaults to 25. |
| query | string | — | Free-text search over company name and ticker. Case-insensitive. E.g. 'Apple', 'AAPL', 'Microsoft', 'semiconductor'. |
| sic_code | string | — | 4-digit SIC industry code. E.g. '7372' for Prepackaged Software. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| companies | array | yes | — |
| query | string|null | yes | — |
| results_returned | integer | yes | — |
No examples provided.
search_reports Search Published Reports ~153
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.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | — | — |
| limit | integer | — | — |
| price_max_cents | integer | — | Reserved for future paid listings; currently ignored (all reports are free). |
| query | string | — | Free-text query over title + abstract (case-insensitive). |
| report_type | string | — | Filter by report type. |
| sort | string | — | — |
| ticker | string | — | Filter to a single subject ticker. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| next_cursor | string|null | yes | — |
| reports | array | yes | — |
No examples provided.
set_agent_memory Set Agent Memory ~163
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 / 8000 chars per value. Tier: sp500+ (sample rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | Memory key (1–128 chars). Reusing an existing key overwrites its value. |
| value | string | yes | The note to remember (≤8000 chars). Never store a figure you would cite as a fact — those come from data tools. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| created | boolean | yes | — |
| memory | object | yes | — |
No examples provided.
sign_off_report Sign Off Report ~346
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 did. ⚠️ IRREVERSIBLE AND OUTWARD-FACING. A certificate can be revoked (loudly — the URL keeps resolving and says so) but its signature stays cryptographically valid forever; there is no undo. It is classified RED, so a governed client will stage this for a named human to authorize rather than executing it autonomously. Propose it; do not claim to have certified anything yourself. PRECONDITION: every figure in the report must already be reviewed via `save_figure_review` — check with `list_figure_reviews` first. Refusals are PERMANENT outcomes, not transport errors, and name what to fix: `unreviewed_figures` (review them, then retry), `rejected_figures` (fix the report), `no_figures` (a report with nothing to verify is refused, never trivially passed), `unverifiable_citation`, `not_certifiable`. Do not retry a refusal unchanged. Only the report's author may sign it off. Tier: sp500+ (sample rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| report_id | string | yes | Identifier of the report to certify, as returned by create_report / list_my_reports / save_freeform_report. Must be authored by the calling customer. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| certificate | object | — | — |
| code | string | — | — |
| coverage | object | — | — |
| message | string | — | — |
| ok | boolean | yes | — |
| reason | string|null | — | — |
| verdict | string | — | — |
No examples provided.
stage_action Stage Action ~338
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).
| Name | Type | Req | Description |
|---|---|---|---|
| origin | string | yes | Free-form label identifying who/what is proposing this action — e.g. 'agent-runner:managed', 'claude-connector', 'cursor', or any caller-supplied identifier. Lets a human distinguish which session/ag… |
| tool_args | object | — | The exact arguments to replay through that tool if/when a human approves. |
| tool_name | string | yes | The MCP tool this action would call once approved (e.g. 'save_thesis', 'create_alert', 'publish_report'). |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| result | string | yes | — |
| risk_tier | string | yes | — |
| staged_action | — | yes | — |
| staged_action_id | string|null | yes | — |
No examples provided.
submit_artifact_feedback Submit Artifact Feedback ~570
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.
| Name | Type | Req | Description |
|---|---|---|---|
| expected_value | string | — | Optional: what the value SHOULD have been, in your own words. Stored verbatim for triage — NEVER computed, restated, or trusted as data by Valuein. |
| fact_id | string | — | Optional disputed `fact_id` (most useful for wrong_number / bad_citation). |
| idempotency_key | string | — | Optional explicit dedupe key (1–64 chars). Used to dedupe when no `request_id` is supplied; safe to retry on a network error. |
| message | string | — | Optional free-text detail (≤4000 chars). What you expected and what happened. |
| reason | string | — | Optional structured error-mode: 'wrong_number', 'bad_citation', 'missing_data', 'wrong_company', 'formatting', 'hallucinated_fact', 'tool_error', 'coverage_gap', or 'other'. |
| request_id | string | — | Optional `_meta` request id of the turn that produced the artifact. Folded into the idempotency key so a retried submission of the same judgement files once. |
| sentiment | string | yes | REQUIRED. How you judge the artifact: 'positive' (it was right/useful), 'negative' (it was wrong/unhelpful), or 'correction' (you are supplying the right value via `expected_value`). |
| target_id | string | yes | REQUIRED. The id of the artifact this feedback targets (a report id, thesis id, claim id, message id, tool-call id, or table/schema name). |
| target_type | string | yes | REQUIRED. The kind of artifact this feedback is about: 'chat_message', 'report', 'thesis', 'claim', 'tool_call', 'schema', or 'other'. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| feedback_id | string | yes | — |
| status | string | yes | — |
No examples provided.
submit_feedback Submit Feedback ~666
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.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | yes | What kind of feedback this is: 'bug' (something broke), 'feature_request' (something missing), 'experience' (UX / clarity / docs), 'data_quality' (a wrong/missing/stale figure), or 'other'. |
| context | object | — | Optional free-form context object (stored as JSON), e.g. { tool: 'get_company_fundamentals', ticker: 'AAPL', request_id: 'abc123' }. Avoid secrets. |
| expected_value | string | — | Optional caller-asserted correct value, in your own words. Stored verbatim for triage — NEVER computed or trusted as data. |
| fact_id | string | — | Optional disputed `fact_id` (for wrong_number / bad_citation feedback). |
| idempotency_key | string | — | Optional client-supplied key (1–64 chars). For authenticated callers, reusing the same key files the feedback exactly once — safe to retry on a network error. Ignored for guest/sample callers (no acc… |
| message | string | yes | The feedback body (1–4000 chars). Be specific: what you expected, what happened, and any reproduction steps. May contain the user's own words — it is stored for triage and never used for arithmetic. |
| reason | string | — | Optional structured error-mode reason: 'wrong_number', 'bad_citation', 'missing_data', 'wrong_company', 'formatting', 'hallucinated_fact', 'tool_error', 'coverage_gap', or 'other'. |
| request_id | string | — | Optional `_meta` request id of the turn that produced the artifact, for correlation. |
| sentiment | string | — | Optional sentiment of this feedback: 'positive' (worked well), 'negative' (something was wrong), or 'correction' (you are supplying the right value). |
| severity | string | — | Optional impact classification: 'low', 'medium', or 'high'. |
| subject | string | — | Optional short title (≤140 chars) summarizing the feedback. |
| surface | string | — | Optional product surface the feedback concerns: 'mcp', 'workspace', 'sdk', 'dashboard', or 'api'. |
| target_id | string | — | Optional id of the artifact this feedback targets (e.g. a report or thesis id). |
| target_type | string | — | Optional kind of artifact the feedback targets: 'chat_message', 'report', 'thesis', 'claim', 'tool_call', 'schema', or 'other'. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| acknowledgment | string | yes | — |
| feedback | object | yes | — |
No examples provided.
test_alert Test Alert (synthetic fire) ~108
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.
| Name | Type | Req | Description |
|---|---|---|---|
| alert_id | string | yes | Identifier of the alert to fire a synthetic test notification through, as returned by create_alert or list_alerts. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| alert_id | string | yes | — |
| channel_type | string | yes | — |
| error_message | string|null | yes | — |
| outcome | string | yes | — |
| status_code | — | yes | — |
No examples provided.
test_rule Test Rule (dry run) ~150
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}`).
| Name | Type | Req | Description |
|---|---|---|---|
| rule_id | string | yes | Identifier of the rule to dry-run, from create_rule or list_rules. |
| sample_payload_override | object | — | Merged over the built-in synthetic payload for this rule's trigger_type — lets you test a specific value. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| action_type | string | yes | — |
| note | string | yes | — |
| reason | string | yes | — |
| rule_id | string | yes | — |
| synthetic_payload | object | yes | — |
| would_fire | boolean | yes | — |
No examples provided.
unlink_claim_from_thesis Unlink Claim from Thesis ~102
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).
| Name | Type | Req | Description |
|---|---|---|---|
| claim_id | string | yes | Identifier of the claim to unlink, as returned by save_claim or list_claims. |
| thesis_id | string | yes | Identifier of the thesis to unlink the claim from, as returned by save_thesis or list_theses. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| unlinked | boolean | yes | — |
No examples provided.
unpublish_claim Unpublish Claim (back to private) ~89
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).
| Name | Type | Req | Description |
|---|---|---|---|
| claim_id | string | yes | Id returned by `save_claim` or `list_claims`. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| claim | object | yes | — |
No examples provided.
unpublish_report Unpublish Report (back to private) ~49
Revert a published report (listed or unlisted) back to `private` visibility, removing it from the public catalog. Author-only. Idempotent.
| Name | Type | Req | Description |
|---|---|---|---|
| report_id | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| report | object | yes | — |
No examples provided.
unpublish_thesis Unpublish Thesis (back to private) ~90
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).
| Name | Type | Req | Description |
|---|---|---|---|
| thesis_id | string | yes | Id returned by `save_thesis` or `list_theses`. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| thesis | object | yes | — |
No examples provided.
update_report Update Report Sections ~393
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`. Does NOT change price / tier / visibility — use publish_report for those.
| Name | Type | Req | Description |
|---|---|---|---|
| abstract | string | — | Optional new abstract. |
| citations | array | — | Lineage for figures in the edited sections. MERGED into the report's existing citations (first claim wins), never replacing them — so an editor autosave that sends none preserves every citation the r… |
| expected_version | integer | — | Optimistic concurrency check. If supplied and the current HEAD version is different, the call returns a `version_conflict` error WITHOUT writing. Pass the version you loaded so a concurrent agent edi… |
| remove_section_ids | array | — | Section ids to DELETE outright. Without this, a merge-only update cannot express a deletion: an editor that drops a section simply omits it, the omitted section is preserved, and the caller sees a bu… |
| report_id | string | yes | Identifier of the report to update, as returned by create_report or list_my_reports. |
| sections | array | yes | Sections to replace. Sections not listed are preserved — to DELETE one, name it in `remove_section_ids`. Section ids must match the existing payload. |
| title | string | — | Optional new title. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| archived | boolean | yes | — |
| previous_version | — | yes | — |
| report | object | yes | — |
| version | integer | yes | — |
No examples provided.
verify_fact_lineage Verify Fact Lineage ~631
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.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of_date | string | — | Point-in-time cutoff (YYYY-MM-DD) used with `concept` — returns the latest fact whose 10-K/10-Q was accepted by SEC on or before this date (true PIT, no lookahead; any calendar date works). Canonical… |
| concept | string | — | Standard concept to look up the most recently known fact for (see the enum for the full fundamentals + capital-allocation set). Use this when you don't have a fact_id. Provide either concept OR fact_… |
| fact_id | string | — | Deterministic fact identity hash: SHA-256(entity_id|accession_id|concept|period_end|unit). 64-char lowercase hex. Use this when you already have the hash from a previous query. Provide either fact_id… |
| period_end | string | — | [DEPRECATED — pass `as_of_date` instead.] Filing-acceptance cutoff (YYYY-MM-DD) used with `concept`; despite the name it filters on filing accepted_at, not the returned fact's period_end. Kept one re… |
| ticker | string | yes | Stock ticker symbol, e.g. AAPL, MSFT, BRK.B |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| lineage | object | — | Full provenance: fact_id, concept, value, unit, period_end, source accession, SEC EDGAR URL, form_type, accepted_at, plus duration context — period_start, period_span_days, and period_type (instant |… |
| lookup_by | string | yes | How the fact was located: 'fact_id' or 'concept' |
| verified | boolean | yes | True when the fact was located and its provenance resolved |
No examples provided.
watchlist_diff Watchlist Diff ~130
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.
| Name | Type | Req | Description |
|---|---|---|---|
| form_types | array | — | Filing forms to include. Defaults to 10-K + 10-Q + 8-K. |
| name | string | yes | Watchlist name. |
| since | string | yes | Cutoff date (YYYY-MM-DD); the diff returns SEC filings accepted on or after this date across the watchlist's tickers. |
| Name | Type | Req | Description |
|---|---|---|---|
| _meta | object | yes | Provenance envelope — data lineage for every MCP response |
| filings | array | yes | — |
| since | string | yes | — |
| tickers_scanned | integer | yes | — |
| watchlist_name | string | yes | — |
No examples provided.