Skip to main content
Glama
Bigred97

io.ausdata/asic-mcp

asic-mcp

mcp-name: io.ausdata/asic-mcp

PyPI Python License Tests CodeQL Glama MCP server quality

MCP server for Australian Securities and Investments Commission registers. Plain-English access to the Financial Advisers Register, AFS Licensees, AFS Authorised Representatives, Credit Licensees, Banned & Disqualified Persons and Organisations, and Registered Liquidators — every one updated weekly by ASIC and served via data.gov.au.

Hosted access? For cross-source queries, webhooks, an always-on REST API, and a uniform response envelope across all 9 sources, see ausdata.io — free tier available (500 calls/mo, no card).

"Is Jane Smith a registered financial adviser?"
"Find every AFS licensee in NSW with 'Westpac' in the name."
"List all banned persons added since 2024-01-01."
"Who's the registered liquidator for KordaMentha?"
"Which credit licensees were suspended last year?"

Sister to abs-mcp (Australian Bureau of Statistics), rba-mcp (Reserve Bank of Australia), ato-mcp (Australian Taxation Office), apra-mcp (Australian Prudential Regulation Authority), aihw-mcp (Australian Institute of Health and Welfare), and au-weather-mcp (Australian weather). All seven together cover the macro / regulator / health / tax / climate layer of Australian official data.


Install

# Run on demand via uvx (recommended)
uvx --upgrade asic-mcp

# Or install permanently
pip install asic-mcp

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "asic": { "command": "uvx", "args": ["--upgrade", "asic-mcp"] }
  }
}

Why --upgrade? uvx asic-mcp (without the flag) uses whatever wheel is cached and never adopts new PyPI releases on its own. --upgrade makes uvx check PyPI on each launch and pull a newer release if one exists. To verify which version is currently serving you, look at the server_version field on any DataResponse.

Claude Code / Cursor

claude mcp add asic --command uvx --args -- --upgrade asic-mcp

Related MCP server: AU-BizIntel MCP Server

Auto-updating data

Beyond the wheel-level --upgrade, the server has a second auto-update path inside the data layer: every register snapshot on data.gov.au is reissued each week (some monthly) at a stable resource UUID. asic-mcp resolves that UUID via data.gov.au's CKAN API at fetch time and uses the freshest match. Hard-coded YAML URLs are the safe fallback if CKAN discovery fails. You do not need to wait for a new wheel release to get new weekly data — the 24-hour cache TTL means a fresh snapshot lands within a day. Force-refresh by deleting ~/.asic-mcp/cache.db.


What it exposes

Five tools, all plain-English in, structured out:

Tool

Purpose

search_datasets

Fuzzy-search the curated catalogue by keyword

describe_dataset

List a dataset's filterable dimensions and source URL

get_data

Query with filters, period range, output format

latest

Most recent observation(s) for a dataset (shortcut)

list_curated

Enumerate the curated dataset IDs

Every response is the same shape — dataset_id, dataset_name, query, period, unit, row_count, records, source_url, attribution, server_version, stale — across every curated dataset.


Curated datasets (7)

ID

What it is

Cadence

Source slug

ASIC_FINANCIAL_ADVISERS

Every individual on the Financial Advisers Register (~21,000 records, 76 columns)

Weekly

asic-financial-adviser

ASIC_AFS_LICENSEE

Every Australian Financial Services Licensee (~6,500 entities)

Weekly

asic-afs-licensee

ASIC_AFS_AUTH_REP

Every AFS Authorised Representative — appointees under each AFSL

Weekly

asic-afs-authorised-representative

ASIC_CREDIT_LICENSEE

Every Australian Credit Licensee (NCCP-regulated lenders, brokers, BNPL providers)

Weekly

asic-credit-licensee

ASIC_BANNED_PERSONS

Persons banned/disqualified from financial services, credit, or managing corporations

Weekly

asic-banned-disqualified-per

ASIC_BANNED_ORGS

Organisations banned/disqualified — companion register to BANNED_PERSONS

Weekly

asic-banned-disqualified-org

ASIC_LIQUIDATOR

