# `worldbank__worldbank_search_projects`

**Search World Bank Projects**

Search the World Bank lending portfolio — the individual loans, credits, and grants the Bank finances — by free text, country, region, status, and board approval date. Returns the project ID, name, borrowing country, region, status, board approval and closing dates, total commitment in USD, financing instrument, major sectors, and a link to the project page. This is the operations catalogue, not the statistics catalogue: use it for "what is the World Bank funding in Kenya", "which climate adaptation projects are active", or "how much was committed to education in South Asia since 2020". For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead. Countries are identified by ISO2 code here (BR, IN, ZA), which is the one place this server departs from the ISO3 codes its other tools take — worldbank_get_country reports a country's iso2 field for either form, and multi-country operations carry a World Bank regional code such as 3A instead. Every filter is an exact match upstream and combines with the others by AND, so a narrow search can legitimately return nothing; when it does, the response says whether the country codes matched anything on their own.

- Server: [World Bank](https://gateway.mcpharbor.dev/docs/servers/worldbank) (`dev.mcpharbor.gateway/worldbank`)
- Price per call: $0.0001 (100 micro-USD); only tools/call is charged
- Endpoint: `https://gateway.mcpharbor.dev/mcp` or `https://gateway.mcpharbor.dev/mcp/worldbank`
- Upstream tool: exposed by the provider; called through this gateway as `worldbank__worldbank_search_projects`
- Provider terms: <https://data.worldbank.org/summary-terms-of-use> (verified 2026-09-19)
- Upstream API documentation: <https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation>
- Rate limit: 500 requests per minute
- Attribution required: "The World Bank: Dataset name: Data source (if known)"; same acknowledgment must be passed to sub-licensees

## Parameters

- `approved_from` (any, optional): Earliest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day (2024-02-29, not 2023-02-29) and, when approved_to is also set, on or before it. Board approval is the date...
- `approved_to` (any, optional): Latest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day.
- `countries` (any, optional): Borrowing countries, by the two-character code this API keys on: ISO2 for an economy (BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific)....
- `include_abstract` (boolean, optional): Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, with every abstract return... Default: `false`.
- `page` (integer, optional): Pagination page number (1-based). Default: `1`.
- `per_page` (integer, optional): Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default ...
- `query` (string, optional): Free-text search across project names, abstracts, and objectives. Every word must appear, so extra words narrow the result. Omit to browse the portfolio by filter alone, newest board approvals first.
- `region` (array, optional): World Bank operational regions to include, combined as OR. These are the lending regions the portfolio is organized by, not the WDI aggregate codes worldbank_get_data accepts.
- `status` (array, optional): Lifecycle stages to include, combined as OR. "Active" is under implementation, "Pipeline" is approved but not yet effective, "Closed" has finished disbursing, and "Dropped" was abandoned before app...

## Example call

Request headers and body:

```http
POST /mcp HTTP/1.1
Host: gateway.mcpharbor.dev
Authorization: Bearer <your gateway API key>
Content-Type: application/json
Accept: application/json, text/event-stream
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: worldbank__worldbank_search_projects
```

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "_meta": {
      "io.modelcontextprotocol/clientCapabilities": {},
      "io.modelcontextprotocol/clientInfo": {
        "name": "example-agent",
        "version": "1.0.0"
      },
      "io.modelcontextprotocol/protocolVersion": "2026-07-28"
    },
    "arguments": {
      "approved_from": "example"
    },
    "name": "worldbank__worldbank_search_projects"
  }
}
```

A successful response:

```json
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "_meta": {
      "dev.mcpharbor.gateway/call": {
        "chargedMicroUsd": 100,
        "id": "<the id of this charge>"
      }
    },
    "content": [
      {
        "text": "<whatever the upstream tool returned>",
        "type": "text"
      }
    ],
    "resultType": "complete"
  }
}
```

This call costs $0.0001 (100 micro-USD). Reading this page and listing the tool cost nothing.
The `dev.mcpharbor.gateway/call` record in the result is the receipt for that charge. Each
POST is metered separately, so sending the same call again buys another one: see
[agent.txt](https://gateway.mcpharbor.dev/agent.txt), section 7, before retrying.

## Attribution

This provider requires the attribution below wherever you use results from its tools.
Reproduce it verbatim:

> "The World Bank: Dataset name: Data source (if known)"; same acknowledgment must be passed to sub-licensees

## Tool definition

Exactly as `tools/list` returns it (free):

```json
{
  "_meta": {
    "dev.mcpharbor.gateway/pricing": {
      "currency": "USD",
      "pricePerCallMicroUsd": 100
    }
  },
  "annotations": {
    "idempotentHint": true,
    "openWorldHint": true,
    "readOnlyHint": true
  },
  "description": "Search the World Bank lending portfolio — the individual loans, credits, and grants the Bank finances — by free text, country, region, status, and board approval date. Returns the project ID, name, borrowing country, region, status, board approval and closing dates, total commitment in USD, financing instrument, major sectors, and a link to the project page. This is the operations catalogue, not the statistics catalogue: use it for \"what is the World Bank funding in Kenya\", \"which climate adaptation projects are active\", or \"how much was committed to education in South Asia since 2020\". For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead. Countries are identified by ISO2 code here (BR, IN, ZA), which is the one place this server departs from the ISO3 codes its other tools take — worldbank_get_country reports a country's iso2 field for either form, and multi-country operations carry a World Bank regional code such as 3A instead. Every filter is an exact match upstream and combines with the others by AND, so a narrow search can legitimately return nothing; when it does, the response says whether the country codes matched anything on their own.",
  "inputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "properties": {
      "approved_from": {
        "anyOf": [
          {
            "const": "",
            "type": "string"
          },
          {
            "description": "Earliest board approval date to include.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          }
        ],
        "description": "Earliest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day (2024-02-29, not 2023-02-29) and, when approved_to is also set, on or before it. Board approval is the date the Bank committed to the operation; pipeline projects carry a scheduled date in the future."
      },
      "approved_to": {
        "anyOf": [
          {
            "const": "",
            "type": "string"
          },
          {
            "description": "Latest board approval date to include.",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "type": "string"
          }
        ],
        "description": "Latest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day."
      },
      "countries": {
        "anyOf": [
          {
            "description": "A single two-character code, or a comma- or semicolon-separated list of them.",
            "type": "string"
          },
          {
            "description": "An array of two-character codes.",
            "items": {
              "description": "A two-character country code.",
              "type": "string"
            },
            "type": "array"
          }
        ],
        "description": "Borrowing countries, by the two-character code this API keys on: ISO2 for an economy (BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes are combined as OR — a project matching any of them is returned. Omit for every country."
      },
      "include_abstract": {
        "default": false,
        "description": "Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, with every abstract returned whole; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes.",
        "type": "boolean"
      },
      "page": {
        "default": 1,
        "description": "Pagination page number (1-based).",
        "maximum": 9007199254740991,
        "minimum": 1,
        "type": "integer"
      },
      "per_page": {
        "description": "Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap, disclosed in notice, and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size.",
        "maximum": 1000,
        "minimum": 1,
        "type": "integer"
      },
      "query": {
        "description": "Free-text search across project names, abstracts, and objectives. Every word must appear, so extra words narrow the result. Omit to browse the portfolio by filter alone, newest board approvals first.",
        "type": "string"
      },
      "region": {
        "description": "World Bank operational regions to include, combined as OR. These are the lending regions the portfolio is organized by, not the WDI aggregate codes worldbank_get_data accepts.",
        "items": {
          "enum": [
            "East Asia and Pacific",
            "Europe and Central Asia",
            "Latin America and Caribbean",
            "Middle East, North Africa, Afghanistan, and Pakistan",
            "South Asia",
            "Eastern and Southern Africa",
            "Western and Central Africa",
            "Africa",
            "Other"
          ],
          "type": "string"
        },
        "type": "array"
      },
      "status": {
        "description": "Lifecycle stages to include, combined as OR. \"Active\" is under implementation, \"Pipeline\" is approved but not yet effective, \"Closed\" has finished disbursing, and \"Dropped\" was abandoned before approval. Most of the portfolio is closed, so omitting this returns mostly historical operations.",
        "items": {
          "enum": [
            "Active",
            "Closed",
            "Dropped",
            "Pipeline"
          ],
          "type": "string"
        },
        "type": "array"
      }
    },
    "type": "object"
  },
  "name": "worldbank__worldbank_search_projects",
  "outputSchema": {
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false,
    "anyOf": [
      {
        "not": {
          "required": [
            "error"
          ]
        },
        "required": [
          "projects",
          "appliedFilters",
          "totalCount",
          "currentPage",
          "totalPages"
        ]
      },
      {
        "required": [
          "error"
        ]
      }
    ],
    "properties": {
      "appliedFilters": {
        "additionalProperties": false,
        "description": "The effective search sent upstream — confirms country-code normalization and which filters were in force for these results.",
        "properties": {
          "approvedFrom": {
            "description": "Earliest board approval date applied, omitted when none.",
            "type": "string"
          },
          "approvedTo": {
            "description": "Latest board approval date applied, omitted when none.",
            "type": "string"
          },
          "countries": {
            "description": "Country codes as sent upstream — uppercased and comma-joined here for readability, though the API itself takes them caret-separated. Omitted when no country filter was applied.",
            "type": "string"
          },
          "includeAbstract": {
            "description": "Whether abstracts were requested, including the server default of false. A null abstract means \"not requested\" when this is false and \"none published\" when it is true.",
            "type": "boolean"
          },
          "page": {
            "description": "Page number requested.",
            "type": "number"
          },
          "perPage": {
            "description": "Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size.",
            "type": "number"
          },
          "query": {
            "description": "Free-text query applied, omitted when none.",
            "type": "string"
          },
          "region": {
            "description": "Regions applied, omitted when none.",
            "type": "string"
          },
          "requestedPerPage": {
            "description": "Page size asked for, requested or server default, present only when it exceeded the page cap and perPage was reduced.",
            "type": "number"
          },
          "status": {
            "description": "Statuses applied, omitted when none.",
            "type": "string"
          }
        },
        "required": [
          "includeAbstract",
          "page",
          "perPage"
        ],
        "type": "object"
      },
      "currentPage": {
        "description": "Page number requested — past totalPages when the request ran off the end.",
        "type": "number"
      },
      "error": {
        "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: `invalid_country_code`: A countries entry is not a two-character code — most often an ISO3 code such as BRA, which the Projects API does not key on. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page. Other values are possible when a failure originates below the handler.",
                "examples": [
                  "invalid_country_code",
                  "invalid_date",
                  "reversed_date_range",
                  "page_out_of_range",
                  "upstream_unavailable"
                ],
                "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"
      },
      "notice": {
        "description": "Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the page cap.",
        "type": "string"
      },
      "projects": {
        "description": "Projects on this page, newest board approval date first — the order the API returns and the order pagination walks.",
        "items": {
          "additionalProperties": false,
          "description": "One World Bank lending operation.",
          "properties": {
            "abstract": {
              "description": "Project abstract. Null when include_abstract was not requested and when the project publishes none — appliedFilters.includeAbstract separates the two.",
              "type": [
                "string",
                "null"
              ]
            },
            "boardApprovalDate": {
              "description": "Date the Board approved the operation, as YYYY-MM-DD. A future date belongs to a pipeline project with a scheduled board date.",
              "type": [
                "string",
                "null"
              ]
            },
            "closingDate": {
              "description": "Scheduled or actual closing date, as YYYY-MM-DD. Null on roughly 44% of the portfolio, which publishes none — almost all dropped operations among them.",
              "type": [
                "string",
                "null"
              ]
            },
            "countryCodes": {
              "description": "Two-character code of the borrowing country — ISO2 for an economy, a World Bank regional code such as 3A for a multi-country operation. Upstream publishes it as a list, though every project in the portfolio carries exactly one.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "countryName": {
              "description": "Borrowing country, as the portfolio names it.",
              "type": "string"
            },
            "financialTypes": {
              "description": "Financing windows behind the operation: IBRD, IDA, Grants, or Other. A blended operation lists more than one.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "id": {
              "description": "World Bank project ID, e.g. P513206.",
              "type": "string"
            },
            "majorSectors": {
              "description": "Major sectors the operation is classified under, e.g. Health, Education, Transportation. Empty where the portfolio publishes no sector classification.",
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "name": {
              "description": "Project name.",
              "type": "string"
            },
            "regionName": {
              "description": "World Bank operational region.",
              "type": "string"
            },
            "status": {
              "description": "Lifecycle stage: Active, Closed, Dropped, or Pipeline.",
              "type": "string"
            },
            "totalCommitment": {
              "description": "Total World Bank commitment in USD. Null on just over half the portfolio, which publishes no amount — dropped and older operations mostly — and that is not the same as a commitment of zero.",
              "type": [
                "number",
                "null"
              ]
            },
            "url": {
              "description": "Project page on projects.worldbank.org.",
              "type": "string"
            }
          },
          "required": [
            "id",
            "name",
            "status",
            "countryCodes",
            "countryName",
            "regionName",
            "boardApprovalDate",
            "closingDate",
            "totalCommitment",
            "financialTypes",
            "majorSectors",
            "abstract",
            "url"
          ],
          "type": "object"
        },
        "type": "array"
      },
      "totalCount": {
        "description": "Total projects matching the search, before pagination.",
        "type": "number"
      },
      "totalPages": {
        "description": "Total number of pages.",
        "type": "number"
      }
    },
    "type": "object"
  },
  "title": "Search World Bank Projects"
}
```
