Skip to main content
Glama

Search World Bank Indicators

worldbank_search_indicators
Read-onlyIdempotent

Search the 29,500+ World Bank indicator catalog by keyword, topic, or source, returning indicator IDs and metadata for worldbank_get_data. Provide at least one of query, topic_id, or source_id; a topic and a source together narrow to indicators in both. A keyword query matches every term against indicator ID, name, and full description, in any word order, across the whole catalog or the whole selected topic or source; punctuation is ignored, so the query needs at least one letter or digit. Exact ID or name matches rank first, then names starting with the phrase as whole words, then whole-phrase matches, then matches where every term is a whole word of the ID or name, then other ID/name matches, then description-only matches; within each of those, World Development Indicators series come first, then other live sources, then archives, and a series comes ahead of its own breakdowns by sex, area, or age. Each indicator ID appears once, even where the catalog publishes it under two sources. Each result carries the first 150 characters of its description; worldbank_get_indicator returns the whole of it. Find topic IDs with worldbank_list_topics and source IDs with worldbank_list_sources.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
queryNoKeyword search terms — an indicator name, ID, or any words from either (e.g. "GDP per capita", "NY.GDP.MKTP.CD", "CO2 emissions"). Every term must match; punctuation is ignored, so the query needs at least one letter or digit. At least one of query, topic_id, or source_id must be provided.
per_pageNoResults per page (default: server default, max: 100).
topic_idNoFilter by topic ID (e.g. "1" for Agriculture, "3" for Economy & Growth). Use worldbank_list_topics to browse valid IDs.
source_idNoFilter by data source ID (e.g. "2" for World Development Indicators). Use worldbank_list_sources to browse valid IDs.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint for an empty page — how to broaden the search when no indicators matched, or the page range that exists when the requested page is past the end.
indicatorsNoMatching indicators for this page.
totalCountNoTotal matching indicators before pagination.
totalPagesNoTotal number of pages.
currentPageNoCurrent page number.
appliedFiltersNoThe effective search parameters, field by field — confirms which filter combination produced these results without parsing the effectiveQuery string.
effectiveQueryNoActive filters echoed: keyword, topic ID, and/or source ID that were applied.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / indicators / items / properties / sourceNote / description
      Previous value: -"Brief indicator description."New value: +"Indicator description, cut to its first 150 characters and marked with … when longer. worldbank_get_indicator returns it whole."
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint when no indicators matched — suggests how to broaden the search."New value: +"Recovery hint for an empty page — how to broaden the search when no indicators matched, or the page range that exists when the requested page is past the end."
  2. Changed5 schema fields changed
    • changedInput schema / properties / query / description
      Previous value: -"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored. At least one of query, topic_id, or source_id must be provided."New value: +"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored, so the query needs at least one letter or digit. At least one of query, topic_id, or source_id must be provided."
    • addedInput schema / properties / source_id / pattern
      Added value: +"^\\s*\\d*\\s*$"
    • addedInput schema / properties / topic_id / pattern
      Added value: +"^\\s*\\d*\\s*$"
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. `empty_query`: The query contains no letters or digits once punctuation is ignored. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "missing_filter",
      -  "invalid_filter"
      -]New value: +[
      +  "missing_filter",
      +  "invalid_filter",
      +  "empty_query"
      +]
  3. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "indicators",
      +      "appliedFilters",
      +      "totalCount",
      +      "currentPage",
      +      "totalPages"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "missing_filter",
      +            "invalid_filter"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "indicators",
      -  "appliedFilters",
      -  "totalCount",
      -  "currentPage",
      -  "totalPages"
      -]
  4. Changed2 schema fields changed
    • addedOutput schema / properties / appliedFilters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The effective search parameters, field by field — confirms which filter combination produced these results without parsing the effectiveQuery string.",
      +  "properties": {
      +    "query": {
      +      "description": "Trimmed keyword query sent to the search, omitted when none was given.",
      +      "type": "string"
      +    },
      +    "sourceId": {
      +      "description": "Source ID the results were scoped to, omitted when none was given.",
      +      "type": "string"
      +    },
      +    "topicId": {
      +      "description": "Topic ID the results were scoped to, omitted when none was given.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "indicators",
      -  "totalCount",
      -  "currentPage",
      -  "totalPages"
      -]New value: +[
      +  "indicators",
      +  "appliedFilters",
      +  "totalCount",
      +  "currentPage",
      +  "totalPages"
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / query / description
      Previous value: -"Keyword search terms. At least one of query, topic_id, or source_id must be provided."New value: +"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored. At least one of query, topic_id, or source_id must be provided."
  6. Changed10 schema fields changed
    • addedOutput schema / properties / currentPage
      Added value: +{
      +  "description": "Current page number.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / effectiveQuery
      Added value: +{
      +  "description": "Active filters echoed: keyword, topic ID, and/or source ID that were applied.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / message
      Removed value: -{
      -  "description": "Recovery hint when no indicators matched — suggests how to broaden the search.",
      -  "type": "string"
      -}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery hint when no indicators matched — suggests how to broaden the search.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / page
      Removed value: -{
      -  "description": "Current page number.",
      -  "type": "number"
      -}
    • removedOutput schema / properties / pages
      Removed value: -{
      -  "description": "Total number of pages.",
      -  "type": "number"
      -}
    • removedOutput schema / properties / total
      Removed value: -{
      -  "description": "Total matching indicators before pagination.",
      -  "type": "number"
      -}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total matching indicators before pagination.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / totalPages
      Added value: +{
      +  "description": "Total number of pages.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "indicators",
      -  "total",
      -  "page",
      -  "pages"
      -]New value: +[
      +  "indicators",
      +  "totalCount",
      +  "currentPage",
      +  "totalPages"
      +]
  7. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Despite annotations already declaring readOnlyHint, openWorldHint, and idempotentHint, the description adds substantial behavioral context: exact ranking order, deduplication across sources, punctuation-ignoring matching rules, and the 150-character description truncation. It discloses the full matching and ordering contract an agent needs 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 notably long and dense, but it is logically structured: purpose first, then parameter requirements, matching, ranking, deduplication, and output format, ending with sibling references. Every sentence carries operational information for a tool with genuinely complex ranking logic, so the length is earned rather than padded.

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 description needn't detail return values, and it doesn't. It fully covers filtering rules, ranking order, deduplication, description truncation, and where to find valid IDs via sibling tools. Nothing an agent needs to call this tool 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%, so the schema already documents every parameter, establishing a baseline of 3. The description goes beyond this by explaining the 'at least one of' constraint, the topic+source intersection semantics, and the query matching behavior (every term must match, whole-word matching). It adds real meaning beyond the schema, though it doesn't elaborate on page/per_page specifics.

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 states a specific verb and resource ('Search the 29,500+ World Bank indicator catalog by keyword, topic, or source') and explicitly frames the output as 'indicator IDs and metadata for worldbank_get_data,' tying it into the workflow. This clearly differentiates it from the sibling worldbank_search_projects and the data-retrieval tools.

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 the requirement 'Provide at least one of query, topic_id, or source_id' and the narrowing semantics of combining topic and source. It also directs agents to worldbank_list_topics and worldbank_list_sources for valid IDs and contrasts itself with worldbank_get_indicator (which returns the full description), giving clear when-to-use guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.