Skip to main content
Glama
Halpph

istat-mcp-server

by Halpph

ISTAT MCP Server

PyPI Tests License: MIT Python 3.10+

A Model Context Protocol (MCP) server that enables Large Language Models to access and analyze data from the Italian National Statistical Institute (ISTAT) directly.

What is this?

This MCP server allows LLMs like Claude to seamlessly query, filter, and download statistical datasets from ISTAT, enabling natural language data analysis workflows. Instead of manually searching for datasets, constructing API queries, and downloading data, you can simply ask your LLM to find and analyze Italian statistical data.

Built on top of: This server uses the excellent istatapi open-source Python wrapper by ondata, which simplifies interaction with ISTAT's SDMX REST API.

Related MCP server: eurostat-mcp

Features

  • Dataset Discovery: Search and browse all available ISTAT datasets

  • Dimension Exploration: Inspect dataset structure and available filters

  • Flexible Data Retrieval: Get data directly in JSON or download large datasets

  • Smart Error Handling: Automatic fallback to file downloads for large/timeout scenarios

  • Secure Storage: Configurable storage directory with path traversal protection

  • Cross-Platform: Works on WSL, Windows, macOS, and Linux

Use Cases

Enable your LLM to:

  • Find Italian economic indicators (GDP, unemployment, inflation)

  • Analyze demographic trends and population statistics

  • Compare regional data across Italy

  • Download and process large statistical datasets

  • Create data visualizations from ISTAT data

  • Answer questions about Italian statistics naturally

Installation

The easiest way to use this MCP server is directly with uvx - no installation required:

uvx istat-mcp-server

Install from PyPI

# Using pip
pip install istat-mcp-server

# Using uv
uv pip install istat-mcp-server

Install from Source (for development)

# Clone the repository
git clone https://github.com/Halpph/istat-mcp-server.git
cd istat-mcp-server

# Install with uv (recommended)
uv sync

# Or install with pip
python -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate
pip install -e .

Configuration

Claude Desktop Setup

Add this to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "istat": {
      "command": "uvx",
      "args": ["istat-mcp-server"],
      "env": {
        "MCP_STORAGE_DIR": "/path/to/data/storage"
      }
    }
  }
}

That's it! Claude Desktop will automatically download and run the server from PyPI.

Alternative: Running from local installation

If you installed from source or want to run a development version:

{
  "mcpServers": {
    "istat": {
      "command": "uv",
      "args": [
        "--directory",
        "/absolute/path/to/istat-mcp-server",
        "run",
        "istat-mcp-server"
      ],
      "env": {
        "MCP_STORAGE_DIR": "/path/to/data/storage"
      }
    }
  }
}

Storage Configuration

By default, downloaded files are saved to:

  • WSL: /mnt/c/Users/Public/Downloads/mcp-data/

  • Windows: %USERPROFILE%\Downloads\mcp-data

  • Linux/macOS: ./data

Override this by setting the MCP_STORAGE_DIR environment variable.

Other Environment Variables

  • MCP_DEBUG: Set to true for detailed error tracebacks in responses

Available Tools

Dataset Discovery

  • get_list_of_available_datasets() - List all available ISTAT datasets

  • search_datasets(query) - Search datasets by keyword

Dataset Exploration

  • get_dataset_dimensions(dataflow_identifier) - Get dimensions/structure of a dataset

  • get_dimension_values(dataflow_identifier, dimension) - Get possible values for a dimension

Data Retrieval

  • get_data(dataflow_identifier, filters) - Get data with filters (or URL if too large)

  • get_data_limited(dataflow_identifier, filters, limit) - Get limited number of records

  • get_summary(dataflow_identifier, filters) - Get statistical summary of filtered data

File Operations

  • get_dataset_url(dataflow_identifier, filters) - Get download URL with metadata

  • download_dataset(url, output_path) - Download dataset to local storage

Example Usage

With Claude Desktop

Once configured, you can interact naturally:

You: "Find datasets about Italian unemployment"

Claude: [Uses search_datasets tool]
I found several unemployment datasets...

You: "Get the monthly unemployment rate for 2024"

Claude: [Uses get_dataset_dimensions, get_dimension_values, get_data tools]
Here's the unemployment data for 2024...

Programmatic Usage

from mcp.client import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# Connect to the server
server_params = StdioServerParameters(
    command="uvx",
    args=["istat-mcp-server"]
)

