mcp-csu
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-csuSearch datasets for inflation rate"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-csuData 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 fetchDatasets 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 |
| 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 inflacesearch_selections
Full-text search across all predefined data tables.
Parameter | Type | Required | Description |
| 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: MZDQ1list_datasets
Paginated listing of all datasets.
Parameter | Type | Default | Description |
| int | 0 | Skip first N items |
| int | 30 | Items per page (max 100) |
list_selections
Paginated listing of all predefined tables.
Parameter | Type | Default | Description |
| int | 0 | Skip first N items |
| 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 |
| string | yes | Dataset code (e.g. |
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 |
| 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átget_dimension_items
Get all possible values for a dimension. Supports hierarchy level filtering and pagination.
Parameter | Type | Default | Description |
| string | — | Dimension code from |
| string | null | Filter by hierarchy level (e.g. |
| int | 0 | Skip first N items |
| 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 |
| string | yes | Indicator code from |
Data retrieval
get_selection_data
Primary data access tool. Fetches CSV data from a predefined selection.
Parameter | Type | Default | Description |
| string | — | Selection code (e.g. |
| 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 |
| string | — | Dataset code |
| string | — | Indicator code |
| list[str] | — | Dimension codes in order |
| list[str] | — | Item codes matching dimensions |
| 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:00Zcustom_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 |
| string | — | Dataset code |
| string | — | Version from |
| list[dict] | — | Column dimensions (each needs |
| list[dict] | — | Row dimensions |
| list[dict] | null | Filter dimensions |
| int | 100 | Max CSV rows |
get_dataset_metadata
Dataset content statistics: record count, time range, publication and update timestamps.
Parameter | Type | Required | Description |
| string | yes | Dataset code |
| string | yes | Version from |
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 presentFind 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 regionGet 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 valueCzech vocabulary for search
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 |
| Dataset/selection/dimension/indicator metadata |
Data |
| 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_rowsparameterLanguage: all API responses are in Czech (
Accept-Language: cs)
Dependencies
Package | Version | Purpose |
| >=1.0.0 | MCP server framework (FastMCP) |
| >=0.27.0 | Async HTTP client |
Both installed automatically by uv run.
License
MIT
Available Tools
12 toolscustom_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.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_code | Yes | ||
| dataset_version | Yes | ||
| columns | Yes | ||
| rows | Yes | ||
| table_filters | No | ||
| max_rows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_code | Yes | ||
| version | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| dimension_code | Yes | ||
| level | No | ||
| offset | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| selection_code | Yes | ||
| max_rows | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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"])
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_code | Yes | ||
| indicator_code | Yes | ||
| dimension_codes | Yes | ||
| item_codes | Yes | ||
| version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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().
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
12 tool updates
v0.1.0- First observed
custom_query - First observed
get_dataset - First observed
get_dataset_metadata - First observed
get_dataset_selections - First observed
get_dimension_items - First observed
get_indicator - First observed
get_selection_data - First observed
get_value - First observed
list_datasets - First observed
list_selections - First observed
search_datasets - First observed
search_selections
TDQS
Scored across 12 tools
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.
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.
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.
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
Related MCP Connectors
Access European statistics: GDP, unemployment, inflation, population data.
Czech Statistical Office (Český statistický úřad, ČSÚ) open-data MCP.
Verified Polish open data for AI agents: debt, budget, 460 MPs, votings, judiciary search, RAG.
Public Data Ukraine Mcp connects AI agents to real public APIs via MCP. Tools include
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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
- AlicenseAqualityCmaintenanceEnables AI assistants to query Prague's public transit departures, air quality, parking availability, and other city data via the Golemio open data API.12GPL 3.0
- AlicenseNot gradedqualityCmaintenanceMCP 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.6MIT
- AlicenseNot gradedqualityFmaintenanceProvides access to Statistics Canada official statistics without authentication, enabling AI agents to query Canadian economic and demographic data.4MIT