oecd-mcp-server
Server Details
Search and query 1,500+ OECD statistical datasets via SDMX. Keyless.
- Status
- Healthy
- Uptime
- 100.0% over 35 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/oecd-mcp-server
- GitHub Stars
- 2
- Server Listing
- OECD MCP Server
TDQS
Scored across 7 tools
Every tool targets a distinct stage of the OECD data workflow: search, agency discovery, dataset structure, dimension codelists, and observation queries. The DataCanvas describe/query pair is clearly separated from the main query tool by its purpose of exploring spilled tabular results.
All tools share the oecd_ prefix and use snake_case with clear verbs like search, list, get, and query. The two DataCanvas tools use a noun-verb pattern (dataframe_describe, dataframe_query) instead of the verb-noun pattern used elsewhere, which is a minor but noticeable deviation.
Seven tools is appropriate for the stated purpose of browsing and querying OECD SDMX datasets. Each tool maps to a meaningful step in the workflow, and none feel redundant or superfluous.
The set covers the entire read-only lifecycle: discovering datasets, resolving dimensions, querying observations, and working with large result sets via DataCanvas. There are no obvious dead ends or missing operations for this domain.
Available Tools
7 toolsoecd_dataframe_describeOecd Dataframe DescribeARead-onlyIdempotentInspect
List tables and columns staged on a DataCanvas by a prior oecd_query_dataset spill. Call this before oecd_dataframe_query to discover exact table and column names for SQL. Only available when CANVAS_PROVIDER_TYPE=duckdb is set.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | Yes | Canvas ID returned by oecd_query_dataset — exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the staged observation tables. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| tables | No | Tables and views staged on this canvas. |
| canvas_id | No | The canvas ID whose tables are listed. |
| table_count | No | Total number of tables and views. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds context by explaining the dependency on a prior oecd_query_dataset spill and the duckdb provider requirement, which is useful behavioral context not present in annotations. It does not, however, describe what happens when no spill exists or when the provider condition is unmet, but the output schema covers return shape.
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 two sentences with no filler. The core purpose is front-loaded, the key usage ordering is stated immediately, and the environment constraint is given last. Every sentence carries distinct and necessary information.
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?
Given the tool has one fully documented parameter, an output schema, and annotations covering read-only and idempotent behavior, the description is complete for agent decision-making. It tells the agent what the tool does, when to call it, what it enables, and the precondition required.
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%: the canvas_id parameter is fully described in the schema, including its 10-character pattern and purpose. The description does not add extra detail about the parameter itself, so the baseline of 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?
The description opens with a specific verb and resource: 'List tables and columns staged on a DataCanvas.' It clearly identifies this as a discovery tool for inspecting spill results, which is distinct from querying via oecd_dataframe_query or fetching dataset metadata. The name and title are supported rather than merely restated.
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?
The description gives explicit sequencing context: 'Call this before oecd_dataframe_query to discover exact table and column names for SQL.' It also states a concrete availability condition: 'Only available when CANVAS_PROVIDER_TYPE=duckdb is set.' It lacks an explicit when-not-to-use statement or mention of alternatives beyond the implied sibling ordering, but the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_dataframe_queryOecd Dataframe QueryARead-onlyIdempotentInspect
Run a read-only SQL SELECT against OECD observation tables staged on a DataCanvas by oecd_query_dataset. Call oecd_dataframe_describe first to discover exact table and column names, then use this tool for aggregation, filtering, GROUP BY, JOIN, and window functions. Only available when CANVAS_PROVIDER_TYPE=duckdb is set.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | Read-only SELECT statement. Reference tables by the names returned by oecd_dataframe_describe. Only SELECT statements are allowed — DDL, DML, and file-reading functions are rejected. | |
| canvas_id | Yes | Canvas ID returned by oecd_query_dataset — exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the observation tables. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Result rows from the SQL query (capped at the canvas row limit). |
| error | No | Present when the call failed. Absent on success. |
| row_count | No | Full result count before any row cap. |
| column_names | No | Column names in the result, in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description explicitly forbids DDL, DML, and file-reading functions, and discloses the runtime availability constraint based on CANVAS_PROVIDER_TYPE. This gives the agent concrete behavioral boundaries that are not fully captured by annotations alone.
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 three sentences with no filler. It front-loads the core purpose and read-only nature, then provides the prerequisite workflow, supported operations, and environment requirement. Every sentence contributes meaningful information.
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?
The description covers the prerequisite discovery step, the supported SQL operations, the rejection of non-SELECT statements, the dependency on oecd_query_dataset, and the duckdb environment requirement. Combined with the output schema, an agent has enough context to call the tool correctly without missing critical setup or constraints.
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. The description adds value by explaining the relationship between the SQL parameter and table names returned by oecd_dataframe_describe, and by naming the supported query capabilities (aggregation, filtering, GROUP BY, JOIN, window functions) beyond the schema's generic SELECT statement description.
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 states a specific verb ('Run'), a resource ('OECD observation tables staged on a DataCanvas'), and the operation type ('read-only SQL SELECT'). It differentiates this tool from sibling tools by noting that oecd_dataframe_describe should be called first and that this tool is for querying staged tables, not for fetching or describing datasets.
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?
The description gives clear usage context: call oecd_dataframe_describe first to discover table and column names, then use this tool for aggregation, filtering, GROUP BY, JOIN, and window functions. It also states the environment prerequisite (CANVAS_PROVIDER_TYPE=duckdb). It does not explicitly name alternatives or when-not-to-use scenarios, but the guidance is strong enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_get_dataset_infoOecd Get Dataset InfoARead-onlyIdempotentInspect
Fetch a dataflow's dimensions, their order, and how to construct a query key. Returns per-dimension names, codelist references, and position in the dot-delimited key. Required before calling oecd_query_dataset to understand key structure.
| Name | Required | Description | Default |
|---|---|---|---|
| flow_ref | Yes | Full flow reference, either {agencyID},{dsd_id}@{df_id} — e.g. "OECD.SDD.NAD,DSD_NAAG@DF_NAAG_I" — or the bare {agencyID},{df_id} form OECD uses for the few dataflows published without a datastructure prefix. Obtain from oecd_search_datasets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source attribution — always "OECD". |
| flow_ref | No | The resolved flow reference. |
| dimensions | No | Dimensions in ascending position order. |
| key_example | No | Example dot-delimited key with wildcards — each dot corresponds to one dimension in position order. Empty segments are wildcards. Replace with actual codes from oecd_get_dimension_values. |
| non_production | No | True if OECD flagged this dataflow as experimental or deprecated. |
| time_dimension | No | Time dimension — used for startPeriod/endPeriod filtering in oecd_query_dataset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds value by disclosing that the tool returns key-construction information (position in the dot-delimited key) and that it is a prerequisite step, which is behavioral context beyond the annotations. It doesn't discuss rate limits or error cases, but for a read-only metadata fetch the annotations plus the description are sufficient.
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?
Three sentences, each earning its place: the first states what the tool returns, the second details the return contents, and the third gives the usage context. The most important information (what it fetches and why it's needed) is front-loaded. No filler or repetition of schema details.
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?
The tool has one parameter, a rich schema description, an output schema, and annotations covering safety and idempotency. The description explains the return value's purpose and the prerequisite relationship to oecd_query_dataset. Nothing an agent needs to decide whether to call this tool and how to use its output is missing.
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 flow_ref thoroughly, including the two accepted forms and an example. The description adds context by explaining that the output is needed to construct query keys, which helps the agent understand why flow_ref matters. Since the schema does the heavy lifting, a 4 is appropriate rather than a 5.
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 states a specific verb ('Fetch'), a specific resource ('a dataflow's dimensions'), and the concrete output (dimension names, codelist references, position in the dot-delimited key). It also explicitly distinguishes itself from oecd_query_dataset by saying it is required before calling that tool to understand key structure. This clearly differentiates it from siblings like oecd_get_dimension_values and oecd_query_dataset.
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?
The description explicitly says 'Required before calling oecd_query_dataset to understand key structure,' which gives a clear when-to-use directive and names the alternative it supports. It also implies this is a prerequisite/metadata tool rather than a data-fetching tool, which helps an agent choose it over oecd_query_dataset or oecd_get_dimension_values. No exclusions are needed because the tool's role as a prerequisite is clearly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_get_dimension_valuesOecd Get Dimension ValuesARead-onlyIdempotentInspect
Fetch the valid codes and labels for one dimension of a dataflow. Use to resolve human-readable names (countries, measures) to SDMX codes before querying with oecd_query_dataset. Pass query to match a code or label by substring — codelists run to a thousand-plus entries, and the response is a page of at most limit codes either way.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum codes to return (1–500, default 50). | |
| query | No | Case-insensitive substring matched against both the code and its label, so "PA" and "percent" each reach the code "PA" / "Percent per annum". Omit to page the whole codelist. | |
| offset | No | Zero-based index of the first code to return within the matching list, applied before limit. Advance it to page; an offset past the last match returns an empty page. | |
| flow_ref | Yes | Full flow reference — e.g. "OECD.SDD.NAD,DSD_NAAG@DF_NAAG_I", or the bare "OECD.TAD.ARP,DF_AEI2024_DASHBOARD" form for a dataflow published without a datastructure prefix. Obtain from oecd_search_datasets. | |
| dimension_id | Yes | Dimension identifier to fetch codes for — e.g. "REF_AREA" or "MEASURE". Obtain valid dimension IDs from oecd_get_dataset_info. |
Output Schema
| Name | Required | Description |
|---|---|---|
| codes | No | The requested page of codes, after query, offset, and limit are applied. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when the page needs explaining — the dimension has no codelist, the query matched nothing, or codes remain beyond the page. States how to reach the rest. |
| source | No | Data source attribution — always "OECD". |
| flow_ref | No | The flow reference this dimension belongs to. |
| code_count | No | Number of codes in this page — not the size of the dimension's codelist. |
| totalCount | No | Codes matching before offset and limit, disclosed when the page does not cover them all. |
| dimension_id | No | The dimension whose codes are listed. |
| effectiveQuery | No | The substring filter as applied. Absent when the whole codelist was paged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the readOnly/openWorld/idempotent annotations: responses are paginated at 'at most limit codes either way,' and codelists 'run to a thousand-plus entries,' explaining why querying and paging matter. No contradiction with annotations.
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?
Two sentences deliver purpose, usage context, a rationale for the query parameter, and pagination behavior. Everything earns its place and the key action is front-loaded.
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?
Input schema fully documents parameters, an output schema exists, and the description supplies the workflow context and pagination behavior. It is complete for practical use, though explicit alternative tool guidance would make it stronger.
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 applies. The description adds workflow context but does not materially elaborate on individual parameter meanings beyond what the schema already documents, so it neither compensates nor needs to.
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 states a specific verb and resource: 'Fetch the valid codes and labels for one dimension of a dataflow.' It also frames the tool's role in the workflow, resolving human-readable names to SDMX codes before using oecd_query_dataset, which differentiates it from sibling tools.
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?
Clear context is provided: use this tool to resolve names to codes before querying with oecd_query_dataset. It does not enumerate exclusions or alternative tools explicitly, but the intended position in the workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_list_agenciesOecd List AgenciesARead-onlyIdempotentInspect
List OECD SDMX agencies, the directorate each belongs to, and the number of dataflows each publishes. Use to discover agency IDs before filtering oecd_search_datasets by department.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source attribution — always "OECD". |
| agencies | No | Agencies and their dataflow counts, sorted descending by count. |
| total_agencies | No | Total number of distinct agencies. |
| total_dataflows | No | Total number of dataflows across all agencies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds value by naming the returned content (agencies, directorate, dataflow counts) and its intended role in a search workflow. It does not go further into behavior such as pagination, ordering, or how open-world results should be interpreted, but for a zero-parameter list tool this is sufficient.
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?
Two sentences with no filler. The first sentence states what the tool returns, and the second gives the concrete workflow purpose. Every word earns its place and the key action is front-loaded.
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 zero-parameter, read-only, idempotent listing tool with an output schema present, the description covers the essential information: what is returned and why an agent would invoke it. The annotations handle side-effect concerns, and the output schema handles return structure details.
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?
The tool has zero parameters, so the input schema is complete by definition and there is nothing for the description to clarify. Baseline for no-parameter tools is 4, and the description appropriately avoids inventing parameter information that does not exist.
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 opens with a specific verb and resource ('List OECD SDMX agencies') and specifies the exact output fields ('directorate each belongs to, and the number of dataflows each publishes'). It differentiates itself from siblings by positioning itself as the precursor to filtering oecd_search_datasets, so an agent can distinguish it 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?
The description gives an explicit use case: discover agency IDs before filtering oecd_search_datasets by department. It names the sibling tool and the workflow context. It does not explicitly state when not to use it, but the positive guidance is specific enough to route an agent effectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_query_datasetOecd Query DatasetARead-onlyIdempotentInspect
Fetch observations from an OECD dataflow filtered by a dimension key and optional time range. Returns decoded rows (one per observation) with dimension and attribute labels, and values already scaled by the observation unit multiplier. Large multi-country time-series spill to a DataCanvas table — follow up with oecd_dataframe_query; without DataCanvas every row still comes back, but the rendered table stops at a preview slice. Call oecd_get_dataset_info first to learn the dimension order for constructing the key.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Dot-delimited dimension key matching the dimension order from oecd_get_dataset_info. Empty segments are wildcards; "+" separates multiple values per segment. Example: "A.USA+DEU.B1GQ.." — Annual, USA or Germany, GDP, all remaining dimensions. | |
| flow_ref | Yes | Full flow reference — e.g. "OECD.SDD.NAD,DSD_NAAG@DF_NAAG_I", or the bare "OECD.TAD.ARP,DF_AEI2024_DASHBOARD" form for a dataflow published without a datastructure prefix. Obtain from oecd_search_datasets and pass it through unchanged. | |
| canvas_id | No | Canvas ID from a prior oecd_query_dataset call — exactly 10 characters of letters, digits, hyphens, and underscores — to stage this result alongside that one. Omit to let the server mint a canvas if this result needs one; a canvas_id comes back only when the result was large enough to spill, never on a result that fits inline. | |
| end_period | No | End of the time range — ISO period code such as "2023" or "2023-Q4". Omit to include up to the latest available period. | |
| start_period | No | Start of the time range — ISO period code such as "2010", "2010-Q1", or "2010-01". Omit to include all history (may produce very large results). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | Observation rows. Every row of the result when truncated is absent; the leading preview slice when truncated is true — query the canvas table for the rest. |
| error | No | Present when the call failed. Absent on success. |
| source | No | Data source attribution — always "OECD". |
| canvas_id | No | Canvas handle for the staged result. Present only when DataCanvas is configured and the result exceeded the inline budget; absent when DataCanvas is off, and absent when it is on but the result fit inline. Pass to oecd_dataframe_query or oecd_dataframe_describe. |
| query_key | No | Dimension key used in this query. |
| row_count | No | Total rows in the result (or on the canvas when truncated). |
| truncated | No | True when rows is a preview slice and the full result was staged on DataCanvas; omitted entirely (never false) when rows holds the complete result. Use oecd_dataframe_query with the canvas_id for analytics over the full set. A complete rows never means a complete rendered table — content_table_capped reports that separately. |
| table_name | No | Canvas table name holding the full result — present when canvas_id is set. |
| query_flow_ref | No | Flow reference used in this query. |
| query_end_period | No | End period filter applied in this query, if any. |
| content_table_rows | No | Rows the rendered table shows when content_table_capped is true. |
| query_start_period | No | Start period filter applied in this query, if any. |
| content_table_capped | No | True when the rendered table shows only the leading rows of the result. Distinct from truncated: nothing was staged anywhere, and structuredContent.rows still holds every row. To shrink the result itself, name fewer values per key segment or set a narrower start_period / end_period; to reach the full set as a queryable table instead, run with CANVAS_PROVIDER_TYPE=duckdb and follow up with oecd_dataframe_query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/openWorld/idempotent, so the bar is lower. The description still adds meaningful behavior: decoded rows with labels, values scaled by the observation unit multiplier, and the large-result spill to DataCanvas with a preview slice when DataCanvas is absent. These details go beyond the annotations and help an agent understand side effects and result handling. No contradiction with annotations.
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?
Three sentences with no filler: purpose, return behavior and spill edge case, and a necessary prerequisite. Every sentence contributes new information and the most important facts come first. This is appropriately compact for the tool's complexity.
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?
The description covers the core call, return shape, spill behavior, and the critical dimension-order prerequisite. With an output schema present and full schema parameter documentation, the remaining gaps (e.g., exact period formats, error cases) are already covered structurally. It is complete enough for correct invocation, though it doesn't discuss pagination or error scenarios in free text.
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. The description itself adds only cross-reference guidance (use oecd_get_dataset_info to learn dimension order), not extra semantics for the parameters. The schema's own descriptions already cover key syntax, flow_ref forms, canvas_id rules, and period formats. This does not meaningfully exceed the baseline.
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 clearly states a specific action—fetch observations from an OECD dataflow—and the filtering mechanism (dimension key, optional time range). It distinguishes itself from siblings like oecd_dataframe_query (which queries the spilled DataCanvas table) and oecd_get_dataset_info (which returns metadata). No ambiguity about what this tool does.
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?
The description gives explicit context: 'Call oecd_get_dataset_info first to learn the dimension order for constructing the key' and explains the spill behavior with a follow-up to oecd_dataframe_query. It does not explicitly enumerate when to avoid this tool in favor of other siblings, but the prerequisite and follow-up guidance are clear. This fits 'clear context, no exclusions.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_search_datasetsOecd Search DatasetsARead-onlyIdempotentInspect
Search OECD dataflows by keyword or theme, matching against dataflow names and descriptions. Returns flow_ref identifiers, names, and agency IDs for use with oecd_get_dataset_info.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (1–100, default 20). | |
| query | Yes | Keyword or phrase to search for in dataflow names and descriptions — e.g. "GDP", "employment", "education". Every whitespace-separated token must appear somewhere in the name or description. | |
| offset | No | Zero-based index of the first match to return, applied before limit. Page through results past the limit by advancing it; an offset at or past total_matches returns an empty list. | |
| agency_id | No | Optional agency identifier to restrict the search scope — e.g. "OECD.SDD.NAD". Obtain valid agency IDs from oecd_list_agencies. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| offset | No | Zero-based index of the first returned result within the full match list. |
| source | No | Data source attribution — always "OECD". |
| dataflows | No | Matching dataflows for the requested page, up to the requested limit. |
| totalCount | No | Total dataflows matching the query, disclosed when matches remain beyond the returned page. |
| result_count | No | Number of results returned (may be less than total_matches). |
| total_matches | No | Total dataflows matching the query before applying offset and limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld behavior, so the description only needs to add context. It adds the matching behavior (against names and descriptions) and the specific return payload, which is useful beyond the annotations. No contradiction with the annotation hints.
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?
Two sentences with no filler; the search action and matching scope are front-loaded, and the return-value note is relevant to downstream tool selection.
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 read-only search tool with a fully documented schema, rich annotations, and an output schema, the description covers the necessary selection and invocation context. It tells the agent what to expect and how the result connects to oecd_get_dataset_info.
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%, and the input schema already documents query, limit, offset, and agency_id with examples and constraints. The tool description adds no parameter-level meaning, so the 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?
The description specifies a concrete action (search OECD dataflows by keyword or theme), the matching target (dataflow names and descriptions), and the returned identifiers (flow_ref, names, agency IDs). It also positions the tool as the discovery step preceding oecd_get_dataset_info, distinguishing it from sibling query/dataframe tools.
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?
The description makes the intended workflow clear: search by keyword or theme to obtain identifiers 'for use with oecd_get_dataset_info.' It does not explicitly list when not to use it or name alternatives, so it stops short of full exclusion guidance.
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.
3 tool updates
- Changed
oecd_dataframe_describe2 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by oecd_query_dataset. Identifies the DataCanvas session holding the staged observation tables."New value: +"Canvas ID returned by oecd_query_dataset — exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the staged observation tables." - added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
- Changed
oecd_dataframe_query4 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID returned by oecd_query_dataset. Identifies the DataCanvas session holding the observation tables."New value: +"Canvas ID returned by oecd_query_dataset — exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the observation tables." - added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is not configured — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id has expired or was never created. `table_not_found`: The SQL names a table this canvas does not hold — it expired, was dropped, or the name is wrong. `invalid_sql`: The SQL is not a valid SELECT statement or contains disallowed operations. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is not configured — CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id has expired or was never created. `table_not_found`: The SQL names a table this canvas does not hold — it expired, was dropped, or the name is wrong. `invalid_sql`: The SQL is not a valid SELECT statement or contains disallowed operations. `sql_execution_error`: The SQL parsed and ran, then failed on the staged observation data — a conversion, an invalid input, or a value out of range. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "canvas_disabled", - "canvas_not_found", - "table_not_found", - "invalid_sql" -]New value: +[ + "canvas_disabled", + "canvas_not_found", + "table_not_found", + "invalid_sql", + "sql_execution_error" +]
- Changed
oecd_query_dataset2 fields changed- changed
Input schema / properties / canvas_id / descriptionPrevious value: -"Canvas ID from a prior oecd_query_dataset call, to stage this result alongside that one. Omit to let the server mint a canvas if this result needs one — a canvas_id comes back only when the result was large enough to spill, never on a result that fits inline."New value: +"Canvas ID from a prior oecd_query_dataset call — exactly 10 characters of letters, digits, hyphens, and underscores — to stage this result alongside that one. Omit to let the server mint a canvas if this result needs one; a canvas_id comes back only when the result was large enough to spill, never on a result that fits inline." - added
Input schema / properties / canvas_id / patternAdded value: +"^[A-Za-z0-9_-]{10}$"
7 tool updates
- First observed
oecd_dataframe_describe - First observed
oecd_dataframe_query - First observed
oecd_get_dataset_info - First observed
oecd_get_dimension_values - First observed
oecd_list_agencies - First observed
oecd_query_dataset - First observed
oecd_search_datasets
Related MCP Connectors
Query IMF SDMX 3.0 macroeconomic dataflows — WEO, BOP, CPI, exchange rates, 190 countries.
Search ILOSTAT labour indicators, query and compare series, build country profiles, run SQL.
UK Office for National Statistics dataset catalogue + Beta JSON API
Search and query the Eurostat catalogue — EU economy, demography, trade, and NUTS regional data.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides AI assistants access to over 5,000 OECD economic and statistical datasets via the SDMX API for search, analysis, and comparison across 38 countries.953 npm8MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying OECD data through MCP, including searching curated dataflows, fetching tidy dataset rows from the OECD SDMX REST API, and asking natural-language questions via the Pipeworx gateway.510 npmMIT
- AlicenseAqualityBmaintenanceProvides OECD statistical data (employment, wages, etc.) through SDMX API, supporting Korean-language queries. Enables listing indicators, retrieving stats, trends, comparisons, and rankings among OECD countries.8MIT
- AlicenseAqualityBmaintenanceEnables querying, exploring, and downloading ISTAT statistical datasets via SDMX REST API, with unified metadata, territorial code resolution, and data extraction.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.