Skip to main content
Glama

mcp-csu

MCP server for the Czech Statistical Office (ČSÚ / CZSO) DataStat API. Gives AI assistants direct access to 700+ statistical datasets about the Czech Republic — population, economy, prices, wages, employment, industry, agriculture, trade, tourism, environment, and more.

Single Python file. No cloning required — just uvx mcp-csu.

Features

  • Full catalog access — search, browse, and inspect all 700+ datasets and 1500+ predefined tables

  • Data retrieval — fetch statistical data as CSV, query individual values with full context

  • AI-optimized output — human-readable text for metadata, CSV for data, automatic truncation with row counts

  • Rate limiting — built-in concurrency control (3 parallel requests) and minimum request interval (150ms)

  • Caching — catalog listings cached in memory for 10 minutes to avoid redundant requests

  • No authentication — the DataStat API is public

Related MCP server: golemio-mcp

Prerequisites

  • uv (Python package runner)

That's it. Python and all dependencies are managed automatically by uv.

Configuration

Claude Code

Add to ~/.claude/settings.json:

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

Claude Desktop

Add to claude_desktop_config.json:

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

Any MCP client

The server uses stdio transport (default). Launch command:

uvx mcp-csu

Data model

The DataStat database has a hierarchical structure:

Dataset (sada)              e.g. CEN0101H — "Míra inflace"
├── Dimensions (dimenze)    e.g. CasR (years), Uz0 (territory)
│   └── Items (položky)     e.g. "2024", "CZ"
├── Indicators (ukazatele)  e.g. 6134J06 — "Průměrná roční míra inflace"
└── Selections (výběry)     e.g. CEN0101HT01 — "Průměrná roční míra inflace"
    └── CSV data            pre-configured table ready to fetch

Datasets contain raw multidimensional data. Each dataset has dimensions (time, territory, categories) and indicators (what is measured).

Selections are predefined views — a specific slice of a dataset with fixed dimension arrangement. They are the easiest way to get data.

Tools

Discovery

search_datasets

Full-text search across all datasets. Returns dataset codes, names, time period types, and territory levels.

Parameter

Type

Required

Description

query

string

yes

Search keyword (Czech recommended)

search_datasets("inflace")
→ Found 3 dataset(s):
    WCEN01 (v4) — Index spotřebitelských cen (indexy, míra inflace)
    WCEN01M (v1) — Index spotřebitelských cen — měsíční data
    CEN0101H (v1) — Míra inflace

search_selections

Full-text search across all predefined data tables.

Parameter

Type

Required

Description

query

string

yes

Search keyword (Czech recommended)

search_selections("mzdy")
→ Found 30 selection(s):
    MZDQ1T1 — Průměrný evidenční počet zaměstnanců a průměrné hrubé měsíční mzdy...
      Period: Čtvrtletí | Territory: Stát | Dataset: MZDQ1

list_datasets

Paginated listing of all datasets.

Parameter

Type

Default

Description

offset

int

0

Skip first N items

limit

int

30

Items per page (max 100)

list_selections

Paginated listing of all predefined tables.

Parameter

Type

Default

Description

offset

int

0

Skip first N items

limit

int

30

Items per page (max 100)

Exploration

get_dataset

Full dataset metadata: dimensions with item counts, indicators with definitions, keywords, update frequency.

Parameter

Type

Required

Description

dataset_code

string

yes

Dataset code (e.g. CEN0101H)

get_dataset("CEN0101H")
→ Dataset: CEN0101H (v1)
  Name: Míra inflace
  Keywords: míra inflace
  Update frequency: MONTHLY

  Dimensions (4):
    CasM — Měsíce (720 items)
    CasR — Roky (61 items)
    CASRMX — Měsíce, roky (780 items)
    Uz0 — Území (1 items)

  Indicators (4):
    6134J09 — Přírůstek průměrného ročního indexu spotřebitelských cen - měsíční
    6134J06 — Průměrná roční míra inflace
    ...

get_dataset_selections

List predefined data tables for a specific dataset.

Parameter

Type

Required

Description

dataset_code

string

yes

Dataset code

