MCP Server

oecd-mcp-server

io.github.cyanheads/oecd-mcp-server
Business & Operations Data & Analytics Public & reachable MCP 2025-11-25

What this MCP does

Searches and queries OECD statistical dataflows, dimensions, codes, and observations with optional SQL analysis of staged datasets.

oecd_dataframe_describe
Oecd Dataframe Describe
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.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['canvas_id'], 'properties': {'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'Canvas ID returned by oecd_query_dataset â\x80\x94 exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the staged observation tables.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['canvas_id', 'tables', 'table_count']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['canvas_disabled', 'canvas_not_found'], 'description': 'Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is not configured â\x80\x94 CANVAS_PROVIDER_TYPE is unset. `canvas_not_found`: The canvas_id has expired or was never created. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'tables': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'kind', 'row_count', 'columns'], 'properties': {'kind': {'type': 'string', 'description': 'Object kind: "table" or "view".'}, 'name': {'type': 'string', 'description': 'Table name â\x80\x94 use in SQL FROM clauses.'}, 'columns': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'type'], 'properties': {'name': {'type': 'string', 'description': 'Column name.'}, 'type': {'type': 'string', 'description': 'DuckDB column type â\x80\x94 e.g. VARCHAR, DOUBLE, BIGINT.'}}, 'description': 'A column in the table with its DuckDB type.', 'additionalProperties': False}, 'description': 'Columns in the table.'}, 'row_count': {'type': 'number', 'description': 'Number of rows in the table.'}}, 'description': 'A canvas table or view with row count and column schema.', 'additionalProperties': False}, 'description': 'Tables and views staged on this canvas.'}, 'canvas_id': {'type': 'string', 'description': 'The canvas ID whose tables are listed.'}, 'table_count': {'type': 'number', 'description': 'Total number of tables and views.'}}, 'additionalProperties': False}
oecd_dataframe_query
Oecd Dataframe Query
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.
Read only Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['canvas_id', 'sql'], 'properties': {'sql': {'type': 'string', 'description': 'Read-only SELECT statement. Reference tables by the names returned by oecd_dataframe_describe. Only SELECT statements are allowed â\x80\x94 DDL, DML, and file-reading functions are rejected.'}, 'canvas_id': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'Canvas ID returned by oecd_query_dataset â\x80\x94 exactly 10 characters of letters, digits, hyphens, and underscores. Identifies the DataCanvas session holding the observation tables.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['rows', 'row_count', 'column_names']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'description': 'Result rows from the SQL query (capped at the canvas row limit).'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['canvas_disabled', 'canvas_not_found', 'table_not_found', 'invalid_sql', 'sql_execution_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `canvas_disabled`: DataCanvas is not configured â\x80\x94 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 â\x80\x94 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 â\x80\x94 a conversion, an invalid input, or a value out of range. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'row_count': {'type': 'number', 'description': 'Full result count before any row cap.'}, 'column_names': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Column names in the result, in order.'}}, 'additionalProperties': False}
oecd_get_dataset_info
Oecd Get Dataset Info
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['flow_ref'], 'properties': {'flow_ref': {'type': 'string', 'description': 'Full flow reference, either {agencyID},{dsd_id}@{df_id} â\x80\x94 e.g. "OECD.SDD.NAD,DSD_NAAG@DF_NAAG_I" â\x80\x94 or the bare {agencyID},{df_id} form OECD uses for the few dataflows published without a datastructure prefix. Obtain from oecd_search_datasets.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['flow_ref', 'dimensions', 'key_example', 'non_production', 'source']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_flow_ref', 'dataflow_not_found', 'rate_limited', 'upstream_timeout', 'upstream_unavailable', 'upstream_redirect', 'upstream_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_flow_ref`: The flow_ref parameter matches neither the {agencyID},{dsd_id}@{df_id} nor the {agencyID},{df_id} format. `dataflow_not_found`: No datastructure was found for the provided flow_ref. `rate_limited`: OECD throttled the request rate and was still refusing after the retries. `upstream_timeout`: OECD did not finish responding before OECD_TIMEOUT_MS elapsed. `upstream_unavailable`: OECD returned a server fault or was unreachable once the retries ran out. `upstream_redirect`: The configured OECD host answered with a redirect, which this server never follows. `upstream_error`: OECD refused the request with a status this server does not model â\x80\x94 an authorization challenge, a rejection from something sitting in front of the API, or a request read as malformed. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'source': {'type': 'string', 'const': 'OECD', 'description': 'Data source attribution â\x80\x94 always "OECD".'}, 'flow_ref': {'type': 'string', 'description': 'The resolved flow reference.'}, 'dimensions': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'position'], 'properties': {'id': {'type': 'string', 'description': 'Dimension identifier â\x80\x94 e.g. REF_AREA.'}, 'name': {'type': 'string', 'description': 'Concept name for the dimension â\x80\x94 e.g. "Reference area" for REF_AREA. Repeats the id when OECD publishes no concept for it.'}, 'position': {'type': 'number', 'description': '1-based position in the dot-delimited key. Segment at this position corresponds to this dimension.'}, 'codelist_ref': {'type': 'string', 'description': 'Codelist reference in the form {agencyID},{codelistID} â\x80\x94 use with oecd_get_dimension_values.'}}, 'description': 'A dataflow dimension with its key position and codelist reference.', 'additionalProperties': False}, 'description': 'Dimensions in ascending position order.'}, 'key_example': {'type': 'string', 'description': 'Example dot-delimited key with wildcards â\x80\x94 each dot corresponds to one dimension in position order. Empty segments are wildcards. Replace with actual codes from oecd_get_dimension_values.'}, 'non_production': {'type': 'boolean', 'description': 'True if OECD flagged this dataflow as experimental or deprecated.'}, 'time_dimension': {'type': 'object', 'required': ['id', 'name', 'position'], 'properties': {'id': {'type': 'string', 'description': 'Time dimension identifier â\x80\x94 typically TIME_PERIOD.'}, 'name': {'type': 'string', 'description': 'Concept name for the time dimension, repeating the id when none is published.'}, 'position': {'type': 'number', 'description': 'Position after all regular dimensions.'}}, 'description': 'Time dimension â\x80\x94 used for startPeriod/endPeriod filtering in oecd_query_dataset.', 'additionalProperties': False}}, 'additionalProperties': False}
oecd_get_dimension_values
Oecd Get Dimension Values
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['flow_ref', 'dimension_id'], 'properties': {'limit': {'type': 'integer', 'default': 50, 'maximum': 500, 'minimum': 1, 'description': 'Maximum codes to return (1â\x80\x93500, default 50).'}, 'query': {'type': 'string', 'description': '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': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': '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': {'type': 'string', 'description': 'Full flow reference â\x80\x94 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': {'type': 'string', 'description': 'Dimension identifier to fetch codes for â\x80\x94 e.g. "REF_AREA" or "MEASURE". Obtain valid dimension IDs from oecd_get_dataset_info.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['flow_ref', 'dimension_id', 'codes', 'code_count', 'source']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'codes': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name'], 'properties': {'id': {'type': 'string', 'description': 'SDMX code â\x80\x94 use in the dimension key for oecd_query_dataset.'}, 'name': {'type': 'string', 'description': 'Human-readable label for the code.'}}, 'description': 'A valid SDMX code and its human-readable label.', 'additionalProperties': False}, 'description': 'The requested page of codes, after query, offset, and limit are applied.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_flow_ref', 'dataflow_not_found', 'dimension_not_found', 'rate_limited', 'upstream_timeout', 'upstream_unavailable', 'upstream_redirect', 'upstream_error'], 'description': "Machine-readable failure mode. Declared by this tool: `invalid_flow_ref`: The flow_ref parameter matches neither the {agencyID},{dsd_id}@{df_id} nor the {agencyID},{df_id} format. `dataflow_not_found`: The flow_ref does not correspond to a known dataflow. `dimension_not_found`: The dimension_id is not present in this dataflow's structure. `rate_limited`: OECD throttled the request rate and was still refusing after the retries. `upstream_timeout`: OECD did not finish responding before OECD_TIMEOUT_MS elapsed. `upstream_unavailable`: OECD returned a server fault or was unreachable once the retries ran out. `upstream_redirect`: The configured OECD host answered with a redirect, which this server never follows. `upstream_error`: OECD refused the request with a status this server does not model â\x80\x94 an authorization challenge, a rejection from something sitting in front of the API, or a request read as malformed. Other values are possible when a failure originates below the handler."}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Present when the page needs explaining â\x80\x94 the dimension has no codelist, the query matched nothing, or codes remain beyond the page. States how to reach the rest.'}, 'source': {'type': 'string', 'const': 'OECD', 'description': 'Data source attribution â\x80\x94 always "OECD".'}, 'flow_ref': {'type': 'string', 'description': 'The flow reference this dimension belongs to.'}, 'code_count': {'type': 'number', 'description': "Number of codes in this page â\x80\x94 not the size of the dimension's codelist."}, 'totalCount': {'type': 'number', 'description': 'Codes matching before offset and limit, disclosed when the page does not cover them all.'}, 'dimension_id': {'type': 'string', 'description': 'The dimension whose codes are listed.'}, 'effectiveQuery': {'type': 'string', 'description': 'The substring filter as applied. Absent when the whole codelist was paged.'}}, 'additionalProperties': False}
oecd_list_agencies
Oecd List Agencies
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['agencies', 'total_agencies', 'total_dataflows', 'source']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['rate_limited', 'upstream_timeout', 'upstream_unavailable', 'upstream_redirect', 'upstream_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `rate_limited`: OECD throttled the request rate and was still refusing after the retries. `upstream_timeout`: OECD did not finish responding before OECD_TIMEOUT_MS elapsed. `upstream_unavailable`: OECD returned a server fault or was unreachable once the retries ran out. `upstream_redirect`: The configured OECD host answered with a redirect, which this server never follows. `upstream_error`: OECD refused the request with a status this server does not model â\x80\x94 an authorization challenge, a rejection from something sitting in front of the API, or a request read as malformed. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'source': {'type': 'string', 'const': 'OECD', 'description': 'Data source attribution â\x80\x94 always "OECD".'}, 'agencies': {'type': 'array', 'items': {'type': 'object', 'required': ['agency_id', 'dataflow_count'], 'properties': {'agency_id': {'type': 'string', 'description': 'Agency identifier â\x80\x94 e.g. OECD.SDD.NAD.'}, 'directorate': {'type': 'string', 'description': 'Name of the OECD directorate the agency sits in, resolved from the directorate segment of the identifier â\x80\x94 OECD.SDD.NAD is "Statistics and Data Directorate". Absent for a publisher outside OECD and when the agency scheme could not be reached.'}, 'dataflow_count': {'type': 'number', 'description': 'Number of dataflows published by this agency.'}}, 'description': 'An agency, its directorate, and its dataflow count.', 'additionalProperties': False}, 'description': 'Agencies and their dataflow counts, sorted descending by count.'}, 'total_agencies': {'type': 'number', 'description': 'Total number of distinct agencies.'}, 'total_dataflows': {'type': 'number', 'description': 'Total number of dataflows across all agencies.'}}, 'additionalProperties': False}
oecd_query_dataset
Oecd Query Dataset
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['flow_ref', 'key'], 'properties': {'key': {'type': 'string', 'description': '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.." â\x80\x94 Annual, USA or Germany, GDP, all remaining dimensions.'}, 'flow_ref': {'type': 'string', 'description': 'Full flow reference â\x80\x94 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': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]{10}$', 'description': 'Canvas ID from a prior oecd_query_dataset call â\x80\x94 exactly 10 characters of letters, digits, hyphens, and underscores â\x80\x94 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': {'type': 'string', 'description': 'End of the time range â\x80\x94 ISO period code such as "2023" or "2023-Q4". Omit to include up to the latest available period.'}, 'start_period': {'type': 'string', 'description': 'Start of the time range â\x80\x94 ISO period code such as "2010", "2010-Q1", or "2010-01". Omit to include all history (may produce very large results).'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['rows', 'row_count', 'query_flow_ref', 'query_key', 'source']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'properties': {}, 'description': 'Decoded observation row. One key per dataflow dimension (e.g. REF_AREA, TIME_PERIOD) and per observation attribute (e.g. UNIT_MULT, OBS_STATUS, PRICE_BASE), each holding a human-readable label; attributes absent from this slice are omitted. Plus "value" â\x80\x94 the observation already multiplied by "value_scale", the power of ten from UNIT_MULT (1 when the dataflow declares no multiplier; divide value by it for the figure as OECD published it) â\x80\x94 and "source" ("OECD").', 'additionalProperties': {}}, 'description': 'Observation rows. Every row of the result when truncated is absent; the leading preview slice when truncated is true â\x80\x94 query the canvas table for the rest.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_flow_ref', 'dataflow_not_found', 'no_results', 'invalid_key', 'invalid_period', 'rate_limited', 'download_limit', 'upstream_timeout', 'upstream_unavailable', 'upstream_redirect', 'upstream_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_flow_ref`: The flow_ref parameter matches neither the {agencyID},{dsd_id}@{df_id} nor the {agencyID},{df_id} format. `dataflow_not_found`: The flow_ref does not correspond to a known OECD dataflow. `no_results`: The dataflow exists but no observations matched the key and time range. `invalid_key`: OECD rejected the dimension key â\x80\x94 wrong number of segments, or an unsupported format. `invalid_period`: OECD could not parse start_period or end_period. `rate_limited`: OECD throttled the request rate and was still refusing after the retries. `download_limit`: OECD refused the query for exceeding its data-download or data-range limit. `upstream_timeout`: OECD did not finish responding before OECD_TIMEOUT_MS elapsed. `upstream_unavailable`: OECD returned a server fault or was unreachable once the retries ran out. `upstream_redirect`: The configured OECD host answered with a redirect, which this server never follows. `upstream_error`: OECD refused the request with a status this server does not model â\x80\x94 an authorization challenge, a rejection from something sitting in front of the API, or a request read as malformed. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'source': {'type': 'string', 'const': 'OECD', 'description': 'Data source attribution â\x80\x94 always "OECD".'}, 'canvas_id': {'type': 'string', 'description': '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': {'type': 'string', 'description': 'Dimension key used in this query.'}, 'row_count': {'type': 'number', 'description': 'Total rows in the result (or on the canvas when truncated).'}, 'truncated': {'type': 'boolean', 'description': '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 â\x80\x94 content_table_capped reports that separately.'}, 'table_name': {'type': 'string', 'description': 'Canvas table name holding the full result â\x80\x94 present when canvas_id is set.'}, 'query_flow_ref': {'type': 'string', 'description': 'Flow reference used in this query.'}, 'query_end_period': {'type': 'string', 'description': 'End period filter applied in this query, if any.'}, 'content_table_rows': {'type': 'number', 'description': 'Rows the rendered table shows when content_table_capped is true.'}, 'query_start_period': {'type': 'string', 'description': 'Start period filter applied in this query, if any.'}, 'content_table_capped': {'type': 'boolean', 'description': '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.'}}, 'additionalProperties': False}
oecd_search_datasets
Oecd Search Datasets
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.
Read only Open world Idempotent
Input schema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of results to return (1â\x80\x93100, default 20).'}, 'query': {'type': 'string', 'description': 'Keyword or phrase to search for in dataflow names and descriptions â\x80\x94 e.g. "GDP", "employment", "education". Every whitespace-separated token must appear somewhere in the name or description.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': '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': {'type': 'string', 'description': 'Optional agency identifier to restrict the search scope â\x80\x94 e.g. "OECD.SDD.NAD". Obtain valid agency IDs from oecd_list_agencies.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['dataflows', 'result_count', 'total_matches', 'offset', 'source']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_match', 'agency_not_found', 'rate_limited', 'upstream_timeout', 'upstream_unavailable', 'upstream_redirect', 'upstream_error'], 'description': 'Machine-readable failure mode. Declared by this tool: `no_match`: No dataflows matched the search query. `agency_not_found`: The supplied agency_id does not exist in the OECD SDMX catalog. `rate_limited`: OECD throttled the request rate and was still refusing after the retries. `upstream_timeout`: OECD did not finish responding before OECD_TIMEOUT_MS elapsed. `upstream_unavailable`: OECD returned a server fault or was unreachable once the retries ran out. `upstream_redirect`: The configured OECD host answered with a redirect, which this server never follows. `upstream_error`: OECD refused the request with a status this server does not model â\x80\x94 an authorization challenge, a rejection from something sitting in front of the API, or a request read as malformed. Other values are possible when a failure originates below the handler.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'offset': {'type': 'number', 'description': 'Zero-based index of the first returned result within the full match list.'}, 'source': {'type': 'string', 'const': 'OECD', 'description': 'Data source attribution â\x80\x94 always "OECD".'}, 'dataflows': {'type': 'array', 'items': {'type': 'object', 'required': ['flow_ref', 'agency_id', 'name', 'matched_in', 'non_production'], 'properties': {'name': {'type': 'string', 'description': 'Human-readable dataflow name.'}, 'flow_ref': {'type': 'string', 'description': 'Full flow reference â\x80\x94 {agencyID},{dsd_id}@{df_id}, or {agencyID},{df_id} for the few dataflows OECD publishes without a datastructure prefix. Pass through unchanged to oecd_get_dataset_info or oecd_query_dataset.'}, 'agency_id': {'type': 'string', 'description': 'Publishing agency identifier.'}, 'matched_in': {'enum': ['name', 'description', 'both'], 'type': 'string', 'description': 'Which field carried every query token â\x80\x94 "name" or "description" when only that one did, "both" when each did on its own or the tokens were split across the two.'}, 'description': {'type': 'string', 'description': 'Plain-text abstract of what the dataset covers, truncated to 240 characters. Matching runs against the full abstract, so a term reported in matched_in may sit past the cut. Absent when OECD publishes no description for the dataflow.'}, 'non_production': {'type': 'boolean', 'description': 'True if flagged as experimental or deprecated by OECD.'}}, 'description': 'A matching OECD dataflow entry.', 'additionalProperties': False}, 'description': 'Matching dataflows for the requested page, up to the requested limit.'}, 'totalCount': {'type': 'number', 'description': 'Total dataflows matching the query, disclosed when matches remain beyond the returned page.'}, 'result_count': {'type': 'number', 'description': 'Number of results returned (may be less than total_matches).'}, 'total_matches': {'type': 'number', 'description': 'Total dataflows matching the query before applying offset and limit.'}}, 'additionalProperties': False}
Changed
oecd_dataframe_query
Sept. 21, 2026, 2:50 a.m.
Changed
oecd_dataframe_describe
Sept. 21, 2026, 2:50 a.m.
Changed
oecd_query_dataset
Sept. 21, 2026, 2:50 a.m.
Added
oecd_dataframe_query
Sept. 17, 2026, 12:41 p.m.
Added
oecd_dataframe_describe
Sept. 17, 2026, 12:41 p.m.
Added
oecd_query_dataset
Sept. 17, 2026, 12:41 p.m.
Added
oecd_get_dimension_values
Sept. 17, 2026, 12:41 p.m.
Added
oecd_get_dataset_info
Sept. 17, 2026, 12:41 p.m.
Added
oecd_search_datasets
Sept. 17, 2026, 12:41 p.m.
Added
oecd_list_agencies
Sept. 17, 2026, 12:41 p.m.