Financial data and research MCP for US/CN/JP equities: filings, statements, ownership, signals.
ai.drillr/drillr — Financial MCP Server
The ai.drillr/drillr server is a financial Model Context Protocol (MCP) backend for AI agents. It provides access to 90+ financial tables, including SEC filings, signals, and alt-data, to support market scanning and research workflows. It is distributed under the MIT license and exposes an MCP and REST API.
🛠️ Key Features
90+ financial tables
SEC filings access
Financial signals and alt-data
Tooling provided via MCP (toolCount: 9)
🚀 Use Cases
Scanning markets for agent-driven research
Tracking and citing signals and related claims
Using SEC filings alongside table-based financial data
⚡ Developer Benefits
MCP availability (Streamable HTTP)
REST API documented in docs/rest-api.md
Tools documented in docs/tools.md
⚠️ Limitations
Tooling count is listed as 9 (details beyond that are not provided here)
Use to discover which SEC filings exist for a ticker before searching content.
For the actual content use filing_search instead.
List indexed SEC filings for a given ticker with a summary header.
Returns: summary (period coverage, per-type counts) + table of up to 50 filings
(fiscal_year, fiscal_quarter, filing_type, filing_date, period_start, period_end).
filing_types filter: omit for main reports only (US 10-K/10-Q/20-F/S-1/DEF 14A
+ /A amendments; JP 120/140/160; A-share annual_report / quarterly_report /
q1_report; excludes ad-hoc 8-K/6-K); pass [] for all indexed types; pass explicit
allowlist to override.
Parameters2
ticker
string
required
Stock ticker, e.g. NVDA, 6758.T, 00700.HK, 600519.SH
filing_types
array
optional
Filter by filing type. Omit for default (periodic reports + IPO/shelf registrations + amendments; excludes ad-hoc disclosures). Pass [] for all indexed types. Pass an explicit allowlist to override — use values from the `filing_type` column of a prior unfiltered call.
Raw schema
{
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "Stock ticker, e.g. NVDA, 6758.T, 00700.HK, 600519.SH"
},
"filing_types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter by filing type. Omit for default (periodic reports + IPO/shelf registrations + amendments; excludes ad-hoc disclosures). Pass [] for all indexed types. Pass an explicit allowlist to override — use values from the `filing_type` column of a prior unfiltered call."
}
},
"required": [
"ticker"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
filing_search
Search one company's SEC filings. Returns `## Facts` (exact as-reported and restated financial values) and `## Passages` (matching filing text) — both come back in one call.
`ticker` is REQUIRED. When `## Facts` is empty, read `## Passages` — the figure is usually stated in the filing text.
`period_start`/`period_end` match by interval overlap; `fiscal_period` sets granularity (Q1..Q4/H/9M/FY). Pass an explicit period window for the most recent figure.
Parameters8
query
string
required
Natural-language financial metric query
ticker
string
required
Required. Canonical or historical ticker; one only. Resolve company names with ticker_lookup first
period_start
string
optional
Calendar start date YYYY-MM-DD (calendar, not fiscal; resolve fiscal periods via financial_statements period_start/period_end)
period_end
any
optional
Calendar end date YYYY-MM-DD (calendar, not fiscal)
as_of
any
optional
Publication cutoff date YYYY-MM-DD. Rows with missing published_at still appear; not a strict point-in-time snapshot
top_k
integer
optional
Max results; 1-30, default 10
period_type
string
optional
instant or duration
fiscal_period
any
optional
Q1 | Q2 | Q3 | Q4 | H | 9M | FY, or a list of those
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Natural-language financial metric query"
},
"ticker": {
"type": "string",
"minLength": 1,
"description": "Required. Canonical or historical ticker; one only. Resolve company names with ticker_lookup first"
},
"period_start": {
"type": "string",
"description": "Calendar start date YYYY-MM-DD (calendar, not fiscal; resolve fiscal periods via financial_statements period_start/period_end)"
},
"period_end": {
"$ref": "#/properties/period_start",
"description": "Calendar end date YYYY-MM-DD (calendar, not fiscal)"
},
"as_of": {
"$ref": "#/properties/period_start",
"description": "Publication cutoff date YYYY-MM-DD. Rows with missing published_at still appear; not a strict point-in-time snapshot"
},
"top_k": {
"type": "integer",
"minimum": 1,
"maximum": 30,
"description": "Max results; 1-30, default 10"
},
"period_type": {
"type": "string",
"enum": [
"instant",
"duration"
],
"description": "instant or duration"
},
"fiscal_period": {
"anyOf": [
{
"type": "string",
"enum": [
"Q1",
"Q2",
"Q3",
"Q4",
"H",
"9M",
"FY"
]
},
{
"type": "array",
"items": {
"$ref": "#/properties/fiscal_period/anyOf/0"
},
"minItems": 1,
"maxItems": 7
}
],
"description": "Q1 | Q2 | Q3 | Q4 | H | 9M | FY, or a list of those"
}
},
"required": [
"query",
"ticker"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
company_search
Use for qualitative company discovery (industry, business model, supply chain, competitors, management background). For numerical screening (revenue, margins, ratios, growth rates) use run_sql on company_snapshot instead.
Drillr's company knowledge graph — searchable across industry classification, product offerings, business model, segment structure, competitive landscape, supply chain, management background, and customer profile.
Coverage: US, Japan, Hong Kong, China A-shares, and Korea. `market` accepts one lowercase value or a list from `us | jp | hk | cn | kr`; omit it or pass `[]` for all five. List order does not set priority.
Pass a natural-language description (for example, "Hong Kong and China EV battery suppliers"). Returns a structured list of matching companies with context snippets.
ONLY for finding a LIST of companies by description.
Parameters2
query
string
required
Natural-language company description
market
any
optional
Optional market filter. Pass one lowercase value or a list from 'us' | 'jp' | 'hk' | 'cn' | 'kr'. Omit or pass [] for all five; list order does not set priority.
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Natural-language company description"
},
"market": {
"anyOf": [
{
"type": "string",
"enum": [
"us",
"jp",
"hk",
"cn",
"kr"
]
},
{
"type": "array",
"items": {
"$ref": "#/properties/market/anyOf/0"
},
"maxItems": 5
}
],
"description": "Optional market filter. Pass one lowercase value or a list from 'us' | 'jp' | 'hk' | 'cn' | 'kr'. Omit or pass [] for all five; list order does not set priority."
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
ticker_lookup
Resolve a company name, brand, or ticker substring to canonical ticker(s).
Input:
- query (required): company name, brand, or ticker substring, e.g. "Apple", "AAPL", "OpenAI"
- market (optional): "us" | "jp" | "cn" — omit to search all markets
Returns up to 5 matches ranked by prefix-hit first, then name length; symbols carry their market suffix.
Parameters2
query
string
required
Company name or ticker substring (case-insensitive). Matches historical names + tickers too.
market
string
optional
Optional market filter: 'us' | 'jp' | 'cn'. Omit to search all markets.
Column definitions (name, type, description) for a data table, plus its usage note where one exists: required filters, ticker format, and market coverage.
List alternative-data tables under the given categories. Returns each table's name,
one-line purpose, and column names (call get_table_schema if you need column
types/comments). Batch up to 5 categories in one call; omit categories, or pass ["all"], to
get the category index instead.
Use this BEFORE run_sql when you want to explore alt-data — run_sql alone won't
tell you which tables exist.
Available categories:
- Energy & Power — US power plants, electricity prices, regional hourly generation/demand
- Data Centers — facilities, GPU clusters, cooling
- Semiconductors — AI chip specs, sales, ownership, foundry revenue, customs trade
- Compute Pricing — GPU rental, cloud VM spot/on-demand, instance specs
- Model Development — model specs, benchmarks, AI companies, AI polling, LLM arena
- Inference Economics — LLM API pricing across providers
- Macro & Trade — UN Comtrade, US Census trade flows, FRED macro series
- Prediction Markets — Polymarket and Kalshi events, markets, trades, daily aggregates
- Critical Minerals — USGS mineral deposits, country supply, critical materials
Parameters1
categories
array
optional
Altdata category names (see tool description for the list). Omit, or pass "all", for the category index.
Use for any news, event, development, or statement question about a company,
theme, or the market. The `ticker` filter takes exchange-suffixed symbols.
Returns Markdown: a `## Stories` numbered list (each storyline once), then flat
`## Events` and `## Claims` tables (claims = attributed statements: analyst
actions, corporate guidance, central-bank remarks). The Events `story` column
refers back to the Stories number. `sources` counts corroborating reports;
`first_reported`/`last_reported` give the reporting span. Lowest-ranked stories
are dropped to fit length; the meta line flags how many were omitted.
At least one of query/theme/ticker/since/until is required. Per-parameter detail
is on the input schema — search_type=claims needs query/ticker/a time window,
not theme.
Parameters8
query
string
optional
Semantic query (English). One of query/theme/ticker/since/until required.
theme
string
optional
Theme word, resolved to the nearest canonical theme. Not valid with search_type=claims.
ticker
any
optional
Exact ticker symbol(s) — a single symbol, an array, or a comma-separated string; multiple tickers are an OR/overlap filter. Exchange-suffixed (AAPL, 7203.T, 600519.SH). Company names/brands are NOT resolved here.
since
string
optional
ISO8601; filter time_event >= since.
until
string
optional
ISO8601; filter time_event < until.
search_type
string
optional
all (default) | events | claims (opinions/statements only).
order_by
string
optional
Result ordering. relevance (default) | event_time (newest event time first) | create_time (most recently ingested first).
top_k
integer
optional
Story count. Default 10, max 50.
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Semantic query (English). One of query/theme/ticker/since/until required."
},
"theme": {
"type": "string",
"description": "Theme word, resolved to the nearest canonical theme. Not valid with search_type=claims."
},
"ticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Exact ticker symbol(s) — a single symbol, an array, or a comma-separated string; multiple tickers are an OR/overlap filter. Exchange-suffixed (AAPL, 7203.T, 600519.SH). Company names/brands are NOT resolved here."
},
"since": {
"type": "string",
"description": "ISO8601; filter time_event >= since."
},
"until": {
"type": "string",
"description": "ISO8601; filter time_event < until."
},
"search_type": {
"type": "string",
"enum": [
"all",
"events",
"claims"
],
"description": "all (default) | events | claims (opinions/statements only)."
},
"order_by": {
"type": "string",
"enum": [
"relevance",
"event_time",
"create_time"
],
"description": "Result ordering. relevance (default) | event_time (newest event time first) | create_time (most recently ingested first)."
},
"top_k": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Story count. Default 10, max 50."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
industry_inflections
Search industry inflections identified through structured research of earnings calls held by US-listed companies, including the change mechanism, impact scope, market attention and affected companies.
All filters are optional and combine with AND. With no filters, returns the newest first page. Results are ordered by `quarter` descending. If nothing matches, returns the text `No relevant industry inflections found.`
Returns JSON as `{ "data": [...] }`. Every result contains `quarter`, `name` (English title), `regime_type` (change mechanism), `impact_scope`, `impact_degree` (`limited` | `significant` | `structural`), `attention_verdict` (market-absorption judgment), `change_summary`, `first_seen` (`YYYY-MM-DD`), and `source_tickers` (companies whose calls are primary evidence). When `impact_companies` is true, `company_impacts` contains items with `ticker`, `relation`, `direction`, `magnitude`, `impact_stage`, `evidence_status`, `affected_business`, and `impact`.
Parameters5
ticker
any
optional
Optional company filter, up to 10 US ticker symbols. Returns themes where any supplied ticker is a source company or an affected company. Use symbols such as AAPL, not company names.
keyword
string
optional
Optional case-insensitive text contained in the theme name or research summary, up to 200 characters.
limit
integer
optional
Results per page. Default 10, max 10.
page
integer
optional
One-based page number. Default 1.
impact_companies
boolean
optional
Include the per-company company_impacts list. Default false.
Raw schema
{
"type": "object",
"properties": {
"ticker": {
"anyOf": [
{
"type": "string",
"maxLength": 16,
"pattern": "^[A-Z0-9]+(?:[.-][A-Z0-9]+)*$"
},
{
"type": "array",
"items": {
"$ref": "#/properties/ticker/anyOf/0"
},
"minItems": 1,
"maxItems": 10
}
],
"description": "Optional company filter, up to 10 US ticker symbols. Returns themes where any supplied ticker is a source company or an affected company. Use symbols such as AAPL, not company names."
},
"keyword": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Optional case-insensitive text contained in the theme name or research summary, up to 200 characters."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Results per page. Default 10, max 10."
},
"page": {
"type": "integer",
"minimum": 1,
"description": "One-based page number. Default 1."
},
"impact_companies": {
"type": "boolean",
"default": false,
"description": "Include the per-company company_impacts list. Default false."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
ai_adoption
Search concrete enterprise AI applications disclosed in US company earnings calls. Filter by ticker, partially match a company name, search for an application or workflow by name, or use since in YYYY-MM-DD format to include only observations updated on or after that date. Returns a data array ordered by update_date descending. Each result contains ticker, company_name, application_name, first_report_date, update_date, summary (an AI application summary), evolution_summary, business_position, deployment_stage, deployment_scope, value_type, metrics (application-related metrics), and evidence (supporting management quotes, with speaker and section when available). Use this tool to identify where and how a company applies AI, assess deployment maturity, scope, and disclosed value, and inspect the supporting evidence. Use no filters to browse the most recently updated observations. No matches return an empty data array.
Parameters6
ticker
any
optional
Optional US ticker filter, up to 10 symbols. Accepts one symbol or a list. Company names are not resolved.
company_name
string
optional
Case-insensitive partial company-name match. Empty means no filter.
application_name
string
optional
Case-insensitive partial application-name match. Empty means no filter.
since
string
optional
Only return observations with update_date on or after this date. Use YYYY-MM-DD.
limit
integer
optional
Results per page. Default 10, max 10.
page
integer
optional
One-based page number. Default 1.
Raw schema
{
"type": "object",
"properties": {
"ticker": {
"anyOf": [
{
"type": "string",
"maxLength": 16,
"pattern": "^[A-Z0-9]+(?:[.-][A-Z0-9]+)*$"
},
{
"type": "array",
"items": {
"$ref": "#/properties/ticker/anyOf/0"
},
"minItems": 1,
"maxItems": 10
}
],
"description": "Optional US ticker filter, up to 10 symbols. Accepts one symbol or a list. Company names are not resolved."
},
"company_name": {
"type": "string",
"maxLength": 200,
"description": "Case-insensitive partial company-name match. Empty means no filter."
},
"application_name": {
"type": "string",
"maxLength": 200,
"description": "Case-insensitive partial application-name match. Empty means no filter."
},
"since": {
"type": "string",
"description": "Only return observations with update_date on or after this date. Use YYYY-MM-DD."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Results per page. Default 10, max 10."
},
"page": {
"type": "integer",
"minimum": 1,
"description": "One-based page number. Default 1."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
drillr · The financial data and research MCP for AI agents
Filings, statements, earnings, ownership, events, executives, analyst data, company discovery and research signals for US, China and Japan equities — every figure traced to the document it came from.
Browser sign-in, no API key to copy. One hosted Streamable HTTP endpoint, ten tools: turn a name or a description into tickers, list and search a company's filings (structured as-reported facts and the filed text), run read-only SQL over the financial tables, and pull research signals from earnings calls and news.
⭐ If drillr helps your agent, star us — that's how we know to keep building this in the open.
Please install the drillr MCP server for me and walk me through the sign-in: server drillr-data, url https://gateway.drillr.ai/mcp/data, auth browser OAuth. Use my client's own MCP command to add it. Per-client details: https://drillr.ai/developer/mcp-install.md
Claude Code
bash
claude mcp add --scope user --transport http drillr-data https://gateway.drillr.ai/mcp/data
Restart, run /mcp, pick drillr-data → Authenticate.
Cursor reads .cursor/mcp.json; VS Code reads .vscode/mcp.json with a top-level servers key; Claude Desktop takes the URL under Settings → Connectors → Add custom connector.
API-key fallback
For hosts without browser OAuth (Hermes, OpenClaw, self-built clients) or for REST: create an external key at drillr.ai/account/api-keys, keep it in a secret store, and add it as a bearer header on the same URL. Never configure OAuth and a static header on the same server entry.
"What does NVDA's latest 10-K say about supply commitments, and how did data-center revenue move over the last four quarters?"
The agent calls ticker_lookup if it only has a name, filing_list to see what is indexed, then filing_search — which returns as-reported facts (value, period, XBRL concept, accession number) and the passages they sit in, in one call.
For the quarterly series it calls run_sql on financial_statements.
You get an answer whose every number cites its filing. Typical round-trip 8–15 s.
The ten tools
Each tool has a page at https://drillr.ai/docs/mcp/<tool> with parameters, limits and error shapes; the server's tools/list carries the same descriptions. The set stays small on purpose: the agent composes them.
Semantic search over company and market news: storylines, events, attributed claims
0.2 cr
What the data is
Built by drillr from primary sources — filings taken from each market's official channel (SEC EDGAR, cninfo, EDINET) and parsed in house, what companies publish on the web (IR pages, earnings calls, news), and drillr's own estimates. No data vendor in between. Every reported figure links back to the passage it was filed in. Provenance per dataset: https://drillr.ai/docs/provenance.
Dataset
What is in it
How to reach it
Coverage
Company
Ticker resolution from any name, code, ISIN, CIK or CUSIP; discovery by description; profile (exchange, industry, listing date, website, headcount)
ticker_lookup, company_search; company_snapshot via SQL
US CN JP (discovery + HK KR)
Filings
Filing index with form type, date and official link; full-text search in EN / ZH / JA; as-reported fact records with value, unit, period, filing and position, linked in a knowledge graph so the right version of a figure wins
filing_list, filing_search
US CN JP
Financials
Income statement, balance sheet, cash flow as reported under each market's standard, annual and quarterly; precomputed valuation, margin, return, growth, leverage and liquidity metrics
run_sql on executive_change, company_deal_events, debt_issuance, securities_offering
US
Executives
Roster with status; annual compensation from DEF 14A
run_sql on executive_profile, executive_compensation
US
Analyst
Individual rating and target changes; consensus distribution and targets
run_sql on analyst_ratings, analyst_ratings_consensus
US
Signal
Conclusions drawn by drillr with the evidence quoted: industry inflections, enterprise AI adoption, cross-source news storylines and attributed claims
industry_inflections, ai_adoption, news_search
US (news: US CN JP + macro)
Alt-data (secondary)
9 categories, 65 tables around the AI supply chain and macro: energy & power, data centers, semiconductors, compute pricing, model development, inference economics, macro & trade, prediction markets, critical minerals
list_tables → get_table_schema → run_sql
global
Ticker forms: US bare (AAPL), A-shares .SH / .SZ (600519.SH), Japan .T (6758.T), Hong Kong .HK (00700.HK), Korea .KS / .KQ (005930.KS); indices ^GSPC; quote symbols with . or ^ in SQL. Freshness: filings, ownership and events within minutes of the filing; calls and news within minutes to hours; statements and analyst data daily.
Benchmark: the drillr MCP-powered model scores 94.06 % on Vals Finance Agent, and drillr publishes its own restatement-aware benchmark — https://drillr.ai/drillr-benchmark.
REST API
The same data as 29 typed REST endpoints for scripts and pipelines — one X-API-KEY header, JSON out, public OpenAPI 3.1 contract:
One credit wallet across MCP and REST. Free: 80 credits on sign-up. Plus $29 / 300 cr per month, Ultra $99 / 1,500 cr, Enterprise for redistribution and SLA. run_sql returns 100 rows (500 on Ultra), 10 s per statement, 5 in flight; company_search is capped per day (20 / 100 / 500). Failed calls are not billed. https://drillr.ai/pricing
Out of scope
Private or unlisted companies · on-chain crypto metrics (CEX prices only) · options chains, order book, tick data · placing orders · drillr does not produce its own price forecasts.