global-education-mcp
global-education-mcp is a read-only MCP server that gives AI assistants access to international education statistics from UNESCO UIS and OECD Education at a Glance β no API keys needed.
π Explore indicators β search and filter UNESCO UIS's 4,000+ indicators by theme (
EDUCATION,SCIENCE,CULTURE) or free text (uis_list_indicators).π Browse geographies β list countries and regional aggregates by ISO 3166-1 Alpha-3 code, filtered by name or
NATIONAL/REGIONALtype (uis_list_countries).π Retrieve UIS data β pull any indicator for one country or all, over a 1970β2030 year range (
uis_get_education_data).βοΈ Compare countries β benchmark one indicator across 2β15 countries, sorted by value (
uis_compare_countries).π« Country profiles β generate a 10-core-indicator education profile as latest values or a time series (
uis_country_education_profile).ποΈ Check database versions β see published UIS data versions and dates (
uis_list_versions).π OECD datasets β list Education at a Glance dataflows (enrolment, graduation, finance, teachers, earnings) (
oecd_list_education_datasets).π Search OECD β find dataflows by keyword (
oecd_search_datasets).π° Retrieve OECD data β fetch SDMX data for a dataflow, with country and period filters (
oecd_get_education_indicator).π― Thematic benchmarking β cross-source comparison across 5 focus themes: literacy, spending, completion, teachers, enrollment (
education_benchmark_countries).π‘οΈ Safe by design β all tools are read-only, idempotent, rate-capped (max 50 indicators, 15 countries), cached, and fall back to local reference data on API failure.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@global-education-mcpCompare education spending as % of GDP for Switzerland and Finland"
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.
π¨π Part of the Swiss Public Data MCP Portfolio
π global-education-mcp
MCP server for international education data β UNESCO UIS (4,000+ indicators across all member countries) and OECD Education at a Glance via SDMX. No API keys required.
Overview
global-education-mcp gives AI assistants like Claude a complete international education intelligence system β literacy rates, enrolment ratios, education expenditure, teacher salaries, gender parity and SDG-4 monitoring, all accessible through a single standardised MCP interface.
The server bridges two of the most authoritative sources for internationally comparable education statistics: UNESCO UIS (global coverage, 4,000+ indicators) and the OECD's annual Education at a Glance (38 OECD countries, SDMX REST API). Both are open and require no API key.
Anchor demo query: "Compare Switzerland's education expenditure as a percentage of GDP with Finland, Singapore and South Korea over the last 10 years β and flag any SDG-4 gaps."
Related MCP server: Skolverket-MCP
Features
π UNESCO UIS β 4,000+ indicators, all UNESCO member countries, no API key
π OECD Education at a Glance β 38 OECD countries + partners via SDMX REST
π Indicator search β browse and filter the full UNESCO indicator catalogue
πΊοΈ Multi-country comparison β benchmark any indicator across multiple countries
π« Country education profiles β 10 core indicators in one call
π― SDG-4 monitoring β structured reporting on Education for All targets
π OECD dataset search β discover and retrieve Education at a Glance dataflows
π No API keys required β fully open data, zero setup friction
βοΈ Dual transport β stdio for Claude Desktop, Streamable HTTP (
/mcp, spec2026-07-28) for cloud deploymentπ‘οΈ Graceful degradation β API failures return helpful messages with local reference fallback
Prerequisites
Python 3.11+
uv(recommended) orpipNo API keys needed
Installation
# Clone the repository
git clone https://github.com/malkreide/global-education-mcp.git
cd global-education-mcp
# Install
pip install -e ".[dev]"Or with uvx (no permanent installation):
uvx global-education-mcpQuickstart
# Start the server (stdio mode for Claude Desktop)
global-education-mcpTry it immediately in Claude Desktop:
"What is Switzerland's literacy rate compared to Finland and Singapore?" "Show me education expenditure as % of GDP for CHE, DEU and AUT over the last 10 years."
Configuration
Claude Desktop Configuration
Windows (%APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"global-education": {
"command": "uvx",
"args": ["global-education-mcp"]
}
}
}macOS (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"global-education": {
"command": "uvx",
"args": ["global-education-mcp"]
}
}
}A ready-to-use claude_desktop_config.json is included in the repository root.
Cloud Deployment (Streamable HTTP for browser access)
For use via claude.ai in the browser (e.g. on managed workstations without local software).
β οΈ Security note: Since v0.3,
MCP_HOSTdefaults to127.0.0.1. The HTTP transport must always run behind a reverse proxy that adds TLS, authentication, and rate-limiting. Never expose the raw port to the internet βMCP_HOST=0.0.0.0is only safe inside an isolated container network.
Docker (recommended):
The repository ships a hardened multi-stage Dockerfile and a
docker-compose.yml that applies read_only: true, cap_drop: [ALL],
security_opt: [no-new-privileges:true], and runs as non-root user
uid 10001. The compose file binds the port to 127.0.0.1 so a host-level
reverse proxy is required for any external access.
docker compose up --build
# then point nginx/caddy at 127.0.0.1:8000/mcp with TLS + authPlain docker run (without compose):
docker build -t global-education-mcp .
docker run --rm \
--read-only --cap-drop ALL --security-opt no-new-privileges \
--tmpfs /tmp:size=16M,mode=1777 \
-p 127.0.0.1:8000:8000 \
global-education-mcpRender.com:
Push/fork the repository to GitHub
On render.com: New Web Service β connect GitHub repo
Set environment variables in the Render dashboard:
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 # Render needs 0.0.0.0; their edge layer provides TLS + auth. PORT=8000In claude.ai under Settings β MCP Servers, add:
https://your-app.onrender.com/mcp
Migrating from SSE. Up to v0.3.5 the container defaulted to MCP_TRANSPORT=sse
with the endpoint /sse. The default is now streamable-http at /mcp β the
transport through which 2026-07-28 clients send their single-POST requests;
SSE has been superseded since spec 2025-03-26 and never offered that path.
Existing deployments either switch the client URL to /mcp or set
MCP_TRANSPORT=sse explicitly; the server then logs a
legacy_transport_warning on start. An unknown MCP_TRANSPORT value now
aborts the start instead of silently falling back to stdio.
π‘ "stdio for the developer laptop, sandboxed Streamable HTTP container for the browser."
Available Tools
UNESCO UIS Tools
Tool | Description |
| Search and list available indicators (4,000+) |
| List countries and regions with ISO codes |
| Retrieve data for a specific indicator |
| Multi-country comparison for one indicator |
| Full education profile (10 core indicators) |
| List available database versions |
OECD Tools
Tool | Description |
| List Education at a Glance datasets |
| Retrieve OECD education data via SDMX |
| Search OECD dataflows by keyword |
Cross-Source Tools
Tool | Description |
| Benchmark multiple countries across 5 focus themes (UNESCO UIS) |
Resources & Prompts
Resources:
education://indicators/unescoβ Quick reference for core UNESCO indicatorseducation://datasets/oecdβ Quick reference for OECD Education at a Glance dataflows
Prompts:
bildungsvergleich_schweizβ Switzerland vs. Finland, Singapore, Japansdg4_monitoringβ SDG-4 report for CH/DE/AT
Country Codes
ISO 3166-1 Alpha-3 standard:
Code | Country | Code | Country |
| Switzerland |
| Finland |
| Germany |
| Singapore |
| Austria |
| South Korea |
| France |
| Japan |
| Sweden |
| United States |
Example Use Cases
Query | Tool |
"What is Switzerland's literacy rate vs. Finland and Singapore?" |
|
"Education expenditure as % of GDP for CHE, DEU, AUT over 10 years" |
|
"Create a full education profile for South Korea" |
|
"Which OECD datasets cover teacher salaries?" |
|
"Compare secondary graduation rates across 5 European countries" |
|
"Create an SDG-4 monitoring report for Switzerland" |
|
β More use cases by audience β
Architecture
βββββββββββββββββββ ββββββββββββββββββββββββββββββββ ββββββββββββββββββββββ
β Claude / AI ββββββΆβ Global Education MCP ββββββΆβ UNESCO UIS API β
β (MCP Host) βββββββ (MCP Server) βββββββ uis.unesco.org β
βββββββββββββββββββ β β ββββββββββββββββββββββ
β 10 Tools Β· 2 Resources β
β Β· 2 Prompts β ββββββββββββββββββββββ
β stdio | Streamable HTTP ββββββΆβ OECD SDMX API β
β βββββββ sdmx.oecd.org β
β server.py β ββββββββββββββββββββββ
β + api_client.py β
ββββββββββββββββββββββββββββββββInfrastructure Components
Component | Metaphor | Function |
HTTPClient | Postal service | Handles all outbound HTTP requests, retries and timeouts |
SimpleCache | Whiteboard | In-memory TTL cache for repeated queries |
GracefulFallback | Safety net | Returns local reference data when APIs are unavailable |
SDMXParser | Translator | Converts OECD SDMX/XML responses to clean JSON |
Caching Strategy
Data Source | Cache TTL | Rationale |
UNESCO UIS indicators | 3600s | Catalogue is stable; updated annually |
UNESCO UIS country data | 1800s | Figures update yearly, not intraday |
OECD dataset list | 3600s | Education at a Glance is an annual publication |
OECD indicator data | 1800s | Same annual update cycle |
Country/region list | 86400s | ISO codes and country lists are highly stable |
Project Structure
global-education-mcp/
βββ src/global_education_mcp/ # Main package
β βββ __init__.py # Package metadata, version
β βββ server.py # FastMCP server, 10 tools, 2 resources, 2 prompts
β βββ api_client.py # HTTP client, UNESCO UIS + OECD wrappers, formatters
βββ scripts/
β βββ record_fixtures.py # Records the fixtures from the live UIS API
βββ tests/
β βββ fixtures/ # Recorded responses + PROVENANCE.md (source, date, SHA-256)
β βββ fixture_data.py # Fixture loader β raises on a missing name
β βββ test_source_contract.py # Contract vs. the recording + live tests
β βββ test_server.py # 42 tests (basic / intermediate / advanced)
β βββ test_extended_scenarios.py # 74 tests across 8 categories
βββ claude_desktop_config.json # Ready-to-use Claude Desktop config
βββ pyproject.toml # Build configuration (hatchling)
βββ CHANGELOG.md
βββ CONTRIBUTING.md # Contribution guide (English)
βββ CONTRIBUTING.de.md # Contribution guide (German)
βββ SECURITY.md # Security policy (English)
βββ SECURITY.de.md # Security policy (German)
βββ LICENSE
βββ README.md # This file (English)
βββ README.de.md # German versionKnown Limitations
UNESCO UIS: Some indicators have sparse coverage for low-income countries or recent years
OECD SDMX: Occasional API timeouts on large multi-country, multi-year requests; reduce the year range if needed
OECD coverage: 38 OECD members + select partners β does not cover all UNESCO member states
Historical depth: UNESCO UIS data availability varies by indicator; not all series go back to 1970
Language: UNESCO UIS returns indicator labels in English only; OECD labels may vary by dataflow
No real-time data: Both sources publish annually β figures reflect the latest published edition, not live school statistics
Estimated values are labelled: UIS marks part of its observations
UIS_EST(UIS estimate) orNAT_EST(national estimate) β forLR.AG15T99that is 1,306 of 9,818 values. The status column names it; an unlabelled value is a reported one.Data rows carry the ISO code, not the country name: plain names come from
uis_list_countries. The data tools print the code rather than inventing a name.An unknown country code is not an error status: UIS answers HTTP 200 with an empty result set and states the reason in the payload's
hintsfield. The tools print that hint β otherwise a typo would look exactly like a country without data.
Compliance & Data Classification (City of Zurich)
Verbindliche Klassifikation fΓΌr den Einsatz im Schulamt der Stadt ZΓΌrich (German section follows in
README.de.md).
ISDS Protection Class (Stadt ZΓΌrich Schutzbedarfsklassen)
Dimension | Class | Reasoning |
Confidentiality | public | UNESCO UIS data licensed under CC BY-SA 3.0 IGO; OECD EaG under public OECD Terms |
Integrity | normal | Upstream is authoritative; local in-memory cache is TTL-bounded and never written to disk |
Availability | normal | Graceful fallback to bundled static reference data when an API is unreachable |
Overall protection class | G1 β public (ΓΆffentlich) | lowest tier per ISDS Stadt ZΓΌrich |
Data owner: UNESCO UIS / OECD (external)
System owner: Schulamt der Stadt ZΓΌrich
Processes personal data: no
DSG / EDΓB relevance: none (only anonymized country-level aggregates)
Schulamt Classification (BUI / Vertraulich / Streng Vertraulich)
Aspect | Classification |
Tool output (Markdown tables, summaries) | BUI (betrieblich unkritische Information) |
In-memory TTL cache | BUI (same tier as source) |
Structured logs (JSON on stderr, see OBS-003) | BUI β only tool name, params, duration; no PII |
| BUI |
β The server is approved for any Schulamt use case without additional clearance from the data protection officer.
Compatibility
Component | Supported version |
MCP Protocol | 2024-11-05 |
MCP Python SDK |
|
Python | 3.11, 3.12, 3.13 |
|
|
|
|
Major-version upgrades are deliberate decisions β the upper bounds in
pyproject.toml exist so a transitive bump does not silently break the
server. See CHANGELOG.md for the upgrade trail.
π‘οΈ Safety & Limits
Aspect | Details |
Access | Read-only ( |
Personal data | No personal data β UNESCO UIS and OECD EaG publish only aggregated, country-level statistics |
Rate limits | Built-in per-query caps (max 50 indicators per search, max 10 countries per comparison, conservative year ranges) |
Caching | In-memory TTL cache (1800β86400s) reduces upstream load and respects publisher capacity |
Timeout | 30 seconds per upstream API call, with graceful fallback to local reference data |
Authentication | No API keys required β both UNESCO UIS and OECD SDMX are publicly accessible |
Licenses | UNESCO UIS data under CC BY-SA 3.0 IGO; OECD data under OECD Terms and Conditions |
Terms of Service | Subject to ToS of the respective sources: UNESCO UIS, OECD β please cite the source when redistributing |
Attribution | All tool responses include source attribution ( |
MCP Protocol Version
This server speaks two protocol eras over the same endpoint. The client's first request on a connection decides which one applies; a later claim from the other era is refused.
Era | Revision | Who reaches it |
|
| What today's clients speak. The server answers with the revision asked for, or with the |
Per-request envelope |
| A request carrying the |
Over HTTP both eras share the endpoint /mcp (MCP_TRANSPORT=streamable-http,
stateless): a request with the MCP-Protocol-Version: 2026-07-28 header is
served as a self-contained single exchange β no initialize, no
Mcp-Session-Id. The legacy SSE transport (MCP_TRANSPORT=sse) offers no such
path and reaches the handshake era only.
Both revisions are pinned in
tests/test_protocol_version.py and asserted
against the installed SDK, so a Dependabot bump of mcp cannot move either one
silently. tests/test_streamable_http.py
measures them: it builds the HTTP app with the options main() starts, and
sends a 2026-07-28 client, an auto client, a legacy initialize and a raw
server/discover through it. The CI Docker job sends the same
server/discover to the hardened container.
What 2026-07-28 changes for this server. The logging capability is
deprecated (SEP-2577) and is not used: announcements before a fan-out travel as
progress 0 of n, operational logs go to stderr as JSON. serverInfo, which
now rides in _meta on every response, carries the package version. List
methods carry freshness hints (ttlMs, cacheScope, SEP-2549).
Note that the SDK's LATEST_PROTOCOL_VERSION is an alias for the modern
era, not for the handshake era β pinning against it alone would leave the era
that current clients actually negotiate free to drift.
Update policy. When the gate fails, do not edit the constant blindly: read
the spec changelog between the two revisions, verify the server still behaves,
then move the constant, this section, README.de.md and
CHANGELOG.md together.
Testing
# Unit tests (no API key required, no network)
PYTHONPATH=src pytest tests/ -v -m "not integration"
# Full suite including the live tests against api.uis.unesco.org
PYTHONPATH=src pytest tests/ -v
# Re-record the fixtures (writes tests/fixtures/ + PROVENANCE.md)
PYTHONPATH=src python scripts/record_fixtures.py169 tests β 152 offline, 17 against the live source.
Category | Tests | Description |
Edge cases & boundary values | 19 | Year limits, string lengths, null/zero values |
Security & adversarial inputs | 14 | Injection attempts, HTTP error codes, whitespace |
Output quality | 11 | Markdown structure, source attribution, sort order |
Resilience & error cascades | 9 | Full API outage, partial results, timeouts |
Subject-matter correctness | 10 | SDG-4 coverage, correct indicators per focus theme |
Performance & concurrency | 4 | Concurrent requests, time limits |
Schulamt scenarios | 7 | DACH comparison, PISA, teacher shortage |
Source contract vs. the recording | 23 | Field names, envelope, query parameters, hints |
Live tests ( | 17 | The paths, the shape, and the tools themselves |
Why the fixtures are recorded rather than written
A hand-written mock encodes its author's assumption and therefore cannot refute it: production code and fixture come from the same head, the same hour, the same reading of the docs. Where both are wrong, both are wrong together β and the suite stays green.
That is not a hypothetical here. Before 2026-08-08 this repo had 128 green
tests while three of its four UNESCO paths answered HTTP 404 and every data
query returned an empty list. The mocks carried the same invented field names
as the production code (observations, indicatorId, entityType), so
nothing could ever contradict them.
Every fixture under tests/fixtures/ is now a recorded response.
PROVENANCE.md names the source URL, the recording date, the selection rule
and the SHA-256 for each one. Without a date, "recorded" becomes
indistinguishable from "invented" after two years β the file looks the same.
Three of the fixtures are controls: a made-up theme value, a made-up
country code, and the same time series requested twice with different
parameter names. Without them a measurement only shows what we received; with
them it shows what the source actually distinguishes.
Contributing
Contributions are welcome. Please open an issue first to discuss what you would like to change.
Follow the existing code style (Ruff linting, Black formatting)
Add tests for new tools (
tests/test_server.pyortest_extended_scenarios.py)Use the
@pytest.mark.integrationmarker for tests that call live APIsUpdate
CHANGELOG.mdand the tool table in this READMESee CONTRIBUTING.md for the full contribution guide
Changelog
See CHANGELOG.md
Security
To report a vulnerability, see SECURITY.md (π©πͺ Deutsche Version). Please use the private channels described there rather than public issues.
License
MIT License β see LICENSE
Author
Hayal Oezkan Β· github.com/malkreide
Credits & Related Projects
Data: UNESCO Institute for Statistics (UIS) β open education data for all UNESCO member states
Data: OECD Education at a Glance β annual OECD education statistics via SDMX
Protocol: Model Context Protocol β Anthropic / Linux Foundation
Related: swiss-transport-mcp β MCP server for Swiss public transport
Related: zurich-opendata-mcp β MCP server for Zurich city open data
Portfolio: Swiss Public Data MCP Portfolio
MCP Client Configuration
Run via uv's uvx β no clone or manual install needed. Add to your MCP client config (mcpServers for Claude Desktop, Cursor and Windsurf; use a top-level servers key for VS Code in .vscode/mcp.json):
{
"mcpServers": {
"global-education-mcp": {
"command": "uvx",
"args": [
"global-education-mcp"
]
}
}
}Available Tools
10 toolseducation_benchmark_countriesARead-only
Benchmarkt mehrere LΓ€nder auf einem Bildungsthema via UNESCO UIS.
Automatisch werden die passenden Indikatoren fΓΌr den gewΓ€hlten Fokus ausgewΓ€hlt und ein strukturierter Vergleich erstellt.
Fokus-Optionen:
literacy: Alphabetisierungsraten (Erwachsene + Jugendliche)
spending: Bildungsausgaben (% BIP, verschiedene Stufen)
completion: Abschlussquoten (Primar, Sek I, Sek II)
teachers: SchΓΌler-Lehrer-VerhΓ€ltnis + Lehrerausbildung
enrollment: Einschulungsraten nach Schulstufe
Args: params: country_codes, focus
Returns: VollstΓ€ndiger Benchmarkreport mit Tabellen fΓΌr alle relevanten Indikatoren
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive. The description adds behavioral context: it automatically selects appropriate indicators based on focus and generates a structured report. This goes beyond annotations but does not detail other potential side effects.
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 and well-structured, using bullet points for focus options. It front-loads the core purpose and then details parameters and output efficiently. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations, the description covers purpose, parameters, and output format. It lacks discussion of error handling or prerequisites but is adequate for a non-destructive benchmarking 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?
Despite schema description coverage reported as 0%, the description compensates by explaining the focus parameter with detailed options and linking to the required country_codes parameter. It adds meaning beyond the raw schema by providing context for each focus area.
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 benchmarks multiple countries on a specific education topic using UNESCO UIS. It lists five distinct focus areas and contrasts with siblings by emphasizing automated indicator selection for structured comparison.
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 for benchmarking on specific topics but does not explicitly state when to use this tool versus alternatives like uis_compare_countries. No 'when-not-to-use' guidance or references to sibling tools are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_get_education_indicatorBRead-onlyIdempotent
Ruft Bildungsdaten aus dem OECD Education at a Glance Report ab.
Greift auf die OECD SDMX REST API zu. Liefert strukturierte Daten fΓΌr OECD-LΓ€nder zu Bildungsausgaben, Einschreibungsraten, LehrergehΓ€ltern etc.
Beispiele:
Bildungsausgaben Schweiz/DE/AT: dataflow='EAG_FISC', countries=['CHE','DEU','AUT']
LehrergehΓ€lter OECD: dataflow='EAG_PERS_SALARY'
BeschΓ€ftigung nach Bildungsabschluss: dataflow='EAG_EMP_EDUC'
Args: params: dataflow_id, countries (optional), start_period, end_period
Returns: Markdown-formatierte Datentabelle oder Rohdaten-Zusammenfassung
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is clearly non-destructive. The description adds context about accessing the OECD API and returning structured data, but does not go beyond what annotations imply. No contradictions are present.
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 reasonably concise and well-structured, with a clear introduction, helpful examples, and a brief listing of arguments. It front-loads the main purpose and uses bullet points for examples. It could be slightly shorter without losing key information.
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 complexity and the existence of an output schema (though not provided here), the description adequately covers the return format as markdown table or summary. It also mentions available dataflow IDs. However, it omits potential error conditions or dataset size warnings.
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 provides detailed descriptions for each parameter, so the description adds limited value by simply listing parameter names. The description mentions 'dataflow_id' and 'countries' but does not elaborate on their meaning beyond what the schema already provides. With high schema coverage, a baseline of 3 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 that the tool retrieves education data from OECD Education at a Glance report via SDMX REST API. It provides specific examples of dataflows and countries, making the purpose evident. However, it does not explicitly differentiate from sibling tools like uis_get_education_data, which serve similar but distinct data sources.
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 offers examples of usage but lacks explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites, exclusions, or scenarios where sibling tools might be more appropriate. This omission reduces clarity for an AI agent deciding which tool to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_list_education_datasetsARead-onlyIdempotent
Listet verfΓΌgbare OECD Education at a Glance DatensΓ€tze auf.
Education at a Glance ist das jΓ€hrliche Referenzwerk der OECD fΓΌr internationale Bildungsvergleiche. Es umfasst 38 OECD-LΓ€nder plus Partner.
Abgedeckte Themenbereiche:
Bildungsbeteiligung und -abschlΓΌsse (EAG_ENRL, EAG_GRAD_ENTR)
Bildungsausgaben und Finanzierung (EAG_FISC)
Lehrpersonal und Arbeitsbedingungen (EAG_PERS, EAG_PERS_SALARY)
Bildungsrendite und Arbeitsmarkt (EAG_EMP_EDUC, EAG_EARN_RATIO)
Returns: Markdown-Liste der DatensΓ€tze mit Beschreibungen und Dataflow-IDs
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey read-only, idempotent, and open-world nature. The description adds value by specifying the return format (Markdown list with descriptions and dataflow IDs) and the scope (OECD countries plus partners), which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with bullet points and clear sections. It front-loads the main purpose. Slightly verbose in the topic area listing but overall concise and easy to parse.
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 no parameters, an output schema exists, and rich annotations, the description covers purpose and return value well. However, it lacks guidance on when to use relative to siblings, which slightly detracts from completeness.
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 tool has zero parameters, and the schema coverage is 100% (trivially). The description does not need to add parameter semantics, and the baseline for 0 parameters is 4. It doesn't detract from this score.
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 it lists available OECD Education at a Glance datasets, specifying the resource and action. It enumerates topic areas with example dataflow IDs, effectively distinguishing it from sibling tools like oecd_get_education_indicator or uis_list_countries.
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 does not provide explicit guidance on when to use this tool versus alternatives. No context about prerequisites or exclusions, such as when a more specific tool like oecd_search_datasets might be appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oecd_search_datasetsARead-onlyIdempotent
Durchsucht alle OECD-DatensΓ€tze nach einem Stichwort.
Γber die OECD SDMX API sind hunderte DatensΓ€tze verfΓΌgbar. Diese Funktion findet DatensΓ€tze mit Bildungsbezug oder anderen Themen.
Args: params: keyword, limit
Returns: Markdown-Liste gefundener DatensΓ€tze mit Dataflow-IDs
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds value by noting the API source ('OECD SDMX API'), that it searches hundreds of datasets, and that the output is a Markdown list with Dataflow-IDs. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a lead sentence stating the purpose, followed by context, then an Args/Returns section. It is concise and contains no superfluous information, earning a high score.
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 moderate complexity (search with two parameters, output as list), the description covers purpose, data source, and output format. An output schema exists, so explaining return values is unnecessary. Missing details like error handling or empty results are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description barely adds value beyond the input schema: it only lists parameter names ('keyword, limit') without describing their purpose or constraints. The schema itself already contains good descriptions for each parameter, so the description's contribution is minimal, leading to a low score.
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 'Durchsucht alle OECD-DatensΓ€tze nach einem Stichwort', identifying the verb (search) and resource (all OECD datasets) with a specific action (by keyword). This distinguishes it from siblings like oecd_list_education_datasets, which likely lists all without searching.
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 about the SDMX API and that it finds datasets related to education or other topics, but it does not explicitly state when to use this tool versus alternatives. There is no mention of prerequisites or when not to use it, leaving differentiation to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_compare_countriesARead-onlyIdempotent
Vergleicht Bildungsindikatoren zwischen mehreren LΓ€ndern (UNESCO UIS).
Ideal fΓΌr den direkten internationalen Vergleich: Wie steht die Schweiz im Vergleich zu Finnland, Singapur und dem OECD-Durchschnitt?
Args: params: indicator_id, country_codes (Liste), year (optional)
Returns: Markdown-Vergleichstabelle sortiert nach Indikatorwert
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds that it returns a Markdown comparison table sorted by indicator value, which is useful beyond the annotations (readOnlyHint, idempotentHint). It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences plus args/return) and front-loaded with the main purpose. It could be more structured (e.g., bulleted info) but is efficient.
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 presence of an output schema (though not shown) and the complexity of the tool (comparison with country list), the description adequately covers input, output format, and use case. It lacks error handling details but is sufficient for selection.
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 description lists the parameters (indicator_id, country_codes, year) with minimal additional context (e.g., year optional, country codes as list). The schema already provides detailed descriptions for each field, so the description adds limited value.
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 educational indicators across countries using UNESCO UIS data, and provides an example (Switzerland vs Finland etc.). It is specific and actionable, but does not explicitly differentiate from sibling tools like education_benchmark_countries.
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 phrase 'Ideal fΓΌr den direkten internationalen Vergleich' suggests when to use, but there is no guidance on when not to use or mention of alternative tools (e.g., uis_get_education_data for single country queries).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_country_education_profileARead-onlyIdempotent
Erstellt ein umfassendes Bildungsprofil fΓΌr ein Land via UNESCO UIS.
Ruft automatisch die wichtigsten SchlΓΌsselindikatoren ab: Alphabetisierung, Einschulungsraten, Abschlussquoten, Bildungsausgaben, SchΓΌler-Lehrer-VerhΓ€ltnis, GeschlechterparitΓ€t.
Args: params: country_code (ISO Alpha-3), latest_year_only
Returns: VollstΓ€ndiges Markdown-Bildungsprofil mit allen Kernindikatoren
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. Description adds that it returns a Markdown profile with specific indicator types, but no additional behavioral details (e.g., no mention of side effects, auth, or rate limits).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise with short bullet list of indicators, clear Args and Returns sections. Efficient use of space, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description adequately covers the tool's purpose and return format (Markdown profile). No major gaps, though edge cases like missing data could be addressed.
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 descriptions already cover parameter details (country_code format, latest_year_only toggle). Description adds value by listing the types of indicators included (literacy, enrollment, etc.), which aids understanding beyond 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 it creates a comprehensive education profile for a country using UNESCO UIS, listing specific indicators. It distinguishes from sibling tools like uis_get_education_data (raw data) and uis_compare_countries (comparison).
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?
Implied usage for obtaining a full country profile, but no explicit guidance on when to use vs alternatives (e.g., uis_get_education_data for raw data). No when-not-to-use or prerequisite conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_get_education_dataARead-onlyIdempotent
Ruft Bildungsdaten von der UNESCO Institute for Statistics API ab.
Kernfunktion des Servers. Liefert international vergleichbare Daten zu einem spezifischen Indikator β fΓΌr ein Land oder alle LΓ€nder.
Typische AnwendungsfΓ€lle:
Alphabetisierungsrate der Schweiz: indicator='LR.AG15T99', country='CHE'
Bildungsausgaben OECD-LΓ€nder: indicator='XGDP.FSGOV', kein Land
Schulabschlussquoten Europa: indicator='CR.1' + Jahresfilter
Bildungsausgaben-Zeitreihe: indicator='XGDP.FSGOV', country='CHE'
Ein unbekannter LΓ€ndercode ist hier keine Fehlermeldung: Die Quelle
antwortet mit HTTP 200 und leerer Trefferliste, nennt den Grund aber in
hints. Dieser Hinweis wird mit ausgegeben β sonst sΓ€he ein Tippfehler
genauso aus wie ein Land ohne Daten.
Args: params: indicator_id (erforderlich), country_code, start_year, end_year
Returns: Markdown-formatierte Tabelle oder Zeitreihe mit Daten und Metadaten
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint false. The description adds a valuable operational caveat: unknown country codes yield HTTP 200 with an empty result list and explanatory hints, preventing typo/empty-data confusion. It does not cover rate limits or auth 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?
Well-structured and front-loaded: purpose first, then use cases, a behavioral caveat, and an Args/Returns summary. The four example bullets are slightly verbose, but each illustrates a distinct usage pattern, so they largely earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only data-fetch tool with an output schema and full annotations, the description covers purpose, usage examples, a key caveat, and output format. It omits explicit sibling routing and detailed year-range semantics, but is otherwise adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With reported schema description coverage at 0%, the description lists the parameters (indicator_id required, country_code, start_year, end_year) and examples clarify indicator IDs and country usage. But it adds little semantic detail beyond names and examples already present in the schema's own property descriptions.
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?
States a specific verb and resource: retrieves education data from the UNESCO UIS API, with scope of a specific indicator for one or all countries. It calls itself the server's core function and gives concrete indicator examples, but does not explicitly distinguish itself from siblings like uis_compare_countries or uis_country_education_profile.
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?
Provides four typical use-case examples with concrete indicator/country combinations, which implies when to use it. However, it never states when not to use it or names alternative sibling tools, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_list_countriesARead-onlyIdempotent
Listet verfΓΌgbare LΓ€nder und Regionen in der UNESCO UIS-Datenbank auf.
Gibt ISO 3166-1 Alpha-3 Codes zurΓΌck, die fΓΌr Datenabfragen benΓΆtigt werden. Beispiele: CHE (Schweiz), DEU (Deutschland), AUT (Γsterreich), FRA (Frankreich).
Neben EinzellΓ€ndern (NATIONAL) sind regionale Aggregate (REGIONAL)
verfΓΌgbar: Weltregionen, Einkommensgruppen, SDG-Regionen.
Args: params: search (optional Textfilter), entity_type (optional)
Returns: Markdown-Liste mit ISO-Codes und LΓ€ndernamen
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, open-world, non-destructive operation. The description adds useful behavioral context: it explains that the output is a Markdown list of ISO codes and country names, and it distinguishes between NATIONAL and REGIONAL entities, including examples of regional aggregates. It does not cover auth requirements or rate limits, but the annotations carry the safety profile.
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 purpose and return value, then adds practical examples and entity-type context. The Args and Returns sections are compact, though the Args line slightly conflates nesting and direct arguments. Overall it is efficient with little wasted text.
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?
An output schema exists, so the description need not document return values, yet it helpfully summarizes the Markdown list format. Annotations cover the safety profile, and the description covers entity types, filtering, and the purpose of the returned codes. A minor gap is the lack of explicit nesting guidance for the params object.
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 itself provides detailed descriptions for the nested search and entity_type properties, including allowed entity_type values and caveats about unsupported values. The tool description adds marginal value by naming both optional filters and giving examples of regional aggregate types, but it misleadingly presents search and entity_type as direct arguments rather than as fields nested inside the required params object. Given the schema already does the heavy lifting, this is adequate but imperfect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it lists available countries and regions in the UNESCO UIS database. It also clarifies that the tool returns ISO 3166-1 alpha-3 codes needed for data queries, which distinguishes it from indicator-listing or data-retrieval siblings. However, it does not explicitly name or contrast itself with any sibling tool, so it falls short of the highest clarity tier.
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 by saying the returned ISO codes are needed for data queries, and it mentions optional filtering via search and entity_type. It does not state when to use this tool versus alternatives such as uis_list_indicators or uis_compare_countries, nor does it provide any when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_list_indicatorsARead-onlyIdempotent
Listet verfΓΌgbare Indikatoren der UNESCO Institute for Statistics auf.
Die UIS bietet ΓΌber 4'000 Indikatoren zu Bildung, Wissenschaft, Kultur und Kommunikation. Diese Funktion dient zur Exploration und Indikatorsuche.
Wichtige Indikator-Kategorien (am 2026-08-08 gegen die Quelle gehalten;
NERA.*, XUNIT.* und PTR.* standen hier, existieren dort aber nicht):
Alphabetisierung (LR.*): Lese-/Schreibkompetenz nach Alter, Geschlecht
Einschulungsraten (NERT., OFST.): Netto-Einschulung, Kinder ausserhalb der Schule
SchulabschlΓΌsse (CR.*): Abschlussquoten Primar- bis Sekundarstufe
Bildungsausgaben (XGDP.*): % BIP
Lehrpersonen (TRTP., FTP.): Mindestqualifikation, Frauenanteil
Args: params: theme (optional), search (optional), limit
Returns: Markdown-Liste mit Indikator-IDs und Beschreibungen
| Name | Required | Description | Default |
|---|---|---|---|
| params | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, openWorldHint and destructiveHint, so safety is handled. The description adds real value beyond that: the scale of the catalog, the concrete indicator-prefix categories, and notably a warning that NERA.*, XUNIT.* and PTR.* prefixes do not exist at the source, which prevents wasted queries. It does not cover pagination or rate limits.
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?
Purpose is front-loaded in the first line, followed by scope, then the category reference block. The category list is long but earns its place as search fodder; the parenthetical about which prefixes were removed from the list is slightly noisy bookkeeping an agent does not strictly need.
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?
Safety traits come from annotations and the return shape is covered by an output schema plus a one-line mention of a Markdown indicator list, so the description need not explain returns. For a single-parameter, read-only catalog tool this is essentially complete, with only filter behaviour (how theme and search combine) left unspecified.
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?
Reported schema description coverage is 0% at the top level (the single 'params' object carries no description), so the description partially compensates by enumerating theme, search and limit and marking the first two optional. It adds no syntax, format or value guidance beyond what the nested property descriptions already state, so it is minimum-viable rather than enriching.
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 opening sentence gives a specific verb and resource (list available UIS indicators) and the follow-up quantifies scope (over 4,000 indicators across education, science, culture, communication). An agent can distinguish this exploration/catalog tool from siblings like uis_get_education_data or uis_compare_countries without opening the schema.
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?
'Diese Funktion dient zur Exploration und Indikatorsuche' implies the when-to-use case (discovering indicator IDs before fetching data), which is a reasonable implicit signal. However, it never names an alternative tool or states when not to use it, so the routing decision against uis_get_education_data is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_list_versionsARead-onlyIdempotent
Listet verfΓΌgbare Versionen der UNESCO UIS-Datenbank auf.
Die UIS verΓΆffentlicht mehrmals jΓ€hrlich neue Datenversionen. NΓΌtzlich um sicherzustellen, dass mit den neuesten Daten gearbeitet wird.
Returns: Markdown-Liste mit Versionsbezeichnungen und Publikationsdaten
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by explaining that UIS publishes multiple new versions per year and that the tool returns a Markdown list with version names and publication dates, which is beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with only three sentences, front-loaded with the core action. Every sentence adds value: stating function, providing context about publication frequency, and specifying the return format. No unnecessary text.
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 a simple listing task, the description is complete. It explains the purpose, the context of version releases, and the return format (Markdown list). Annotations cover safety and idempotency, and an output schema exists. 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?
No parameters exist, so schema coverage is 100% and baseline is 4. The description does not add parameter information because none are needed. This 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 the tool lists available versions of the UNESCO UIS database, distinguishing it from sibling tools like uis_list_countries and uis_list_indicators. The verb 'listet' and specific resource 'Versionen der UNESCO UIS-Datenbank' provide clear purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions it is useful to ensure working with the latest data, implying usage context, but does not provide explicit when-to-use or when-not-to-use guidance or compare with alternatives. No exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.4.0- Changed
uis_list_countries1 field changed- changed
Input schema / $defs / UISGeoUnitsInput / properties / entity_type / descriptionPrevious value: -"Typ der Einheit: 'COUNTRY', 'REGION', 'SDG_REGION' etc."New value: +"Typ der Einheit: 'NATIONAL' (241 LΓ€nder) oder 'REGIONAL' (221 Aggregate). Das sind die beiden Werte, die die Quelle am 2026-08-08 fΓΌhrte; 'COUNTRY'/'REGION'/'SDG_REGION' standen hier, gibt es dort aber nicht."
10 tool updates
v0.3.0- First observed
education_benchmark_countries - First observed
oecd_get_education_indicator - First observed
oecd_list_education_datasets - First observed
oecd_search_datasets - First observed
uis_compare_countries - First observed
uis_country_education_profile - First observed
uis_get_education_data - First observed
uis_list_countries - First observed
uis_list_indicators - First observed
uis_list_versions
TDQS
Scored across 10 tools
The four data-retrieval tools (uis_get_education_data, uis_compare_countries, education_benchmark_countries, uis_country_education_profile) have distinguishable scopes (raw single-indicator vs multi-country vs multi-indicator benchmark vs single-country profile), but compare_countries and benchmark_countries could still be confused by an agent. The OECD vs UIS source split is clear.
Most tools follow a source_action pattern (uis_list_indicators, oecd_get_education_indicator, uis_compare_countries), which is largely predictable. However education_benchmark_countries breaks the prefix convention and the action phrasing varies (get vs compare vs profile), creating minor inconsistency.
Ten tools is well-scoped for a dual-source (UIS + OECD) education data server, covering discovery, retrieval, comparison, and profiling without redundancy. Each tool earns its place.
The surface covers indicator/dataset discovery, country listing, raw data retrieval, comparison, benchmarking, and country profiles across both UIS and OECD. Minor gaps exist (no indicator metadata lookup, no version selection passed to queries), but core workflows are complete.
Maintenance
Related MCP Connectors
UNESCO UIS statistics (education, science, culture) with full provenance and fixed releases.
Official statistics for AI agents: Eurostat, World Bank, OECD, IMF and WHO data for 150+ countries.
211Give your agent web search and authoritative datasets: S&P Global, FRED, OECD, SimilarWeb & more.
Search and query 1,500+ OECD statistical datasets via SDMX. Keyless.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides access to the World Health Organization's Global Health Observatory data, enabling AI assistants to search, retrieve, and analyze comprehensive health indicators, country statistics, disease burden data, and regional health trends through WHO's OData API.1MIT
- AlicenseNot gradedqualityCmaintenanceEnables easy access to open data from the Swedish National Agency for Education, allowing querying and integration of educational statistics and facts through large language models.1MIT
- AlicenseAqualityCmaintenanceA Model Context Protocol server that connects AI assistants to UNESCO Institute for Statistics data, enabling natural language search, retrieval, and comparison of indicators across countries.133MIT
- AlicenseAqualityDmaintenanceProvides AI assistants access to over 5,000 OECD economic and statistical datasets via the SDMX API for search, analysis, and comparison across 38 countries.953 npm8MIT