async with stdio_client(server_params) as (read, write):
    async with ClientSession(read, write) as session:
        # List available tools
        tools = await session.list_tools()

        # Call a tool
        result = await session.call_tool("search_datasets", {"query": "unemployment"})

Development

Running Tests

# With uv
uv run pytest

# With pip
pytest

Project Structure

istat-mcp-server/
├── main.py              # Main MCP server implementation
├── test_main.py         # Comprehensive test suite
├── pyproject.toml       # Project metadata and dependencies
├── uv.lock             # Dependency lock file
├── README.md           # This file
├── CONTRIBUTING.md     # Contribution guidelines
├── LICENSE             # MIT License
├── docs/               # Additional documentation
│   ├── TESTING.md     # Testing guide
│   └── ISTATAPI_REFERENCE.md  # API reference
├── examples/           # Example configurations
│   └── gemini-extension.json  # Gemini setup example
└── .github/
    └── workflows/      # CI/CD pipelines
        ├── test.yml   # Automated testing
        └── release.yml # Release automation

How It Works

  1. MCP Protocol: The server implements the Model Context Protocol, exposing ISTAT data operations as "tools" that LLMs can call

  2. ISTAT API Wrapper: Uses the istatapi library to interact with ISTAT's SDMX REST API

  3. Smart Handling: Automatically handles large datasets by falling back to file downloads

  4. Secure Storage: All file operations are restricted to a configured storage directory

Credits

License

MIT License - see LICENSE file for details

Contributing

Contributions are welcome! We appreciate bug reports, feature requests, documentation improvements, and code contributions.

Please see CONTRIBUTING.md for detailed guidelines on:

  • Setting up your development environment

  • Running tests

  • Code style and conventions

  • Submitting pull requests

Quick start for contributors:

# Fork and clone the repo
git clone https://github.com/YOUR_USERNAME/istat-mcp-server.git
cd istat-mcp-server

# Install dependencies
uv sync

# Run tests
uv run pytest

# Make your changes and submit a PR!

Roadmap

Future enhancements planned:

  • Add caching for frequently accessed datasets

  • Support for more data export formats (CSV, JSON, Excel)

  • Integration with data visualization tools

  • Support for ISTAT time series analysis

  • Multi-language support (Italian/English metadata)

FAQ

How do I find the right dataset?

Use the search_datasets tool with keywords like "unemployment", "GDP", "population", etc. The tool searches through all ISTAT dataset titles and descriptions.

Why am I getting a URL instead of data?

For large datasets or when the API times out, the server automatically returns a download URL instead. You can then use the download_dataset tool to save the data locally.

Can I use this with other LLMs besides Claude?

Yes! Any MCP-compatible client can use this server. See the MCP documentation for more information.

Where is the downloaded data stored?

By default:

  • WSL: /mnt/c/Users/Public/Downloads/mcp-data/

  • Windows: %USERPROFILE%\Downloads\mcp-data

  • Linux/macOS: ./data

You can customize this with the MCP_STORAGE_DIR environment variable.

Changelog

Version 0.1.2 (2024-10-14)

  • Fixed: Automatic file format detection in download_dataset function

    • Files now saved with correct extension based on HTTP Content-Type header

    • XML/SDMX files from ISTAT API no longer saved as .csv

    • Added support for XML, CSV, JSON, TXT, and unknown formats

    • Response now includes detected_extension and file_format fields

  • Tests: Added comprehensive test coverage for format detection scenarios

Version 0.1.1 (2024-10-14)

  • Fixed path resolution for cross-platform compatibility (macOS, Windows, Linux, WSL)

  • Updated documentation

See Releases for complete version history.

Support

For issues or questions:

Acknowledgments

  • ondata for the excellent istatapi Python wrapper

  • ISTAT for providing comprehensive statistical data about Italy

  • Anthropic for developing the Model Context Protocol

Available Tools

9 tools
download_datasetA
Download a dataset file from a URL to a local path with automatic format detection.
Better for large datasets that cannot be handled in-memory or when Json responses are too large or not supported.
The file extension is automatically determined from the Content-Type header.

Args:
    url: The URL of the file to download.
    output_path: Optional. A relative or absolute path for the saved file.
                 If relative, it's resolved against the configured storage directory.
                 If absolute, it MUST be inside the storage directory.
                 If not provided, a filename is generated from the URL with the appropriate extension.

