Skip to main content
Glama
Satyampatel779

country-analytics-mcp

🌍 country-analytics-mcp

Ask an AI plain-language questions about world economics — answered live from three public APIs that disagree with each other.

Python MCP Azure Keys

"What was France's GDP in 2022 in US dollars?" · "Convert that to euros at the Dec 30 2022 rate." · "What's Europe's total GDP — and who did you exclude, and why?"

GDP, population, GDP per capita, regional totals in your currency, rankings — reconciled live (nothing hard-coded, no keys, no accounts) and fully traceable: every answer names its countries, years, FX rate, and exclusions.


⚡ Step 1 — Connect it to your AI (60 seconds, nothing to install)

The server is already running on Azure. Paste this URL into your AI client:

https://country-analytics-mcp.grayriver-35df865c.eastus.azurecontainerapps.io/mcp

🟠 Claude (claude.ai or Claude Desktop)

  1. Settings → Connectors → Add custom connector

  2. Name: country-analytics · URL: the one above · no authentication

  3. Add, then start a chat and ask away — Claude picks the tools itself.

🟢 ChatGPT

  1. Settings → Apps & Connectors → Advanced settings → enable Developer mode

  2. Back in ConnectorsCreate: name country-analytics, MCP server URL as above, Authentication: None → save

  3. In a new chat, enable the connector (via the composer's tools / Developer mode menu) and ask your question.

(Custom connectors require a paid plan on both platforms; exact menu names shift occasionally.)

🔍 No paid plan? MCP Inspector works too

npx @modelcontextprotocol/inspector

Transport Streamable HTTP → paste the URL → Connect → call the 8 tools from a form UI.

💤 The app scales to zero when idle — the first request after a quiet spell takes ~10 extra seconds to cold-start. Health check: /health

Related MCP server: world-bank-server

💬 Step 2 — Things worth asking

Ask this…

…and notice

How many countries does the source list for Europe?

53 — and 5 of them have no World Bank data (it says which)

France's GDP in 2022, in USD?

exact World Bank figure, year pinned

Now in euros, at the Dec 30 2022 rate

conversion pinned to the ECB rate, date echoed back

Europe's total GDP in euros?

the answer states its scope, FX date, and every excluded country

Same, but using the World Bank's definition of Europe

a different set (Central Asia in, Malta out — yes, really)

Top 5 European countries by GDP per capita

rankings with the year each value actually came from

What couldn't you reconcile for Europe?

the full flagged-issues ledger


💻 Run it locally (clean checkout → connected client)

No hosted dependency required — the same server runs on your machine with Python 3.10+:

git clone https://github.com/Satyampatel779/country-analytics-mcp.git
cd country-analytics-mcp
python -m venv .venv
.venv\Scripts\pip install .            # macOS/Linux: .venv/bin/pip install .

Transport

Command

stdio (Claude Desktop, Inspector)

.venv\Scripts\python -m country_analytics.server

HTTP at http://127.0.0.1:8000/mcp

set MCP_TRANSPORT=http then the same command (export on macOS/Linux)

Docker (identical to the hosted image)

docker build -t cam . && docker run -p 8000:8000 cam

Claude Desktop (stdio): merge client-configs/claude_desktop_config.json into your claude_desktop_config.json (Settings → Developer → Edit Config), fix the absolute path, restart:

{
  "mcpServers": {
    "country-analytics": {
      "command": "C:\\path\\to\\country-analytics-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-m", "country_analytics.server"]
    }
  }
}

MCP Inspector (stdio or HTTP): step-by-step in client-configs/mcp_inspector.md.

✅ Prove it works

.venv\Scripts\pip install ".[dev]"
.venv\Scripts\python -m pytest -q       # 11 live tests, both MCP transports

Expected values are cross-checked against independent direct fetches of the same live APIs — not constants.


🔧 What's under the hood

Three keyless public services, each speaking a different protocol, joined on ISO2 codes (never names — the sources spell them differently):

Source

Protocol

Provides

Countries GraphQL

GraphQL

Which countries are on a continent (ISO2, name, currency)

World Bank Indicators

REST, [metadata, data] arrays