get_dataset_selections("CEN0101H")
→ Selections for CEN0101H (2):
    CEN0101HT01 — Průměrná roční míra inflace
      Period: Rok | Territory: Stát
    CEN0101HT02 — Míra inflace - měsíční
      Period: Měsíc | Territory: Stát

get_dimension_items

Get all possible values for a dimension. Supports hierarchy level filtering and pagination.

Parameter

Type

Default

Description

dimension_code

string

Dimension code from get_dataset()

level

string

null

Filter by hierarchy level (e.g. STAT, KRAJ, OKRES)

offset

int

0

Skip first N items

limit

int

50

Items per page (max 200)

get_dimension_items("UZ023H2U", level="KRAJ")
→ Dimension UZ023H2U — 14 item(s) at level KRAJ:
    CZ010 — Hlavní město Praha (Capital City Prague) [KRAJ]
    CZ020 — Středočeský kraj (Central Bohemian Region) [KRAJ]
    CZ031 — Jihočeský kraj (South Bohemian Region) [KRAJ]
    ...

get_indicator

Indicator definition and display format.

Parameter

Type

Required

Description

indicator_code

string

yes

Indicator code from get_dataset()

Data retrieval

get_selection_data

Primary data access tool. Fetches CSV data from a predefined selection.

Parameter

Type

Default

Description

selection_code

string

Selection code (e.g. CEN0101HT01)

max_rows

int

100

Max data rows. 0 = unlimited

get_selection_data("CEN0101HT01", max_rows=5)
→ "Ukazatel","Území","Roky","Hodnota"
  "Průměrná roční míra inflace","Česko","2025","2.5"
  "Průměrná roční míra inflace","Česko","2024","2.4"
  "Průměrná roční míra inflace","Česko","2023","10.7"
  "Průměrná roční míra inflace","Česko","2022","15.1"
  "Průměrná roční míra inflace","Česko","2021","3.8"

  [Showing 5 of 29 rows. Use max_rows=0 for all data or max_rows=10 to see more.]

get_value

Retrieve a single specific value. The most precise query — returns one number with full context (indicator name, dimension labels, publication date).

Parameter

Type

Default

Description

dataset_code

string

Dataset code

indicator_code

string

Indicator code

dimension_codes

list[str]

Dimension codes in order

item_codes

list[str]

Item codes matching dimensions

version

string

null

Dataset version (latest if omitted)

get_value("RSO01", "3971b",
          ["CasR", "TYPPROSJED", "UZ023H2U"],
          ["2023", "501", "CZ"])
→ Value: 6 258
  Indicator: Počet územních jednotek
    Roky: 2023
    Typ prostorové jednotky: Obec
    ČR, kraje, okresy: Česko
  Published: 2024-04-30T07:00:00Z

custom_query

Execute an arbitrary data query on a dataset. Returns CSV.

This is an advanced tool — prefer get_selection_data() when a suitable predefined table exists. The custom query API is sensitive to correct dimension placement and hierarchy level filtering.

Parameter

Type

Default

Description

dataset_code

string

Dataset code

dataset_version

string

Version from get_dataset()

columns

list[dict]

Column dimensions (each needs kodDimenze)

rows

list[dict]

Row dimensions

table_filters

list[dict]

null

Filter dimensions

max_rows

int

100

Max CSV rows

get_dataset_metadata

Dataset content statistics: record count, time range, publication and update timestamps.

Parameter

Type

Required

Description

dataset_code

string

yes

Dataset code

version

string

yes

Version from get_dataset()

Usage examples

Get Czech inflation rate

1. search_datasets("inflace")
   → CEN0101H — Míra inflace

2. get_dataset_selections("CEN0101H")
   → CEN0101HT01 — Průměrná roční míra inflace

3. get_selection_data("CEN0101HT01")
   → CSV with annual inflation rates from 1994 to present

Find average wages by region

1. search_selections("mzdy kraje")
   → MZDQ1T2 — ... dle krajů a regionů soudržnosti

2. get_selection_data("MZDQ1T2", max_rows=20)
   → CSV with wages by region

Get exact population of Prague in 2023

1. search_datasets("obyvatelstvo")
   → OBY01 — Obyvatelstvo podle pohlaví a věku

2. get_dataset("OBY01")
   → see dimensions and indicators

