{"serverId":"mcp-registry/cat.idescat/mcp","tools":[{"name":"get_idescat_stat","fixed":{"name":"get_idescat_stat","description":"Obtains information about an Idescat (Statistical Institute of Catalonia) statistic given its acronym. Use it when the user asks about a specific statistic identified by its acronym (for example, CENSPH, EPA, PIBC, AFI, etc.). The 'datasets' field is a key boolean: if true, the statistic is normalized and therefore available in get_idescat_stat_tables and the rest of the table-level tools (metadata, data, divisions, etc.); if false, the statistic is NOT normalized and get_idescat_stat_tables wil","inputSchema":{"type":"object","required":["stat"],"properties":{"stat":{"type":"string","description":"Statistic acronym in lowercase (for example, 'afi', 'censph')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":199,"tokensAfter":199},{"name":"get_idescat_stat_tables","fixed":{"name":"get_idescat_stat_tables","description":"Obtains the list of tables for an Idescat statistic given its official acronym. Use it when the user asks what tables or information a statistic has. The response contains a 'tables' array where each element has 'id' (numerical identifier) and 'name' (table title). Present each table as: name (id). Inform the user that they can request more details about a table by indicating its identifier.","inputSchema":{"type":"object","required":["stat"],"properties":{"stat":{"type":"string","description":"Statistic acronym in lowercase (for example, 'censph', 'piba')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":172,"tokensAfter":172},{"name":"get_idescat_stats","fixed":{"name":"get_idescat_stats","description":"Obtains the complete list of Idescat statistics (all, normalized and non-normalized). It has no parameters. The response contains a 'statistics' array where each element has: 'acronym' (lowercase acronym, e.g., 'censph', to be used as the 'stat' argument of the other tools), 'name' (title), 'description' (summary), 'datasets' (boolean), 'geo' (array of available territorial disaggregations), and 'url' (initial web address, relative to https://www.idescat.cat). Use it when the user asks what stat","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":165,"tokensAfter":165},{"name":"get_table_data","fixed":{"name":"get_table_data","description":"Retrieves the data (values) of an Idescat table in JSON-stat format for a territorial division. You can retrieve the ENTIRE table (without filters) or only a SUBSET by passing the OPTIONAL parameters 'filters' (specific categories per dimension) and/or 'last' (number of last time periods); filtering returns smaller responses and allows querying tables that as a whole would exceed the limit. The filters use the dimension identifiers and category codes (category.index) returned by get_table_metada","inputSchema":{"type":"object","required":["stat","table"],"properties":{"geo":{"type":"string","description":"Territorial division code (optional, defaults to 'cat' = Catalonia as a whole). Other values: 'prov', 'at', 'com', 'mun', 'dis', 'sec'. It must match the 'geo' checked in get_table_metadata. Divisions other than 'cat' usually exceed the 20,000 cell limit; in this case add filters (filters, last) to reduce the selection."},"sum":{"type":"array","items":{"type":"string"},"description":"OPTIONAL. Dimensions to collapse by adding up their categories (e.g. [\"AGE\"]). Only for additive metrics (listed in the metric dimension's extension \"%\"); TOTAL is excluded automatically; time, metric and territorial dimensions cannot be summed. The result is a single category with code SUM; the codes summed are listed in extension.derived."},"last":{"type":"integer","description":"OPTIONAL. Number of last time periods to retrieve (for example, 2 = the two most recent years). Do not combine it with an explicit filter on the time dimension"},"stat":{"type":"string","description":"Statistic acronym in lowercase (for example, 'censph', 'piba')"},"table":{"type":"string","description":"Numerical identifier of the table, obtained from get_idescat_stat_tables (for example, '21654', '8607')"},"derive":{"type":"object","properties":{"share":{"type":"string","description":"Dimension id: adds <METRIC>_SHARE = 100 × value / value(TOTAL of that dimension)."},"difference":{"type":"string","description":"\"previous\" or a period code: adds <METRIC>_DIFF versus the previous period or the given base period."},"percent_change":{"type":"string","description":"\"previous\" or a period code: adds <METRIC>_PCT = 100 × (value − base) / base."}},"description":"OPTIONAL. Derived metrics computed by the server. Results carry their own unit/decimals; cells that cannot be computed are null with status d.","additionalProperties":false},"filters":{"type":"object","description":"OPTIONAL filter by dimension: the keys are dimension identifiers (for example, 'SEX', 'COM', 'YEAR') and the values are category codes separated by commas (for example, {\"SEX\": \"F\", \"COM\": \"01,TOTAL\"}). The codes are obtained from category.index of get_table_metadata. Without filters, the entire table is retrieved. Values can also be AGE RANGE EXPRESSIONS for dimensions coded Y000/Y005_009/Y_GE100: \">=65\", \">65\", \"<16\", \"<=15\", \"16-64\" (resolved by the server to the exact list of codes, returned in extension.derived.ranges; an error is returned if the published groups cannot represent the bound exactly).","additionalProperties":{"type":"string"}}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":887,"tokensAfter":887},{"name":"get_table_geo","fixed":{"name":"get_table_geo","description":"Obtains the list of territorial divisions available for an Idescat table (for example: cat=Catalonia, com=counties and Aran, mun=municipalities, prov=provinces, at=territorial plan areas). The response contains a 'divisions' array where each element has 'id' (division code) and 'name' (label). Often it is NOT necessary to call it because get_table_metadata already returns these divisions in 'link.related'. Use it only if you need the list of divisions without having called the metadata. The 'id'","inputSchema":{"type":"object","required":["stat","table"],"properties":{"stat":{"type":"string","description":"Statistic acronym in lowercase (for example, 'censph', 'piba')"},"table":{"type":"string","description":"Numerical identifier of the table, obtained from get_idescat_stat_tables (for example, '21654', '8607')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":241,"tokensAfter":241},{"name":"get_table_metadata","fixed":{"name":"get_table_metadata","description":"Obtains the metadata for a specific Idescat table in JSON-stat format, given the statistic acronym (stat) and the table identifier (table). Use it when the user wants to know the details of a table: dimensions, categories available for each dimension (time periods, territorial scopes, sex, etc.), date of last update, units, etc. The acronym and identifier are previously obtained with get_idescat_stat_tables. At the end of the response, always include this Markdown link (substituting {stat} and {","inputSchema":{"type":"object","required":["stat","table"],"properties":{"geo":{"type":"string","description":"Territorial division code (optional, defaults to 'cat' = Catalonia as a whole). Other common values: 'prov' (provinces), 'at' (territorial plan areas), 'com' (counties and Aran), 'mun' (municipalities), 'dis' (census districts), 'sec' (census sections). See the available codes in 'link.related' of the response or in get_table_geo. Pass it to obtain the category codes for that division and be able to filter later."},"stat":{"type":"string","description":"Statistic acronym in lowercase (for example, 'censph', 'piba')"},"table":{"type":"string","description":"Numerical identifier of the table, obtained from get_idescat_stat_tables (for example, '21654', '8607')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":369,"tokensAfter":369}],"toolsChanged":6,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}