Skip to main content
Glama
mambalabsdev

Public Company Reporting Window Finder

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_reason rather 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

resolve_company

identifiers

identity and venue, 44 fields

qualify_company

identifiers

a listed status verdict

get_reporting_timing

identifiers

fiscal year end, cadence, next event, the outreach window, 75 fields

build_company_universe

filters

a company list

get_reporting_season

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

company_domain

string

resolve_company, qualify_company, get_reporting_timing

A single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing.

company_domains

string[]

resolve_company, qualify_company, get_reporting_timing

Many domains at once. Used by resolve, qualify and timing.

tickers

string[]

resolve_company, qualify_company, get_reporting_timing

Exchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing.

isins

string[]

resolve_company, qualify_company, get_reporting_timing

12 character ISINs.

leis

string[]

resolve_company, qualify_company, get_reporting_timing

20 character Legal Entity Identifiers.

ciks

string[]

resolve_company, qualify_company, get_reporting_timing

SEC Central Index Keys, with or without leading zeros.

company_names

string[]

resolve_company, qualify_company, get_reporting_timing

Legal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only.

exchange_codes

string[]

all five

ISO 10383 MICs. 18 venues are covered.

country_codes

string[]

all five

ISO 3166-1 alpha-2, e.g. US, GB, FR.

regions

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.

sectors

string[]

all five

SEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.

security_types

string[]

all five

ordinary_shares, depositary_receipt, preferred_shares.

public_float_bands

string[]

all five

micro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.

fiscal_year_end_months

string[]

all five

Integers 1 to 12. Fiscal year end is effectively a United States field in this dataset.

exclude_december_fiscal_year_end

string (false, true)

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.

cadences

string[]

all five

quarterly, semiannual, annual, unknown.

operating_companies_only

string (false, true)

all five

Drop funds, trusts and other non operating entities.

exclude_blank_checks

string (false, true)

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.

foreign_private_issuer

string (any, only, exclude)

all five

Filter on foreign private issuer status.

us_registrant_only

string (false, true)

all five

Keep only companies carrying an SEC CIK.

min_provenance_confidence

string (any, high)

all five

Set to high to exclude rows whose source terms were never read.

exclude_name_only_matches

string (false, true)

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.

exclude_share_alike

string (false, true)

all five

Drop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.

listed_only

string (false, true)

qualify_company

qualify mode. Keep only rows proven to be publicly listed.

suppress_listed

string (false, true)

qualify_company

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.

assume_unmatched_is_private

string (false, true)

qualify_company

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.

event_types

string[]

get_reporting_timing, get_reporting_season

full_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day.

window_lead_days

string

get_reporting_timing

How many days before the event the outreach window opens. Default 70.

window_lag_days

string

get_reporting_timing

How many days before the event the outreach window closes. Default 42. Must be less than the lead.

window_statuses

string[]

get_reporting_timing

Keep only rows in these window states: open, not_yet, closed_passed, no_event.

max_days_to_event

string

get_reporting_timing

Drop rows whose next event is further away than this. A cost control.

min_cadence_confidence

string

get_reporting_timing

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.

include_constrained_period

string (true, false)

get_reporting_timing

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.

limit

string

build_company_universe, get_reporting_season

Maximum rows for universe and season. Truncation is always reported, never silent.

season_group_by

string (week, month)

get_reporting_season

season mode. Bucket size.

season_split_by

string (none, sector, country, exchange_code)

get_reporting_season

season mode. Optional second dimension.

season_from

string

get_reporting_season

season mode. ISO date. Defaults to today.

season_to

string

get_reporting_season

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 tools
build_company_universeBuild Company UniverseA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows for universe and season. Truncation is always reported, never silent.
regionsNoShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsNoSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
cadencesNoquarterly, semiannual, annual, unknown.
country_codesNoISO 3166-1 alpha-2, e.g. US, GB, FR.
exchange_codesNoISO 10383 MICs. 18 venues are covered.
security_typesNoordinary_shares, depositary_receipt, preferred_shares.
public_float_bandsNomicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
us_registrant_onlyNoKeep only companies carrying an SEC CIK.
exclude_share_alikeNoDrop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
exclude_blank_checksNoDrop 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_monthsNoIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
foreign_private_issuerNoFilter on foreign private issuer status.
operating_companies_onlyNoDrop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_name_only_matchesNoDrop 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_confidenceNoSet to high to exclude rows whose source terms were never read.
exclude_december_fiscal_year_endNoKeep 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

A4/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 SeasonA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows for universe and season. Truncation is always reported, never silent.
regionsNoShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsNoSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
cadencesNoquarterly, semiannual, annual, unknown.
season_toNoseason mode. ISO date. Defaults to 180 days from today.
event_typesNofull_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day.
season_fromNoseason mode. ISO date. Defaults to today.
country_codesNoISO 3166-1 alpha-2, e.g. US, GB, FR.
exchange_codesNoISO 10383 MICs. 18 venues are covered.
security_typesNoordinary_shares, depositary_receipt, preferred_shares.
season_group_byNoseason mode. Bucket size.
season_split_byNoseason mode. Optional second dimension.
public_float_bandsNomicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
us_registrant_onlyNoKeep only companies carrying an SEC CIK.
exclude_share_alikeNoDrop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
exclude_blank_checksNoDrop 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_monthsNoIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
foreign_private_issuerNoFilter on foreign private issuer status.
operating_companies_onlyNoDrop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_name_only_matchesNoDrop 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_confidenceNoSet to high to exclude rows whose source terms were never read.
exclude_december_fiscal_year_endNoKeep 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

