You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit b7b222b
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: .claude-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
{
2
2
"name": "factiq",
3
3
"description": "Answer economic and financial data questions with real data from FactIQ — official statistics, market data, earnings-call transcripts, executive media appearances, central-bank speeches and minutes, a curated business-news feed, and satellite-derived data (nighttime lights, shipping and port activity, reservoir levels, crop fires and wildfires with mappable footprints, NO2/SO2/CO activity, smoke and dust aerosol, monsoon rainfall) — return sourced answers, chart JSON, or report JSON.",
Copy file name to clipboardExpand all lines: .codex-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
{
2
2
"name": "factiq",
3
3
"description": "Answer economic and financial data questions with real FactIQ data — official data, markets, earnings calls, executive media appearances, central-bank documents, and satellite-derived signals including crop fires and wildfires — then return sourced answers, chart JSON, or report JSON.",
Copy file name to clipboardExpand all lines: skills/factiq/SKILL.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -119,7 +119,7 @@ All FactIQ tools are MCP tools provided by the `factiq` MCP server.
119
119
| `search_company_filings` (`company`, `query?`, `concept?`, `search_target?`, `report_type?`, `fiscal_year?`, `fiscal_period?`, `metric_class?`, `segment?`, `date_from?`, `date_to?`, `active_only?`, `format?`, `limit?`) | The central tool for company filings. Deterministic (no model) search over the structured facts and report metadata in one company's filed reports, for every company FactIQ covers: US SEC filers (10-K, 10-Q, 8-K, plus 20-F/40-F/6-K for foreign filers) and companies listed in Germany (annual, half-year, Q1, and Q3 reports, values in EUR — e.g. `company="BAS"` for BASF SE), the UK (`ULVR` for Unilever plc), France (`MC` for LVMH), Switzerland (`NESN` for Nestlé), and India (the Nifty 50 companies, from their NSE quarterly results and annual reports — `RELIANCE` for Reliance Industries; an Indian company's Q4 results hold its audited full year). Use an exact ticker; a share-class sibling (GOOGL for GOOG) resolves to the same filer; a German, UK, French, or Swiss company resolves by its local ticker, full name, or LEI, and carries its exchange suffix (MC.PA, BA.L, ROP.SW) when the bare symbol also belongs to a US filer; an Indian company resolves by its NSE symbol (RELIANCE, M&M), the same symbol with `.NS`, its BSE scrip code, or its full name; an ambiguous name comes back with `possible_matches`. Start with `search_target="coverage"` to see which report types, periods, and metric classes exist. Then set `concept` to one metric name (`"revenue"`, `"net income"`) to get that concept's values across periods, or use `search_target="metrics"` to list stored concepts and `"facts"` for reported values. `query` is a lexical text search across concept names, source labels, aliases, and segment names; narrow with `metric_class` (`financial`, `ifrs`, `segment`, `geography`, `product`, `kpi`, `apm`, `guidance`), `segment`, `report_type` (`annual`, `quarterly`, `half_year`, `10-K`, `10-Q`), `fiscal_year` + `fiscal_period` (`2025`, `Q3`), or `date_from`/`date_to`. Every result is a tree: company → metric class → concept → series → period. With `format="json"`, filing/fact nodes retain the report URL and add a standardized `source_link`; exact-ticker metrics/facts misses may fall back to standardized statements with no filing evidence. `format="pretty"` returns a rendered text tree instead of JSON. When a company reports the same concept twice in one filing, the second copy is labeled "Reported line 2" — never add it to the first. Results stop at `limit` (max 50) with `truncated: true`; narrow the filters rather than paging. For joins or aggregations across companies over the same archive, use `run_sql` on the `filings` schema (open to every account; tables in `references/data/schemas.md`). |
120
120
| `search_earnings_transcripts` (`query`, `search_target?`, `ticker?`, `company_name?`, `quarter_filter?`, `claim_family?`, `section?`, `detail?`, `limit?`) | Lexical (not semantic) retrieval over atomic, quote-anchored earnings-call rows — never a raw transcript dump. Tickers go in `ticker` and company names in `company_name`; pass one of the two, never both (both ignore case; a name in `ticker` is still read as a name, and the response says so). `company_filter` is the old name of `ticker` and still works. Companies listed in India carry the NSE suffix (`RELIANCE.NS`, `TCS.NS`); a plain NSE symbol is also accepted and reported in `read_as_exchange_symbol`, but a symbol that is also a US ticker (`INFY`) selects the US listing, so pass `INFY.NS` for the NSE one. Companies listed in Switzerland carry `.SW` (`NESN.SW`, `ROP.SW`) and follow the same rules (`ROP` is Roper Technologies; Roche is `ROP.SW`); their half-year calls are Q2 and full-year calls Q4. For a non-empty `query`, strict websearch matches rank above an automatically broadened loose partial-match OR-of-tokens tier, so lower-ranked rows may match only some terms; trigram fallback runs only when full-text search returns no rows. Inspect every row for support and retry concise company-native vocabulary (`"capital expenditure"`, `"capex"`, segment names) before concluding lexical silence. For one-call notes, first use `search_target="coverage"`, choose its exact returned `latest_period`, then browse `claims` with `query=""`, that ticker + `quarter_filter`, `detail=true`, and a deliberate limit; fetch `pressure_points` with the same ticker and quarter. The browse is capped, not a promise of a complete call. Claim and pressure rows include `transcript_id`, `source_block_index`, `qa_turn_id`, and `source_link`; `source_link.source_label` names the company or ticker, fiscal period, and earnings call transcript, never the ingestion vendor. Quote only `verbatim_quote`, preserving any `[…]` omission marker exactly; `canonical_statement` is normalized, and neither `analyst_hypothesized` nor `mgmt_declined_to_confirm` is a management assertion. For filed actuals use `search_company_filings`; for formal targets use `sec_guidance`. Full target/filter reference and workflows: `references/report-patterns/earnings-intelligence.md`. |
121
121
| `search_media_appearances` (`query`, `search_target?`, `company?`, `person?`, `sort?`, `appearance_type?`, `claim_family?`, `date_from?`, `date_to?`, `detail?`, `limit?`, `offset?`, `institution?`, `country?`, `show?`, `channel?`, `company_filter?`) | Deterministic, lexical retrieval over precomputed public-safe paraphrases of what was said on podcasts, TV interviews, and at conferences outside earnings calls, and of what central banks and monetary authorities published from late 2025 onward: speeches, interviews, blog posts, policy statements, press releases, meeting minutes, press-conference transcripts, testimony before legislatures, and reports from the Federal Reserve Board and the regional Reserve Banks, the European Central Bank, the Bank of England, the Bank of Japan, the Reserve Bank of India, the People's Bank of China, the Bank of Korea, the Hong Kong Monetary Authority, Taiwan's central bank, and the national central banks of the euro area and other EU members. A document written in another language yields English paraphrases; its title may stay in the source language. The speakers are company executives, investors, fund managers, analysts, economists, journalists, central-bank officials, and other guests, and their claims cover listed and unlisted companies (OpenAI, DeepSeek, MiniMax), institutions (central banks, regulators), and whole markets and industries, not only the speaker's own employer; **no serving-time model** interprets or expands the query. Strict lexical FTS runs first, loose any-term FTS only when strict finds no candidates, and trigram fallback only when both FTS stages are empty. Prefer concise topical language and retry company-native synonyms before concluding silence. Targets are `search` (default claims + passages blend), `claims`, `passages`, `pressure_points`, `appearances`, and `coverage`. `sort="relevance"` ranks lexical score before publication date; `sort="newest"` ranks publication date before lexical score. `company` takes comma-separated tickers and company names together (`"NVDA,OpenAI,Federal Reserve"`): a value that is a stored ticker matches by ticker, and any other value is matched as the name of a company, institution, or organisation a section is about, ignoring punctuation, a leading "The", and corporate suffixes (`"NVIDIA Corp."` finds NVIDIA; `"Alphabet"` also reaches GOOGL rows). Each result records `company_tickers`, `company_names`, `company_matched`, and `company_unmatched`; a name that matches nothing returns no rows plus up to five possible matches under `company_unmatched`, not an error, so retry with one of them. The `appearances` and `coverage` targets also match every value, upper-cased, against the entity references of claims (products, rivals, partners such as `"CUDA"`); a value found only there is listed under `company_references`, and alternate spellings can return different `appearances` or `coverage` rows because reference names are matched exactly (`"open ai"` and `"OpenAI"` select the same subject but not the same references); the claims rows are the same. `company_filter` is the old name of `company` and still works, but do not pass both. `company` matches what a claim is about, not who published it: `company="European Central Bank"` also returns a Bank of England speech about the ECB. To select a publisher, use `institution`, a case-insensitive substring of the institution that published an official document (`"Bank of Japan"`, `"Bundesbank"`), or `country`, the ISO code of its jurisdiction (`"US"`, `"IN"`, `"EU"` for the European Central Bank); either one restricts every target to official documents, and `coverage` then returns one `UNATTRIBUTED` row with the document count, date span, and claim count because official documents carry no ticker. `person` is a case-insensitive speaker-name substring; `show` is a case-insensitive substring of a podcast show name (`"Odd Lots"`) and returns only podcast episodes; `channel` is a case-insensitive substring of a YouTube channel name (`"Bloomberg Television"`) and returns only YouTube videos; when more than one of `show`, `channel`, and `institution` is given, rows that match any of them are returned (`show="Bloomberg", channel="Bloomberg"` returns Bloomberg podcast episodes and Bloomberg YouTube videos in one call); `coverage` lists the stored show and channel names for each company, so read it first when the exact name is unknown; `appearance_type`, `claim_family`, inclusive `date_from`/`date_to`, `detail`, and `limit` provide further narrowing. `limit` is one page of 1-50 rows and `offset` skips that many ranked rows before it; every result carries `has_more`, and `next_offset` when more rows follow, so repeat the call with `offset=next_offset` to read the next page of the same ranking. `appearance_type` values are `podcast`, `tv_interview`, `conference`, and `other` for interviews, and for official documents `speech` (also blog posts and opening remarks), `tv_interview` (published interviews), `statement` (also implementation notes), `minutes` (also summaries of opinions), `press_conference`, `testimony`, `hearing`, and `other` (press releases, reports, projections). Dates are the video's publication/upload date, not necessarily its recording/event date; an official document also carries `event_date`, the date of the meeting, speech, or hearing it belongs to (FOMC minutes are published about three weeks after the meeting they describe). `claim_family` makes blended search claims-only, is invalid with `passages`, and requires matching claims for catalog targets. Structured finding rows expose `result_kind`, `canonical_paraphrase`, speaker/topic/video metadata, relevance, and `source_url`: a timestamped YouTube URL for a video, the episode page for a podcast, or the document page for an official document (a PDF transcript links to the page, `...pdf#page=4`); for an official document, `channel` is the institution name. `appearances` returns video-level metadata, attribution, matching-claim count, URL, relevance, and `institution`, `document_kind`, and `event_date` (null on interview rows); `coverage` returns company-level structured corpus counts and date/channel inventory. `detail=true` adds normalized claim/attribution fields plus `institution`, `document_kind`, and `event_date` to finding rows, but never raw transcript text or evidence spans; claim-only fields remain null on passages and detail does not change catalog rows. Never put `canonical_paraphrase` in quotation marks or claim it is verbatim; follow the timestamped or document source when exact wording or tone matters. In a press-conference transcript, a row whose speaker is `Questioner` is a journalist's question, not the institution's position. Empty-query behavior and the complete workflow are in `references/report-patterns/media-intelligence.md`. |
122
-
| `search_news` (`query?`, `tickers?`, `topic?`, `sources?`, `start_date?`, `end_date?`, `sort?`, `limit?`) | Search FactIQ's curated business-news feed — public RSS headlines and summaries from Bloomberg, the Financial Times, and the Wall Street Journal, plus India-macro (Zerodha Daily Brief, ET HealthWorld) and global-health sources (WHO, ECDC, CDC, STAT News, KFF), aggregated and processed by FactIQ so each article carries the listed companies it names (`{symbol, exchange, country}`) and an `analysis` block: searchable keywords, a geography, and an `angle` — one sentence on why the story matters to an investor. Company stories get analysis too, not just macro ones; only content with no business read at all (sports, lifestyle, celebrity) comes back with `analysis: null`. Results are headline + short publisher summary + link out, never full articles. `query` is lexical full-text over headline+summary — start with short concrete stems (`"obesity drug"`, `"rate cut"`); if a multi-word query matches nothing in full, the tool automatically retries matching ANY of the words with rare words ranked first, flagged as `meta.query_mode: "any_term"`, so one query attempt is usually enough. `tickers` matches share classes and cross-listings automatically (GOOG also finds GOOGL-tagged articles, TSM its Taiwan listing) — pass whichever symbol you know; most macro stories name no listed company, so zero ticker matches is a normal answer. `topic` is one of markets / economics / companies / technology / politics / world / energy / health / india / opinion — combined with a `query` it is a ranking preference (matching sections rank first, but strong matches from other sections still return, since stories often run outside their obvious feed); without a query it filters to the topic's feeds. `sort` is `"latest"` (default) or `"relevance"` (needs a query); `limit` 1–50 (default 20). Coverage is recent news (most feeds start late 2025) — treat it as a current-events lens, not an archive. |
122
+
| `search_news` (`query?`, `tickers?`, `topic?`, `sources?`, `start_date?`, `end_date?`, `sort?`, `limit?`) | Search FactIQ's curated business-news feed — public RSS headlines and summaries from Bloomberg, the Financial Times, and the Wall Street Journal, plus India-macro (Zerodha Daily Brief, ET HealthWorld) and global-health sources (WHO, ECDC, CDC, STAT News, KFF), aggregated and processed by FactIQ so each article carries the listed companies it names (`{symbol, exchange, country}`) and an `analysis` block: searchable keywords, a geography, and an `angle` — one sentence on why the story matters to an investor. Company stories get analysis too, not just macro ones; only content with no business read at all (sports, lifestyle, celebrity) comes back with `analysis: null`. Results are headline + short publisher summary + link out, never full articles. `query` is lexical full-text over the headline, the publisher summary and the article's `analysis` fields (keywords, geography, angle), so a subject that an article covers without naming it in the headline still matches — start with short concrete stems (`"obesity drug"`, `"rate cut"`, `"ai governance"`); if a multi-word query matches nothing in full, the tool automatically retries matching ANY of the words with rare words ranked first, flagged as `meta.query_mode: "any_term"`, so one query attempt is usually enough. `tickers` matches share classes and cross-listings automatically (GOOG also finds GOOGL-tagged articles, TSM its Taiwan listing) — pass whichever symbol you know; most macro stories name no listed company, so zero ticker matches is a normal answer. `topic` is one of markets / economics / companies / technology / politics / world / energy / health / india / opinion — combined with a `query` it is a ranking preference (matching sections rank first, but strong matches from other sections still return, since stories often run outside their obvious feed); without a query it filters to the topic's feeds. `sort` is `"latest"` (default) or `"relevance"` (needs a query); `limit` 1–50 (default 20). Coverage is recent news (most feeds start late 2025) — treat it as a current-events lens, not an archive. |
123
123
|`get_style_guides` (`guides`) | FactIQ house-style guides (`"chart"`, `"report"`, `"sql"`, `"earnings"`, or `"all"`). Use these for current style and sourcing rules. Fetch `"earnings"` before writing from `search_earnings_transcripts`. |
124
124
125
125
When an answer uses a quote or filing-backed figure, place that row's provided
0 commit comments