3. get_dimension_items("<territory_dim>", level="KRAJ")
   → find Prague code

4. get_value("OBY01", "<indicator>",
             ["<time_dim>", "<territory_dim>"],
             ["2023", "<prague_code>"])
   → exact value

The database is in Czech. Common search terms:

Czech

English

Example datasets

obyvatelstvo

population

OBY01, OBY02

mzdy

wages

MZDQ1, MZD01

ceny

prices

CEN01, CEN02

inflace

inflation

CEN0101H

HDP

GDP

NUC06R, NUC06Q

nezaměstnanost

unemployment

ZAM04

průmysl

industry

PRU01

stavebnictví

construction

STA01

vzdělání

education

VZD01

zdraví

health

ZDR01

zemědělství

agriculture

ZEM01

doprava

transport

DOP01

cestovní ruch

tourism

CRU01

životní prostředí

environment

ZPR01

kriminalita

crime

KRI01

volby

elections

VOL01

bytová výstavba

housing

BYT01

zahraniční obchod

foreign trade

VZO01

Technical details

Architecture

Single-file Python server using FastMCP framework over stdio transport. Dependencies managed via PEP 723 inline script metadata — uv run installs them automatically into an isolated environment.

Upstream API

The server wraps two DataStat REST APIs:

API

Base URL

Purpose

Catalog

https://data.csu.gov.cz/api/katalog/v1

Dataset/selection/dimension/indicator metadata

Data

https://data.csu.gov.cz/api/dotaz/v1

Data retrieval (CSV, JSON-STAT)

API documentation:

Rate limiting

The DataStat API does not document rate limits, but the server applies conservative throttling:

  • Max concurrent requests: 3 (semaphore)

  • Min request interval: 150ms (global)

  • Request timeout: 60 seconds

Caching

Catalog listings (list_datasets, list_selections) are cached in memory with a 10-minute TTL. These endpoints return the full catalog (700–1500 items) on every call since the API ignores pagination parameters — caching avoids repeated large transfers.

Output formatting

  • Metadata tools return structured text with clear labels

  • Data tools return CSV (most compact and LLM-friendly tabular format)

  • Truncation: data responses are limited to 100 rows by default, with total count shown. Adjustable via max_rows parameter

  • Language: all API responses are in Czech (Accept-Language: cs)

Dependencies

Package

Version

Purpose

mcp

>=1.0.0

MCP server framework (FastMCP)

httpx

>=0.27.0

Async HTTP client

Both installed automatically by uv run.

License

MIT

Available Tools

12 tools
custom_queryA

Execute a custom data query on a dataset (advanced).

IMPORTANT: Prefer get_selection_data() for predefined tables — it is much simpler and more reliable. Use custom_query only when no suitable predefined selection exists.

Caveats:

  • All dataset dimensions must be placed in columns, rows, or table_filters.

  • Datasets with multiple time dimensions (e.g., CasM + CasR + CASRMX) may only work with certain dimension combinations matching predefined selections.

  • Hierarchical territory dimensions may need "filtr" with "urovenHierarchieKod".

Args: dataset_code: Dataset code. dataset_version: Dataset version string from get_dataset(). columns: Column dimensions. Each dict must have "kodDimenze" (str). Optionally add "filtr" with [{"zobrazitPolozky": ["code1","code2"]}]. rows: Row dimensions. Same structure as columns. Use "kodDimenze": "#UKAZATEL" to put indicators as rows. table_filters: Header/filter dimensions. Same structure, but can also include "filtrTabulkyKod" (str) to filter to a single item. max_rows: Max CSV rows to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYes
dataset_versionYes
columnsYes
rowsYes
table_filtersNo
max_rowsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It details caveats about dimension placement, multi-time dimension limitations, and hierarchical territory requirements, offering good behavioral insight. Still, it does not explicitly state read-only nature, which would increase transparency.

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?

Well-structured with important note, caveats, and parameter list. Slightly lengthy but each sentence adds value; could be marginally more concise, but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 complex parameters with no schema descriptions, the description covers parameter usage, special values, default, constraints, and output limit, providing adequate context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage; description compensates thoroughly by explaining the structure of column/row/filter objects, special row value '#UKAZATEL', and max_rows default, adding significant meaning beyond bare types.

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?