Every Registered Liquidator and Official Liquidator (~700 insolvency practitioners)

Weekly

asic-liquidator

Adding a new dataset is a single YAML drop into src/asic_mcp/data/curated/ — see CONTRIBUTING.md. v0.2 roadmap below adds enforcement statistics, short-position reports, and a streaming-lookup tool for the 373 MB Company Register.


Example queries (paste into Claude)

Cross-source compatibility. The state filter on every register accepts canonical state codes ("NSW"), full names ("New South Wales"), case-insensitive variants ("nsw"), ISO 3166-2 ("AU-NSW"), and 4-digit postcodes ("2000" → NSW). Powered by aus-identity — the same input format works across abs-mcp, ato-mcp, apra-mcp, aihw-mcp, and asic-mcp.

Compliance check: "Confirm whether AFSL 234945 is a current AFS licensee, who the legal name is, and what financial services it's authorised to deal in."

Consumer protection: "Has anyone with the surname 'Smith' been banned by ASIC in the last 5 years? Show the ban type, dates, and the public comment."

Insolvency: "List every Registered Liquidator practising under KordaMentha in NSW and Victoria."

Adviser lookup: "Find financial adviser number 000221137 — current/ceased, licensee, and qualifications."

Credit broker due diligence: "For Australian Credit Licence 219612, give me the licensee name, status, EDR scheme membership, and a summary of the authorisations text."

Each prompt resolves to one get_data (or latest) call. The response includes the source URL and CC-BY 3.0 AU attribution so the agent can cite it back.


Architecture

