What's new RSS
2026-07-22 mars_funding_history — empty canonical_investors[] now self-documents (has_named_backers)
mars_funding_history
For consumers: `mars_funding_history` now tells you what an **empty `canonical_investors[]`** means, so you don't misread it as a coverage gap. Per mars's coverage analysis it's GROUND TRUTH — the round's source filing/article didn't itemize backers, which is STRUCTURAL for IPO / debt / Reg D / private-placement rounds (Reg D 100% unnamed, IPO 29%, Debt 34%) vs Series A/B/C/Seed (~95% named). Each round now carries **`has_named_backers`** (bool) and, when empty, an **`investors_note`** that says whether the emptiness is expected for that round type or possibly a gap. So a name with only IPO/debt rounds (e.g. SpaceX's recent IPO/Debt/PP rows) legitimately shows the funding trajectory without namable backers — not a bug.
2026-07-22 bio_catalyst_dossier — the next FDA catalyst + how to think about it (index with drill-downs)
bio_catalyst_dossier
For consumers: **`bio_catalyst_dossier(ticker_or_cik, as_of=)`** — one call returns a biotech's nearest PDUFA/AdCom date AND a compact headline for each context pillar (prior CRLs + the base rate for that reason, the target's historical approval base rate (target_base_rate — the key AdCom-efficacy prior), comparable historical approval setups with realized 1yr returns, management track record, manufacturing/inspection risk, pipeline) — **each with an exact `drill` tool call to go deeper**. It's an INDEX, not a dump: read the headlines, then follow the drill for whichever pillar matters and that tool gives you the full detail (and often its own pointers). Real-time fan-out over already-cooked data (base rates, PIT snapshots, CRL reasons, the people graph are all pre-computed) — nothing baked ahead, nothing stale; assembles in <1s. Token-cheap by design (headline + pointer, not the full record of each). Pillars degrade gracefully (a failed/empty read still returns its drill). The point: an agent asked "what's X's next PDUFA and how to think about it" tends to grab the date and stop — this surfaces all the pillars so it can't skip them. Verified: VRTX → prior CRL clinical_design (2016) → that reason's base rate (n=84, median abn_252 −0.34, 76% down) → 5 comparable approval setups (median 1yr abn −0.47) → 5 officers all with prior approvals → no OAI → 10-asset pipeline.
2026-07-22 Two IPO tools — sections__ipo_screen + sections__ipo_risk_factors
sections__ipo_screen sections__ipo_risk_factors
For consumers: Two new IPO tools on the SEC surface (sections team substrate, wrapped for inferno's report builder). **`sections__ipo_screen`** — recent IPOs in a date window from 424B4 final-pricing prospectuses (2020-2026, ~99.9% of the IPO universe); one row per company (earliest 424B4 = the IPO itself), SPACs excluded by default, filter by `sector` (SIC prefix) or `sic_filter`. **`sections__ipo_risk_factors`** — classified risk factors from a company's IPO prospectus (424B4, S-1 fallback), mirroring `sections__risk_profile` but on the PRE-IPO filing (works for names with no 10-K yet); returns thematic + topic breakdown + the individual factors. Pair them: screen recent IPOs, then pull each one's risk profile. Perf: risk_factors is <100ms (payload path); ipo_screen is ~4-26s depending on window (per-year 424B4 scroll — narrow the window/sector to stay fast).
2026-07-21 bio_trial_readouts flags p-value/outcome mispairs
bio_trial_readouts
For consumers: `bio_trial_readouts` now returns **`pvalue_outcome_conflict`** (bool) per row (super-bio T027). true = the stated p-value contradicts the outcome (MISSED with a significant p, or MET with non-significant) — a likely drug↔outcome mispair (e.g. Keytruda tagged MISSED with p<0.001). **Discount the outcome↔pvalue pairing on flagged rows** (~12% of rows that carry a p-value); the drug / phase / endpoint fields on those rows are still fine. Turns the "sanity-check the p-value" caveat into an explicit filterable flag. Additive.
2026-07-21 Management track-record graph — bio_person_track_record + bio_company_people
bio_person_track_record bio_company_people
For consumers: The "people" alt-data (super-bio T010). **`bio_person_track_record`** (`name` or `owner_cik`) — a biotech exec/director's cross-company outcome record: how many companies they were an officer/director at and how those resolved (drug approval / acquired / failed / active), with the per-company detail. The proven-operator read — a CEO who ran 3 biotechs that got approved. Identity is authoritative (SEC Form-4 owner_cik, no fuzzy name matching); 16,943 people, 1,593 proven individual operators. **`bio_company_people`** (`ticker_or_cik`) — the officers & directors at a company, each annotated with their track record elsewhere ("this new CEO ran 3 approval-cos"). Complements `insiders_of_company` (SEC identity+count only) with the biotech outcome graph. Caveats: coverage = Form-4 filers 2003+ (pre-IPO founders absent); weight officers over directors (outcome is company-level, credentialed-by-association); is_entity=true = fund/VC board seat (distinct smart-money signal).
2026-07-21 Three new bio tools — patent cliff, CRL outcomes, cash runway
bio_patent_cliff bio_crl_outcomes bio_cash_runway
For consumers: Three new biotech tools (super-bio T009/T011 + the CRL base-rate view). **`bio_patent_cliff`** — loss-of-exclusivity / patent-cliff date per approved drug (`ticker_or_cik`, `before=`, `drug=`); small molecules use REAL FDA Orange Book patent + exclusivity data, biologics use the computed BPCIA 12-year regulatory floor (`source` tells you which — never read the 12yr rule as a hard patent expiry). "What's rolling off patent in the next 3 years for X" is `before=<+3yr date>`. **`bio_crl_outcomes`** — realized post-CRL abnormal returns AND eventual-approval rate BY DEFICIENCY REASON across 419 FDA Complete Response Letters; the reason predicts both the down-move magnitude and the resolution rate (efficacy fatal: −0.43 / ~32% approved-later; inspection_483 fixable: −0.16 / 67%). Returns a `by_reason` base-rate table + individual `events`. **`bio_cash_runway`** — cash-runway trajectory in YEARS + declining-streak per biotech; read the trajectory not a point (commercial-stage names oscillate as revenue lands), and `declining_streak≥3` is the distress signal. PIT on all three.
2026-07-21 semantic_search now hands you a cross-company screen (signal_pivot)
semantic_search
For consumers: `semantic_search` results now carry the **ARGOS classifiers each sentence fired** (`classifiers` per hit) plus a response-level **`signals_seen`** (the classifiers ranked by how many hits fired them) and a ready-to-run **`signal_pivot`** string. The pivot turns "here are example sentences about pricing power" into "here is *every company currently flagging that theme*" — it hands you an exact `screen_companies(classifier="is_pricing_pressure")` call. If you use `semantic_search` to find evidence for a theme, follow the `signal_pivot` to get the cross-company screen (the thing an LLM can't reconstruct from filings alone). Additive — existing fields unchanged.
2026-07-21 bio_similar_setups gains event_type='crl' — the rejection NO-arm
bio_similar_setups
For consumers: `bio_similar_setups` now accepts **`event_type='crl'`** (alongside 'quarter' / 'approval') — the CRL / rejection **NO-arm**, completing the pairing with the 'approval' YES-arm. Anchors on FDA Complete Response Letters (336 points, 2015+) and returns realized SPY-adjusted abnormal returns *after the rejection*, so you can ask "what did the stock do post-CRL for companies in a setup like this at THEIR rejection?" The finding that validates the CRL-reason feature: the by-reason down-tail (median abn_252) is **efficacy −0.43 (fatal) vs inspection_483 −0.16 (fixable)** — the `reason_category` predicts the magnitude of the down-move. Caveat: ~57% of CRL points have month-only date precision (their 21/63d abn are unreliable; 126/252d + the aggregate base rate are fine). super-bio T013. Also this cycle: `mining_company_reserves` auto-picked up sedar's AEM reserves fix (AEM now serves 55.4 Moz via a `stated_total` confidence tier; 5/7 majors' reserves serve, all 7 production+AISC).
2026-07-20 13F "current holders" tools now anchor on the latest MATURE quarter (fixes the early-quarter undercount)
thirteenf_holders_full thirteenf_portfolio_full thirteenf_smart_money_consensus thirteenf_cohort_flow
For consumers: The four postgres-backed 13F tools that answer "current holdings / consensus / cohort flow" now default to the **latest MATURE quarter** (one whose 13F filing deadline + grace has passed) instead of the raw newest quarter. Why it matters: for the ~6-week window after each quarter-end, the freshly-ended quarter is only ~half filed (early-filer subset), which massively undercounts every holder base — e.g. Carnival (CCL) showed **12 holders on the sparse Q2 vs 1,010 on the complete Q1**. These tools now anchor on the mature quarter by default (via smart_money's new `pipeline_meta.latest_mature_report_date`); pass an explicit `report_date` for a specific quarter, including the freshest. Fixes the whole early-quarter undercount in one shot. On the SEC vertical.
2026-07-20 new tool bio_trial_readouts + bio_target_base_rate methodology correction
bio_trial_readouts bio_target_base_rate
For consumers: **New tool `bio_trial_readouts`** — clinical-trial endpoint outcomes (primary endpoint **MET / MISSED / MIXED**, the **p-value** as stated, endpoint name) mined per sponsor from SEC filings (2,442 readouts; Ph3 1,240 / Ph2 1,126). The actual trial RESULT — a tier deeper than approvals or pipeline. Filters: `phase`, `outcome`, PIT `as_of` (on filing_date). Filer-anchored (competitor trials excluded); the `sentence` field carries provenance. Caveat surfaced: it's extraction not ground truth — a p-value that disagrees with the outcome (e.g. MISSED with a significant p) is likely a drug↔outcome mispair. Pairs with `bio_pipeline` and `bio_target_base_rate`. **Plus a correction to `bio_target_base_rate`**: its methodology disclosure was inverted — it claimed Phase-3 failures were scored "advanced" (positive, inflating the rate), but advanced programs are actually CENSORED (excluded, never scored positive). The real residual bias is CENSORING (conservative). super-bio's v2 (`phase_progression_v2`) now reclassifies documented Phase-3 misses (from the trial-readout data) to negatives. Corrected the description + methodology_note; dropped the never-firing "discount if n_advanced>0" warning. On the bio vertical.
2026-07-20 new tool — mining_company_reserves (gold-major reserves / production / AISC, reconciled + cited)
mining_company_reserves
For consumers: New tool **`mining_company_reserves`** — company-level gold **reserves (proven+probable Moz) + annual production + AISC ($/oz)** for the 7 major gold producers (NEM / GOLD-Barrick / GFI / KGC / AU / HMY / AEM), structured, reconciled, and provenance-backed. It replaces scraping 10-K reserve tables — the failure mode that produced garbage like "271 Moz reserves". Every figure is reconciled (`contained ≈ tonnes × grade`) and carries its SEC accession; **implausible values are WITHHELD (NULL), never guessed**. Reserves for NEM 134.4 / GOLD 146.4 / GFI 54.9 / KGC 19.7 Moz; production + AISC for all 7 (AU/HMY/AEM reserves withheld on a unit-scale/under-capture gate, flagged via `reserves_completeness`, but their production+AISC serve). `include_deposits=true` adds the per-deposit reconciled detail with citation. Built by the sedar team via the SK-1300 ≈ NI 43-101 play (SEC SK-1300 Technical Report Summaries + Canadian AIFs). On the SEDAR vertical.
The T24 gold-reserves feed I made the case for (SK-1300 ≈ 43-101 flipped sedar's "not our corpus") is live —
sedar built it + kee provided the sec.acc access. Wrapped the two servable views (company summary + per-deposit
detail). Verified matches sedar's numbers exactly; kills the scrape-misread failure inferno hit on NEM/KGC/AU/B.
2026-07-20 bio__prior_crl_reason — leak-safe PIT gate on SEC-disclosed CRLs (disclosing_filing_date)
bio__prior_crl_reason
For consumers: `bio__prior_crl_reason` now gates SEC-disclosed CRLs on **`disclosing_filing_date`** (the date of the filing the disclosure was mined from), not `letter_date`. super-bio + futures found 78% of `source='sec_disclosure'` rows had a `letter_date` EARLIER than the filing that disclosed them — so a strict-PIT replay could surface a CRL before it was publicly known (e.g. a 10-K retrospectively narrating a years-old CRL). New gate: openFDA rows still gate on `letter_date` (public when issued); SEC-disclosure rows gate on `COALESCE(disclosing_filing_date, letter_date + 60d)`. Leak-safe (never shows a CRL before it was public), mildly conservative (a CRL first announced in an 8-K may hide until the later filing we mined). `disclosing_filing_date` now surfaced per row. Verified: at as_of=2024-01-01, 22 previously-leaking rows now correctly hidden. On the bio vertical.
2026-07-18 sedar_resource_screen — effective_date (estimate as-of date) surfaced + filterable
sedar_resource_screen
For consumers: `sedar_resource_screen` now surfaces **`effective_date`** — the resource estimate's stated as-of date, distinct from `filing_date` — on every row, and adds **`effective_after` / `effective_before`** date filters. This is the enabling field for a deck-vs-spot staleness screen (find estimates whose as-of date is old, or restrict to fresh ones): e.g. `effective_after=2024-01-01` → recent estimates, `effective_before=2010-01-01` → stale ones. ~13% of rows carry it (withheld when the report states no explicit as-of, so filtering on it is a stated-as-of subset — a lower bound). sedar also refreshed the underlying table (v4 — fixed a silent JSON-truncation bug that was dropping the largest multi-zone grids; now 23,602 rows / 471 tickers, null-tonnes 7%→3%, nothing to re-wire there). On the SEDAR vertical.
sedar added the effective_date servable column + a full resource re-scan. Wired the column into output +
two range filters. Verified live: effective_after=2024-01-01 → 320 fresh gold rows (LUN 2025-04-15);
effective_before=2010-01-01 → 33 stale.
2026-07-17 insider_liquidity_calendar sort fix + insider_holdings name matching (same-day polish)
insider_liquidity_calendar insider_holdings
For consumers: Two fixes on the tools that shipped this morning. (1) `insider_liquidity_calendar` — the no-identifier date-window SCAN sorted event_date ASC + LIMIT, so a `plan_sale` scan (a trailing-180d PAST anchor) returned the STALEST slice, not current selling. Added a `sort` param (soonest_first / most_recent_first) with a smart default (plan_sale-only → most_recent_first; forward events → soonest_first) + a `truncated` flag when the limit hides more rows. A plan_sale scan now surfaces today's activity. (2) `insider_holdings` / `insider_liquidity_calendar` — `name` matching is now token-AND: `"Elon Musk"` matches the SEC-stored `"Musk Elon"` (was returning 0), and a multi-token query narrows the set (excludes "Musket David"). Thanks mcptest.
mcptest Round 13. The liquidity scan ordering was the real one — a plan_sale scan is exactly the
prospect-research entry point and it was returning the least-current activity. (A separate stale-position
data issue on insider_holdings — Musk's 2010 Form-3 TSLA stake not superseded — routed to insider's mat.)
2026-07-17 mars merger tools migrated to deal-grain (merger_deals_v2) — no more over-counting, integrity-filtered
mars_mergers_screen mars_mergers_for_company mars_trending_acquirers
For consumers: The three mars merger tools now read `merger_deals_v2` (DEAL-grain — one row per deal after cluster/dedup) instead of the article-grain `mergers_resolved_v2` (one row per covering article). Fixes latent over-counting (a deal covered by N wire articles no longer counts N times). New: `integrity_tier IN ('verified','vouched')` filtered by default (drops ~730 known-garbage 'warn' extractions — trillion-dollar misparses, self-mergers, sentinel names; `include_warns=true` to see them); deal value is now `deal_value_usd_converted` (FX-normalized USD) with fallback, and undisclosed shows NULL never $0; new fields surfaced (`close_date`, `is_friendly`, `is_cross_border`, `n_articles`, `deal_value_usd_source`, `integrity_tier`). Removed the per-article `source_ref`/`snippet`/`published_at` (moved to the deal_articles_v2 bridge; `n_articles` is the provenance signal). `mars_trending_acquirers` dropped its manual DISTINCT-ON dedup (deal-grain is already unique). On the mergers vertical + dev.
mars confirmed merger_deals_v2 is canonical (funding_deals_v2's M&A sibling); migrated all 3 tools with
the column map. Verified: Microsoft→Mistral $16M real / TikTok null (undisclosed, not $0); trending
deal-grain Inszone 19 deals total NULL (all-undisclosed rollup), Eli Lilly 12 deals $32.6B. Mars built
3 partial integrity indexes on merger_deals_v2 for the query shapes; will EXPLAIN our plans.
2026-07-17 new insider_holdings tool — standing beneficial-ownership positions (Form 3 + running holdings)
insider_holdings
For consumers: `insider_holdings(person or issuer)` returns CURRENT standing positions — the stake an insider actually holds, from Form 3 (initial statement) + running Form 4/5 holdings, NOT a sum of Form-4 deltas (which understates every founder who owned stock before becoming an insider). Two axes: a PERSON (owner_cik/person_id/name) → positions across all issuers (the wealth surface); an ISSUER (ticker/cik/company_id) → that company's insiders' positions. Thin reader over a daily mat (441K positions / 184K people, ~0.5ms) with the traps pre-baked: latest-snapshot dedup, "owns nothing" declarations dropped, garbage share counts bounded (`shares_bounded=false` = NULLed), funds/trusts excluded (`real_people_only` default). Derivative `shares` is the UNDERLYING count — never add it to a share balance. On the SEC vertical + dev.
Thin reader over insider.insider_holdings_mat. The "you can't get this by summing Form-4 deltas" surface.
2026-07-17 new insider_liquidity_calendar tool — WHEN an insider becomes liquid (option expiries / vesting / plans)
insider_liquidity_calendar
For consumers: `insider_liquidity_calendar` answers "when does this person come into money" — option expiries (forced liquidity), vesting dates, and active 10b5-1 plan sales. Three shapes: a PERSON's upcoming liquidity, an ISSUER's insiders' events, or (no identifier) a forward date-window SCAN of everyone becoming liquid in the next `days_ahead` (optionally `csuite_only`) — the prospect-research entry point. Thin reader over a daily real-people-only forward-looking mat (91K events, ~2ms). `shares` is PROVENANCE not sanitized (describe an event, never rank by it); `plan_sale` event_date is a PAST anchor (currently-selling, trailing 180d) while option_expiry/vesting are future. On the SEC vertical + dev, AND the donor family (capacity+timing signal for prospect research — same table, both surfaces).
Thin reader over insider.insider_liquidity_calendar_mat. Both a trading-desk supply view and the
donor/Insider-Focus "who comes into money this quarter" surface — insider flagged it for both.
2026-07-17 new insider_signal tool — the scored insider packet for one issuer (flagship)
insider_signal
For consumers: `insider_signal(identifier, window_days=90)` returns a single scored insider-activity packet for an issuer — a `signal_class` (cluster_buy / csuite_buy / net_buying / neutral / net_selling, a DETERMINISTIC classification not a recommendation), discretionary flow (`net_discretionary_usd`, planned 10b5-1 excluded), cluster + C-suite-conviction + unusual-buyer flags, and a `notable[]` array of top insiders with per-person context (first-buy-in-5y, x-vs-own-median). All heavy preprocessing (own-history 5y baselines, cluster detection, unusual scoring) is materialized daily by the insider team; the tool reads one row (~2ms). Verified: PSUS 90d → cluster_buy, 8 buyers, 6 C-suite, net $311.6M, Ackman at 133.9× his own median. Historical `as_of` → `unsupported_as_of` (daily table is as-of-today; use insider_flow/history for backtests). On the SEC vertical + dev. 5th tool in the insider_ family.
The flagship "an LLM can't do this" tool — insider does the deterministic thinking (materialized
scored table), argos reads one row, the LLM supplies judgment. Same contracts as the other 4 insider
tools (value_usd only, planned excluded, plan_flag_coverage, PIT).
2026-07-13 catalyst_calendar gains a tariff event_type (Section 232 / 301, Federal-Register-sourced)
catalyst_calendar
For consumers: `catalyst_calendar` now accepts `event_types=['tariff']` — Section 232 / 301 tariff actions across 12 commodities (copper, steel, aluminum, semiconductors, critical minerals, pharma, timber, autos, aircraft, trucks, polysilicon, drones), sourced from the Federal Register (every row carries its FR document number). History-eligible, so "what was copper's 232 status on 2025-09-01?" → `in_effect` (via `include_passed=true` + `as_of`). Detail carries commodity / statute / milestone / status + FR ref. ⚠ `rate_pct` is deliberately NULL on multi-rate proclamations (a 232 document cites market-share stats, recommendations, and multiple enacted rates in one instrument — a wrong tariff rate on an auto-consumed feed is unrecoverable; `rates_enacted[]` + the FR link are handed over instead). Copper's enacted 50% is populated.
crown's ask via catalyst_calendar. 1-line enum add + history_types routing (past-as_of reads).
Verified copper golden: in_effect on 2025-09-01, FR fr:2025-14893. Commodity currently surfaces
under detail.drug (generic history column reuse) — flagged catalyst for the history detail-jsonb
mirror (same fix that unblocks adcom link fields), which will give proper commodity/rate keys.
2026-07-13 catalyst_calendar now returns a data_health block on every response (stale-feed safety)
catalyst_calendar
For consumers: Every `catalyst_calendar` response now carries a `data_health` block — per-event-type feed freshness + audit status, so an auto-consuming system can detect a STALE or BLIND feed and refuse to trade on it. `status` ∈ {ok, stale, critical, unknown}; `per_type` reports the freshness_class / is_stale / hours_since / row_count for each event_type returned; `audit_passing` says whether what we serve matches reality (Federal Register / Drugs@FDA recall). When degraded, a top-level `health_alert` ⚠ leads the response so an LLM consumer can't skim past it. `row_count=0` ⇒ critical (zero rows is indistinguishable from "nothing scheduled" — exactly how a silent 4-week extraction freeze hid, costing a downstream desk a -29% position). Backed by catalyst's new `catalyst_calendar_meta` table.
Safety change requested by catalyst after a silent extraction freeze. Reads the new
catalyst_calendar_meta (per-type + _overall audit row); never breaks the tool (degrades to
status='unknown' if the health table is unreadable).
2026-07-13 mars_trending_acquirers no longer reports undisclosed deal values as $0
mars_trending_acquirers
For consumers: `total_value_usd` is now NULL (not 0) when none of an acquirer's deals disclosed terms — undisclosed ≠ $0. Fixed a `SUM(COALESCE(...,0))` that fabricated $0 aggregates and let all-undisclosed rollups (e.g. Inszone Insurance, 19 deals, all private) rank as if they had $0 of value. Also folds mis-stored `deal_value_usd=0` rows into undisclosed (a $0 M&A deal never exists) and adds `n_disclosed` (how many of `deal_count` carried a value). Per-target `deal_value_usd` now shows null, not 0, for undisclosed. Verified: Eli Lilly's real $26.3B / 8-disclosed preserved; insurance rollups now correctly NULL.
mcptest smoke flagged it on the mergers vertical (same "NULL means unverified, not zero" class
as the sedar/funding threads). NULLIF(deal_value_usd,0) in SUM + COUNT + the per-row json.
279 substrate rows store undisclosed as 0 — flagged to mars for the source fix; NULLIF is the
defensive read meanwhile.
2026-07-13 sedar mining tools now surface us_ticker / us_exchange (US listing of Canadian issuers)
sedar_resource_screen sedar_mining_screen sedar_mining_report
For consumers: Every row from the three sedar mining tools now carries `us_ticker` + `us_exchange` — the issuer's US listing (NYSE / NASDAQ / NYSE American / OTC), resolved through the issuer (never a naive symbol match — "GOLD" does NOT wrongly resolve to Barrick). `NULL` = no US listing on file (a safe lower bound — a company may trade in the US on a line sedar doesn't hold). Big for US-based investors mapping a Canadian miner to something they can trade: Donlin Gold → NG/NYSE, Vizsla Silver → VZLA/NYSE, Fortuna → FFMGF/OTC. Also: sedar's grade quality gate now uses a row-poisoning rule (a row with ANY impossible grade emits no grades_norm at all), so grade screens are clean at source — we dropped our defensive exclusion. Each grade also carries a `verified` bool (its own contained-metal figure confirms it, ~6% — a trust signal to rank by, not a filter).
sedar shipped us_ticker/us_exchange (issuer-resolved, 69 issuers / 53 with a different symbol
— crown proved naive symbol joins unsafe: 232 naive "matches", only 29 survived) + a
row-poisoning grade gate (MSR Chita 681 Mt @ 6.8 g/t Au gone; Donlin back on top). Wired US
listing into all 3 mining tools + dropped the defensive grade_implausible exclusion.
2026-07-13 sedar_resource_screen gains min_grade (basis-aware) + drops the neighbouring-deposit caveat
sedar_resource_screen
For consumers: `sedar_resource_screen` now supports numeric grade filtering — `min_grade` on the selected `commodity`, backed by sedar's new `grades_norm` column (oxide→element converted, so the value IS the element grade). Unit is commodity-canonical: **g/t for precious (Au/Ag/Pt/Pd), % for base metals (Cu/Zn/Ni/Li/U)** — never compare a min_grade across commodities. **Strict basis by default** (directly-reported grades only, not AuEq/CuEq equivalents; `include_equivalents=true` to allow), and grade screens exclude `grade_implausible`-flagged rows so a spurious high grade on a huge tonnage can't top the list. `grades_norm` is now returned per row. Also: sedar's **provenance gate landed** — the neighbouring-deposit contamination (a prose sentence naming an adjacent deposit parsing as a table row) is fixed, so that residual caveat is dropped; the smaller honest caveat remains (rows with no stated contained_metal are served unverified, `quality_flags` shows which). Verified: gold ≥50 Mt AND ≥1 g/t → Donlin Gold 560 Mt @ 2.22 g/t (no PPX/MSR garbage); lithium ≥1% → Thacker Pass. Served 19,830 rows / 492 tickers.
sedar shipped grades_norm (v1.1) + a provenance fix. Wired min_grade with basis-aware
strict-vs-equivalents + a grade_implausible exclusion (caught MSR 681 Mt @ 6.8 g/t Au —
flagged implausible but still emitting a grade value — ranking above Donlin; excluded it
tool-side and flagged the residual back to sedar). jsonb_exists() form avoids the ?-operator
clashing with psycopg2 params. Dropped the fixed neighbouring-deposit caveat.
2026-07-11 sedar mining tools now surface price_deck — the filed NPV price assumptions (deck-vs-spot)
sedar_mining_report sedar_mining_screen
For consumers: The economics block of both sedar mining tools now carries `price_deck` — the commodity PRICE ASSUMPTIONS the filed NPV was computed at, as jsonb `{basis: 'price with unit'}` (e.g. `{"Li":"US$24,000/tonne"}`, `{"LCE":"US$20,757/tonne"}`). 383 non-exploration rows. Keys are RAW pricing bases on purpose (Li vs LCE vs Li2CO3 are different bases at different prices — do NOT normalize; match basis to spot caller-side). This unlocks the deck-vs-spot mispricing screen (a filed $1,900 gold deck vs ~$5k spot). Only-when-stated / NULL otherwise.
crown + futures' #1 mining ask. sedar shipped the column to mining_projects_servable;
we surfaced it in both tools' economics blocks (same pattern as discount_rate_pct/tax_basis).
Verified: LAC {Li:US$24,000/tonne} @ $8.7B after-tax NPV; NVLH {Li2CO3:$8,560/tonne}; LAAC {LCE:US$20,757/tonne}.
2026-07-11 macro_calendar now covers EIA weekly inventory release dates
macro_calendar
For consumers: `macro_calendar` now includes EIA weekly energy-inventory release dates — `EIA_PETROLEUM` (Weekly Petroleum Status Report, Wed 10:30 ET) and `EIA_NATGAS` (Natural Gas Storage, Thu 10:30 ET), 2010→2028. Both are filterable via `categories=['EIA_PETROLEUM']` etc. and interleave with CPI/PCE/EMPLOYMENT/GDP/FOMC. The fred/macro team generated them from EIA's pre-announced schedule with federal-holiday shifts (PIT-by-construction). Release DATES only — inventory values live elsewhere. Coverage grew 3,451→5,383 rows.
The event clock for energy term-structure studies. Verified: macro_calendar(categories=['EIA_PETROLEUM','EIA_NATGAS'], window_days=20) returns WPSR 2026-07-15 + gas storage 2026-07-16 interleaved. Data by the fred team; our side added the categories to the enum + refreshed the coverage text.
2026-07-11 sedar_resource_screen — 10x richer data + is_headline default (clean one-row-per-zone)
sedar_resource_screen
For consumers: The NI 43-101 resource grid substrate got a full-coverage rewrite — `sedar_resource_screen` now searches ~25,312 rows / 560 tickers (was 2,620 / 393), null-tonnage down to ~7% (from 20%), with multi-zone + cutoff-grade sensitivity now captured. To keep results clean, the tool **defaults to headline rows** (`is_headline=true` — one base-case row per report×category×zone, ~14k rows) so a multi-zone deposit doesn't flood results; pass the new `include_all_cutoffs=true` to get the full cutoff-sensitivity table. `is_headline` is surfaced per row.
Same mining_resource_servable view, atomic upsert (no serving gap) — the richer data was automatic; our side added the is_headline default + include_all_cutoffs opt-in + surfaced the column. Verified: lithium M+I ≥100Mt headline → 4 rows (all is_headline); include_all_cutoffs=true → 7. grade_value/unit (numeric min_grade) still sedar's v1.1.
2026-07-10 New tool sedar_resource_screen — NI 43-101 resource/reserve grids by commodity/tonnage
sedar_resource_screen
For consumers: New tool over `sedar.mining_resource_servable` (~2,620 rows / 393 tickers) — the precise per-category/zone resource + reserve GRIDS extracted from the 43-101 PDFs, the tonnage companion to `sedar_mining_screen` (which is project-level economics). Filter by `commodity` (English or symbol — gold/Au, lithium/Li, rare earth/REE), `min_tonnes` (defaults to `tonnage_basis='ore'` so lithium-brine LCE tonnes aren't compared against hard-rock ore), `category` (measured/indicated/inferred/measured_indicated/proven/probable — normalized to controlled vocab), `is_reserve`, `jurisdiction`, `ticker`. **Grain is one row per (project, category, zone)** — to get one headline row per project, filter to a single category (e.g. `measured_indicated`) or `is_reserve=true`. Grade thresholding deferred to v1.1 (grades are unit-carrying strings). On the SEDAR vertical + main catalog alongside the other sedar mining tools.
Wraps sedar's resource-grid substrate (commodity symbols + category_norm
normalized at source). Verified: lithium M+I ≥100Mt ore → Thacker Pass 2328.8 Mt
(LAC), Gabriel 2052 Mt (TEA), Bonnie Claire (NVLH); gold reserves → 93 rows.
Commodity input maps English→symbol; category normalizes casual→vocab; scale-guarded
≤3000 Mt at source. Target consumer: Peter/Rockpoint.
2026-07-10 catalyst_calendar — +cms_rate_notice event_type (11th type)
catalyst_calendar
For consumers: `catalyst_calendar` gains a `cms_rate_notice` event type — CMS Medicare Advantage Rate Notice milestones (Advance + Final) per public insurer (HUM/UNH/CVS/CNC/ELV/...). The Final Rate Announcement lands ~statutory first Monday of April. Snapshot-only (no history table), like `cms_coverage`/`cms_star_ratings`. Verified: `event_types=['cms_rate_notice']` returns rows for the MA insurers.
2026-07-09 SEDAR mining NPVs now comparable — discount_rate_pct + tax_basis + a tax_basis filter
sedar_mining_screen sedar_mining_report
For consumers: Each mining project's economics now carries structured `discount_rate_pct` (numeric) and `tax_basis` (`pre_tax` / `after_tax`), populated when the report states them (~306 rows; NULL, never invented, otherwise). `sedar_mining_screen` gains a `tax_basis` filter so you can rank NPVs like-for-like — an after-tax NPV isn't comparable to a pre-tax one, and a 3%-discount NPV isn't comparable to a 10% one. Pass `tax_basis='after_tax'` and read `discount_rate_pct` per row before ranking. The raw `npv_basis` free-text string is still returned for provenance.
Closes the NPV-comparability gap flagged when the mining corpus refreshed — sedar
added discount_rate_pct + tax_basis to the mining_projects_servable view
(they existed in the base table but weren't exposed), and both mining tools now
surface them. Verified: tax_basis='after_tax' → 171 gold rows led by Alamos
$11,027M @ 5% after-tax; tax_basis='pre_tax' → a distinct set (AKE $7,145M @ 10%).
2026-07-09 SEDAR mining corpus grew 758 → ~1,354 reports + contamination fixed at source
sedar_mining_screen sedar_mining_report
For consumers: The NI 43-101 mining corpus nearly doubled (758 → ~1,354 technical reports, ~266 with verified NPV, ~100 commodities, 2021-2026). Three source-side correctness wins now reflected in the tools: (1) the Item-23 "Adjacent Properties" contamination is fixed — CRUZ (Cruz Battery Metals) now correctly reads exploration-stage / NULL NPV instead of American Lithium's $3.26B, and SMN reads NULL reserve; (2) a served-NPV outlier cap (≤$15B) removed a $30B scale-error row — current max is Alamos Gold's ~$11B; (3) `stage` is now a controlled vocab (exploration/PEA/PFS/feasibility/construction/production/unknown) and `country` is normalized (USA→United States, Perú→Peru), so the old alias-masking is a harmless no-op. Still pending: structured `discount_rate_pct` + `tax_basis` columns exist in the base table (~97% NPV coverage) but aren't on the servable view yet — will surface once sedar exposes them.
Sedar's mining substrate refresh (re-extracted + cleaned, atomic upsert so
no serving gap). Description counts + now-stale caveats updated across both
mining tools. The CRUZ/SMN attribution warnings that previously told the LLM
those rows were contaminated are removed — leaving them would actively
mislead analysis now that the source is corrected. Verified live on dev:
sedar_mining_screen(commodity='gold') → 899 projects, top Alamos Gold
$11,027M (5% after-tax); sedar_mining_report(CRUZ) → exploration / NULL.
2026-07-09 SEDAR material-change timeline full history — 9,108 → 26,119 events / 4,153 tickers
sedar_material_changes
For consumers: The Canadian Material Change Report timeline backfill landed — now 26,119 events across 4,153 tickers, full 2021-2026 (was 9,108 / 2,428, 2025-2026 only). The default `since` floor moved from 2025-01-01 to 2021-01-01 so a dormant issuer whose most recent event predates 2025 now surfaces those events instead of returning empty (active issuers still get newest-first, unchanged). Caveat: a chunk of 2024 MCRs are still absent (2024 filing_type is ~55% NULL upstream) and will fill when sedar extends the filing_type backfill to 2024.
Coverage verified live on dev: UEC 162 events spanning 2021-01-26 → 2026-06-09.
Default-window broadening is a mild behavior change (wider history reachable by
default) but non-breaking — newest-first ordering means active issuers see no
difference at the top of the result set.
2026-07-08 OAuth self-hosted on each vertical URL — claude.ai UI works with custom connectors
For consumers: Vertical URLs (`mcp-sedar.kscope.io`, `mcp-funding.kscope.io`, etc.) now speak OAuth end-to-end. Point claude.ai desktop / web at any vertical URL, walk through the sign-in page → magic-link email → connect — works standards-compliantly with no Anthropic connector-registry submission. Claude Code / Cursor / any bearer-first client keeps working exactly the same via `admin.bearers`. Two delivery modes for the same entitlement — Adrian's admin UI writes to `admin.users.verticals` for OAuth customers, `admin.bearers.verticals` for CLI customers. Vertical entitlement gate live on both paths (customer with `verticals=['sedar']` gets 401 on funding, and vice-versa). Server names now per-vertical for claude.ai UI dedup — `argos-mcp-sedar` / `argos-mcp-funding` instead of the shared `argos-mcp-server`.
Spike outcome after claude.ai UI refused bearer auth on vertical URLs.
Option-1 path (Anthropic connector-registry submission per URL) would
have been days-to-weeks of bureaucratic tax; Option-2 (self-hosted OAuth
per URL with same-origin discovery) shipped in a few hours and is
proven end-to-end.
Auth architecture:
-
Each vertical URL is its own OAuth authorization server. Discovery
metadata (.well-known/oauth-authorization-server,
.well-known/oauth-protected-resource) advertises SELF as both
issuer and resource. Cross-origin delegation to a shared authority
was rejected by claude.ai UI's security policy — we hit it with the
shared-authority pattern first, saw the client silently hang after
reading metadata, and switched to per-URL AS.
-
Shared OAUTH_JWT_SECRET across every vertical service. Tokens
minted at one vertical URL verify at any other. Vertical entitlement
is enforced via admin.users.verticals (OAuth) and
admin.bearers.verticals (bearer) — checked on every request against
ARGOS_VERTICAL, 30s cache.
-
admin.users.verticals TEXT[] new column, GIN-indexed, populated
for kee/raul/adrian with {sedar, funding} for internal-user access.
Adrian's admin UI writes this column for OAuth customers.
-
serverInfo.name now derives from ARGOS_VERTICAL. Distinct
names required for claude.ai UI to treat each vertical as a
separate connector — same-name collision was the last diagnosed
bug (funding OAuth flow completed successfully server-side but
UI wouldn't mark it connected because it identified funding as
a duplicate of the already-active sedar).
Verified end-to-end via claude.ai UI on both vertical URLs.
SEDAR test: 7 tools, sedar_mining_screen call for top gold projects
in Ontario returned Alamos Island Gold at $11.0B NPV with the trust
framing surfaced verbatim to the user. FUNDING test: 13 tools, ready
for real analyst query.
For consumers on Claude Code / Cursor / other CLI-first clients:
bearer path fully preserved. No config change needed.
For consumers on claude.ai UI: add each vertical as a custom connector
using https://mcp-<vertical>.kscope.io/mcp/. Sign in with the email
your admin added to admin.users. Magic link, click, done.
2026-07-04 grok CLI compat — single-underscore aliases for bio__/sections__/tranche__ tools
bio_* sections_* tranche_*
For consumers: If you're calling this MCP from grok CLI / Composer 2.5 (which silently drops any tool whose qualified `<server>__<tool>` name contains `__` more than once), the 25 tools in the `bio__*` / `sections__*` / `tranche__*` families are now reachable via single-underscore aliases (`bio_*` / `sections_*` / `tranche_*`) that point at the same handlers. Existing double-underscore names still work — this is purely additive. Anthropic / Claude clients see both names in the catalog (mild bloat, ranks together in `discover_tools`); grok / Composer sees the single-underscore aliases as workable. Verify: `grok mcp doctor` should now report 85 workable tools (was 60 pre-fix). Public catalog on prod goes from 48 workable → 61 workable for grok clients.
Per company-scorer team-mail 2026-07-04. grok CLI (v0.2.82, Composer 2.5's
headless runner) qualifies MCP tools as <server>__<tool> and silently
drops any tool whose qualified name would contain __ more than once —
e.g. argos-dev__bio__pipeline has two __s, dropped with only a
stderr ERROR line the model never sees.
Fix: tools/__init__.py:grok_alias() maps <family>__<X> →
<family>_<X> for the three affected families (bio / sections / tranche).
server_http.py:create_app adds the alias entries to the tools dict
AFTER the DEV_ONLY filter runs, pointing at the same handler instances.
list_tools uses the dict key (not the tool's canonical name) so aliases
surface. BETA_TOOLS + TITLES + DEV_ONLY_FAMILIES all mirror the aliases
so beta-gating, titles, and dev-only-family filtering all stay consistent
regardless of which name the caller uses.
- Prod catalog: 48 → 61 workable tools for grok (public sections + tranche
aliases visible; bio stays dev-only). Public double-underscore names
still visible + callable for Anthropic / Claude clients.
- Dev catalog: 85 → 85 for Anthropic (60 unaffected + 25 canonical + 25
aliases = 110 total visible; discover_tools handles ranking).
grok sees 60 + 25 aliases = 85 workable.
2026-07-03 catalyst_calendar — +foreign_permit event_type (10th type; CNSC nuclear MVP)
catalyst_calendar
For consumers: New 10th `event_type`: `foreign_permit` — foreign government-approval calendar. MVP scope is CNSC nuclear licensing hearings (Canada), covering uranium/nuclear developers with a US ticker (NXE Rook I, DNN Wheeler River). `detail` carries `{regulator, sub_type, us_ticker, is_developer, applicant, matter, decision_class, estimated_decision, outcome}`. Snapshot-only routing (same as `cms_coverage` / `cms_star_ratings`). Uranium/energy angle — new sector for the calendar; broader jurisdictions may follow as catalyst_calendar expands.
Per catalyst_calendar team-mail 2026-07-03. Same three-line pattern
as cms_star_ratings: _EVENT_TYPES set + inputSchema enum + description.
Snapshot-only routing — does NOT enter history_types.
2026-07-03 thirteenf_holders PIT route — v3 accumulation signals + qoq_action now populated
thirteenf_holders thirteenf_holders_full
For consumers: PIT queries (passing `report_date=`) now carry the same v3 Layer-3 signals the Qdrant latest-quarter path had — top-level `consecutive_accum_qtrs`, `consecutive_dist_qtrs`, `accel_4q`, `avg_position_value`, `is_cluster_entry`, `is_cluster_exit`, `is_quiet_accumulation`, `corporate_action_suspect`. Each holder in the list also carries `qoq_action` ∈ {`new`, `exit`, `add`, `trim`, `unchanged`} mapped from `holdings_events`. Fixes the PIT-replay gap that was degrading backtest fidelity — replays match live workups now. `exit` doesn't appear on this response path by construction (exited holders aren't in the current-quarter holdings), and `qoq_action` may be null for holders with no state change recorded — LEFT JOIN semantic, entry stays sound.
Per smart_money team-mail 2026-07-03. Two LEFT JOINs added on the
PIT (report_date-specified) code path — same tables smart_money
populates for every historical (cusip, quarter) already; pure MCP-side
query wiring, no compute change on their side.
holdings_company_quarterly on (cusip, report_date): surfaces the
eight Layer-3 signals at the top level of the response.
holdings_events on (cik, cusip, report_date): surfaces per-holder
qoq_action (event_type → action label map: increase→add, decrease→trim,
the rest pass through).
For multi-cusip tickers, top-level Layer-3 signals pick the row with the
highest avg_position_value (single-cusip tickers are a no-op). For
multi-cusip holders where the same cik has divergent events under
different cusips, qoq_action picks the "loudest" event per materiality
precedence (exit > new > decrease > increase > unchanged) so a holder
doesn't disagree with themselves in the response.
WEX/2025-09-30 verify case from smart_money's spec smoked live:
consecutive_accum_qtrs=1, is_cluster_entry=true, is_cluster_exit=true,
corporate_action_suspect=false; qoq_action populates on the holders
list (trim / add / new / unchanged; exit is structurally absent — it
would require the holder to NOT appear on the response path).
Caveat still applies from smart_money 2026-06-12: late RESTATEMENT
amendments can retroactively change historical answers under as_of.
Rare (~3.4K amendments corpus-wide, mostly old).
2026-06-28 catalyst_calendar — +cms_star_ratings event_type (9th type)
catalyst_calendar
For consumers: New 9th event_type: `cms_star_ratings` — annual CMS Medicare Advantage Star Ratings release (forward ~October), per public insurer (UNH/HUM/CVS/ELV/CNC/MOH/ALHC/CLOV). Detail carries overall stars + YoY + 4.0-cliff proximity. Snapshot-only (no history table — same routing as `cms_coverage`/`debt_maturity`/`clinical_readout`).
Per catalyst_calendar team-mail 2026-06-28 (second batch — bundled with
their data ship per "our learning" from yesterday's enum-lag). Data
already live on proc2.catalyst_calendar_snapshot (8 rows). One-line-tier
fix mirroring the earlier device + cms_coverage batch.
2026-06-28 catalyst_calendar — 3 new event_types: device_panel, device_pma, cms_coverage
catalyst_calendar
For consumers: Three new event_types accepted by `catalyst_calendar`: `device_panel` (FDA device advisory committees), `device_pma` (device PMA approvals + projected forward decisions), `cms_coverage` (Medicare coverage events — granted/denied/restricted/delayed/pending). Same common record shape, `detail` jsonb passes through per type. PIT routing: device_panel + device_pma read snapshot OR history (same as pdufa+adcom); cms_coverage is snapshot-only (same as debt_maturity + clinical_readout — no history table for CMS).
Per catalyst_calendar team-mail 2026-06-28. Data was already live on
proc2.catalyst_calendar_snapshot (device data also in
catalyst_calendar_history); the gap was purely the tool's input-schema
enum rejecting the new strings at input validation before the query
ran. Three-line fix:
_EVENT_TYPES set: +device_panel, +device_pma, +cms_coverage
history_types intersection: +device_panel, +device_pma (cms_coverage
stays snapshot-only)
- inputSchema enum: +device_panel, +device_pma, +cms_coverage
Description block now lists eight event types (was five) with per-type
data-layer notes.
Unblocks futures' device-PMA triage (WALD/NPCE/AORT) + the device replay
battery + the CMS coverage screen.
2026-06-23 Durable per-call audit log — JSONL to /var/log, daily rotation
For consumers: Every tool call you make is now logged to a durable JSONL file separate from the systemd journal. Schema: ts / ts_iso / env / email / kind / tool / args (preserved as JSON object) / ok / error / latency_ms. Files keep forever (no auto-delete); daily rotation at UTC midnight. If your persona makes high-volume calls and you want a query path beyond `jq`, ping kee — we can add a /audit?email=...&since=... admin endpoint. Tool args are written verbatim with no PII redaction; flag this if you put sensitive query text in args.
Compliance-grade audit logging on both servers. Files:
- prod:
/var/log/argos-mcp/argos-mcp-prod.jsonl (+ rotated .YYYY-MM-DD)
- dev:
/var/log/argos-mcp-dev/argos-mcp-dev.jsonl
Each line is one tool call: timestamp, email (or *break-glass* for static
bearer), tool name, full args, success/failure, error class, latency_ms.
Three audit points per call: gate denial, unknown-tool, success-or-exception
with real latency.
Query patterns (jq-based):
# Every call by a specific user today
jq -c 'select(.email == "user@example.com")' < argos-mcp-prod.jsonl
# Failed calls only
jq -c 'select(.ok == false)' < argos-mcp-prod.jsonl
# Calls that mention VRTX anywhere in args
jq -c 'select(.args.ticker=="VRTX" or (.args.tickers // [] | index("VRTX")))' < argos-mcp-prod.jsonl
Failure mode: audit-write failures emit a journal warning and drop the
audit line — never crash a tool call. Audit must not be load-bearing on
the request path.
Caveat: tool args are written verbatim. No PII redaction. Fine for internal
compliance; needs a redaction pass before external audit sharing.
2026-06-19 Atlas — REITs added to atlas_tickers + has_corporate_filings filter
resolve_company_name get_fundamentals screen_companies search_activist_positions
For consumers: AMT, SPG, O, PLD, BMO (REITs) now resolve via Atlas ticker→CIK lookup. New Qdrant payload field `has_corporate_filings` (boolean) — filter to True if you want to exclude 13F-only filers like OZK / PFBC that show up under SEC `company_tickers.json` but only file 13F-HR / SC 13G. PFBC was also reclassified `preferred` → `stock`.
Atlas's atlas_tickers Qdrant collection now includes REITs
(entity_type='reit') — 9,664 → 9,983 points. Sample: AMT 1053507 reit / O / PLD / SPG.
New payload field has_corporate_filings (boolean): true iff the CIK
has at least one 10-K/Q / 8-K / 20-F / 40-F / S-1/3/4/11 (or /A) filing
in the SEC accessions index. OZK and PFBC are false (their SEC-mapped
CIKs only file 13F-HR / SC 13G via alternate CIK chains).
Transient bug heads-up: ~523 tickers were wrongly flagged dead overnight
June 18→19 (Form 25-NSE per-security redemption miscount); fixed
atlas-side ~13:30 UTC June 19. If you ran resolution between ~00:30
and ~13:00 UTC June 19 and saw missing AMT/O/PLD/BMO, it's resolved now.
2026-06-18 Atlas — 2,189 mega-caps unstuck from "dead_with_data"
screen_companies resolve_company_name get_company_profile search_activist_positions
For consumers: If you were filtering by `status='active'` and missing AAPL / MSFT / NFLX / SCHW / ABBV / AAL (and 2,180 others) since April, they're back. 14 ticker-reuse renames also corrected — BK now resolves to BNY Mellon CIK 1390777 (not the old BANK OF NEW YORK CO). NFLX and SCHW had been miscategorized entity_type=etf, now stock.
A reconciler had a hardcoded date still_trading = end_date >= "2026-03-01"
that flipped 2,189 ticker'd CIKs to still_trading=False on 2026-04-07.
An overprotective guard in update.py then prevented resurrection.
Combined: AAPL, MSFT, etc. stuck in "dead" state for two months. Fixed at
the source (rolling 30-day cutoff + resurrection-allowed). No MCP-side
code change required.
2026-06-18 catalyst_calendar — history now mirrors snapshot exactly; evidence + date_range + adcom + projected surface
catalyst_calendar
For consumers: PIT-replay queries through history now carry real `evidence` text (governing source narrative) and proper `date_range` bounds — previously these were always NULL on history reads. New `event_type='adcom'` for filtering FDA AdCom meeting dates separately from pdufa. New `status='projected'` for v1.5 calibrated PDUFA windows. History rebuilt through `build_calendar` so phantom guards (CORT relacorilant) and cross-CIK collapses (SNSE→CELC) now auto-inherit into replay.
Per catalyst team's NOTE_FOR_MCP_HISTORY_MIRRORS_BUILD_2026-06-18.
catalyst_calendar_history rebuilt through build_calendar, auto-inheriting
every build-layer guard. Three additive columns on history table now wired
into our reader: date_range_start, date_range_end, evidence. Two new
enum values: event_type='adcom' and status='projected'.
Spec-verified: event_types=['adcom'] as_of=2024-06-30 → 5 rows with real
evidence text (PRGO Advisory Committee on Nonprescription Drugs, BCLI
NurOwn ALS, VANI September 2023 PADAC). Forward pdufa regression unchanged.
2026-06-18 Two MCP servers — dev / prod split
For consumers: Engineering iterates on mcp.staticpipe.com; sales-managed mcp.kscope.io is the customer-facing surface. Bio + sec_power + mars tools live only on the dev URL. Update your config to point at dev if you need those; prod's catalog is sales-curated and stable.
Two MCP servers now: mcp.staticpipe.com (dev, engineering's
iteration target) and mcp.kscope.io (sales-managed, customer-facing).
Active development on bio + sec_power + mars happens on dev and
graduates to prod only when sales-approved. Branch isolation between
dev and master plus an ARGOS_ENV runtime gate makes accidental
prod leaks hard.
2026-06-17 Per-user tool entitlements via proc2.admin.users.tool_access
For consumers: Customer access to gated tool families (bio, mars, sec_power, sedar, news, adv) is now per-user via the admin UI. `tool_access=[]` means public catalog only (always-on), NOT "no tools." Adds on top of public.
Adrian's admin UI can now grant per-customer access to gated tool
families via proc2.admin.users.tool_access (jsonb array of patterns
like ["bio__*", "sedar_*"]). Additive — never replaces public.
2026-06-17 News + ADV moved out of the public catalog BREAKING
search_news search_news_articles adv_manager_profile adv_manager_raum_trend adv_screen_managers adv_manager_fees adv_raum_decliners adv_manager_disciplinary_detail
For consumers: 8 tools moved from public to premium-gated. If your persona uses `search_news*` or `adv_*` on the prod URL and the customer doesn't have an explicit grant, those tools no longer appear in list_tools. Personas using the dev URL aren't affected (full catalog there).
The 2 news tools + 6 ADV tools moved out of the public catalog. Grant
via search_news* / adv_* patterns through Adrian's admin UI.
2026-06-15 macro_calendar + macro_series
macro_calendar macro_series
For consumers: FRED release calendar + ALFRED PIT vintages. 44 series with full first-print revision history. UNRATE 2020-04-01 returns 14.7 at as_of=2020-05-15 (first print) vs 14.8 today (revised). Pair with catalyst_calendar for the macro+catalyst calendar story.
FRED release calendar + ALFRED PIT vintages — 44 series, full
revision history. UNRATE 2020-04-01 returns 14.7 at as_of=2020-05-15
(first print) vs 14.8 today (revised).
2026-06-14 catalyst_calendar — PDUFA / IPO lockup / debt maturity / clinical readout
catalyst_calendar
For consumers: Unified dated-catalyst record across 4 event types. PDUFA confidence is calibrated vs Drugs@FDA at conf>=0.9 (medAE 5 days). PIT routing handled internally — pass `as_of` for past replays, get history-table reconstruction; current/forward queries hit the snapshot.
PDUFA / IPO lockup / debt maturity / clinical readout in one uniform
dated-catalyst record. Calibrated PDUFA confidence vs Drugs@FDA
(medAE 5 days). PIT routing: past as_of → history table; current /
forward → snapshot.
This is the production MCP server.
First connection triggers an OAuth magic-link flow; subsequent calls use a 30-day JWT.
Auto-generated from the registered tool dict at server startup. Restart to refresh.