Overview
A collector pulls five World Bank indicators daily: total population (SP.POP.TOTL), annual growth (SP.POP.GROW), urban population share (SP.URB.TOTL.IN.ZS), population density (EN.POP.DNST) and life expectancy at birth (SP.DYN.LE00.IN). It stores one record per country per year from 1960 and keeps the newest year as the latest record.
`country` accepts ISO 3166 alpha-2 or alpha-3 codes; two-letter codes are mapped to three-letter ones before lookup, and Kosovo is handled as XK. Without `year` you get the newest stored year. `year` (paid) must be between 1960 and the current year, otherwise the request is rejected with a 400, and a year with no record returns a 404.
The response always wraps the figures in a `historical` array with one entry, and `count` is 1. `population` is the raw count and `populationFormatted` its readable form. `growthRate` is the year-on-year change in percent and can be negative. `density` is people per square kilometre of land and `urbanPercent` is the urban share in percent, both rounded to two decimals. Indicators publish on different schedules, so the newest year often has a population count before density or life expectancy are released; those fields are null until the World Bank fills them, and a reported zero is kept as zero rather than treated as missing.
`worldRank` ranks the country by `population` among the countries and territories that report a population that year (about 217); World Bank regional, income and lending aggregates are excluded. Ranking is per year, so a historical lookup returns the rank for that year. Ties share a rank and the next rank is skipped. `rankedCountries` is the number ranked, and `worldPercent` is the population divided by the World Bank world total (`WLD`) for the year, as a percentage to four decimals; the world total also counts Taiwan, which the World Bank does not list separately, so the shares of all ranked countries add up to slightly under 100. All three are null when the year has no ranking or the code is not a ranked country.
Live Test Population Grounding Data for AI Agents Source →
The tool
Once your client is connected to the VerveContext server, this appears in its tool list as PopulationGroundingDataforAIAgents. It is read-only and open-world — it fetches and never mutates anything on your side — so most clients call it without asking you to confirm.
{
"name": "PopulationGroundingDataforAIAgents",
"arguments": {
"country": "US"
}
}You do not name the tool yourself; the model picks it. Asking about US in the terms this source covers is enough for it to reach for PopulationGroundingDataforAIAgents on its own — naming it explicitly also works, and is the way to force the call.
Connecting
One server URL covers every source in the catalog, including this one. Authorization is OAuth: the client opens a browser once, and there is no key to paste into a config file.
{
"mcpServers": {
"vervecontext": {
"url": "https://api.vervecontext.com/v1/mcp"
}
}
}https://api.vervecontext.com/v1/mcpPer-client setup — Claude, Cursor, VS Code, ChatGPT — is on the MCP setup page.
Arguments
These are the properties on the tool's inputSchema, so a well-behaved client validates them before the call is made. Premium arguments are accepted on every plan but only take effect on plans that include them.
| Argument | Type | Description |
|---|---|---|
countryRequired | string | ISO 2 or 3-letter country code (e.g., US, USA, GB, GBR) length 2–3 |
yearOptionalPremium | integer | Specific year to retrieve data for (1960-present). Returns latest if not specified. range 1960–2030 |
What the model gets back
The result carries a structuredContent object matching the tool's declared outputSchema, so a client reads fields without parsing prose. status is "ok" and error is null on success; a null field means the value was not available for that input, not that the call failed.
{
"status": "ok",
"error": null,
"data": {
"country": "US",
"countryName": "United States",
"year": 2025,
"count": 1,
"historical": [
{
"year": 2025,
"population": 341784857,
"populationFormatted": "341.78 million",
"growthRate": 0.52,
"urbanPercent": 80.19
}
]
}
}
Response fields
Paths are relative to data. Premium fields are absent rather than zeroed on plans that do not include them, so check for presence instead of comparing to 0.
| Field | Type | Example | Description |
|---|---|---|---|
country | string | US | ISO 2-letter country code for the country |
countryName | string | United States | Full name of the country in English |
year | number | 2025 | Year of the population data retrieved |
count | number | 1 | Number of historical records returned |
historical | array[1] | Population figures for the requested year (one entry) | |
historical.0.year | number | 2025 | Year the figures in this entry describe |
historical.0.populationPremium | number | 341784857 | Total population count for the country |
historical.0.populationFormattedPremium | string | 341.78 million | Population count in human-readable format |
historical.0.growthRatePremium | number | 0.52 | Annual population growth rate as percentage |
historical.0.urbanPercentPremium | number | 80.19 | Percentage of population living in urban areas |
Why ground on it
A model can produce something that looks like this answer from its training data, and be confidently out of date or simply wrong. This source returns the current value in a shape you can check, which is the difference between an answer you can cite and one you have to hedge.
Point an evaluation at countryName: it is the field most worth pinning a claim to, and it is either present and current or absent — never plausibly invented.
Failure modes
Errors come back as tool errors carrying a sentence the model can act on, not a bare status code. Error handling covers the full list.
| Status | What it means |
|---|---|
400 / 422 | The arguments did not validate. The message names the offending one. |
401 | The OAuth session is invalid or expired — reconnect the server. |
403 | Blocked by a key restriction or an IP allow-list. Never a bad identity. |
404 | This source is not part of VerveContext. Check the catalog. |
429 | Out of credits, or a brief rate limit. The message tells them apart. |
A call costs 2 credits each time the tool actually runs; a model that reasons about the tool without calling it costs nothing.
Use cases
- Market Expansion Sizing
- When evaluating entry into emerging markets, retail planners pull total population and urban percentage to gauge addressable customer density.
- Demographic Trend Modeling
- Academic research tools query historical growth rates and life expectancy across decades to model regional aging patterns.
- Broadband Network Planning
- Telecom planners cross-reference population density and urban shares to prioritize where to deploy new broadband fiber networks.
- Sovereign ESG Scoring
- To assess national health and development indicators, sovereign ESG platforms fetch country life expectancy and population growth figures.
Other ways to use Population Grounding Data for AI Agents
Set up Population Grounding Data for AI Agents on VerveContext, or reach the same source a different way. Your VerveContext account and credits work on all of them — one key, one balance.
Related
More in Finance: