Public Company Reporting Window Finder
Use this MCP server to find public-company identity and listing status, get US reporting/outreach timing, and build filtered company universes or reporting-season aggregates.
Resolve a domain, ticker, ISIN, LEI, CIK, or company name to a listed company identity with 44 fields.
Qualify whether a company is publicly listed, with options to keep/suppress listed rows and handle unmatched companies.
Get reporting timing for US companies: fiscal year end, cadence/confidence, next event, days to event, and a configurable outreach window with status.
Emit a constrained-period field for campaign/announcement timing around a listing company’s reporting window.
Build a filtered company universe from exchange, country, region, sector, security type, float band, FY end, cadence, and other filters; set
limitexplicitly.Analyze reporting-season load by week or month, optionally split by sector, country, or exchange.
Identity and venue data resolve worldwide; reporting dates are US-only. All tools are read-only, require an
APIFY_TOKEN, and are charged per row returned.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Public Company Reporting Window Finderwhen does Apple report earnings and what's the outreach window?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Reporting Window Finder MCP Server
MCP server for the Mamba Labs Reporting Window Finder actor on Apify.
Give it a domain, ticker, ISIN, LEI or CIK and it tells you when that public company reports, and when to reach out around it: fiscal year end, reporting cadence, the next reporting date, days to event, and the open and close of an outreach window you define.
Timing rows cover US companies only. Identity, venue and classification resolve worldwide across the publishable universe. Reporting dates come from US SEC filing history and exist for US companies alone. A non US company resolves fully and returns a stated
timing_unavailable_reasonrather than a guessed date, and is still charged as a timing row because the lookup ran.
Five tools, one per actor mode
Tool | Takes | Returns |
| identifiers | identity and venue, 44 fields |
| identifiers | a listed status verdict |
| identifiers | fiscal year end, cadence, next event, the outreach window, 75 fields |
| filters | a company list |
| filters | reporting load per week or month |
You never pass mode. Each tool sets it, and each tool exposes only the inputs its mode actually uses.
build_company_universe and get_reporting_season build a list from filters and do not accept company identifiers. Set limit explicitly on both: it defaults to 1000 and you are charged per row returned.
Related MCP server: corporate-events-mcp
Parameters
Every parameter is optional unless a tool says otherwise. The Tools column names the tools that accept it.
Parameter | Type | Tools | Description |
| string |
| A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing. |
| string[] |
| Many domains at once. Used by resolve, qualify and timing. |
| string[] |
| Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing. |
| string[] |
| 12 character ISINs. |
| string[] |
| 20 character Legal Entity Identifiers. |
| string[] |
| SEC Central Index Keys, with or without leading zeros. |
| string[] |
| Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only. |
| string[] | all five | ISO 10383 MICs. 18 venues are covered. |
| string[] | all five | ISO 3166-1 alpha-2, e.g. US, GB, FR. |
| string[] | all five | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. |
| string[] | all five | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. |
| string[] | all five | ordinary_shares, depositary_receipt, preferred_shares. |
| string[] | all five | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. |
| string[] | all five | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. |
| string ( | all five | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
| string[] | all five | quarterly, semiannual, annual, unknown. |
| string ( | all five | Drop funds, trusts and other non operating entities. |
| string ( | all five | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. |
| string ( | all five | Filter on foreign private issuer status. |
| string ( | all five | Keep only companies carrying an SEC CIK. |
| string ( | all five | Set to high to exclude rows whose source terms were never read. |
| string ( | all five | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. |
| string ( | all five | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. |
| string ( |
| qualify mode. Keep only rows proven to be publicly listed. |
| string ( |
| qualify mode. Remove companies proven to be publicly listed, for anyone selling only into private companies. It removes what we can prove is listed; it does not warrant that the remainder is private. |
| string ( |
| qualify mode. By default an unmatched company returns is_listed null, because a non match may mean the company is private OR that we do not hold its domain. Set true to opt into reading a non match as private, which sets is_listed false. |
| string[] |
| full_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day. |
| string |
| How many days before the event the outreach window opens. Default 70. |
| string |
| How many days before the event the outreach window closes. Default 42. Must be less than the lead. |
| string[] |
| Keep only rows in these window states: open, not_yet, closed_passed, no_event. |
| string |
| Drop rows whose next event is further away than this. A cost control. |
| string |
| 0 to 1. Rows whose cadence confidence falls below this return a null timing block with a stated reason rather than a guess. Quarterly cadence averages 0.94, annual 0.40, semiannual 0.21. |
| string ( |
| Emit the period in which a listed company is constrained in what it can announce, derived from the same window numbers. Useful for campaign and announcement timing. |
| string |
| Maximum rows for universe and season. Truncation is always reported, never silent. |
| string ( |
| season mode. Bucket size. |
| string ( |
| season mode. Optional second dimension. |
| string |
| season mode. ISO date. Defaults to today. |
| string |
| season mode. ISO date. Defaults to 180 days from today. |
Install
{
"mcpServers": {
"mamba-public-company-reporting-window-finder": {
"command": "npx",
"args": ["-y", "@mambalabsdev/mcp-public-company-reporting-window-finder"],
"env": { "APIFY_TOKEN": "your-apify-token" }
}
}
}Get a token at console.apify.com/account/integrations.
Reading the output
Dates are predicted, not announced. next_event_is_estimate is true for a date derived from filing history. confidence_band sits at 0.80 and 0.50, computed on the weakest link in the chain, so confidence_effective is the minimum of the event and cadence confidences rather than an average.
window_status is the field to filter on. It is open, not_yet, closed_passed or no_event against today. no_event is the state a company lands in when there is no reporting event to build a window from.
Unknown cadence is refused, not guessed. A company whose filing history is too short or irregular returns a null cadence with a reason instead of an invented date.
A row that resolves nothing is still billed. An identifier that matches no public company returns match_method of no_match with every other field null. That is a real answer and the lookup ran to produce it.
Cost
Pay per event on Apify, charged for rows returned rather than rows filtered out.
Event | Price |
Company resolved | $0.006 per row |
Timing row returned | $0.012 per row |
Reporting season aggregate | $0.05 per row |
Actor start | $0.00005 per run |
Volume discounts of 5, 10 and 15 percent apply on the Apify Bronze, Silver and Gold plans. A timing row is never additionally charged as a resolved company.
Part of the Mamba Labs GTM Suite
Browse the full suite on Apify.
License
MIT
Available Tools
5 toolsbuild_company_universeBuild Company UniverseAIdempotent
Build a list of listed companies from filters rather than from identifiers you already hold. Filter by exchange, country, region, sector, security type, public float band, fiscal year end month, reporting cadence, operating status and foreign private issuer status. Returns 44 fields per company, the same shape resolve_company returns. At least one filter is required, so a bare call cannot pull the whole universe. This tool does NOT accept company identifiers: use resolve_company, qualify_company or get_reporting_timing for specific companies. SET limit EXPLICITLY. It defaults to 1000 and you are charged per company row returned, so an unbounded call is an expensive call. Truncation is always reported, never silent. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows for universe and season. Truncation is always reported, never silent. | |
| regions | No | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. | |
| sectors | No | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. | |
| cadences | No | quarterly, semiannual, annual, unknown. | |
| country_codes | No | ISO 3166-1 alpha-2, e.g. US, GB, FR. | |
| exchange_codes | No | ISO 10383 MICs. 18 venues are covered. | |
| security_types | No | ordinary_shares, depositary_receipt, preferred_shares. | |
| public_float_bands | No | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. | |
| us_registrant_only | No | Keep only companies carrying an SEC CIK. | |
| exclude_share_alike | No | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. | |
| exclude_blank_checks | No | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. | |
| fiscal_year_end_months | No | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. | |
| foreign_private_issuer | No | Filter on foreign private issuer status. | |
| operating_companies_only | No | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. | |
| exclude_name_only_matches | No | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. | |
| min_provenance_confidence | No | Set to high to exclude rows whose source terms were never read. | |
| exclude_december_fiscal_year_end | No | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description ends with 'Read only', but annotations declare readOnlyHint=false, a direct contradiction of the structured safety hint. Although the description otherwise discloses valuable behavior (Apify token requirement, per-row credit cost, limit default of 1000, reported truncation), the explicit read-only claim against a readOnlyHint=false annotation is a serious inconsistency that an agent would rely on incorrectly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then exclusions, then the at-least-one-filter rule, then the cost warning, then the token/auth note. Dense but each sentence carries a distinct operational fact; only the closing 'Read only' is wasted (and harmful) given the rest of the payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter filter tool with no output schema, the description supplies the missing return-value context ('44 fields per company, the same shape resolve_company returns'), the cost and truncation model, the auth requirement, and the identifier exclusion. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; however the description adds the limit default (1000) and the per-row billing model, neither of which appear in the schema text, and enumerates the filter families so the agent knows what dimension each parameter targets. It adds real meaning over the schema rather than repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (build a list of listed companies) and immediately scopes it against identifier-based lookup, explicitly naming siblings resolve_company, qualify_company and get_reporting_timing as the tools to use for specific companies. An agent can distinguish it from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (derive a universe from filters), when-not-to-use (you already hold identifiers, or want specific companies), and hard operational rules: at least one filter is required, and limit must be set explicitly. Also warns it does NOT accept company identifiers, which is the key selection trap against the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reporting_seasonGet Reporting SeasonAIdempotent
Show how reporting load is distributed over time, so you can find the busy weeks and the quiet ones. Returns aggregate rows per bucket, not per company: period start and end, event count, company count, estimated share and mean confidence. Bucket by week or month with season_group_by, and optionally split by sector, country or exchange with season_split_by. The window defaults to today through 180 days out; set season_from and season_to for another. At least one filter is required and company identifiers are not accepted. Use this to plan campaign timing across a market, not to time one account; for a single company use get_reporting_timing. Narrow the population with the same filters build_company_universe takes (exchange_codes, country_codes, regions, sectors, public_float_bands, cadences). Charged per aggregate row returned, which is far fewer rows than the companies behind them. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows for universe and season. Truncation is always reported, never silent. | |
| regions | No | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. | |
| sectors | No | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. | |
| cadences | No | quarterly, semiannual, annual, unknown. | |
| season_to | No | season mode. ISO date. Defaults to 180 days from today. | |
| event_types | No | full_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day. | |
| season_from | No | season mode. ISO date. Defaults to today. | |
| country_codes | No | ISO 3166-1 alpha-2, e.g. US, GB, FR. | |
| exchange_codes | No | ISO 10383 MICs. 18 venues are covered. | |
| security_types | No | ordinary_shares, depositary_receipt, preferred_shares. | |
| season_group_by | No | season mode. Bucket size. | |
| season_split_by | No | season mode. Optional second dimension. | |
| public_float_bands | No | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. | |
| us_registrant_only | No | Keep only companies carrying an SEC CIK. | |
| exclude_share_alike | No | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. | |
| exclude_blank_checks | No | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. | |
| fiscal_year_end_months | No | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. | |
| foreign_private_issuer | No | Filter on foreign private issuer status. | |
| operating_companies_only | No | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. | |
| exclude_name_only_matches | No | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. | |
| min_provenance_confidence | No | Set to high to exclude rows whose source terms were never read. | |
| exclude_december_fiscal_year_end | No | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description closes with 'Read only.' while the annotations declare readOnlyHint=false, a direct contradiction of the declared safety profile (flagged as Annotation Contradiction). Setting that aside, the description is otherwise rich — it discloses cost ('Charged per aggregate row returned'), auth ('Requires an APIFY_TOKEN and consumes Apify credits'), and the minimum-filter constraint — but the explicit contradiction with structured metadata forces the floor score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the return shape before any parameter talk, then progressively adds window defaults, constraints, routing, cost and auth. Nine sentences with essentially no filler; each carries either a routing rule, a constraint, or a cost/auth disclosure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so — aggregate rows per bucket with period start/end, event count, company count, estimated share and mean confidence. Combined with cost model, auth requirement, minimum-filter rule and sibling routing, an agent has everything needed to call this correctly for a 22-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond it: it names the season-specific controls (season_group_by for week/month bucketing, season_split_by for a second dimension, season_from/season_to for the window), groups the population filters by family, and adds a constraint not encoded anywhere in the schema ('company identifiers are not accepted'). It stops short of explaining the semantics of individual filter enums, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show how reporting load is distributed over time') and immediately names the sibling it is not for ('not to time one account; for a single company use get_reporting_timing'). An agent can distinguish it from get_reporting_timing and build_company_universe without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rule ('Use this to plan campaign timing across a market... for a single company use get_reporting_timing'), an explicit hard precondition ('At least one filter is required and company identifiers are not accepted'), and a pointer to the filter vocabulary build_company_universe uses. When-to-use, when-not-to-use, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reporting_timingGet Reporting TimingAIdempotent
Find when a public company next reports, and when to reach out around it. Returns 75 fields per input: fiscal year end, derived reporting cadence and its confidence, the next reporting event with its type, period and date, days to event, and the open and close of an outreach window you define with window_lead_days and window_lag_days, which default to 70 and 42. window_status is one of open, not_yet, closed_passed or no_event and is the field to filter on. Dates are PREDICTED from filing history, not announced: read next_event_is_estimate and confidence_band, whose thresholds sit at 0.80 and 0.50. TIMING ROWS COVER US COMPANIES ONLY. A non US company resolves fully for identity and returns a stated timing_unavailable_reason rather than a guessed date, and is still charged as a timing row because the work ran. Charged per timing row returned, never additionally as a resolved company. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| ciks | No | SEC Central Index Keys, with or without leading zeros. | |
| leis | No | 20 character Legal Entity Identifiers. | |
| isins | No | 12 character ISINs. | |
| regions | No | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. | |
| sectors | No | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. | |
| tickers | No | Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing. | |
| cadences | No | quarterly, semiannual, annual, unknown. | |
| event_types | No | full_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day. | |
| company_names | No | Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only. | |
| country_codes | No | ISO 3166-1 alpha-2, e.g. US, GB, FR. | |
| company_domain | No | A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing. | |
| exchange_codes | No | ISO 10383 MICs. 18 venues are covered. | |
| security_types | No | ordinary_shares, depositary_receipt, preferred_shares. | |
| company_domains | No | Many domains at once. Used by resolve, qualify and timing. | |
| window_lag_days | No | How many days before the event the outreach window closes. Default 42. Must be less than the lead. | |
| window_statuses | No | Keep only rows in these window states: open, not_yet, closed_passed, no_event. | |
| window_lead_days | No | How many days before the event the outreach window opens. Default 70. | |
| max_days_to_event | No | Drop rows whose next event is further away than this. A cost control. | |
| public_float_bands | No | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. | |
| us_registrant_only | No | Keep only companies carrying an SEC CIK. | |
| exclude_share_alike | No | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. | |
| exclude_blank_checks | No | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. | |
| fiscal_year_end_months | No | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. | |
| foreign_private_issuer | No | Filter on foreign private issuer status. | |
| min_cadence_confidence | No | 0 to 1. Rows whose cadence confidence falls below this return a null timing block with a stated reason rather than a guess. Quarterly cadence averages 0.94, annual 0.40, semiannual 0.21. | |
| operating_companies_only | No | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. | |
| exclude_name_only_matches | No | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. | |
| min_provenance_confidence | No | Set to high to exclude rows whose source terms were never read. | |
| include_constrained_period | No | Emit the period in which a listed company is constrained in what it can announce, derived from the same window numbers. Useful for campaign and announcement timing. | |
| exclude_december_fiscal_year_end | No | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is unusually rich about behavior beyond the annotations: dates are PREDICTED not announced, estimate/confidence thresholds at 0.80 and 0.50, per-row credit charging, APIFY_TOKEN requirement, and the non-US no-guess policy. However, it closes with 'Read only.' while the annotations declare readOnlyHint=false, a direct conflict on the read/write axis that an agent may rely on when deciding whether a call has side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense passage with no filler: purpose first, then the returned shape, then the prediction caveat, then the US-only and billing constraints last. It is long, but every sentence carries a fact an agent needs; the only cost is that the constraint/cost material is buried in a paragraph rather than surfaced separately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 30-parameter, no-required-parameter tool with no output schema, the description supplies the missing return-value semantics (field names, window_status vocabulary, estimate flags, confidence bands) and the commercial/geographic constraints an agent cannot infer from the schema. Nothing material for correct invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description earns above baseline by tying parameters to meaning the schema does not: window_lead_days/window_lag_days (70/42) define the window whose state window_status reports, min_cadence_confidence interacts with null timing blocks, and 'which is the field to filter on' tells the agent that window_statuses is the primary dial. It does not attempt to explain the other ~25 filter parameters, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: it predicts when a public company next reports and defines an outreach window around that event, with a concrete list of returned dimensions (next reporting event, days to event, window open/close). It is clearly a timing tool and not an identity or qualification tool, but it never names or contrasts itself with the sibling get_reporting_season, which is the tool an agent is most likely to confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a hard applicability boundary ('TIMING ROWS COVER US COMPANIES ONLY') and what happens outside it (a stated timing_unavailable_reason rather than a guess, still billed), plus which field to filter on (window_status) and that max_days_to_event is a cost control. What is missing is routing guidance against the sibling alternatives (get_reporting_season, resolve_company, qualify_company) for the same company set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
qualify_companyQualify CompanyAIdempotent
Answer whether a company is publicly listed. Takes the same identifiers as resolve_company and returns a listed status verdict per input. Set listed_only to keep only the companies proven to be listed, or suppress_listed to remove them, which is what you want when selling only into private companies. By default an unmatched company returns is_listed null rather than false, because a non match may mean the company is private OR that the dataset does not hold its domain; set assume_unmatched_is_private to true to opt into reading a non match as private. Use this to split a prospect list into listed and private companies before outreach; use resolve_company when you need the full identity fields. Identify companies with company_domain, company_domains, tickers, isins, leis, ciks, or company_names; every other input is an optional filter shared with resolve_company (exchange, country, region, sector, security type, float band, fiscal year end, cadence, and data quality switches). Charged per company row returned. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| ciks | No | SEC Central Index Keys, with or without leading zeros. | |
| leis | No | 20 character Legal Entity Identifiers. | |
| isins | No | 12 character ISINs. | |
| regions | No | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. | |
| sectors | No | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. | |
| tickers | No | Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing. | |
| cadences | No | quarterly, semiannual, annual, unknown. | |
| listed_only | No | qualify mode. Keep only rows proven to be publicly listed. | |
| company_names | No | Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only. | |
| country_codes | No | ISO 3166-1 alpha-2, e.g. US, GB, FR. | |
| company_domain | No | A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing. | |
| exchange_codes | No | ISO 10383 MICs. 18 venues are covered. | |
| security_types | No | ordinary_shares, depositary_receipt, preferred_shares. | |
| company_domains | No | Many domains at once. Used by resolve, qualify and timing. | |
| suppress_listed | No | qualify mode. Remove companies proven to be publicly listed, for anyone selling only into private companies. It removes what we can prove is listed; it does not warrant that the remainder is private. | |
| public_float_bands | No | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. | |
| us_registrant_only | No | Keep only companies carrying an SEC CIK. | |
| exclude_share_alike | No | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. | |
| exclude_blank_checks | No | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. | |
| fiscal_year_end_months | No | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. | |
| foreign_private_issuer | No | Filter on foreign private issuer status. | |
| operating_companies_only | No | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. | |
| exclude_name_only_matches | No | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. | |
| min_provenance_confidence | No | Set to high to exclude rows whose source terms were never read. | |
| assume_unmatched_is_private | No | qualify mode. By default an unmatched company returns is_listed null, because a non match may mean the company is private OR that we do not hold its domain. Set true to opt into reading a non match as private, which sets is_listed false. | |
| exclude_december_fiscal_year_end | No | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Read only' while annotations declare readOnlyHint=false, which directly contradicts the safety profile. Although it otherwise adds useful behavioral context such as APIFY_TOKEN, Apify credit consumption, and unmatched-company handling, the contradiction requires a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and then organized by modes, default behavior, usage, identifiers, filters, and cost/auth. It is dense but appropriate for a 26-parameter tool, with only minor extra phrasing that still earns its place as use-case context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 26-parameter tool with no output schema, the description covers identifier inputs, filter families, cost, auth, and default return behavior including is_listed null. It does not detail the full return shape and contains the incorrect 'Read only' claim, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 26 parameters in detail. The description groups identifiers and optional filters but adds little syntax or meaning beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: answer whether a company is publicly listed. Distinguishes itself from resolve_company by naming when to use the sibling instead. An agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this to split a prospect list into listed and private companies before outreach, and to use resolve_company when full identity fields are needed. It also explains the listed_only, suppress_listed, and assume_unmatched_is_private modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_companyResolve CompanyAIdempotent
Resolve a domain, ticker, ISIN, LEI, CIK or company name to a listed company identity. Returns 44 fields per input: legal name, primary ticker, ISIN, LEI, CIK, domain, primary exchange, country, currency, sector, security type, public float band, shares outstanding, and the provenance of each. Every input returns exactly one row, including the ones that match nothing, which come back with match_method set to no_match and every other field null. Read matched_on to see which identifier produced the row. Use this when you hold identifiers and need the listed identity behind them; use qualify_company for a yes or no on listed status, get_reporting_timing for dates, and build_company_universe when you hold filters rather than identifiers. The filter inputs (exchange_codes, country_codes, regions, sectors, and the rest) narrow which matched rows come back. Charged per company row returned, including a no_match row, because the lookup ran either way. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| ciks | No | SEC Central Index Keys, with or without leading zeros. | |
| leis | No | 20 character Legal Entity Identifiers. | |
| isins | No | 12 character ISINs. | |
| regions | No | Shorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it. | |
| sectors | No | SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe. | |
| tickers | No | Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing. | |
| cadences | No | quarterly, semiannual, annual, unknown. | |
| company_names | No | Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only. | |
| country_codes | No | ISO 3166-1 alpha-2, e.g. US, GB, FR. | |
| company_domain | No | A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing. | |
| exchange_codes | No | ISO 10383 MICs. 18 venues are covered. | |
| security_types | No | ordinary_shares, depositary_receipt, preferred_shares. | |
| company_domains | No | Many domains at once. Used by resolve, qualify and timing. | |
| public_float_bands | No | micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset. | |
| us_registrant_only | No | Keep only companies carrying an SEC CIK. | |
| exclude_share_alike | No | Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product. | |
| exclude_blank_checks | No | Drop pre deal SPACs. Separate from the operating company filter: a blank check shell is flagged as an operating company and passes every ordinary firmographic filter. | |
| fiscal_year_end_months | No | Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset. | |
| foreign_private_issuer | No | Filter on foreign private issuer status. | |
| operating_companies_only | No | Drop funds, trusts and other non operating entities. Sent as a string for Clay compatibility. | |
| exclude_name_only_matches | No | Drop rows whose identity link rests on a name and country agreeing rather than on an identifier. Use this wherever a wrong identity link matters. | |
| min_provenance_confidence | No | Set to high to exclude rows whose source terms were never read. | |
| exclude_december_fiscal_year_end | No | Keep only companies whose fiscal year ends in a month other than December, the accounts whose budget cycle is out of phase with a calendar quarter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuinely valuable behavior beyond the annotations: per-row billing including no_match rows, an exactly-one-row guarantee, no_match semantics, and the APIFY_TOKEN requirement. However, it closes with 'Read only' while the annotation declares readOnlyHint: false, so the safety claim an agent would rely on is contradicted by the structured field. That conflict prevents a higher score despite the otherwise rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in sentence one, followed by output shape, edge-case behavior, sibling routing, filter semantics, and pricing. Each sentence carries distinct information, but the block is long and could be tightened; nothing is filler, yet it is denser than it needs to be for a tool description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter tool with no output schema and no required parameters, the description covers what an agent needs: input identifiers, the 44-field return shape, the no_match outcome, how to read provenance, filter behavior, auth requirements, and cost model. Nothing material is left for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the per-parameter descriptions are unusually strong, so the baseline is 3. The description still adds a real semantic not present in the schema: the filter inputs (exchange_codes, country_codes, regions, sectors, etc.) narrow which matched rows return rather than acting as selectors, and it explains how to interpret match_method/matched_on. That is meaningful added meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb (resolve) plus the exact set of accepted identifier types (domain, ticker, ISIN, LEI, CIK, name) and the resource (a listed company identity). It is immediately distinguishable from qualify_company (yes/no listed status) and build_company_universe (filter-driven). No ambiguity about what comes back.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the selecting condition ('when you hold identifiers and need the listed identity behind them') and then names three alternatives with their own conditions: qualify_company for a yes/no, get_reporting_timing for dates, build_company_universe for filters. This is textbook when-to-use/when-not-to-use routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.1.2- Changed
build_company_universe1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_reporting_season1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
get_reporting_timing1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
qualify_company1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
- Changed
resolve_company1 field changed- removed
Input schema / additionalPropertiesRemoved value: -false
5 tool updates
v1.0.0- First observed
build_company_universe - First observed
get_reporting_season - First observed
get_reporting_timing - First observed
qualify_company - First observed
resolve_company
TDQS
Scored across 5 tools
Each tool has a distinct input/output contract: build_company_universe takes filters only, resolve_company takes identifiers, qualify_company returns a listed-status verdict, get_reporting_timing returns per-company timing, and get_reporting_season returns aggregate season buckets. Descriptions explicitly cross-reference when to use each alternative, making misselection unlikely.
All five names use consistent snake_case with a verb_noun structure (build_, resolve_, qualify_, get_). The only slight length variation is build_company_universe, but it follows the same convention.
Five tools are well-scoped for a read-only reporting-data server; each covers a distinct query mode and none feels redundant. The count sits comfortably in the ideal 3-15 range.
The surface covers company enumeration, identity resolution, listed-status qualification, per-company timing, and aggregate season planning, which is a coherent lifecycle for the domain. Minor gap: get_reporting_timing is US-only, so non-US timing requests dead-end with timing_unavailable_reason and no alternative tool; bulk or historical event retrieval is also absent but agents can work around via batching or aggregation.
Maintenance
Related MCP Connectors
Earnings calls, news releases, decks, prices and shareholders for listed companies worldwide.
Institutional-grade financial data: earnings, estimates, guidance, stock prices, macro indicators.
Resolves all 10,000+ US public stock tickers to SEC CIK numbers, recent 10-K/10-Q/8-K filings, an.
Realtime financial context for AI agents: what changed, who is affected, and what to watch next. One suite covering news, events, guidance, filing changes, sentiment, stakeholders, and alerts. Information-efficient responses with evidence for every result. First-class point-in-time safety for backtests. Pairs well with web search and a market-data API. All data is our own.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables deep analysis of SEC EDGAR filings through universal company search, document content extraction, and advanced filing search capabilities. Provides AI-ready access to business descriptions, risk factors, financial statements, and full-text search across any public company's SEC documents.-
- FlicenseNot gradedqualityDmaintenanceNormalizes and serves corporate events (earnings, dividends, splits, M\&A) from US, UK, Canada, and Australia via a programmatic MCP API.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access and search 177,000+ earnings call transcripts from 17,000+ companies, allowing natural language queries about financial commentary.21 npmMIT
- AlicenseAqualityBmaintenanceEnables AI assistants to look up verified investor relations page URLs and earnings release (kessan tanshin) URLs for 3,821 Japanese listed companies by securities code, company name, former or brand name, and to fetch selected company attributes. Also supports retrieving monthly change data, checking credit balance and expiry, and inspecting available field definitions.640 npmMIT