Example:
    # Saves to <storage_dir>/my_data/export.xml (extension based on content type)
    download_dataset(url="http://.../data", output_path="my_data/export")

    # Saves to <storage_dir>/<generated_name>.<ext> (extension based on content type)
    download_dataset(url="http://.../data")
ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
output_pathNo

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?

Discloses automatic format detection from Content-Type header and output path constraints (relative vs absolute, storage directory). No annotations provided, but description covers key behavioral aspects for a download 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?

Very concise, structured with purpose, usage guidance, args, and example. Every sentence adds value, no 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?

Given the presence of an output schema (not shown) and simple parameters, the description covers usage well. Could mention overwrite behavior, but overall sufficiently complete for effective tool usage.

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 coverage is 0%, but the description adds full semantic meaning: url is the source, output_path is optional with relative/absolute resolution and default filename generation. Compensates well for the lack of schema descriptions.

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 downloads a dataset file from a URL to a local path with automatic format detection, and distinguishes itself from sibling tools by highlighting it's better for large datasets or when JSON responses are too large.

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?

Provides explicit guidance on when to use this tool (large datasets, JSON too large) and an example. Does not explicitly state when not to use, but context is clear enough for the agent to decide.

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

get_dataA
Get data from a dataset with filters. Attempt to retrieve data, if it times out or is too big,
return the URL of the file to download.

Args:
    dataflow_identifier: The identifier of the dataset.
    filters: A dictionary of filters to apply to the dataset.

Example:
    get_data(dataflow_identifier="139_176", filters={"freq": "M", "tipo_dato": ["ISAV", "ESAV"], "paese_partner": "WORLD"})
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes
filtersYes

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?

No annotations provided, so description bears full burden. It discloses that the tool attempts retrieval and may return a download URL on timeout or large result, but does not mention rate limits, authentication, or data freshness. Adequate but not comprehensive.

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 a clear function statement, argument descriptions, and an example. No redundant information, but the Args section partially duplicates schema titles.

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 complexity (2 params, nested object, output schema exists), the description covers core behavior and fallback. It lacks details on error handling, filter syntax, or output schema structure. Acceptable but not fully comprehensive.

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 description coverage is 0%, so the description must add value. It explains that dataflow_identifier is the dataset identifier and filters is a dictionary, and provides an example. This adds some meaning beyond the schema's titles, but does not fully detail constraints or formats.

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's purpose: 'Get data from a dataset with filters.' It also specifies fallback behavior (return URL if too big/times out), which distinguishes it from sibling tools like download_dataset or get_data_limited.

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 implies usage for filtered data retrieval but does not explicitly state when to use this tool versus alternatives like get_data_limited. It lacks clear 'when-not-to-use' guidance or differentiation from siblings.

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

get_data_limitedA
Get limited data from a dataset with filters. Returns only the first N records.
Attempt to retrieve data, if it times out or is too big, return the URL of the file to download.

Args:
    dataflow_identifier: The identifier of the dataset.
    filters: A dictionary of filters to apply to the dataset.
    limit: The maximum number of records to return.

Example:
    get_data_limited(dataflow_identifier="139_176", filters={"freq": "M", "tipo_dato": ["ISAV", "ESAV"], "paese_partner": "WORLD"}, limit=100)
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes
filtersYes
limitYes

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?

With no annotations, the description carries the burden and discloses key behaviors: returns first N records, attempts retrieval, and falls back to a URL on timeout or size limit. Lack of detail on error handling or permissions is acceptable given the scope.

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 fairly concise: two summary sentences plus an args list and example. It is front-loaded with purpose. Minor redundancy between the first two sentences could be trimmed, but overall efficient.

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 three required parameters, no annotations, and an output schema present, the description covers the essential aspects: purpose, usage, fallback, and example. No explanation of output format is needed due to output schema, but some guidance on errors or prerequisites would add completeness.

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 description adds substantial meaning to all three parameters beyond the schema (which has zero coverage). It explains dataflow_identifier, filters, and limit clearly, and provides a concrete example with actual values, compensating fully for the schema gap.

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 retrieves limited data from a dataset with filters and returns only the first N records. It distinguishes from siblings like get_data (likely full data) and download_dataset (for download) by emphasizing the limit.

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 for when to use this tool (for limited, filtered data) and mentions the fallback to a URL if data is too large or times out. However, it does not explicitly state when not to use it or name alternative tools for different scenarios.

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

get_dataset_dimensionsC

Get the dimensions of a dataset

