Skip to main content
Glama

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

uis_search_indicators

busca ~5.060 indicadores (4 temas) com disponibilidade de dados; traduz a palavra do usuário para a da UNESCO e diz que traduziu (vocabulary_notes); paginação por offset

catálogo em D1 (100% local)

uis_list_geo_units

462 códigos de país/região (NATIONAL/REGIONAL); paginação por offset

D1 (100% local)

uis_get_data

registros por indicador/geo unit/anos, footnotes opcionais

1 chamada à Data API por consulta (release fixada)

search

contrato ChatGPT Deep Research: ranqueia a consulta contra o catálogo inteiro, devolve { id, title, url } (ind:<code>)

índice em memória construído do catálogo D1 (24 h)

fetch

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 url

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

enrollment

0

enrolment

387

education spending, budget

0

expenditure

57

teacher wages

0

salary

4

university, college

0

tertiary

448

preschool, kindergarten

0

pre-primary, early childhood

113

elementary

0

primary

886

scientists

0

researchers

11

girls, women

0

female

1.252

kids, teenagers

0

children, adolescents

161, 131

graduation rate

0

completion

342

pupil-teacher ratio

0

pupil-qualified teacher ratio

10

foreign students

249

internationally mobile students

979

primary school completion

0

primary education

114

illiteracy, maths, tvet, phd, stem

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/mcp

search 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 o retrieved_at real 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 que fetch (Deep Research) cita cai para a home do Data Browser e o índice de search nã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/default com cache KV TTL 24 h) — pinagem reprodutível + aproveitamento do cache CloudFront do upstream (keyed pela URL completa). A release é o data_vintage (ex.: 20260507-91260335 (published 2026-05-08)).

  • Catálogo em D1 (uis_indicators/uis_geounits/uis_meta), seed via scripts/seed-uis-catalog.mjs com retrieved_at REAL 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 é sempre false — 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_at 2026-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 tools
fetchDeep Research DocumentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesIdentifier of a document returned by `search`

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesUnique identifier of the document on this server; what `fetch` takes
urlYesCanonical public URL of the document — ChatGPT's citation depends on it
textYesFull readable content of the document (Markdown)
titleYesHuman-readable title of the document
metadataNoAdditional key/value pairs about the document (kind, source, period…)
provenanceYes
attributionYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

uis_get_dataGet UNESCO UIS dataA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_yearNoLast year, e.g. 2024
geo_unitsNoGeo unit codes from uis_list_geo_units (e.g. ["BRA","ARG"]); omit for all
indicatorsYesIndicator codes from uis_search_indicators (e.g. ["CR.1"])
start_yearNoFirst year, e.g. 2015
provenance_modeNoProvenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)
include_footnotesNoInclude per-record footnotes (source notes); default false

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
columnsYes
provenanceYes
rows_countYes
attributionYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 unitsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly countries (NATIONAL) or only regional aggregates
limitNoMaximum results (default 100)
offsetNoResults to skip, for pagination (default 0)
searchNoCase-insensitive filter on name, or exact code (e.g. "BRA")
provenance_modeNoProvenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)

Output Schema

ParametersJSON Schema
NameRequiredDescription
offsetYes
showingYes
has_moreYes
geo_unitsYes
provenanceYes
attributionYes
next_offsetNo
total_matchesYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 indicatorsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results (default 20)
queryYesKeywords, matched against indicator name and code, AND between terms (e.g. "literacy rate youth")
themeNoRestrict to one UIS theme
offsetNoResults to skip, for pagination (default 0)
provenance_modeNoProvenance verbosity: 'concise' (default — source, url, vintage, retrieval date, citation, license) or 'detailed' (full canonical block with dataset, dimension key and notices)

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNo
offsetYes
showingYes
has_moreYes
indicatorsYes
provenanceYes
attributionYes
next_offsetNo
total_matchesYes
vocabulary_notesNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 5 tool updatesv0.4.0
    • First observedfetch
    • First observedsearch
    • First observeduis_get_data
    • First observeduis_list_geo_units
    • First observeduis_search_indicators

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    C
    maintenance
    MCP 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.
    5
    14
    -
  • A
    license
    A
    quality
    C
    maintenance
    MCP 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.
    9
    5
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A 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.
    13
    3
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An 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
    -