Description clearly states 'Execute a custom data query on a dataset' and explicitly distinguishes from 'get_selection_data' as an advanced alternative, making purpose and differentiation evident.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

Explicitly advises to prefer get_selection_data for predefined tables and to use custom_query only when no suitable predefined selection exists, providing clear when-to-use and when-not-to-use guidance.

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

get_datasetA

Get detailed info about a dataset: description, dimensions, indicators, keywords.

Use this to understand dataset structure before querying data. The dimension codes and indicator codes are needed for get_value() and custom_query().

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 full burden. It indicates this is a read operation (getting info) but does not disclose any specific behavioral traits such as safety, authentication needs, or side effects. The mention of needing codes for other tools adds some behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with three sentences, each providing valuable information: what the tool returns, when to use it, and why the output is important. No redundant words, and it is well front-loaded.

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?

Given the existence of an output schema, the description appropriately focuses on usage context and links to other tools. It covers the purpose and the relevance of the returned codes. It could mention that 'dataset_code' can be obtained from 'list_datasets', but overall it is complete enough for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% for the only parameter 'dataset_code'. The description does not explain what 'dataset_code' is, where to find it, or any format details. While the purpose is clear, the parameter meaning is left implicit, requiring the agent to infer from the tool name or sibling tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'dataset' and lists what information is returned (description, dimensions, indicators, keywords). However, it does not explicitly differentiate from sibling tools like 'get_dataset_metadata' or 'get_dataset_selections', which may overlap in purpose.

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 description gives explicit advice: 'Use this to understand dataset structure before querying data.' It also mentions that the codes are needed for 'get_value()' and 'custom_query()', providing context for when to use this tool and linking to alternatives. However, it does not mention when not to use it.

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

get_dataset_metadataA

Get metadata about dataset content: record count, time range, last update.

Args: dataset_code: Dataset code. version: Dataset version from get_dataset().

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYes
versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It states it returns metadata, implying read-only, but does not explicitly confirm safety, side effects, or performance characteristics. Adequate for a simple retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences and a bullet list, front-loaded with purpose, no unnecessary words. Efficient and clear.

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?

Output schema exists, so return structure is covered. Description lists key metadata fields, but does not explain 'time range' or 'last update' precisely. Reasonably complete for a simple metadata tool.

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 0%, but description adds meaning: dataset_code is a code, version is from get_dataset(). This provides context beyond bare schema, but no details on formats or constraints.

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?

Clearly states it gets metadata about dataset content, listing specific fields (record count, time range, last update), and the verb 'Get' plus resource 'metadata' distinguishes it from siblings like get_dataset or list_datasets.

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?

Mentions that the version parameter is from get_dataset(), providing a dependency hint. However, no explicit when-to-use or alternatives list, but the context of siblings implies usage.

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

get_dataset_selectionsB

List predefined data tables for a specific dataset.

These selections can be fetched directly with get_selection_data(code). This is the recommended way to find available pre-built data views.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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

No annotations provided, so description must explain behavior. It only states 'list predefined data tables' without mentioning read-only nature, permissions, error handling, or output characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences with no fluff. Purpose stated first, followed by useful cross-reference and recommendation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with an output schema, the description is adequate but lacks details like error handling or dataset_code validity, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and description does not explain dataset_code (e.g., format, source), adding no value beyond the parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists predefined data tables for a dataset, but it does not distinguish from all siblings (e.g., list_selections). Mentioning get_selection_data provides some differentiation.

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 description advises that selections can be fetched with get_selection_data(code) and recommends this tool for finding available views, offering clear contextual guidance for one sibling, but lacks exclusions for other siblings.

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

get_dimension_itemsA

Get possible values for a dimension (e.g., years, regions, categories).

Args: dimension_code: Dimension code from get_dataset() output (e.g., CasR, Uz0). level: Filter by hierarchy level code (e.g., STAT, KRAJ, OKRES). offset: Skip first N items. limit: Max items to return (default 50, max 200).

Item codes are needed for get_value() and custom_query().