Args:
    dataflow_identifier: The identifier of the dataset.

Example:
    get_dataset_dimensions(dataflow_identifier="139_176")
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.5/5.0
Behavior1/5

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

With no annotations, the description must disclose behavioral traits. It fails to mention read-only nature, authentication requirements, or side effects. The description is purely functional without 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.

Conciseness4/5

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

The description is extremely concise with no wasted words, but it sacrifices necessary detail. It is front-loaded with purpose, but the Args section is minimal.

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 complexity of the tool ecosystem (multiple sibling tools), the description fails to explain what 'dimensions' means or how it relates to other data retrieval tools. The presence of an output schema is good, but the description still lacks context for proper use.

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%. The description merely restates the parameter name ('The identifier of the dataset') without additional semantics like format, valid values, or examples beyond the code example. The example '139_176' is helpful but not part of the formal 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 action ('Get the dimensions') and the resource ('a dataset'), but does not differentiate from sibling tools like get_dimension_values or get_summary, which could also provide dimensional 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 on when to use this tool versus alternatives. The description lacks any context about prerequisites or scenarios, leaving the agent to guess.

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

get_dataset_urlA
Get the URL to download a dataset with metadata.

Args:
    dataflow_identifier: The identifier of the dataset.
    filters: A dictionary of filters to apply to the dataset.
        Filter keys should be dimension names in lowercase.
        For unfiltered dimensions, omit them or set to None.

Example:
    get_dataset_url(dataflow_identifier="139_176", filters={"freq": "M", "tipo_dato": ["ISAV", "ESAV"], "paese_partner": "WORLD"})

Returns:
    JSON with URL and metadata (content-type, size, etc.)
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes
filtersYes

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?

With no annotations provided, the description carries the burden. It describes the return value (JSON with URL and metadata) but does not disclose potential side effects, authentication needs, or limitations like URL expiration. This is adequate but lacks depth.

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 and well-structured: a one-sentence purpose, clear argument descriptions with formatting guidance, an example, and return value. Every part adds value without 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 description covers parameters and return value with an example. It is sufficient for a straightforward tool. However, it could mention if the URL is temporary or requires authentication. The presence of an output schema is noted, but the description adequately explains returns.

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 description adds meaningful information beyond the input schema. For dataflow_identifier, it says 'The identifier of the dataset.' For filters, it explains they are a dictionary with keys being lowercase dimension names. The example clarifies correct usage. This compensates for the 0% schema description coverage.

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's purpose: 'Get the URL to download a dataset with metadata.' It uses a specific verb-resource pair and distinguishes from sibling tools like download_dataset (which directly downloads) and get_data (which retrieves data).

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 usage guidance through an example and explains filter keys should be lowercase dimension names. It implicitly tells when this tool is used (to obtain a URL before downloading), but does not explicitly mention when not to use it or alternatives.

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

get_dimension_valuesC

Get the values of a dimension for a given dataset

Args:
    dataflow_identifier: The identifier of the dataset.
    dimension: The dimension to get the values for.

Example:
    get_dimension_values(dataflow_identifier="139_176", dimension="TIPO_DATO")
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes
dimensionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are present, so the description must disclose behavioral traits. It only states what the tool does and not any side effects, authentication needs, rate limits, or error handling. Minimal 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?

The description is short and to the point, with an example. It would benefit from slightly more structure, but it is efficient.

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 simplicity (2 params) and existence of output schema, the description is very minimal. It does not explain what the returned values look like or potential errors. More context would be helpful for an agent.

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?

With 0% schema description coverage, the description partially compensates by explaining each parameter briefly ('The identifier of the dataset', 'The dimension to get the values for') and includes an example. However, it lacks detail on allowed values or format beyond the schema titles.

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 values of a dimension for a dataset. The verb 'Get' is specific, and the resource 'dimension values' distinguishes it from sibling tools like get_data or get_summary.

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 on when to use this tool versus alternatives, no prerequisites or exclusions provided. The description is purely functional without usage context.

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

get_list_of_available_datasetsA

Get a list of available datasets from ISTAT

Example:
    get_list_of_available_datasets()
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 provided, so description carries full burden. It only states the action without disclosing behavioral traits like pagination, result size limits, or authentication requirements.

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?

Extremely concise: two sentences with no wasted words. Purpose is front-loaded, and the example is helpful without being verbose.

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 no parameters and an existing output schema, the description adequately covers what the tool does. However, behavioral context (e.g., authentication, performance) is missing, but the simplicity of the tool makes this acceptable.

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?

