uis-mcp-server
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., "@uis-mcp-serverGet the gross enrollment ratio for primary education in France for 2019."
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.
uis-mcp-server — servidor MCP provenance-first do UNESCO UIS
Servidor MCP (Streamable HTTP) para o UNESCO
UIS (Instituto de Estatística da UNESCO — educação, ciência/P&D, cultura e
comunicação), hospedado em Cloudflare Workers. Fase 2 do projeto ilostat
(C:\dev\mcp\ilostat\roadmap.md; medições da Data API em ilostat/docs/06).
O ILOSTAT vive no servidor irmão ilo-mcp-server (decisão do decisor,
07/08/2026: um servidor por fonte — segregação estrutural CC BY / CC BY-SA e
convenção de naming do mcp-builder; tools com prefixo de serviço uis_).
Produção: https://uis.sidneybissoli.com (endpoint MCP em /mcp; padrão de
URLs do portfólio). O hostname uis-mcp-server.sidneybissoli.workers.dev permanece
servido como secundário. O mesmo servidor também roda localmente por stdio
(pacote uis-mcp-server no npm —
ver Rodar localmente).
Tools
Tool | O quê | Fonte |
| busca ~5.060 indicadores (4 temas) com disponibilidade de dados; traduz a palavra do usuário para a da UNESCO e diz que traduziu ( | catálogo em D1 (100% local) |
| 462 códigos de país/região (NATIONAL/REGIONAL); paginação por | D1 (100% local) |
| registros por indicador/geo unit/anos, footnotes opcionais | 1 chamada à Data API por consulta (release fixada) |
| contrato ChatGPT Deep Research: ranqueia a consulta contra o catálogo inteiro, devolve | índice em memória construído do catálogo D1 (24 h) |
| contrato ChatGPT Deep Research: um indicador em Markdown legível (entrada do catálogo + amostra de dados) com a página pública do Data Browser como | catálogo D1 + 1 chamada à Data API (amostra) |
Toda resposta carrega o bloco de proveniência v1.0 (@sbissoli/mcp-provenance,
modos concise/detailed via parâmetro provenance_mode) nos três canais do
contrato: structuredContent, _meta namespaced (com.sidneybissoli.uis/*) e
rodapé de texto. Em search/fetch o canal de texto é o JSON do contrato
Deep Research (sem rodapé); a proveniência viaja em structuredContent e _meta.
Pergunte com as suas palavras, não com as da UNESCO
A UIS escreve em inglês britânico e estatístico, e o catálogo é casado por
substring contra o NOME do indicador — então a palavra de todo dia, ou a grafia
americana, devolvia zero, calado. Medido nos 5.063 indicadores do catálogo
oficial em 16/09/2026 e consertado na 0.3.0: a busca expande o termo para as
grafias da fonte (OR dentro do termo, AND entre termos — só aumenta o recall) e
diz que traduziu, em vocabulary_notes; zero resultado vem com hint do
que fazer em seguida. A mesma tabela alimenta o índice de search (Deep
Research), que recebe a palavra perguntada como keyword do indicador cujo nome
traz a palavra da fonte.
você pergunta | achava | a UNESCO escreve | acha |
| 0 | enrolment | 387 |
| 0 | expenditure | 57 |
| 0 | salary | 4 |
| 0 | tertiary | 448 |
| 0 | pre-primary, early childhood | 113 |
| 0 | primary | 886 |
| 0 | researchers | 11 |
| 0 | female | 1.252 |
| 0 | children, adolescents | 161, 131 |
| 0 | completion | 342 |
| 0 | pupil-qualified teacher ratio | 10 |
| 249 | internationally mobile students | 979 |
| 0 | primary education | 114 |
| 0 | illiterate, mathematics, vocational, doctoral, science, technology, engineering | 268, 79, 33, 24, 9 |
Só entra par medido (palavra perguntada ausente do catálogo, palavra da
fonte presente) — a tabela está em src/uis/vocabulary.ts, com as contagens.
Termo que a UIS não publica fica de fora e segue devolvendo zero, porque apelido
para dado inexistente promete o que a fonte não tem: dropout, tuition,
unemployment e labor (estatística de trabalho é do servidor irmão
ilo-mcp-server; o que labor casa hoje são 62 nomes com "collaboration").
ChatGPT (Deep Research)
O deep research do ChatGPT (e o company knowledge, e os fluxos de pesquisa da
Responses API) só usa servidor MCP que exponha exatamente search e fetch —
este servidor expõe, por cima das tools uis_*. Aponte o conector para o
endpoint hospedado, sem chave:
https://uis.sidneybissoli.com/mcpsearch ranqueia a consulta contra o catálogo inteiro da UIS (~5.060 indicadores
— educação, ciência/P&D, cultura, contexto demográfico) e devolve
{ id, title, url } (ind:<code>, ex.: ind:ROFST.1.CP); fetch devolve o
indicador em Markdown legível — nome, tema, grupo e framework do Data Browser,
anos disponíveis, uma amostra dos dados (Brasil e o agregado mundial dos ODS,
últimos cinco anos; 1 chamada à Data API com release fixada) e como consultar com
uis_get_data — com a página pública do UIS Data Browser como url
(https://databrowser.uis.unesco.org/view#indicatorPaths=<framework>%3A0%3A<code>),
que é o que o ChatGPT cita. O framework vem das definições do Data Browser,
gravadas no catálogo pelo seed (framework_id, group_id, group_name). No modo
desenvolvedor do ChatGPT (Settings → Security and login → Developer mode) qualquer
tool é chamável — as uis_* continuam sendo as certas para dados.
Related MCP server: unicefstats-mcp
Rodar localmente (stdio)
Prefere não passar suas consultas por um host de terceiros? O mesmo servidor
(buildServer de src/server.ts) também roda como processo stdio local
(src/cli.ts), falando direto com a UIS Data API oficial — mesmas 5 tools e 3
resources, mesmos limites, mesmo bloco de proveniência, sem Cloudflare no
caminho. A superfície dos dois canais é idêntica por construção (o dump do CI
confere: node scripts/dump-surface.mjs --stdio).
Sem instalação — o pacote está no npm
(uis-mcp-server, Node ≥ 22):
{
"mcpServers": {
"unesco-uis": {
"command": "npx",
"args": ["-y", "uis-mcp-server"]
}
}
}Ou a partir do código-fonte:
git clone https://github.com/SidneyBissoli/uis-mcp-server
cd uis-mcp-server
npm install
npm run build
node dist/cli.js # serve MCP via stdio (Ctrl+C para parar)Diferenças em relação ao servidor hospedado, todas por ausência dos bindings da
Cloudflare (src/uis/catalog-memory.ts):
a release corrente (
/versions/default) fica na memória do processo (KV → Map com TTL): resolvida uma vez por sessão, não entre sessões;o catálogo de indicadores e os geo units são baixados dos endpoints oficiais na primeira busca (
/definitions/indicators,/definitions/geounits— os mesmos que o seed do D1 lê; ~1 s), e oretrieved_atreal desse download é o que a proveniência reporta;o catálogo em memória não baixa as definições do UIS Data Browser (~6,7 MB):
framework_id/group_*ficam nulos, então a URL quefetch(Deep Research) cita cai para a home do Data Browser e o índice desearchnão tem o nome do grupo nas keywords. Deep Research conversa com o servidor hospedado, onde o seed do D1 tem tudo;sem métricas de uso, rate limit ou autenticação (não há rede de entrada).
Logs vão para stderr — stdout carrega só o JSON-RPC. O Dockerfile do
repositório constrói este runtime (para o registro Glama).
Decisões vinculantes (mini-spike docs/06 + decisor, 07/08/2026)
Release fixada em toda consulta de dados (
version=explícita, resolvida de/versions/defaultcom cache KV TTL 24 h) — pinagem reprodutível + aproveitamento do cache CloudFront do upstream (keyed pela URL completa). A release é odata_vintage(ex.:20260507-91260335 (published 2026-05-08)).Catálogo em D1 (
uis_indicators/uis_geounits/uis_meta), seed viascripts/seed-uis-catalog.mjscomretrieved_atREAL da extração — é o que a proveniência do catálogo reporta (served_from_cache: true). A UIS aceita fetch do Node (sem a patologia do gateway da OIT).Teto de 100k registros é do upstream (HTTP 400 pedagógico com contagem exata — repassado ao cliente). Teto próprio de 5.000 registros por resposta (proteção do contexto MCP): acima disso, erro pedagógico com a contagem real — nunca truncar silenciosamente (dado parcial apresentado como completo viola o contrato anti-alucinação). Máx. 25 indicadores/chamada. Reavaliar com uso real.
Notices = tipos de footnote + magnitude + qualifier com contagem; o texto integral de cada footnote fica na linha (
include_footnotes: true).Idioma do servidor: inglês; fuso: UTC (persona internacional; dados da UIS são publicados em inglês).
derivedé semprefalse— o servidor não transforma nada.
Obrigações de licença (docs/02 do projeto ilostat)
UIS: CC BY-SA 4.0 (Terms do Data Browser, que governam a Data API;
verified_at2026-08-04; confirmação manual do decisor 07/08/2026).Atribuição obrigatória em toda resposta (campo
citation), com URL completa + data de extração:Source: UNESCO Institute for Statistics (UIS), <URL>, date of extraction <data>.Não implicar endosso/afiliação da UNESCO (landing declara "not endorsed"); por isso o servidor chama
uis-mcp-server, não "unesco-mcp-server".Segregação CC BY / CC BY-SA em relação ao ILOSTAT: estrutural — servidores distintos; os dois regimes nunca coabitam uma resposta nem um servidor.
Desenvolvimento
npm install
npm run typecheck && npm test # testes offline (tools, framework, vocabulário, catálogo em memória, evals-fixtures)
npm run dev # http://localhost:8787/mcp
npm run build # runtime stdio → dist/cli.js (o que vai para o npm)
node scripts/dump-surface.mjs --stdio # fumaça offline do build: initialize → tools/resources/prompts
# Seed do catálogo (D1) — necessário antes do primeiro uso:
node scripts/seed-uis-catalog.mjs
npx wrangler d1 execute uis-catalog --local --file=scripts/seed-uis-catalog.sql
npx wrangler d1 execute uis-catalog --remote --file=scripts/seed-uis-catalog.sql
npm run deploy
node scripts/smoke-mcp.mjs # smoke do MCP em produção (initialize → tools/list == /status → uis_* → search/fetch → erros)Refresh do seed (D1) — decisão da Sessão 07 (07/08/2026)
Estratégia: seed manual a cada data release da UIS; sem cron do Worker. As
consultas de uis_get_data seguem a release default re-resolvida com KV TTL 24 h
(quando a UIS publica release nova, os dados migram sozinhos em ≤24 h); o que fica
defasado é o catálogo em D1 (disponibilidade, contagens, anos por indicador),
seedado da release corrente (20260507-91260335). A proveniência do catálogo expõe
o retrieved_at REAL do seed — staleness explícita, não silenciosa.
Gatilho de re-seed: release default ≠ release do seed (a UIS publica ~2–3 releases/ano; o smoke em produção imprime a release corrente da Data API — divergência = re-seedar). Procedimento: os 3 comandos de seed em "Desenvolvimento".
Cron rejeitado por ora: 2–3 eventos/ano não justificam código/estado extra; reavaliar na Fase 3 (pós-submissão), com tráfego real — mesma janela da reavaliação dos tetos operacionais.
Evals
@sbissoli/mcp-evals: 22 fixtures próprias em evals/fixtures/queries.ts, validadas
offline em npm test. A rodada com modelo real (npm run eval) custa API — só
com decisão explícita (ANTHROPIC_API_KEY; sem a chave, sai 0 com instruções).
Rodada de 07/08/2026 (Sessão 07): top-1 100% (20/20) — evals/results/.
End-to-end (formato mcp-builder): 10 perguntas complexas com resposta única
verificável em evals/e2e/evaluation.xml, respostas validadas manualmente contra a
produção (evals/e2e/validacao-respostas.md). Rodada de 07/08/2026 (Sonnet):
10/10 (100%) — evals/results/2026-08-07-e2e.md. Harness:
fase0-insumos/mcp-builder-evaluation/evaluation.py -t http -u https://uis.sidneybissoli.com/mcp
(exige as correções de compatibilidade descritas no registro de resultados).
Rotas
/ landing · /health liveness · /status versão+deploy · /metrics uso agregado ·
/mcp MCP Streamable HTTP. Auth Bearer opcional (wrangler secret put API_KEY);
rate limit token-bucket por IP.
Privacidade
Política de privacidade do serviço hospedado: PRIVACY.md.
Available Tools
5 toolsfetchDeep Research DocumentARead-onlyIdempotentInspect
Returns the full document for an id obtained from search, as { id, title, text, url, metadata }: text is the readable content (Markdown) and url the canonical public page to cite.
Companion of search in the OpenAI Deep Research contract, over the UNESCO UIS statistics (≈5,000 indicators: education — enrolment, completion, literacy, teachers, spending, SDG 4 —, science/R&D (SDG 9.5), culture (SDG 11.4) and demographic context) catalog. Only ids returned by search are valid; an unknown id returns an error.
The uis_* tools remain the tools for data queries.
Behavior: read-only and idempotent — a live GET against the public source when the document needs it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Identifier of a document returned by `search` |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique identifier of the document on this server; what `fetch` takes |
| url | Yes | Canonical public URL of the document — ChatGPT's citation depends on it |
| text | Yes | Full readable content of the document (Markdown) |
| title | Yes | Human-readable title of the document |
| metadata | No | Additional key/value pairs about the document (kind, source, period…) |
| provenance | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint; the description adds beyond that by explaining the live GET behavior against the public source and the error condition for unknown ids. This gives the agent practical expectations without contradicting 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 front-loaded with the primary action and return contract, followed by domain context, error behavior, and routing guidance. Each sentence provides distinct value, though the catalog context sentence adds length and density.
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 one-parameter fetch tool with an output schema, the description covers the return shape, id provenance, error behavior, behavioral traits, and sibling distinctions. Nothing needed for the agent to invoke it correctly is missing.
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 100% with the id description, so the baseline is 3. The description adds meaningful extra context by stating that only ids from `search` are valid and that an unknown id errors, reinforcing validation rules beyond the schema's simple field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns the full document for an id obtained from `search`', and details the exact return shape ({ id, title, text, url, metadata }). It also distinguishes itself from the `uis_*` data query tools, so an agent can immediately tell this is the document-retrieval companion to `search`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states that only ids returned by `search` are valid and that unknown ids return an error, giving clear input constraints. It also directs data queries to the `uis_*` tools, providing an unambiguous 'when not to use this tool and what to use instead' rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchDeep Research SearchARead-onlyIdempotentInspect
Searches the UNESCO UIS statistics (≈5,000 indicators: education — enrolment, completion, literacy, teachers, spending, SDG 4 —, science/R&D (SDG 9.5), culture (SDG 11.4) and demographic context) catalog and returns up to 10 matching documents as { id, title, url }, ordered by relevance (an empty list means nothing matched).
This tool exists for the OpenAI Deep Research contract: ChatGPT deep research, company knowledge and research workflows over the Responses API require exactly the tools search and fetch. Pass one of the returned ids to fetch to read the document.
For direct questions and for data (values, series, rankings) prefer the uis_* tools, which return the actual data with provenance — this is a catalog index, not a data query.
Query: natural language or keywords, Portuguese or English; accents and case are ignored.
Behavior: read-only and idempotent — the catalog comes from the public source and is cached in memory.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search terms, natural language or keywords (accents and case are ignored) |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Matching documents, in relevance order |
| provenance | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although read-only and idempotent are already in annotations, the description adds valuable behavioral detail: up to 10 results, relevance ordering, empty list meaning no match, and the fact that the catalog comes from a public source and is cached in memory. This goes well 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 front-loaded with the core behavior and return format, then efficiently covers contract context, alternatives, query expectations, and behavior in separate short sections. Each sentence adds practical 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?
For a single-parameter catalog search tool, the description is complete: it defines the result contract, ordering, empty-result behavior, language support, and how to continue the workflow via `fetch`. Nothing invocation-critical is missing.
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 already fully documents the `query` parameter, so the baseline is 3. The description adds meaningful extra context by specifying supported languages ('Portuguese or English') and reiterating that natural language or keywords are acceptable.
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 a specific verb ('Searches'), a specific resource ('UNESCO UIS statistics catalog'), and the exact result shape ('{ id, title, url }'). It also differentiates itself from the uis_* tools by calling itself 'a catalog index, not a data query.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool versus alternatives: pass returned ids to `fetch`, and prefer `uis_*` tools for direct data questions. This is highly actionable and leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_get_dataGet UNESCO UIS dataARead-onlyIdempotentInspect
Statistical records from the UNESCO Institute for Statistics Data API, filtered by indicator codes (from uis_search_indicators, up to 25), geo unit codes (from uis_list_geo_units) and year range. Set include_footnotes for per-record source notes. Returns raw UIS records only — it does not aggregate, convert or otherwise transform values; ILO labour statistics live in the sibling ILOSTAT MCP server. Broad queries are rejected with the record count — narrow by geo unit or years.
| Name | Required | Description | Default |
|---|---|---|---|
| end_year | No | Last year, e.g. 2024 | |
| geo_units | No | Geo unit codes from uis_list_geo_units (e.g. ["BRA","ARG"]); omit for all | |
| indicators | Yes | Indicator codes from uis_search_indicators (e.g. ["CR.1"]) | |
| start_year | No | First year, e.g. 2015 | |
| provenance_mode | No | Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices) | |
| include_footnotes | No | Include per-record footnotes (source notes); default false |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | |
| columns | Yes | |
| provenance | Yes | |
| rows_count | Yes | |
| attribution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: values are returned raw and untransformed, and oversized queries are rejected with the record count rather than truncated. It stops short of describing pagination or any result-size cap on accepted queries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the resource and filters before the constraints and caveats. Every clause carries information; the only cost is that the raw-records and ILOSTAT disclaimers are stacked into one long sentence, slightly diluting scannability.
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 return values need no explanation. Combined with annotations covering the safety profile and a 100%-documented schema, the description supplies the remaining essentials: where codes come from, the 25-indicator ceiling, raw/unaggregated output, and the rejection behavior for broad queries.
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 100%, so a baseline of 3 applies, and the description goes beyond it by tying 'indicators' to uis_search_indicators with a max of 25 and 'geo_units' to uis_list_geo_units, plus explaining what include_footnotes yields. It adds cross-tool provenance but no syntax detail for year bounds beyond what the schema already shows.
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 ('statistical records from the UNESCO Institute for Statistics Data API') and immediately scopes it by the three filter axes. It also distinguishes itself from siblings by naming uis_search_indicators and uis_list_geo_units as the code sources, and by ruling out the ILOSTAT MCP server's data.
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?
Gives explicit prerequisites (codes must come from uis_search_indicators / uis_list_geo_units) and operational guidance ('narrow by geo unit or years' when broad queries are rejected). It does not, however, contrast this tool with the generic 'fetch' and 'search' siblings, so routing between those remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_list_geo_unitsList UNESCO UIS geo unitsARead-onlyIdempotentInspect
Valid geographic codes for uis_get_data: 462 geo units — countries (NATIONAL, ISO alpha-3 codes like BRA) and regional aggregates (REGIONAL). Filter by name/code and type. Does not return statistical values; these codes apply only to uis_get_data, not to other statistical servers.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only countries (NATIONAL) or only regional aggregates | |
| limit | No | Maximum results (default 100) | |
| offset | No | Results to skip, for pagination (default 0) | |
| search | No | Case-insensitive filter on name, or exact code (e.g. "BRA") | |
| provenance_mode | No | Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices) |
Output Schema
| Name | Required | Description |
|---|---|---|
| offset | Yes | |
| showing | Yes | |
| has_more | Yes | |
| geo_units | Yes | |
| provenance | Yes | |
| attribution | Yes | |
| next_offset | No | |
| total_matches | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real behavioral context beyond the annotations: the size of the result set (462 units) and the important scope constraint that these codes apply only to uis_get_data, not other statistical servers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler, and the most important facts — what the codes are and where they apply — are front-loaded. Every clause carries information an agent needs.
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 return format needn't be explained, and the description still clarifies that no statistical values are returned. For a low-complexity lookup tool with full parameter documentation and annotations, nothing an agent needs to call it correctly is missing.
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 100%, so all five parameters (type, limit, offset, search, provenance_mode) are already documented, including the NATIONAL/REGIONAL enum and the search-by-name-or-code semantics. The description's 'Filter by name/code and type' merely restates what the schema provides, so the baseline of 3 applies.
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 names the specific resource (462 UNESCO UIS geographic codes) and its exact role: supplying valid codes for uis_get_data. It distinguishes its output from statistical data and explicitly scopes the codes to uis_get_data rather than other statistical servers, so the agent can separate it from siblings like uis_get_data and uis_search_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?
It clearly frames the use case — resolving valid geographic codes before calling uis_get_data — and states what the tool does not do (return statistical values). It stops short of an explicit 'call this first to resolve codes' instruction or direct comparison with siblings, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uis_search_indicatorsSearch UNESCO UIS indicatorsARead-onlyIdempotentInspect
Search the UNESCO Institute for Statistics catalogue of ~5,000 indicators — education, science/R&D, culture and communication — by keywords in the name or code, optionally filtered by theme. All terms must match (AND, case-insensitive), so start with 2–3 words and drop terms if you get 0 results. Everyday and US wording is resolved to the UIS's own (enrollment→enrolment, spending→expenditure, preschool→pre-primary, university→tertiary, graduation→completion, girls/boys→female/male); when that happens the response says so in vocabulary_notes. Returns indicator codes to use with uis_get_data, plus each indicator's data availability (years, record count). Searches the catalogue only — it does not return statistical values (use uis_get_data); ILO labour statistics live in the sibling ILOSTAT MCP server.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default 20) | |
| query | Yes | Keywords, matched against indicator name and code, AND between terms (e.g. "literacy rate youth") | |
| theme | No | Restrict to one UIS theme | |
| offset | No | Results to skip, for pagination (default 0) | |
| provenance_mode | No | Provenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices) |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| offset | Yes | |
| showing | Yes | |
| has_more | Yes | |
| indicators | Yes | |
| provenance | Yes | |
| attribution | Yes | |
| next_offset | No | |
| total_matches | Yes | |
| vocabulary_notes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description reveals AND semantics, case-insensitivity, vocabulary normalization to UIS terminology, the response's vocabulary_notes field, and the return of data-availability metadata. This substantially enriches the agent's expectations beyond what annotations alone convey.
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?
Four dense, front-loaded sentences with no filler. Every sentence contributes either scope, matching semantics, vocabulary behavior, return content, or routing to alternatives, and the purpose appears immediately in the first sentence.
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 search tool with a rich schema and output schema, the description covers what the tool searches, how matching behaves, how vocabulary is normalized, what the response contains, and how the tool relates to its key siblings. Nothing essential for correct invocation is missing.
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 already documents all 5 parameters fully, so the baseline is 3. The description adds meaningful semantics for query matching (AND, case-insensitive, vocabulary resolution) and mentions optional theme filtering, going beyond the schema's simple field 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: searching the UNESCO UIS catalogue of ~5,000 indicators by keyword in name or code with optional theme filtering. It links to uis_get_data as the downstream consumer of results, which clearly distinguishes it from siblings.
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 directs users to uis_get_data for statistical values and to the ILOSTAT server for ILO labour data, establishing when not to use this tool. It also gives practical search strategy guidance: start with 2–3 terms and drop terms if 0 results.
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.
5 tool updates
v0.4.0- First observed
fetch - First observed
search - First observed
uis_get_data - First observed
uis_list_geo_units - First observed
uis_search_indicators
TDQS
Scored across 5 tools
The three uis_* tools are clearly separated by role: indicator catalogue lookup, geo-unit lookup, and statistical data retrieval. However, search and uis_search_indicators both search the UIS catalogue; the descriptions differentiate document search from indicator-code search, but the overlap could still cause a misrouted query.
Three tools follow a clear uis_<verb>_<noun> convention, but search and fetch break that pattern with bare generic names. The naming is still readable and intentional, but the mix of prefixed and unprefixed tools is inconsistent.
Five tools is well-scoped for a statistics server: indicator discovery, geo-unit discovery, data retrieval, and document search/fetch each serve a distinct purpose. No tool feels redundant, and the set is neither too thin nor overly heavy.
The core UIS data workflow is fully covered: find indicator codes, find geo codes, and fetch statistical records with filtering and footnotes. The search/fetch pair also supports document-level retrieval and citation, so agents can complete data queries without dead ends.
Maintenance
Related MCP Connectors
UNESCO Institute for Statistics (UIS) MCP — keyless.
Hosted MCP server for finding authoritative primary data sources and official portals.
MCP server for Statistics Sweden (SCB) - 1200+ tables with population, economy, environment data
WHO GHO MCP — World Health Organization Global Health Observatory (free, no auth)
Related MCP Servers
- FlicenseAqualityCmaintenanceMCP server that exposes skills from the Brazilian National Common Curricular Base (BNCC) with thematic units, knowledge objects, and prioritization layer from Mapa de Foco, enabling lookup, search, listing, and statistics of educational skills.514-
- AlicenseAqualityCmaintenanceMCP server for UNICEF child development statistics. Query 790+ child-focused indicators across 200+ countries with disaggregations by sex, age, wealth quintile, and residence. No API key required.95MIT
- 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
- FlicenseAqualityDmaintenanceAn MCP server that provides official statistical data for development indicators in Asia-Pacific. It wraps the ESCAP Data Explorer API, letting any MCP-compatible host query SDG and thematic data through natural language.5-