ParametersJSON Schema
NameRequiredDescriptionDefault
dimension_codeYes
levelNo
offsetNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It explains pagination (offset, limit with defaults) and mentions dependencies on other tools, but omits behavioral details like side effects (none expected), authorization needs, or data freshness. It does not contradict any annotation since there are none.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise: one opening sentence followed by a structured list of parameters. Every sentence adds value and there is no redundancy. It is appropriately front-loaded with the purpose.

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?

The tool has 4 parameters (one required) and an output schema, which covers the return format. The description explains parameter usage and integration with sibling tools. It lacks mention of error handling or edge cases, but the output schema likely documents the response structure. Overall adequate for a paginated listing tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description fully compensates. It explains dimension_code as coming from get_dataset() output, level as a hierarchy filter with examples, offset as skip, and limit as max items with default and maximum. This adds significant meaning beyond the schema's type and title fields.

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 clearly states the verb 'Get' and resource 'possible values for a dimension' with concrete examples (years, regions, categories). It distinguishes from siblings by explaining how dimension codes from get_dataset() are used and that item codes feed into get_value() and custom_query().

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 description implies when to use: after get_dataset() to obtain dimension codes, and before get_value() or custom_query() which need item codes. It does not explicitly state when not to use, but the context is clear enough for an AI agent to infer appropriate usage.

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

get_indicatorC

Get detailed information about a statistical indicator.

Returns the indicator's full definition, display format, and related datasets.

ParametersJSON Schema
NameRequiredDescriptionDefault
indicator_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations exist, so the description carries full burden. While 'Get' implies a read-only operation, the description does not disclose any required permissions, error behavior, or limitations. For a simple retrieval, it is minimally transparent but insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences with clear front-loading of purpose and returns. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema, return values need not be explained. However, the parameter is undocumented, and usage context is lacking. The tool is simple but incomplete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must explain the parameter 'indicator_code', but it does not mention it at all. The agent has no guidance on what value to provide, making this a critical gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed indicator information, including definition, display format, and related datasets. However, it does not differentiate from sibling tools like get_dataset_metadata or get_dimension_items, which may also return dataset-related information.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives, nor are there any exclusions or prerequisites mentioned. The description implies usage for indicator details but lacks explicit context.

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

get_selection_dataA

Fetch actual statistical data from a predefined selection as CSV.

This is the primary and most reliable way to get data. Find selection codes via search_selections() or get_dataset_selections().

Args: selection_code: Selection code (e.g., CEN0101HT01). max_rows: Maximum number of data rows to return (default 100). Set to 0 for unlimited (use with caution — some tables are very large).

ParametersJSON Schema
NameRequiredDescriptionDefault
selection_codeYes
max_rowsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the output format (CSV), the role of selection_code (required) and max_rows (optional limit), and warns about large tables. No side effects or destructive behavior are expected, and the description is consistent with the tool's 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (3 sentences plus an Args section) and front-loaded with the main purpose. Every sentence adds value: purpose, prominence, how to find selection codes, and parameter details. No fluff or redundancy.

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?

The tool has 2 simple parameters and an output schema (not shown). The description explains the output format, primary usage, and necessary prerequisites (selection codes). It omits potential error handling or rate limits, but given the low complexity and presence of an output schema, the description is sufficiently complete for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage (only titles), but the description adds detailed meaning: selection_code is exemplified as 'CEN0101HT01', and max_rows is explained with its default (100) and the caution 'Set to 0 for unlimited (use with caution — some tables are very large).' This fully compensates for the schema's lack of description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Fetch actual statistical data from a predefined selection as CSV.' It uses a specific verb ('Fetch') and resource ('statistical data from selection'), and distinguishes itself as 'the primary and most reliable way to get data,' implying prioritization over sibling tools like get_value or custom_query.

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 description provides context on when to use this tool: it is the primary way to get data, and guides the user to find selection codes using search_selections() or get_dataset_selections(). It also includes a caution about using max_rows=0 for large tables. However, it does not explicitly state when not to use this tool versus alternatives like custom_query.

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

get_valueA

Get a single specific value from a dataset.

This is the most precise way to query data — returns exactly one value. Requires knowing the exact dimension and item codes from get_dataset() and get_dimension_items().