GDP (NY.GDP.MKTP.CD, current US$) & population (SP.POP.TOTL) by year

Frankfurter

REST

ECB FX rates, latest or pinned to a date

The 8 tools

Tool

Answers

list_continents()

continent codes + country counts

list_countries(continent)

the full source list with join status per country

get_country_metric(country, metric, year, currency, fx_date)

one country, one number, fully traced

region_total(continent, metric, year, currency, scope, fx_date, missing_policy)

regional totals — every assumption a parameter

rank_countries(continent, metric, year, top_n, currency, scope, order)

top-N / bottom-N

convert_currency(amount, from, to, date)

pinned or latest FX conversion

list_reconciliation_issues(continent)

everything excluded, unmatched, or flagged — with reasons

describe_methodology()

join key, defaults, and which parameters change them

Judgment calls are parameters, not hard-coded

  • scope — geographic continent (default) vs. the World Bank region: for Europe the WB set adds Central Asia and drops Malta (the World Bank files it under MENA — flagged, of course).

  • year — pinned exactly, or latest walks back past null years per country and reports the year used.

  • missing_policy — exclude-and-list (default) or walk back to the most recent earlier value.

  • fx_date — defaults to the pinned year's last trading day (2022 → 2022-12-30); pin any date you like.

  • Refuses to guess — currencies outside Frankfurter's 30 (Serbian dinar, hryvnia…) return the supported list instead of an invented rate.

📄 More

  • WRITEUP.md — sources & join choices, every disagreement found, every assumption, production notes (≤1 page, written for a non-technical stakeholder).

  • samples/sample_run_output.md — a real timestamped run: the reconciled Europe table, computed metrics, and the flagged-issues list, kept as a reference in case a source is down during evaluation.

Available Tools

8 tools
convert_currencyA

Convert an amount between two Frankfurter-supported currencies at the latest rate or a pinned historical date ("YYYY-MM-DD"; non-trading days fall back to the prior trading day and the response says so). Unsupported currencies are refused with the supported list.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNolatest
amountYes
to_currencyYes
from_currencyYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does so well: it discloses the non-trading-day fallback-to-prior-day behavior and the fact that the response flags the substitution, and it states that unsupported currencies are refused with the supported list returned. That is real behavioral context beyond the schema. It omits rounding/precision behavior and rate-source caveats, which keeps it from a 5.

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?

A single dense sentence with the core action front-loaded and the parenthetical caveats tucked at the end where they belong. It is slightly long, but every clause (date format, fallback, refusal behavior) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-param, no-annotation, no-output-schema tool, the description covers the important edge cases (fallback days, unsupported currencies, response noting the substitution). It leaves the returned value shape and error payload structure unspecified, which is tolerable given the tool's simplicity but is still a gap.

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 coverage is 0% across 4 parameters, so the description must compensate. It does document the date format ('YYYY-MM-DD'), the 'latest' semantics, and that currencies must be Frankfurter-supported, but amount and the two currency parameters get no format, casing, or ISO-code guidance, and the supported-currency list is only referenced, not enumerated.

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+resource ('Convert an amount between two ... currencies') plus the scope ('Frankfurter-supported') and the rate mode. None of the siblings (list_countries, get_country_metric, etc.) do currency conversion, so there is no ambiguity to resolve, and the description pins down exactly what is being computed.

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 two supported modes of use (latest rate vs. a pinned historical date) and explains the fallback rule, which tells an agent what to expect before calling. It does not name when another tool should be used instead, but no sibling overlaps this function, so the omission is low-cost.

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

describe_methodologyA

How every number is produced: sources, join key, scope/year/FX/missing-value defaults, and which parameters change them. Use this to answer "how did you get that?".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full disclosure burden, and it does describe what the response covers (sources, join key, defaults, parameter overrides). It does not mention that it takes no input or that it returns a static documentation payload, but for a no-side-effect provenance tool the disclosure is otherwise adequate.

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 tightly packed sentences with the payload contents front-loaded and the usage trigger appended. Every clause earns its place and nothing is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description must convey the return content, and it does so with a specific inventory of topics. It could be slightly clearer that the tool requires no arguments, but an agent has everything needed to call it correctly.

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?