No parameters exist, so schema coverage is 100%. Description adds an example call but no extra parameter detail is needed. Baseline 4 for zero-parameter tools.

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 'Get a list of available datasets from ISTAT', using a specific verb and resource. This distinguishes it from siblings like search_datasets (which implies filtering) and download_dataset (which implies downloading).

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 on when to use this tool versus alternatives such as search_datasets or get_data. The example shows a basic call but lacks context about prerequisites or limitations.

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

get_summaryA
Get a summary of a dataset from ISTAT.

Args:
    dataflow_identifier: The identifier of the dataset.
    filters: A dictionary of filters to apply to the dataset.
    
Example:
    get_summary(dataflow_identifier="139_176", filters={"freq": "M", "tipo_dato": ["ISAV", "ESAV"], "paese_partner": "WORLD"})
ParametersJSON Schema
NameRequiredDescriptionDefault
dataflow_identifierYes
filtersYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations, the description carries full burden. It does not disclose whether the tool is read-only, what the summary includes, or any constraints. The behavioral detail is minimal beyond parameter names.

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 very concise, with a clear one-sentence purpose, parameter descriptions, and an example. Every sentence adds value without redundancy.

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 that an output schema exists, the description does not need to detail return values. However, it lacks context about what constitutes a dataset identifier, how to find it, or any prerequisites. Adequate but with gaps.

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 description coverage is 0%, so description must compensate. It adds meaning by defining dataflow_identifier as dataset identifier and filters as a dictionary, with an example showing specific filter keys. However, it does not explain valid filter keys or value formats.

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 it gets a summary of a dataset from ISTAT, specifying the source and action. It distinguishes from siblings like download_dataset or get_data by focusing on summaries.

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 provides an example showing typical usage with dataflow_identifier and filters, implying usage context. However, it lacks explicit guidance on when to use this tool versus alternatives like get_data or search_datasets.

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

search_datasetsA

Search datasets in ISTAT website by a query string

Args:
    query: The query string to search for.
    
Example:
    search_datasets(query="import")
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

No annotations exist, and the description does not disclose behavioral traits such as read-only nature, idempotency, or any side effects. The word 'search' implies a safe operation but is not explicit.

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 very concise with one sentence, a clear 'Args' section, and an example. No unnecessary words, but it could benefit from a slightly more structured explanation of output.

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 that the tool has one parameter and an output schema, the description is fairly complete: it explains the param and provides an example. It does not explain the output but the schema covers that.

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' has a brief description ('The query string to search for') that adds clarity beyond the schema's title and type. Schema description coverage is 0%, so the description compensates well.

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 'Search' and the resource 'datasets in ISTAT website by a query string', with a high-level purpose that distinguishes it from sibling tools like download_dataset or get_data.

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 on when to use this tool versus alternatives. The example only shows usage but does not explain when search is appropriate compared to other dataset retrieval tools.

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. Dates show when Glama detected each change.

  1. 9 tool updatesv0.1.2
    • First observeddownload_dataset
    • First observedget_data
    • First observedget_data_limited
    • First observedget_dataset_dimensions
    • First observedget_dataset_url
    • First observedget_dimension_values
    • First observedget_list_of_available_datasets
    • First observedget_summary
    • First observedsearch_datasets

TDQS

A3.7/5.0
Disambiguation4/5

Tools are mostly distinct: download_dataset handles file download, get_data and get_data_limited differ by limit, and others cover distinct metadata and discovery functions. Slight overlap between get_data and get_data_limited could cause confusion but descriptions clarify.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case (get_, download_, search_), making them predictable and easy to use.

Tool Count5/5

With 9 tools covering discovery, metadata, and data retrieval, the count is well-scoped for an ISTAT data access server—neither too many nor too few.

Completeness5/5

The tool set provides a complete workflow: dataset discovery (list, search), metadata exploration (dimensions, summary), and data retrieval with multiple options (filtered, limited, URL, download). No obvious gaps for its intended purpose.

Maintenance

ActivityNo data
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying Italian national statistics (ISTAT) data through natural language questions, with tools for accessing demographic, economic, and social indicators.
    16
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Exposes the Eurostat Statistics API, enabling LLMs to discover, explore, and retrieve official EU statistical data through search, dimension inspection, and data retrieval tools.
    3
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Halpph/istat-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server