unesco-mcp
Click on "Install 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., "@unesco-mcpCompare literacy rates across East African countries"
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.
unesco-mcp
A Model Context Protocol (MCP) server for UNESCO Institute for Statistics (UIS) data. Bring the UIS Data Browser into any MCP-compatible client (Claude Desktop, Claude Code, Cursor, Windsurf, etc.).
What it does
This server connects AI assistants to the UIS API, enabling them to search indicators, retrieve data values, compare countries, and explore available breakdowns — all through natural conversation. Data is cached locally in SQLite for fast indicator discovery, while live API calls fetch the actual data values.
Related MCP server: OECD-Search
Available tools
Discovery
Tool | Description |
| List all UNESCO data themes (education, science, culture, etc.) |
| List available data breakdowns (by sex, age, education level, etc.) |
| Get specific values for a breakdown type (e.g. "Male", "Female" for SEX) |
| Search indicators by text query and structured filters |
| Count indicators matching filters, with year range support |
| Get full definition, methodology, and data sources for an indicator |
| Quick overview of multiple indicators from local cache |
Geography
Tool | Description |
| Search countries and regions by name or ISO3 code, with grouping disambiguation |
Data retrieval
Tool | Description |
| Get a single data point for an indicator and geography |
| Get the full time series for an indicator and geography |
| Rank countries by indicator value (top N / bottom N) |
| Compare an indicator across up to 20 specific geographies |
Utility
Tool | Description |
| Health check with server name and UTC timestamp |
Installation
PyPI (recommended)
Run the server locally from the published Python package. This requires Python 3.10+ and
uv.
Claude Code:
claude mcp add unesco-mcp -- uvx unesco-mcpClaude Desktop — add to your config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):
{
"mcpServers": {
"unesco-mcp": {
"command": "uvx",
"args": ["unesco-mcp"]
}
}
}Local (from source)
Use this path when developing locally or testing unreleased changes:
git clone https://github.com/lpicci96/unesco-mcp.git
cd unesco-mcp
uv sync
uv run unesco-mcpFor Claude Desktop, point the client at the checkout:
{
"mcpServers": {
"unesco-mcp": {
"command": "uv",
"args": ["run", "--directory", "/path/to/unesco-mcp", "unesco-mcp"]
}
}
}Claude Code:
claude mcp add unesco-mcp -- uv run --directory /path/to/unesco-mcp unesco-mcpExample usage
Once installed, you can ask your AI assistant things like:
"What is the primary completion rate in Kenya?"
"Compare literacy rates across East African countries"
"Which countries have the highest out-of-school rates?"
"What education indicators are available broken down by sex and wealth quintile?"
"Show me the trend in secondary enrollment for Brazil over the last 10 years"
Available Tools
13 toolscompare_geographiesA
Compare a UNESCO UIS indicator across a specific list of countries or regions.
Retrieves the indicator value for each supplied geo unit code and ranks them by value. Use this to directly compare a set of countries or regions you already know the codes for (e.g. from prior searches or elicitations).
Year handling:
strict_year=True (default): year must be provided; if a geography has no value in that year, it is reported in missing_codes (no fallback year used).
strict_year=False:
year provided: falls back to the nearest available year per geography.
year omitted: uses the most recent available year per geography (mixed years possible).
Args: indicator_code: The indicator code (e.g. "LR.AG15T99"). geo_unit_codes: List of geo unit codes to compare (max 20, e.g. ["KEN", "TZA", "UGA"]). Codes must already be known — use search_geo_units to find them. year: Optional. The year to compare. If omitted, the most recent available value for each geography is used only when strict_year=False. strict_year: If True, require an explicit year and disallow fallback years.
Returns: A dictionary with: - "indicator_code", "indicator_name": Indicator identity. - "comparison": [{rank, code, name, value, year, qualifier}, ...] sorted by value desc. - "missing_codes": Geo unit codes for which no data was found. - "note": Context (e.g. mixed years warning, missing codes).
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes | ||
| geo_unit_codes | Yes | ||
| year | No | ||
| strict_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description fully covers behavior: strict_year fallback logic, missing codes reporting, year handling, and limits (max 20 geo_unit_codes). No contradictions.
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 sections and bullet points for return values. The initial summary is clear. However, the description is somewhat lengthy; some details (e.g., exact year handling in two cases) could be streamlined slightly, but still 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 4 params, no annotations, but output schema exists (described in detail in text), the description explains the output dictionary structure, covers year options, missing codes, and limits. It is complete for a comparison tool with no obvious 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%, so the description must add meaning. It explains each parameter: indicator_code with example, geo_unit_codes with type and limit, year optional behavior, strict_year default. Adds context beyond schema (e.g., max list size, code source).
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 compares a UNESCO UIS indicator across a specific list of countries/regions, using the verb 'compare' and specifying the resource. It distinguishes from siblings like get_country_ranking (which likely ranks all countries) and search_geo_units (for finding codes).
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 says when to use: 'directly compare a set of countries or regions you already know the codes for'. It provides prerequisites (codes known, use search_geo_units), and explains year/strict_year options to guide selection. Clear context without needing to state when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_indicatorsA
Count UNESCO UIS indicators matching precise filter criteria.
Use this tool when the user wants to know how many indicators exist for a given combination of filters, including year coverage or update date constraints. Unlike search_indicators, this tool returns an exact count and accepts year range filters.
All provided filters are combined with AND logic. If no filters are provided, returns the total count of all indicators in the database.
Args: theme: Exact theme code (from list_themes). disaggregation_types: List of disaggregation type codes. Indicators must support ALL listed types. disaggregation_values: List of disaggregation value codes. Indicators must match ALL listed values. coverage_start_year: Only count indicators whose data begins by this year (i.e. timeLine_min <= year). coverage_end_year: Only count indicators whose data extends through this year (i.e. timeLine_max >= year). updated_since: ISO date string (e.g. "2024-01-01"). Only count indicators updated on or after this date.
Returns: A dictionary with: - "count": The exact number of indicators matching all provided filters. - "filters_applied": A summary of which filters were used.
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | ||
| disaggregation_types | No | ||
| disaggregation_values | No | ||
| coverage_start_year | No | ||
| coverage_end_year | No | ||
| updated_since | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the tool is likely read-only, the description does not explicitly state safety, authentication needs, or side effects. It does explain filtering logic and return format, but with no annotations, the description should disclose behavioral traits beyond the obvious. A score of 3 reflects adequate but incomplete 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?
The description is concise, well-structured with a summary line, usage guidelines, logic note, Args block, and Returns block. Every sentence adds value, no redundancy, and the layout aids 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?
Given the tool's simplicity (count with filters), the description covers all necessary context: purpose, usage, parameters with detailed semantics, AND logic, behavior with no filters, and return format (output schema). No obvious gaps remain.
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%, but the description provides detailed Args section with exact meaning, examples, and logic (e.g., 'timeLine_min <= year'). This fully compensates for the lack of schema descriptions, adding significant value beyond the input schema.
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 uses a specific verb 'Count' and resource 'UNESCO UIS indicators', clearly distinguishing from sibling tool 'search_indicators' which returns list. It explicitly states this tool returns an exact count and accepts year range filters, making purpose unambiguous.
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 explicitly states 'Use this tool when the user wants to know how many indicators exist for a given combination of filters...' and contrasts with 'search_indicators', providing clear when-to-use and alternative. Also explains AND logic and behavior with no filters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_country_rankingA
Rank countries (not regions) by their value for a UNESCO UIS indicator.
Returns the top-N and bottom-N countries for a given indicator in a specific year. Uses dense ranking (tied countries share the same rank).
Year handling:
strict_year=True (default): year must be provided explicitly.
strict_year=False and year omitted: uses the year with the most country coverage.
Args: indicator_code: The indicator code (e.g. "LR.AG15T99"). year: Optional. The year to rank countries for. If omitted, the year with the most data points is used only when strict_year=False. top_n: Number of top-ranked countries to return (default 10, max 200). bottom_n: Number of bottom-ranked countries to return (default 10, max 200). strict_year: If True, require an explicit year to avoid implicit year selection.
Returns: A dictionary with: - "indicator_code", "indicator_name": Indicator identity. - "year_used": The year the ranking is based on. - "total_countries_with_data": Countries with non-null values that year. - "top": [{rank, code, name, value}, ...] — highest-value countries. - "bottom": [{rank, code, name, value}, ...] — lowest-value countries. - "note": Context (e.g. year selection rationale, overlap explanation).
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes | ||
| year | No | ||
| top_n | No | ||
| bottom_n | No | ||
| strict_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description sufficiently discloses behavior: it returns top and bottom lists, uses dense ranking, and explains year handling. It does not mention read-only nature, but the lack of destructive hints is acceptable for a ranking operation.
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 well-structured with a summary, year handling, Args, and Returns sections. It is front-loaded but slightly verbose; the Args section repeats parameter types already in schema, but adds necessary behavioral context.
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 5 parameters, no annotations, and an output schema, the description is complete: it covers return fields (indicator info, year, top/bottom with rank, code, name, value) and edge cases (year selection, strict_year).
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 the description fully explains each parameter (e.g., indicator_code example, strict_year interaction, max for top_n/bottom_n), adding significant meaning beyond the schema.
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 ranks countries by indicator value, specifying the resource (countries vs regions) and the action (ranking). It distinguishes from siblings like 'compare_geographies' or 'get_latest_value' by focusing on ranking for UNESCO UIS indicators.
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 includes detailed usage guidance (e.g., dense ranking, strict_year behavior, parameter defaults) but does not explicitly compare to sibling tools or state when not to use it. However, the clarity of the parameter explanations compensates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disaggregation_valuesA
Get the available values for a specific disaggregation type.
Given a disaggregation type code (e.g. 'SEX', 'AGE', 'EDU_LEVEL'), return all possible values that indicators can be broken down by.
Args: type_code: The disaggregation type code (from list_disaggregation_types).
Returns: A dictionary with: - "type_code": The requested type code. - "type_name": The human-readable name of the disaggregation type. - "values": A list of dicts, each with 'code', 'name', and 'description'. - "count": The total number of values.
| Name | Required | Description | Default |
|---|---|---|---|
| type_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It fully discloses the input-output behavior, including the structure of the return value. It describes each field in the response, ensuring 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?
The description is concise with only 6 sentences, clearly separated into args and returns sections. Every sentence adds value without 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?
Given the tool's simplicity (one parameter, no nested objects) and the presence of an output schema (though described), the description covers all necessary information. It is complete for the 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?
Schema coverage is 0%, so the description must compensate. It explains the single parameter 'type_code' as a disaggregation type code from list_disaggregation_types, with an example. This adds crucial context beyond the schema's minimal type declaration.
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 'available values for a specific disaggregation type.' It distinguishes from sibling tools like list_disaggregation_types by specifying that this tool returns values for a given type.
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: use after list_disaggregation_types to get values for a specific code. It doesn't explicitly mention when not to use, but the context is sufficient for correct selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_indicator_metadataA
Get detailed metadata for a specific UNESCO UIS indicator.
Returns definitional and methodological information for an indicator, including its glossary definition, purpose, calculation method, data sources, and available disaggregations. Use this after finding indicator codes via search_indicators.
Args: indicator_code: The indicator code (e.g. "CR.1", "ROFST.1.cp").
Returns: A dictionary with: - "code": Indicator code. - "name": Full indicator name. - "theme": Theme code. - "last_update": Date and description of the most recent data release. - "data_availability": Time coverage (min/max year), total record count, and geographic unit types. - "definition": Glossary entry with definition, purpose, calculation method, data source, interpretation, and limitations (if available). - "disaggregations": List of available disaggregation breakdowns (code, name, type).
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It explains what the tool does and the return structure, but lacks explicit disclosure of side effects (e.g., mutations), safety, rate 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a summary sentence, usage guidance, argument docs, and returns breakdown. It is concise enough for the detail needed, with no superfluous content.
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 description is complete: it defines the tool's purpose, usage, parameter, and return structure in detail. With an output schema present, the description still adds value by explaining nested fields, making the tool fully understandable.
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 provides only the parameter name with no description (0% coverage). The description adds meaningful context: the indicator code format and examples ('e.g. 'CR.1', 'ROFST.1.cp'). This significantly aids the AI agent.
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'), resource ('detailed metadata for a specific UNESCO UIS indicator'), and scope. It differentiates this tool from its sibling 'search_indicators' by instructing to use it after finding indicator codes.
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 explicitly tells when to use this tool: 'Use this after finding indicator codes via search_indicators.' It provides clear context but does not mention when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_indicator_summaryA
Get a lightweight summary for one or more UNESCO UIS indicators.
Returns key fields from the local database without making API calls. Much faster than get_indicator_metadata — use this when you need a quick overview of multiple indicators (e.g. after a search) rather than full definitional detail.
Use get_indicator_metadata when you need glossary definitions, methodology, or detailed disaggregation breakdowns for a single indicator.
Args: indicator_codes: List of indicator codes (1–10). Use codes from search_indicators results.
Returns: A dictionary with: - "indicators": List of summaries, each with code, name, theme, timeLine_min/max, totalRecordCount, geoUnitType, lastDataUpdate, and disaggregation_types (list of type names). - "returned": Number of indicators found. - "not_found": List of requested codes that were not in the database.
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_codes | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that the tool is fast because it uses a local database without API calls, and it details the return structure including not_found list. It does not mention any destructive behavior or auth requirements, but for a read-only summary tool, this is sufficient. A score of 4 reflects that it adds valuable behavioral context beyond just the operation.
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 well-structured with a brief overview, usage comparison, args section, and returns section. Every sentence adds value, and it is concise without being overly verbose.
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 has a single parameter and an output schema (described in detail), the description provides complete context. It explains the return structure, what data is included, and behavior for missing codes. No gaps remain.
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 only parameter, indicator_codes, is described with additional meaning: 'List of indicator codes (1–10). Use codes from search_indicators results.' This adds constraints and source information beyond the schema which only specifies array of strings. Since schema description coverage is 0%, the description compensates fully.
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's purpose: 'Get a lightweight summary for one or more UNESCO UIS indicators.' It specifies the verb, resource, and distinguishes it from sibling get_indicator_metadata by mentioning it returns key fields from the local database without API calls.
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 explicitly provides usage guidance: 'Much faster than get_indicator_metadata — use this when you need a quick overview... Use get_indicator_metadata when you need glossary definitions...' It also mentions constraints (1–10 indicator codes) and source of codes (search_indicators results).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_valueA
Get the value of a UNESCO UIS indicator for a specific country or region.
Returns a single data point — either the most recent available value, or the value for a specific year. Use this for answering questions like: "What is the literacy rate in Kenya?" or "What was the completion rate in Sub-Saharan Africa in 2015?"
GEOGRAPHY RULES:
For countries: pass the ISO3 code directly (e.g. "KEN", "FRA").
For regions: ALWAYS call search_geo_units first — it will ask the user which grouping system to use. Regional names map to multiple codes with different country compositions; using the wrong one gives silently wrong data.
If omitted, the tool will interactively ask the user for the geography.
To find indicator codes, use search_indicators. Always show the user the year alongside the value, since data is not always available for the most recent years.
Args: indicator_code: The indicator code (e.g. "CR.1", "LR.AG15T99"). geo_unit_code: ISO3 code for countries, or a confirmed code from search_geo_units for regions. Omit to trigger interactive geography lookup. year: Optional. The specific year to retrieve. If omitted, returns the most recent available value. If no data exists for the requested year, returns the nearest available year instead, with a note.
Returns: A dictionary with: - "indicator_code": The indicator code. - "indicator_name": Full name of the indicator. - "geo_unit_code": The geo unit code. - "geo_unit_name": Human-readable geography name. - "year": The year of the returned value. - "value": The numeric data value. - "qualifier": Data quality flag if present (e.g. "<", "~"), else null. - "note": Context about the data point (e.g. year range, year substitution).
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes | ||
| geo_unit_code | No | ||
| year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key behaviors: returns a single data point, interactively asks for geography if geo_unit_code is omitted, handles missing years by returning the nearest available year with a note, and includes data quality flags. This provides full transparency about what the tool does beyond the schema.
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 moderately long but well-structured with clear sections (GEOGRAPHY RULES, Args, Returns). Every sentence adds value, though the example questions and some prose could be slightly trimmed without losing clarity. Overall, it is efficient and front-loaded with the core 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?
Given the tool has 3 parameters (one required) and a detailed output schema, the description is extremely complete. It explains return values in a human-readable way (e.g., note about year substitution), covers all behaviors, and provides contextual rules. The output schema already defines the return structure, so the description enhances rather than repeats it.
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%, so the description must compensate. It does so excellently: it explains indicator_code (e.g., 'CR.1'), geo_unit_code with geography rules (ISO3 for countries, confirmed code for regions, or omit for interactive lookup), and year with default behavior (most recent if omitted, nearest year if no data). This adds critical meaning not in the raw schema.
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's purpose: 'Get the value of a UNESCO UIS indicator for a specific country or region.' It uses a specific verb (Get) and resource (value of indicator for geography), and distinguishes from siblings like get_time_series (multiple data points) and search_indicators (finding codes).
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 explicit when-to-use guidance with example questions ('What is the literacy rate in Kenya?'). It also gives when-not-to-use by specifying geography rules (for regions, use search_geo_units first) and references sibling tools like search_indicators for finding codes. It even tells the agent to always show the year alongside the value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_time_seriesA
Get the full time series for a UNESCO UIS indicator for one country or region.
Returns all data points for the indicator × geography combination, optionally filtered to a year range. Ideal for trend analysis and time-series visualisation.
GEOGRAPHY RULES:
For countries: pass the ISO3 code directly (e.g. "KEN", "FRA").
For regions: ALWAYS call search_geo_units first — it will ask the user which grouping system to use. Regional names map to multiple codes with different country compositions; using the wrong one gives silently wrong data.
If omitted, the tool will interactively ask the user for the geography.
Args: indicator_code: The indicator code (e.g. "LR.AG15T99"). geo_unit_code: ISO3 code for countries, or a confirmed code from search_geo_units for regions. Omit to trigger interactive geography lookup. start_year: Optional. First year to include (inclusive). end_year: Optional. Last year to include (inclusive).
Returns: A dictionary with: - "indicator_code", "indicator_name": Indicator identity. - "geo_unit_code", "geo_unit_name": Geography identity. - "data_points": Chronological list of {year, value, qualifier}. - "summary": {total_data_points, min_value, max_value, latest_year, note}.
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_code | Yes | ||
| geo_unit_code | No | ||
| start_year | No | ||
| end_year | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses behavior: returns all data points, optional year range, geography rules including risks, and return structure. Comprehensive.
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 sections and front-loaded purpose. Slightly verbose but all content is valuable. Could be trimmed slightly, but still 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 the complexity (4 params, 1 required, no annotations, but has output schema), the description is very complete. Covers geography rules, parameter usage, and return format thoroughly.
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% description coverage, but description explains each parameter in detail: indicator_code, geo_unit_code with rules, start_year, end_year. Adds significant meaning beyond schema 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?
The description clearly states the tool gets the full time series for a UNESCO UIS indicator for one country or region. It distinguishes from siblings by mentioning geography rules and referencing search_geo_units for regions.
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 states when to use (trend analysis, time-series visualization) and provides geography rules with a clear directive to use search_geo_units for regions to avoid silent errors.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_disaggregation_typesA
Find all available disaggregation types for UNESCO UIS indicators.
Disaggregation types describe how indicator data can be broken down (e.g. by sex, age group, education level, wealth quintile, etc.).
Returns: A dictionary with: - "disaggregation_types": A list of dicts, each with 'type_code' and 'type_name'. - "count": The total number of disaggregation types. - "hint": Guidance on how to use the type codes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool is a read operation (no side effects) and provides the exact return structure. This sufficiently informs the agent of behavior beyond a simple name.
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 moderately concise, with three functional paragraphs. It could be slightly tighter (e.g., merging the return explanation into fewer sentences), but it is well-structured with a clear purpose and return section.
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 zero parameters and presence of an output schema, this description is fully complete. It explains the purpose, the meaning of disaggregation types, and the exact return dictionary. No information is missing for an agent to use it 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 is empty (no parameters), so there is no need for additional parameter explanation. The description adds no redundancy.
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's purpose: 'Find all available disaggregation types for UNESCO UIS indicators.' It specifies the resource (disaggregation types) and the action (list/find). The return format is detailed, distinguishing it from sibling tools like get_disaggregation_values which retrieve values for a specific type.
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 usage context by explaining that disaggregation types describe how data can be broken down, and the return includes a hint on using type codes. This guides the agent to use this tool before querying specific values. However, it does not explicitly state when to use this versus siblings, though the differentiation is clear from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_themesA
Find all available UNESCO data themes and basic information about them.
UIS themes are the highest-level topical groups used to organize indicators.
Returns: A dictionary with three keys: - "theme information": A list containing each theme code, name, last update date, description of the update, and the count of indicators in that theme. - "theme count": The total number of themes available. - "hint": A string providing guidance on how to use the theme codes for searching indicators
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosure. It fully describes the return structure (a dictionary with three keys and their contents), giving the agent a clear expectation of the output. It does not mention side effects, auth needs, or performance, but for a simple read-only list tool this 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 concise at 4 sentences, front-loading the main action and then explaining the return structure. It avoids unnecessary details but could be slightly tighter by combining the first two lines.
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 (no parameters, output schema exists), the description is thorough. It explains the hierarchical role of themes, lists all output fields, and provides guidance on using the results. No additional information is needed for an agent to invoke this tool 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 zero parameters, so schema coverage is 100% and there is nothing for the description to add beyond the schema. Following the baseline rule for 0-parameter tools, a score of 4 is appropriate.
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 'Find all available UNESCO data themes' with a specific verb and resource. It distinguishes this from sibling tools focused on indicators, geographies, and other operations, making the purpose unambiguous.
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 that themes are 'the highest-level topical groups used to organize indicators' and includes a hint for using theme codes to search indicators. This implies when to use the tool (to get an overview of themes and their codes), but it does not explicitly state when not to use it or name alternative tools for related tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_geo_unitsA
Search for UNESCO UIS geographic units (countries and regions) by name or code.
Use this to find the geo unit code needed for get_latest_value. Accepts either a country/region name (e.g. "Kenya", "Sub-Saharan Africa") or an ISO3 code directly (e.g. "KEN", "ZWE"). When multiple grouping systems match a region (WB, SDG, UNICEF, etc.), the tool will elicit a choice from the user directly.
Args: query: Country or region name, or ISO3 code (e.g. "Kenya", "ZWE", "Sub-Saharan Africa"). type_filter: Optional. "NATIONAL" to show only countries, "REGIONAL" for aggregates only. region_group: Optional. Restrict to a specific grouping system (e.g. "WB", "SDG", "UNICEF").
Returns: A dictionary with: - "geo_units": List of matches, each with code, name, type, and region_group. - "count": Number of results returned. - "hint": Guidance on next steps.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| type_filter | No | ||
| region_group | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 the interactive behavior when multiple grouping systems match, which is a key trait. It also implies a read-only nature. No contradictions; the description is honest about the tool's 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 front-loaded with a one-sentence summary, followed by context and detailed parameter explanations. Every sentence adds value with no redundancy. It is concise yet comprehensive.
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 has 3 parameters, no annotations, but an output schema, the description covers all necessary aspects: purpose, parameter usage, interactive behavior, and return format (dictionary with geo_units, count, hint). It is complete for an agent to select and invoke the tool 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?
Schema description coverage is 0%, so the description must compensate. It does so thoroughly: for 'query' it explains accepted inputs (name or ISO3 code with examples), for 'type_filter' it clarifies the two valid values (NATIONAL/REGIONAL), and for 'region_group' it explains restriction to a grouping system with examples. This adds significant meaning beyond the bare schema.
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's purpose: searching for UNESCO UIS geographic units by name or code. It specifies the verb 'search', the resource 'geo units', and the scope (countries and regions). It also mentions its role in supporting get_latest_value, making it distinct from sibling tools like search_indicators or get_country_ranking.
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 explicitly says 'Use this to find the geo unit code needed for get_latest_value' and explains how it handles multiple grouping systems by eliciting a user choice. It provides examples of acceptable inputs. While it doesn't list when not to use it, the context is clear and practical.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_indicatorsA
Search UNESCO UIS indicators by relevance using text and structured filters.
Use this tool to discover which indicators exist for a topic. Results are capped (default 20, max 50) and intended for interactive exploration. For counting indicators with precise year or date filters, use count_indicators.
Suggested workflow for complex queries:
Call list_themes to find the theme code if the user mentions a thematic area.
Call list_disaggregation_types and get_disaggregation_values to find codes for concepts like "sex", "primary education", "age group". Do not pass these as the query parameter — use the structured filter parameters instead.
Pass discovered codes as structured filters. Only use query for name-based narrowing after applying structured filters.
All provided filters are combined with AND logic. At least one filter must be provided. Results default to 20. If more exist, suggest narrowing with additional filters rather than increasing the limit.
Args: query: Full-text search on indicator name (supports stemming, e.g. "completing" matches "completion"). Secondary refinement only — do not use for concepts that map to themes or disaggregations. theme: Exact theme code (from list_themes). disaggregation_types: List of disaggregation type codes (from list_disaggregation_types). Indicators must support ALL listed types. disaggregation_values: List of disaggregation value codes (from get_disaggregation_values). Indicators must match ALL listed values. limit: Maximum number of results to return (default 20, max 50). Prefer narrowing filters over increasing limit.
Returns: A dictionary with: - "indicators": List of matching indicators, each with: code, name, theme, timeLine_min, timeLine_max. - "query_matches": Number of indicators matched by this query. This is NOT the total count of all UNESCO indicators — it only reflects how many matched these specific filters. Some relevant indicators may be missing if the query is too narrow or the text search didn't capture them. - "returned": Number of indicators included in this response (may be less than query_matches if truncated). - "hint": Guidance on next steps.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| theme | No | ||
| disaggregation_types | No | ||
| disaggregation_values | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description fully covers behavior. Discloses result capping (default 20, max 50), interactive exploration intent, and that query_matches is not total count. Warns that some indicators may be missing if query is too narrow. Describes return structure, ensuring agent knows what to expect.
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?
Description is lengthy but well-structured with purpose, usage, suggested workflow, filter logic, and parameter details. Every sentence adds value. Slight redundancy in parameter descriptions could be trimmed, but overall efficient given complexity.
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 all aspects: tool purpose, when to use, complex workflow, parameter semantics, output schema explanation (though output schema provided externally), and edge cases (truncation, query_matches vs total count). Adequate for the complexity of the 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 has 0% description coverage, so description compensates fully. Each parameter gets detailed guidance: query (stemming, secondary refinement), theme (exact code from list_themes), disaggregation types/values (reference to other tools, must work for ALL), limit (default 20, max 50, prefer narrowing filters).
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 it searches UNESCO UIS indicators using text and structured filters. It distinguishes from sibling tool count_indicators by noting the latter is for counting with precise year/date filters, making the scope specific and unambiguous.
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 states when to use (discover indicators) and when not (use count_indicators for precise counting). Provides a detailed suggested workflow for complex queries, guiding agents to find theme and disaggregation codes from other tools and to use structured filters before query parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusA
Return basic runtime metadata for smoke tests and client wiring.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 states it returns metadata but does not specify what runtime metadata includes or any side effects. The existence of an output schema compensates somewhat, but more details on behavior (e.g., read-only, latency) would be beneficial.
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 a single, front-loaded sentence with no wasted words. It efficiently conveys purpose and usage context.
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 has no parameters and an output schema exists, the description is sufficiently complete for a simple status endpoint. The context of sibling tools reinforces its distinct role. Slightly more detail about the metadata could be added, but it's adequate.
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?
There are zero parameters, and schema description coverage is 100% (empty). According to guidelines, 0 parameters gives a baseline of 4. No additional parameter semantics needed.
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 returns 'basic runtime metadata' for specific use cases 'smoke tests and client wiring'. The verb 'Return' is specific, and the resource ('runtime metadata') is distinct from sibling tools that deal with data queries.
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 explicitly mentions when to use: for smoke tests and client wiring. While it does not list when not to use or alternatives, the context of sibling tools makes its usage obvious. A clearer exclusion statement would improve, but it is adequate.
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.
13 tool updates
v0.1.1- First observed
compare_geographies - First observed
count_indicators - First observed
get_country_ranking - First observed
get_disaggregation_values - First observed
get_indicator_metadata - First observed
get_indicator_summary - First observed
get_latest_value - First observed
get_time_series - First observed
list_disaggregation_types - First observed
list_themes - First observed
search_geo_units - First observed
search_indicators - First observed
server_status
TDQS
Each tool has a clearly distinct purpose: compare geographies, count indicators, get rankings, retrieve metadata/summary, get single value or time series, list themes/disaggregation types, and search geo units or indicators. No two tools overlap in functionality.
Most tools follow the verb_noun pattern (e.g., compare_geographies, get_latest_value, list_themes). The only exception is server_status, which uses noun_noun. Overall, the naming is clear and predictable.
With 13 tools, the set is well-scoped for covering UNESCO UIS data exploration and retrieval without being overwhelming. Each tool serves a specific, necessary function.
The tool surface covers the full lifecycle of data discovery (search, list, metadata) and retrieval (single value, time series, comparison, ranking). No obvious gaps for a read-only statistical API.
Maintenance
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
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
The BigQuery remote MCP server is a fully managed service that uses the Model Context Protocol to connect AI applications and LLMs to BigQuery data sources. It provides secure, standardized tools for AI agents to list datasets and tables, retrieve schemas, generate and execute SQL queries through natural language, and analyze data—enabling direct access to enterprise analytics data without requiring manual SQL coding.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
Related MCP Servers
- FlicenseBqualityDmaintenanceA Model Context Protocol server that provides AI-driven tools to categorize, tag, and optimize educational content using GPT-4.36-
- AlicenseBqualityDmaintenanceA model Context Protocol (MCP) server that provides comprehensive OECD statistics through the SDMX API, supporting AI assistants and chatbots to query OECD datasets in areas such as economy, health, education, and environment.92Apache 2.0
- AlicenseAqualityCmaintenanceA Model Context Protocol (MCP) server that gives AI assistants direct access to the World Health Organization's Global Health Observatory (GHO) for comparative health systems research.15MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server for the CBS Open Data OData API, enabling AI assistants to query, filter, and explore CBS statistics.9MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/lpicci96/unesco-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server