Zero parameters, so the baseline is 4. The description notes that the methodology covers 'which parameters change them', tying the documented defaults back to the parameters of the sibling data tools, which is useful framing even though this tool itself accepts nothing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool returns — how numbers are produced, including sources, join key, scope/year/FX/missing-value defaults. It implicitly distinguishes itself from the data-retrieval siblings by being the provenance/documentation source, though it never states a verb like 'returns' or names itself as documentation.

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 gives a clear use case with a quoted trigger phrase ('how did you get that?'), which tells the agent precisely when to reach for this tool rather than a data sibling. It stops short of when-not guidance or naming the alternative data tools explicitly.

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

get_country_metricA

One country's gdp, population, or gdp_per_capita for a year.

  • country: ISO2/ISO3 code or a name from either source ("France", "FR", "FRA", "Czechia").

  • metric: gdp | population | gdp_per_capita (GDP divided by population, same year).

  • year: a year like "2022", or "latest" (walks back past null years and reports year_used).

  • currency: any Frankfurter-supported currency (GDP is natively current US$).

  • fx_date: "YYYY-MM-DD" or "latest". Default: year-end of a pinned year (falls back to the last trading day, e.g. 2022 -> 2022-12-30), or the latest rate when year='latest'. The response includes the exact year used, FX rate and date, flags, and sources.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNolatest
metricNogdp
countryYes
fx_dateNo
currencyNoUSD

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does so well: it discloses that year='latest' walks back past null years, that fx_date defaults to year-end of a pinned year with a last-trading-day fallback, and that the response reports the actual year and FX rate used. It omits any auth, rate-limit, or error behavior, keeping it out of 5 territory.

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?

Front-loaded one-line purpose followed by a tight per-parameter bullet list; every line conveys format, allowed values, or default behavior. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameter-heavy read tool with no output schema and no annotations, the description covers defaults, fallback behavior, and the shape of the response (year used, FX rate and date, flags, sources). It is nearly self-sufficient, though edge cases like invalid country codes or missing data are not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all five parameters: accepted country code formats with examples, the metric enum values with a definition of gdp_per_capita, year formats plus 'latest' semantics, accepted currencies, and the fx_date format/default. This adds substantial meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource combination ("One country's gdp, population, or gdp_per_capita for a year") and enumerates the metric dimension, which implicitly separates it from aggregate siblings like region_total and rank_countries. It does not explicitly name or contrast a sibling, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the bullets rather than stated: an agent can infer this is for a single country's metric, but the description never says when to pick it over region_total, rank_countries, or convert_currency. No exclusions or prerequisites are given.

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

list_continentsA

List the seven continent codes (AF AN AS EU NA OC SA) with names and how many countries the country-list source has for each. Start here to find a continent code.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden; it is a pure read-only lookup but never states this, nor whether results are static, cached, or paginated. It discloses the shape of the payload (codes, names, counts) but no behavioral traits such as source dependency or stability of the counts.

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 compact sentences: contents first, the 'start here' routing cue second. No filler, front-loaded with the essential scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, zero-annotation enumeration tool this covers what an agent needs to call it and interpret the result. The gap is the missing behavioral framing (read-only, static vs. live counts) that no annotation supplies.

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?

Zero parameters, so the baseline is 4. The description helpfully documents the exact output token set (AF AN AS EU NA OC SA) that downstream calls need, exceeding the empty schema without over-explaining.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('continent codes') and enumerates exactly what's returned: codes, names, and country counts. It does not explicitly name a sibling tool to differentiate from, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear entry-point cue ('Start here to find a continent code') that tells the agent when this is the right first call. No explicit when-not-to-use or named alternative, so it does not reach 5.

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

list_countriesA

List every country the source lists for a continent (e.g. 'EU'), with ISO codes, both sources' names, currencies, and whether each could be matched in the World Bank. Answers "how many countries are in ?" via countries_listed_by_source.

ParametersJSON Schema
NameRequiredDescriptionDefault
continentYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the return contents (ISO codes, both source names, currencies, World Bank match flag) but says nothing about permissions, whether the continent argument is case-sensitive, error behavior for unknown continents, or coverage limits for a read tool.

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?