Args: dataset_code: Dataset code (e.g., RSO01). indicator_code: Indicator code (e.g., 3971b). dimension_codes: List of dimension codes (e.g., ["CasR", "TYPPROSJED", "UZ023H2U"]). item_codes: List of item codes matching dimension_codes order (e.g., ["2023", "501", "CZ"]). version: Dataset version (optional, defaults to latest).

Example: Number of municipalities in Czech Republic in 2023: get_value("RSO01", "3971b", ["CasR","TYPPROSJED","UZ023H2U"], ["2023","501","CZ"])

ParametersJSON Schema
NameRequiredDescriptionDefault
dataset_codeYes
indicator_codeYes
dimension_codesYes
item_codesYes
versionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

No annotations, so description bears full burden. It describes it as a read-like query returning exactly one value, requires specific inputs, and mentions optional version. Could explicitly state it is read-only, but overall clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise but thorough: purpose sentence, context, structured Args list, and example. No fluff, all sentences add value.

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?

Covers prerequisites, parameters, and example. With output schema present, return values need not be explained. Missing error behavior (e.g., if combination doesn't exist), but adequate for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema coverage signal, the description includes a detailed Args section that explains each parameter with types, examples, and optionality. Greatly surpasses schema minimal info.

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?

Clearly states 'Get a single specific value from a dataset' and calls it 'the most precise way'. Distinguishes from siblings by emphasizing exact single value return.

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 notes prerequisites: requires exact codes from get_dataset() and get_dimension_items(). Provides a concrete example. Lacks explicit when-not-to-use or alternative comparisons, but guidance is clear.

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

list_datasetsA

List all available datasets with pagination.

Use offset and limit to page through results. Total: ~730 datasets.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, and the description adds minimal behavioral context beyond 'lists all datasets'. It does not disclose return format, authentication needs, rate limits, or scope (e.g., public vs. private). This is insufficient for a tool with no annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with three short lines, front-loading the primary action and pagination. The total count is extraneous but not harmful. It earns its place, though a bit more structure (e.g., bullet points) could improve readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple paginated list tool with an output schema, the description is adequate but leaves ambiguity about the scope (e.g., all datasets across the user or system). Sibling tools provide some context, but the description itself could be more complete.

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 has 0% parameter descriptions, but the description explains 'offset and limit to page through results', adding meaning beyond the schema's defaults. This helps an agent understand the parameter purposes, though more detail could be added.

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 clearly states the verb 'list' and resource 'datasets', distinguishing it from siblings like 'get_dataset' (single) and 'search_datasets' (filtered). It is specific and leaves no ambiguity about what the tool does.

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?

The description explains pagination with offset and limit, but does not explicitly contrast with alternatives like 'search_datasets'. It implies usage for all datasets without querying, but lacks explicit when-to-use guidance.

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

list_selectionsA

List all predefined data tables (selections) with pagination.

Selections are pre-configured data views that can be fetched directly. Use get_selection_data(code) to retrieve their data.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses pagination but omits details on auth, rate limits, or handling of empty results. It adds moderate context but could be more transparent about behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise sentences with no redundancy. The first sentence states the core purpose, the second defines the resource, and the third points to a related tool. Every sentence serves a clear function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity and the presence of an output schema, the description covers the basics but falls short on parameter semantics and explicit differentiation from search_selections. It adequately explains the tool's role in the workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It mentions 'pagination' but does not explain that offset and limit control it. Without explicit parameter descriptions, the semantic value added is minimal.

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 clearly states the tool lists 'predefined data tables (selections)' with pagination, using a specific verb and resource. It distinguishes itself from siblings like get_selection_data and search_selections by focusing on listing all selections.

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 description provides clear context by stating that selections are pre-configured data views and directs users to use get_selection_data(code) to retrieve the data. However, it doesn't explicitly contrast with search_selections or give when-not-to-use guidance.

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

search_datasetsA

Search for statistical datasets by keyword.

Search works best with Czech terms: obyvatelstvo=population, mzdy=wages, ceny=prices, nezaměstnanost=unemployment, průmysl=industry, HDP=GDP, inflace=inflation, vzdělání=education, zdraví=health.

Returns dataset codes usable with get_dataset() and get_dataset_selections().

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so the description carries full burden. It discloses that the tool returns dataset codes and recommends Czech terms for best results. It does not mention rate limits or authorization, but as a search tool it is inherently read-only and non-destructive, so the transparency is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short paragraphs. The first sentence is clear and front-loaded. The list of terms is easy to scan. Could be slightly more concise, but overall it earns its place without unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one string parameter) and the presence of an output schema, the description is complete. It explains what the tool does, how to use it (keyword search, Czech terms), and what to do with the results (use with get_dataset/get_dataset_selections). No gaps.

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 single parameter 'query' is described as a keyword search. The description adds meaning beyond the schema by stating it works best with Czech terms and providing common examples. Schema coverage is 0% but the description compensates well for a simple string parameter.

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 states 'Search for statistical datasets by keyword' which clearly specifies the action (search), resource (statistical datasets), and method (by keyword). This distinguishes it from siblings like list_datasets (lists all) and get_dataset (retrieves specific).

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 description provides useful context: 'Search works best with Czech terms' and includes a list of common Czech terms with English translations. It also explains that results are 'dataset codes usable with get_dataset() and get_dataset_selections().' However, it does not explicitly state when to use this tool versus alternatives like search_selections, which would make it a 5.

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