Same shape as the sister packages — client → cache → parsing → shaping → server:

  • client.py wraps httpx with a SQLite-backed disk cache and an in-flight dedup so a burst of latest() calls fans into one HTTP request. Sends a polite User-Agent — data.gov.au's CDN blocks the default httpx UA.

  • parsing.py reads CSV via pandas, with delimiter auto-sniffing because ASIC labels every file ".csv" but ships some as tab-separated (Financial Advisers, AFS Auth Rep, Banned Orgs) and some as comma-separated (AFS Licensee, Credit Licensee, Banned Persons, Liquidator).

  • curated.py loads dataset specs from data/curated/*.yaml — each one declares its dimensions, dimension-value enums, source/download URLs, and CKAN discovery hints.

  • discovery.py resolves the freshest CKAN resource URL at query time; falls back to the YAML default on any failure.

  • shaping.py transforms the parsed DataFrame into DataResponse (records / series / csv). For register data (no measure columns) it emits one Observation per row with all dimensions populated.

  • server.py is the FastMCP entrypoint — five tools, full input validation with helpful "Try X" hints on error.

Cache lives under ~/.asic-mcp/cache.db. ASIC registers refresh weekly, so the byte cache TTL is 24 hours and the CKAN catalogue cache is 1 hour.


Attribution

Source: Australian Securities and Investments Commission, licensed under Creative Commons Attribution 3.0 Australia (CC BY 3.0 AU). Data accessed via data.gov.au. © Commonwealth of Australia. The MCP server is MIT-licensed; the underlying register data carries the CC-BY 3.0 AU licence, which is echoed verbatim in every response's attribution field.


Sister MCPs (Australian Public Data portfolio)

Want all 9 sources behind one REST API? The hosted gateway at ausdata.io adds cross-source joins, full history, webhooks, and HMAC-signed responses on top of these MCPs — free tier (500 calls/mo, no card).

  • abs-mcp — Australian Bureau of Statistics (CPI, unemployment, ERP, building approvals)

  • rba-mcp — Reserve Bank of Australia (cash rate, lending stats, exchange rates)

  • ato-mcp — Australian Taxation Office (tax stats, ACNC charities)

  • apra-mcp — Australian Prudential Regulation Authority (banking, insurance, super)

  • aihw-mcp — Australian Institute of Health and Welfare

  • asic-mcp — this one. Financial advisers, AFS / credit licensees, banned persons & orgs, liquidators.

  • aemo-mcp — Australian Energy Market Operator (NEM dispatch, spot prices, generation)

  • au-weather-mcp — Open-Meteo (Bureau of Meteorology aggregator)

  • wgea-mcp — Workplace Gender Equality Agency

  • aus-identity — Postcode / state / ABN normalisation helper used by all sisters

The portfolio is designed to compose: an agent can ask for "current financial adviser in postcode 2000, paired with the AFS licensee's parent firm and the regulator's banning history" and one shot fans out across two or three MCPs.


Roadmap

  • v0.2: ASIC_REGISTERED_AUDITOR, ASIC_CREDIT_REPRESENTATIVE, ASIC_SMSF_AUDITOR. Streaming-lookup tool for the 373 MB Company Register (look up by ACN/ABN instead of bulk-loading).

  • v0.3: Insolvency Series 3.x XLSX from asic.gov.au (apra-mcp-style landing-page scrape). Short-position reports (daily CSV).

  • v0.4: Hosted version with x402 per-call paywall; programmatic SEO pages; MCPay + Apify listings.

CHANGELOG tracks every release.


Development

git clone https://github.com/Bigred97/asic-mcp.git
cd asic-mcp
uv sync --extra dev
uv run pytest                  # ~229 unit tests
uv run pytest -m live          # ~9 live tests against data.gov.au

Issues, ideas, and contributions welcome: github.com/Bigred97/asic-mcp/issues.

Available Tools

5 tools
describe_datasetA

Describe a dataset's filterable dimensions, returnable measures, and source.

Use this before calling get_data on a new dataset — it tells you the valid filter keys ('current_status', 'state', 'business_name'), the valid filter values ('current', 'ceased', 'nsw', 'vic'), and the source URL.

Returns: DatasetDetail with id, name, description, period_coverage, list of dimensions, list of measures, source_url, and download_url.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_idYesCurated dataset ID. Use the search endpoint or search tool to discover, or the list-curated endpoint/tool to enumerate. Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
measuresNo
dimensionsNo
is_curatedYes
source_urlYes
descriptionYes
download_urlNo
period_coverageNo
update_frequencyNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses what the call yields (filter keys, valid values, source URL) and its role as a prerequisite step, but says nothing about permissions, rate limits, or failure behavior for an unknown dataset_id — the kind of behavioral detail an unannotated tool would ideally supply.

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 the purpose, then the usage rule, then returns — a sensible ordering with no filler sentences. Slight redundancy: the 'Returns: DatasetDetail with ...' block restates fields that an output schema already publishes, so a sentence is spent duplicating structured data.

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 one-parameter read tool with a rich output schema, the description supplies everything needed: what it does, why to call it first, and concrete example filter keys/values. It is essentially complete, with only minor gaps around error cases and freshness of the discovered metadata.

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 coverage is 100%: the single `dataset_id` parameter already documents its curated-ID nature, case-insensitivity, and discovery path with examples. The description's concrete filter keys and values are about the *result*, not about how to set the parameter, so it adds little beyond the schema — the 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?

The description names a specific verb and resource ('Describe a dataset's filterable dimensions, returnable measures, and source') and explicitly separates itself from the sibling `get_data`, which it positions as the downstream step. An agent can distinguish this metadata-inspection tool from retrieval tools 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear precondition ('Use this before calling get_data on a new dataset') and names the alternative being deferred to. It does not explain when this is unnecessary (e.g., a dataset already described) or route to the other siblings `search_datasets` / `list_curated` for discovery, so it stops just short of a full when/when-not statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_dataA

Query a curated ASIC register dataset and return matching rows.

Examples: # All currently registered financial advisers in NSW resp = await get_data( "ASIC_FINANCIAL_ADVISERS", filters={"current_status": "current", "state": "nsw"}, )

# AFS licensees whose legal name contains "Macquarie"
resp = await get_data(
    "ASIC_AFS_LICENSEE",
    filters={"licensee_name": "Macquarie"},
)

# Persons banned or disqualified after 2024
resp = await get_data(
    "ASIC_BANNED_PERSONS",
    start_period="2024-01-01",
)

# Full authorisation text for one AFS licensee
resp = await get_data(
    "ASIC_AFS_LICENSEE",
    filters={"licensee_name": "Macquarie Bank Limited"},
    include_full_authorisation=True,
)

Returns: DataResponse with records (or csv), unit, period bounds, row_count, source URL, and CC-BY 3.0 AU attribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoResponse shape. 'records' (default): flat list of observations. 'series': grouped by measure. 'csv': pandas CSV string in `csv` field.records
filtersNoDimension filters. Keys are plain-English aliases from the dataset's describe_dataset response. Values are matched against the source data; pass a list to OR across values. Examples: {'current_status': 'current'}, {'state': 'nsw'}, {'licensee_name': ['Westpac Banking Corporation', 'NAB']}. MCP clients that cannot send a native object may pass this as a JSON-encoded string instead, e.g. '{"state": "nsw"}'.
dataset_idYesCurated dataset ID. Use the search or list-curated endpoint/tool to discover.
end_periodNoInclusive end date. Same format as start_period.
start_periodNoInclusive start date for time-bounded register fields (date of registration, date banned, etc.). Format: 'YYYY', 'YYYY-MM', or 'YYYY-MM-DD'. Bare int years like 2020 are coerced to '2020' automatically.
include_full_authorisationNoASIC_AFS_LICENSEE only. The `authorisation` field carries 2-3 KB of license boilerplate per record (which financial services and products the licensee may deal in). To keep responses under the portfolio's 10k-token target, that field is truncated to ~200 chars by default with a [truncated] suffix. Pass True to receive the full text — useful when verifying scope conditions for a specific licensee. Ignored for the other ASIC datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
unitNo
queryNo
staleNo
periodNo
sourceNo
recordsNo
row_countNo
dataset_idYes
source_urlYes
attributionNo
dataset_nameYes
retrieved_atYes
stale_reasonNo
truncated_atNo
server_versionNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and 'Query... return matching rows' implies a read-only operation but never states it outright. It does add useful behavioral detail (CC-BY attribution, source URL, row_count, and the authorisation truncation rationale), though some of that overlaps the schema. No auth, rate-limit, or pagination behavior is disclosed.

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?

A tight one-line purpose statement is front-loaded, followed by four compact examples that each illustrate a distinct capability. The examples are longer than strictly necessary but each earns its place by showing a different parameter combination.

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 six-parameter query tool with an output schema and 100% schema coverage, the description supplies the practical context an agent needs (discovery pointer, example filter usage, truncation caveat). The Returns section partially duplicates the output schema, so there is minor redundancy rather than a 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 baseline is 3. The examples reinforce real filter keys and the start_period/end_period pairing, but they largely restate what the schema already documents thoroughly rather than adding new semantics.

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 opening sentence gives a specific verb and resource ('Query a curated ASIC register dataset and return matching rows'), and the four worked examples make the scope concrete. It stops short of naming or contrasting siblings like search_datasets or describe_dataset, so an agent still has to infer routing, but the purpose itself is unambiguous.

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?

The examples effectively demonstrate the range of valid invocations (filters, period bounds, include_full_authorisation) and the dataset_id schema note points to the discovery tools. There is no explicit when-not-to-use or a stated 'call describe_dataset first' workflow, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

latestA

Return the most recent observation(s) per measure for a dataset.

For register data, "latest" is the current weekly/monthly snapshot capped at limit rows (default 50). For time-bounded fields (date_banned, date_ceased), latest returns the most recent matching record per entity.

Pass filters to drill into one entity (no truncation hits) or raise limit to request more rows.

Examples: # Current registered status for one adviser (precise filter, no truncation) resp = await latest( "ASIC_FINANCIAL_ADVISERS", filters={"adviser_number": "1234567"}, )

# First 50 most-recent banned persons (truncated; full count in resp.truncated_at)
resp = await latest("ASIC_BANNED_PERSONS")

# Get 500 rows in one go (still capped, but bigger window)
resp = await latest("ASIC_AFS_LICENSEE", limit=500)

# Full authorisation text for one AFS licensee
resp = await latest(
    "ASIC_AFS_LICENSEE",
    filters={"licensee_name": "Macquarie Bank Limited"},
    include_full_authorisation=True,
)
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return. ASIC registers can be huge — ASIC_AFS_AUTH_REP alone has ~360,000 rows. Without a cap the response blows an agent's context window. Pass filters to narrow the search; raise `limit` only if you genuinely need a bulk dump. Truncated responses set DataResponse.truncated_at to the original row count so agents can detect + surface it.
filtersNoSame filter shape as get_data. Useful for narrowing to one entity. MCP clients that cannot send a native object may pass this as a JSON-encoded string instead, e.g. '{"adviser_number": "1234567"}'.
dataset_idYesCurated dataset ID.
include_full_authorisationNoASIC_AFS_LICENSEE only. The `authorisation` field carries 2-3 KB of license boilerplate per record. To stay under the portfolio's 10k-token target, that field is truncated to ~200 chars by default. Pass True to receive the full text — typically used when narrowing to one licensee. Ignored for the other ASIC datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
csvNo
unitNo
queryNo
staleNo
periodNo
sourceNo
recordsNo
row_countNo
dataset_idYes
source_urlYes
attributionNo
dataset_nameYes
retrieved_atYes
stale_reasonNo
truncated_atNo
server_versionNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses the 50-row default cap, that huge registers blow the context window, that truncation sets DataResponse.truncated_at, and that `authorisation` is silently truncated to ~200 chars unless include_full_authorisation=True. It does not state read-only status, permissions, or rate limits, which keeps it out of the top band.

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 a one-line summary, then contract details, then worked examples; every block earns its place and the examples double as invocation templates. It is longer than strictly necessary, with some repetition of limit behavior between prose and schema.

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?

An output schema exists, yet the description still explains the truncated_at signal, which is the key thing an agent must react to. Combined with the filter/limit guidance, it is complete enough to call correctly, missing only sibling-selection guidance and any note on write-safety or auth.

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; the description exceeds it by adding rationale and cross-parameter interaction (filter vs. limit tradeoff, include_full_authorisation being ASIC_AFS_LICENSEE-only,-string fallback for filters). The examples duplicate the schema's own examples rather than adding new syntax.

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?

States a specific verb+resource: 'Return the most recent observation(s) per measure for a dataset', and clarifies two distinct semantics (register snapshot vs. time-bounded fields). It never explicitly contrasts itself with siblings like get_data or list_curated, so an agent must infer the boundary, but the purpose itself is unambiguous.

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?

Gives concrete guidance: pass `filters` to drill into one entity without truncation, or raise `limit` for a bulk dump, backed by four worked examples. It stops short of an explicit 'use latest instead of get_data when...' rule, so the selection boundary against siblings is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_curatedA

List every curated dataset ID in this version of asic-mcp.

These are the datasets where get_data accepts plain-English filter keys and returns aliased, well-typed columns. Each ID is documented via describe_dataset.

Returns: Sorted list of dataset IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden, and it does add real context: the listing is read-only in nature and the curated IDs are specifically the ones where get_data supports plain-English filter keys and returns aliased, well-typed columns. It also states the return shape is a sorted list. It doesn't cover versioning behavior or what happens if the dataset set changes, hence not a 5.

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 purpose is front-loaded in the first sentence, followed by a compact explanation of curated semantics and a short Returns block. All content earns its place, though the line break structure is slightly looser than necessary for such a small tool.

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?

With no parameters and an output schema present, the description only needs to convey purpose and the meaning of the returned IDs, which it does. The remaining gap is the absence of routing guidance against search_datasets/latest, which is a minor omission for a simple enumeration 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?

The tool takes zero parameters, so by rule the baseline is 4. The description correctly reflects a no-argument listing and adds no misleading parameter hints.

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 description gives a specific verb and resource — 'List every curated dataset ID in this version of asic-mcp' — and defines what 'curated' means in terms of sibling behavior (get_data accepts plain-English filter keys; IDs are documented via describe_dataset). An agent can distinguish this from search_datasets 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies a discovery role by tying curated IDs to get_data and describe_dataset, but never states explicitly when to call this versus search_datasets or latest. No exclusions or prerequisites are given, so usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_datasetsA

Fuzzy-search the curated ASIC dataset catalogue.

The curated set of hand-curated ASIC registers covers Financial Advisers, AFS Licensees, AFS Authorised Representatives, Credit Licensees, Credit Representatives, Banned and Disqualified Persons, Banned and Disqualified Organisations, Registered Liquidators, Registered Company Auditors, SMSF Auditors, Companies, Business Names, and Short Positions. Call list_curated() to get the live list rather than assuming a fixed count — the registry grows over time.

Examples: # Find the financial advisers register results = await search_datasets("financial adviser") # → [{id: 'ASIC_FINANCIAL_ADVISERS', name: 'Financial Advisers Register', ...}]

# Discover what's available on enforcement-related lists
results = await search_datasets("banned")

Returns: List of DatasetSummary (id, name, description, update_frequency, is_curated), ranked by relevance.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return, ranked by relevance.
queryYesFree-text search query. Matches against dataset IDs, names, descriptions, and curated search keywords. Case-insensitive.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses the matching surface (IDs, names, descriptions, curated keywords), case-insensitivity, relevance ranking, and the returned DatasetSummary fields. It omits no harm salient for a read-only search, though it never explicitly states the read-only nature.

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 what/where is front-loaded before the catalogue enumeration and code examples, and the examples earn their place by showing expected return shape. The long enumerated list of register types is somewhat bulkier than necessary for an agent that already has list_curated().

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?

With an output schema present, the description needn't explain return fields, and its inclusion of matching scope and ranking behavior is sufficient for correct invocation. Slight gap in not clarifying how results relate to the other sibling tools, but nothing blocking.

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 query and limit in full. The description adds only illustrative query examples, not new parameter semantics, so the baseline 3 is correct.

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 (fuzzy-search) and resource (the curated ASIC dataset catalogue), and immediately differentiates itself from the list_curated sibling by noting that list_curated gives the live list rather than a search. An agent can tell it apart from siblings 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes agents to list_curated() for the live list and demonstrates two concrete query scenarios, giving clear usage context. It does not, however, clarify how this differs from describe_dataset, get_data, or latest, so the sibling guidance is partial rather than complete.

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 updatesv0.6.22
    • First observeddescribe_dataset
    • First observedget_data
    • First observedlatest
    • First observedlist_curated
    • First observedsearch_datasets

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation4/5

get_data and latest both query dataset rows with filters and limit, creating mild overlap; however, latest is clearly scoped to most-recent snapshots while get_data handles general filtering. Other tools are distinct.

Naming Consistency3/5

Three tools follow verb_noun (search_datasets, describe_dataset, get_data), but list_curated breaks the pattern (verb + adjective, missing 'datasets') and latest is a lone adjective/noun. Mixed conventions overall.

Tool Count5/5

Five tools cover discovery (list, search, describe) and query (get_data, latest) without redundancy or bloat, fitting the focused ASIC dataset access purpose.

Completeness5/5

The surface supports discovery, metadata inspection, and data retrieval with filtering, pagination, and latest snapshots. No obvious missing CRUD operation or query capability for the domain.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Verify Australian and New Zealand businesses against government registers via any MCP-compatible AI agent. Returns registration status, directors, licences, trading names, and a three-tier risk assessment (CLEAR / ADVISORY / FLAGS_FOUND) that surfaces regulatory findings across jurisdictions — including bans, disqualifications, and insolvencies that may not appear in any single register.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Gives any MCP-compatible AI agent instant access to the Australian Business Register (ABR) — plus AI-powered business intelligence. Search 8M+ registered Australian entities by name or ABN, get full profiles, check GST status, and get an AI-generated opportunity assessment for any business.
    21 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to the UK FCA Financial Services Register, enabling firm and individual searches, firm details by FRN, appointed representatives lookups, and individual records by IRN.
    11 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Lets any MCP-speaking assistant look up SEC filings and fundamentals, 13F holdings, insider trades, BDC loan books, and U.S. government reference data from Treasury, FRED, FDIC, USAspending, USPTO and CFTC, with the source named on every answer. Most of its 29 tools run keyless against public sources, giving citations-backed answers without an account.
    193 PyPI
    MIT