Two sentences, front-loaded with what is returned and followed by the question it answers. The trailing 'via countries_listed_by_source' is slightly noisy and slightly out of register with the rest.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly enumerates the returned fields, and with no annotations it covers the core read-only listing behavior. A brief note on continent name format or unknown-value handling is the only real gap for a single-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the only parameter has just a title, so the description must compensate. The example value 'EU' plus 'for a continent' gives meaningful guidance on the expected format, which is real added value, but nothing states accepted spellings or case handling.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('List every country the source lists for a continent') plus the exact payload fields returned, which is more than enough to distinguish it from list_continents or get_country_metric. It stops short of naming a sibling it must not be confused with (e.g. region_total), so it doesn't reach a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the embedded question 'how many countries are in <continent>?', which tells the agent the scenario this satisfies. There is no explicit when-not guidance or pointer to an alternative aggregation tool, so it stays at the implied-usage level.

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

list_reconciliation_issuesA

Every disagreement found while reconciling the three sources for a continent: countries missing from the World Bank, name mismatches (joined on ISO2 instead), excluded aggregate rows, currencies the FX source doesn't cover, and how the World Bank region differs from the geographic continent. Use this to explain any number's coverage.

ParametersJSON Schema
NameRequiredDescriptionDefault
continentYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the categories of findings the tool surfaces and its read-only explanatory role, which is useful. But it says nothing about output shape, ordering, or whether the result can be empty or huge for a continent with many mismatches.

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?