A4.1/5.0
Behavior1/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TimingA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ciksNoSEC Central Index Keys, with or without leading zeros.
leisNo20 character Legal Entity Identifiers.
isinsNo12 character ISINs.
regionsNoShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsNoSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
tickersNoExchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing.
cadencesNoquarterly, semiannual, annual, unknown.
event_typesNofull_year_results, half_year_results, quarterly_results, trading_update, annual_report_publication, sustainability_report_publication, agm, proxy_filing, capital_markets_day.
company_namesNoLegal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only.
country_codesNoISO 3166-1 alpha-2, e.g. US, GB, FR.
company_domainNoA single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing.
exchange_codesNoISO 10383 MICs. 18 venues are covered.
security_typesNoordinary_shares, depositary_receipt, preferred_shares.
company_domainsNoMany domains at once. Used by resolve, qualify and timing.
window_lag_daysNoHow many days before the event the outreach window closes. Default 42. Must be less than the lead.
window_statusesNoKeep only rows in these window states: open, not_yet, closed_passed, no_event.
window_lead_daysNoHow many days before the event the outreach window opens. Default 70.
max_days_to_eventNoDrop rows whose next event is further away than this. A cost control.
public_float_bandsNomicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
us_registrant_onlyNoKeep only companies carrying an SEC CIK.
exclude_share_alikeNoDrop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
exclude_blank_checksNoDrop 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_monthsNoIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
foreign_private_issuerNoFilter on foreign private issuer status.
min_cadence_confidenceNo0 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_onlyNoDrop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_name_only_matchesNoDrop 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_confidenceNoSet to high to exclude rows whose source terms were never read.
include_constrained_periodNoEmit 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_endNoKeep 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

A3.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CompanyA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ciksNoSEC Central Index Keys, with or without leading zeros.
leisNo20 character Legal Entity Identifiers.
isinsNo12 character ISINs.
regionsNoShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsNoSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
tickersNoExchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing.
cadencesNoquarterly, semiannual, annual, unknown.
listed_onlyNoqualify mode. Keep only rows proven to be publicly listed.
company_namesNoLegal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only.
country_codesNoISO 3166-1 alpha-2, e.g. US, GB, FR.
company_domainNoA single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing.
exchange_codesNoISO 10383 MICs. 18 venues are covered.
security_typesNoordinary_shares, depositary_receipt, preferred_shares.
company_domainsNoMany domains at once. Used by resolve, qualify and timing.
suppress_listedNoqualify 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_bandsNomicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
us_registrant_onlyNoKeep only companies carrying an SEC CIK.
exclude_share_alikeNoDrop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
exclude_blank_checksNoDrop 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_monthsNoIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
foreign_private_issuerNoFilter on foreign private issuer status.
operating_companies_onlyNoDrop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_name_only_matchesNoDrop 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_confidenceNoSet to high to exclude rows whose source terms were never read.
assume_unmatched_is_privateNoqualify 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_endNoKeep 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

A3.7/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CompanyA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ciksNoSEC Central Index Keys, with or without leading zeros.
leisNo20 character Legal Entity Identifiers.
isinsNo12 character ISINs.
regionsNoShorthand for a set of venues and countries: us, uk, eu. Widens an explicit exchange or country filter rather than replacing it.
sectorsNoSEC SIC descriptions, e.g. Pharmaceutical Preparations. Populated on roughly 65 percent of the publishable universe.
tickersNoExchange tickers, e.g. NWLG. Matched against the primary ticker and every venue listing.
cadencesNoquarterly, semiannual, annual, unknown.
company_namesNoLegal or trading names. Matched on a normalized name. Former names are not available: the alias table carries tickers and ISINs only.
country_codesNoISO 3166-1 alpha-2, e.g. US, GB, FR.
company_domainNoA single bare domain, e.g. stripe.com. The Clay column shape. Used by resolve, qualify and timing.
exchange_codesNoISO 10383 MICs. 18 venues are covered.
security_typesNoordinary_shares, depositary_receipt, preferred_shares.
company_domainsNoMany domains at once. Used by resolve, qualify and timing.
public_float_bandsNomicro, small, mid, large, mega, unknown. Size runs on public float because market capitalization is not populated anywhere in this dataset.
us_registrant_onlyNoKeep only companies carrying an SEC CIK.
exclude_share_alikeNoDrop rows derived from CC BY-SA sources, whose share alike condition may not suit a closed product.
exclude_blank_checksNoDrop 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_monthsNoIntegers 1 to 12. Fiscal year end is effectively a United States field in this dataset.
foreign_private_issuerNoFilter on foreign private issuer status.
operating_companies_onlyNoDrop funds, trusts and other non operating entities. Sent as a string for Clay compatibility.
exclude_name_only_matchesNoDrop 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_confidenceNoSet to high to exclude rows whose source terms were never read.
exclude_december_fiscal_year_endNoKeep 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

A4.2/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 5 tool updatesv1.1.2
    • Changedbuild_company_universe1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_reporting_season1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_reporting_timing1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedqualify_company1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedresolve_company1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
  2. 5 tool updatesv1.0.0
    • First observedbuild_company_universe
    • First observedget_reporting_season
    • First observedget_reporting_timing
    • First observedqualify_company
    • First observedresolve_company

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables 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.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Normalizes and serves corporate events (earnings, dividends, splits, M\&A) from US, UK, Canada, and Australia via a programmatic MCP API.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    6
    40 npm
    MIT