search_selectionsA

Search for predefined data tables (selections) by keyword.

Selections are pre-configured views of datasets — the easiest way to get data. Retrieve their data with get_selection_data(code). Search in Czech for best results.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/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 full responsibility. It describes the search behavior and recommendation for Czech language but does not explicitly state that it is read-only, mention consent or rate limits, or disclose any side effects. For a search tool, this is adequate but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three clear sentences: purpose, context, and usage tip. No unnecessary words. Front-loaded with the core action.

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 does not need to detail return values. It covers what the tool does, what selections are, how to use the results, and a search optimization tip. Missing details like search behavior (fuzzy, partial match) but sufficient for typical use.

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?

Input schema has 0% description coverage, but the description adds that the query is a keyword and recommends Czech language for best results. This provides meaningful guidance beyond the schema structure.

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 states 'Search for predefined data tables (selections) by keyword,' which is a specific verb-resource combination. It distinguishes from siblings like search_datasets (which targets datasets) and list_selections (which lists all without search).

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 provides clear context: selections are pre-configured views, easiest way to get data. It suggests using Czech for best results and directs users to get_selection_data for retrieval. However, it does not explicitly state when not to use or compare with alternatives like search_datasets.

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. 12 tool updatesv0.1.0
    • First observedcustom_query
    • First observedget_dataset
    • First observedget_dataset_metadata
    • First observedget_dataset_selections
    • First observedget_dimension_items
    • First observedget_indicator
    • First observedget_selection_data
    • First observedget_value
    • First observedlist_datasets
    • First observedlist_selections
    • First observedsearch_datasets
    • First observedsearch_selections

TDQS

A4/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct aspect of the CSU data workflow: discovery, metadata, dimension exploration, and data retrieval. Even the three query tools (get_value, get_selection_data, custom_query) are clearly differentiated by use-case guidance, making selection unambiguous.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern using snake_case (e.g., get_dataset, list_datasets, search_selections). The one outlier, custom_query, still adheres to the same pattern, so naming is uniform and predictable.

Tool Count5/5

With 12 tools covering search, listing, metadata, dimension exploration, and multiple query methods, the set is well-scoped for the CSU domain. No tools feel redundant or missing for core operations.

Completeness5/5

The tools provide end-to-end coverage: dataset discovery (list/search), structure exploration (get_dataset, get_dimension_items, get_indicator), and data retrieval (predefined selections, custom queries, single values). No obvious gaps exist in the statistical data access lifecycle.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables natural language access to Denmark's Statistics API (Danmarks Statistik), allowing users to query and analyze Danish statistical data without coding knowledge through AI-powered interactions.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that enables querying Latvian official statistics from data.stat.gov.lv via PxWeb tables, allowing retrieval of table definitions and data through natural language or direct tool calls.
    6
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Provides access to Statistics Canada official statistics without authentication, enabling AI agents to query Canadian economic and demographic data.
    4
    MIT