Two sentences, front-loaded with the core action and the enumerated issue types. The list of five categories is dense but each earns its place by defining scope. Slightly long but justified by the tool's explanatory purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter explanatory tool with no annotations and no output schema, the description adequately covers the 'what' and 'why' but leaves the 'how to call it' unanswered — parameter format is undocumented everywhere, and no return-shape hint is given.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the lone 'continent' parameter has no description anywhere. The description mentions 'a continent' only implicitly, never stating expected format (name? ISO code? case-sensitivity?) or whether an unknown continent errors or returns empty. This is the main gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb + resource ('list every disagreement') and an explicit scope ('reconciling the three sources for a continent'). It enumerates five concrete categories of issue, which distinguishes it sharply from siblings like describe_methodology or get_country_metric.

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 states a clear use case ('Use this to explain any number's coverage'), which tells the agent when to reach for this tool. However, it does not name or exclude a direct alternative sibling, and gives no counter-case for when NOT to call it.

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

rank_countriesA

Top-N (or bottom-N with order='asc') countries of a continent by gdp, population, or gdp_per_capita. Same scope/year/currency/fx_date semantics as region_total. Countries without data for the requested year are excluded and listed with reasons.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNolatest
orderNodesc
scopeNocontinent
top_nNo
metricNogdp
fx_dateNo
currencyNoUSD
continentYes

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose a genuinely useful behavior beyond the schema: countries lacking data for the requested year are excluded and reported with reasons, so partial results are expected. It says nothing about permissions, rate limits, or pagination/limits on top_n.

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 tight sentences with the ranking mode and metric options front-loaded and no filler. The cross-reference to region_total is economical but forces the agent to look up another definition to resolve currency/fx_date semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter tool with no annotations and no output schema, the description covers the ranking behavior and partial-result handling, including what gets listed alongside results. It leaves currency/fx_date semantics external and gives no sense of the result shape beyond the exclusion list.

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 coverage is 0% across 8 parameters, so the description must compensate. It adds real meaning for metric (three named measures), order ('asc' flips to bottom-N), and top_n ('Top-N'), but currency and fx_date are only name-dropped by deference to region_total rather than explained, and year/scope semantics are delegated to another tool's 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 names a specific operation (Top-N/bottom-N ranking), the resource (countries of a continent), and the valid metrics (gdp, population, gdp_per_capita), which separates it cleanly from siblings like get_country_metric (single value) and region_total (aggregate). An agent can tell what this tool returns 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent how to invert the ranking (order='asc' for bottom-N) and that scope/year/currency/fx_date behave as in region_total, which orients usage. It stops short of stating when NOT to use it or which sibling to prefer for non-continent rankings.

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

region_totalA

Regional total for a continent: sum of GDP, sum of population, or population-weighted GDP per capita (sum GDP / sum population). All judgment calls are parameters:

  • scope: 'continent' = the geographic continent per the country-list source (default); 'wb_region' = the World Bank region(s) overlapping it — a DIFFERENT country set (e.g. Europe & Central Asia adds Central Asia and the Caucasus).

  • year: "2022" or "latest" (latest walks back per country and may mix years — flagged).

  • missing_policy (pinned years): 'exclude' = countries without that year's value are excluded and listed (default); 'walk_back' = use their most recent earlier value.

  • currency / fx_date: as in get_country_metric. The response lists every included country with its value and year, every exclusion with its reason, the FX rate used, and the assumptions applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNolatest
scopeNocontinent
metricNogdp
fx_dateNo
currencyNoUSD
continentYes
missing_policyNoexclude

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does notably well: it discloses that 'latest' walks back per country and may mix years (flagged), that exclusions are listed, and that FX rate and assumptions are returned. It doesn't cover permissions, rate limits, or pagination, but for an analytical aggregation those are less critical.

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?

Front-loaded with the computation in the first sentence, then a clean bulleted parameter list. Slightly dense, and 'All judgment calls are parameters' is a filler clause, but overall tight and scannable.

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 7-parameter aggregation with no output schema and no annotations, the description covers the computation, every judgment-call parameter, default behaviors, and even the response contents (included countries, exclusions, FX rate, assumptions). Nothing essential to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it does: it defines scope='continent' vs 'wb_region' (with a concrete example of the differing country set), year='latest' behavior, missing_policy='exclude' vs 'walk_back' semantics, and defers currency/fx_date to get_country_metric. It documents nearly all 7 parameters beyond bare titles.

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 computation ('sum of GDP, sum of population, or population-weighted GDP per capita') over a named resource (continent region). It clearly distinguishes itself from siblings like get_country_metric (single country) and rank_countries (ordering), so an agent can route correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains parameter semantics well but never says when to prefer this tool over get_country_metric or rank_countries, nor when a region total is the right call. Usage is implied by the computation described, but no explicit when/when-not guidance is given.

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. 8 tool updatesv1.0.0
    • First observedconvert_currency
    • First observeddescribe_methodology
    • First observedget_country_metric
    • First observedlist_continents
    • First observedlist_countries
    • First observedlist_reconciliation_issues
    • First observedrank_countries
    • First observedregion_total

TDQS

A4/5.0

Scored across 8 tools

Disambiguation4/5

Tools are mostly distinct: list_continents, list_countries, and get_country_metric target different granularities, while region_total and rank_countries differ by aggregation vs ranking. However, both region_total and rank_countries share identical scope/year/currency semantics and could be confused for aggregate queries, and get_country_metric is buried despite its importance.

Naming Consistency5/5

All tool names follow a clear verb_noun pattern (list_continents, get_country_metric, region_total, convert_currency, describe_methodology). The only slight deviation is region_total and rank_countries which omit an explicit verb, but they remain readable and consistent within the set.

Tool Count5/5

Eight tools is well-scoped for a country analytics server: listing entities, fetching metrics, aggregating, ranking, converting currency, and explaining reconciliation/methodology. Each tool earns its place without redundancy.

Completeness5/5

The surface covers the full lifecycle: discovery (continents, countries), retrieval (get_country_metric), aggregation (region_total), ranking (rank_countries), currency conversion, and transparency tools (list_reconciliation_issues, describe_methodology). No obvious gaps for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Server that brings World Bank Open Data to AI assistants. 10 tools · Zero authentication · LRU caching · Sparkline trends · Cross-country comparisons
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Exposes World Bank development data to AI agents via local CSV resources and live API tools, enabling queries about GDP, population, and other indicators.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Query 2,500+ verified public datasets (World Bank, IMF, Eurostat, OECD, WHO) from your AI agent. Search, analyze, and visualize data, and publish charts — with verified SEC + official source data.
    28
    430 npm
    2
    MIT