Skip to main content
Glama
paulvercoustre

UNDP Open Data MCP Server

UNDP Open Data MCP Server

An MCP server for the UNDP Open Data API — UNDP's transparency data on projects, outputs, funding, donors, SDG alignment and focus areas.

No API key or authentication required.

Install

Sharing this with non-technical colleagues? See INSTALL.md for the one-file Claude Desktop extension and what to tell people about the data.

dist/ is gitignored, so build after cloning:

npm install && npm run build

Related MCP server: mcp-open-contracting

Running it

You do not start this server yourself — the MCP client launches it on demand and talks to it over stdio. To check it works standalone:

npm run build && node dist/index.js

It should print UNDP Open Data MCP server running on stdio to stderr and then wait for JSON-RPC on stdin. Ctrl-C to stop. Nothing further will happen without a client attached; that is expected.

To exercise every tool against the live API:

node test/smoke.mjs

Connecting to Claude

Claude Code (CLI)

From an interactive terminal:

claude mcp add undp-open-data --scope user -- node /absolute/path/to/undp-open-data-mcp/dist/index.js

--scope user makes it available in every project. Use --scope project instead to write a .mcp.json into the current project and share it with collaborators. Verify with claude mcp list, or /mcp inside a session.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add:

{
  "mcpServers": {
    "undp-open-data": {
      "command": "node",
      "args": ["/absolute/path/to/undp-open-data-mcp/dist/index.js"]
    }
  }
}

Restart Claude Desktop, then check the tools appear in the MCP/tools menu.

Both need the absolute path, and node must be on the launching process's PATH. If the client reports the server failing to start, run the node dist/index.js command above by hand — the error will be clearer there.

Asking for things once connected

  • "Which countries received the most UNDP funding in 2023?" → undp_aggregate_projects

  • "What is UNDP doing in Kenya on climate?" → undp_list_operating_units, then undp_search_projects

  • "How much has Germany contributed?" → undp_list_donor_countries / undp_search_donors

Tools

Reference data

Tool

Purpose

undp_list_operating_units

Country offices and regional units. Start here to resolve a country name to its iso3 code.

undp_list_regions

The regional bureaux (RBA, RBAP, RBEC, RBLAC, RBAS) with aggregates.

undp_list_sdgs

The 17 SDGs with UNDP funding, filterable by year/unit/donor.

undp_list_sdg_targets

Target-level (1.1, 1.2 …) funding detail.

undp_list_focus_areas

'Our Focus' thematic pillars.

undp_list_signature_solutions

The six signature solutions.

undp_list_approaches

Policy markers — supplies the marker_type/marker_id filter values.

undp_list_crs_sectors

OECD DAC CRS sector codes.

Projects

Tool

Purpose

undp_search_projects

Search projects for a year, filtered by country, SDG, sector, donor, marker. Paginated.

undp_get_project

One project in full: dates, fiscal-year financials, outputs, locations, documents.

undp_get_output

One output: CRS sector, gender marker, per-donor and per-year financials.

undp_get_operating_unit

A country office's whole portfolio, paginated.

undp_aggregate_projects

Totals across a full year grouped by country, region, donor country, donor type, CRS sector, or core vs non-core.

Donors

Tool

Purpose

undp_search_donors

Search 6,200+ funding organisations by name. Query required.

undp_list_donor_countries

Donor countries ranked by contribution, with contributing organisations.

Design notes

The upstream API is generous with payload size — several endpoints return far more than fits in a model's context window:

Endpoint

Raw size

donor-index.json

~37 MB (6,221 donors)

project_summary_<year>.json

~7 MB (4,619 projects for 2023)

units/<iso3>.json

~600 KB for a single country

So no tool returns a raw upstream document. Instead:

  • Everything is paginated. Lists return total, has_more and next_offset; pass next_offset back as offset to continue.

  • Verbose nested data is opt-in. Outputs, documents, locations, and top_donors arrays sit behind include_* flags, because they dominate the payload when left in.

  • Text search covers the whole result set. query on undp_search_projects pulls every project matching the structured filters (pages fetched concurrently, ~2.5 s cold for a full year, then cached) and matches title and description across all of them, so counts are real rather than whatever landed on the first page.

  • Aggregation happens server-side. undp_aggregate_projects reduces a whole year of projects to ranked totals, so "which countries received the most funding in 2023" costs one call instead of paging through 4,619 records.

  • Large documents are cached in memory (1 h TTL by default), with concurrent requests for the same URL deduplicated. The donor index takes ~7 s cold and ~3 ms warm.

  • A hard size guard (100 k chars) backstops every result, returning a recoverable error with guidance rather than flooding the context.

Upstream quirks handled:

  • crs-index.json inverts its fields — id holds the label and name the numeric code. The server normalises this to {code, name}.

  • project_list supports undocumented limit/offset parameters (visible only in its next link); the server uses them for real server-side pagination.

  • Output budget, expenditure and fiscal_year arrive as parallel arrays; undp_get_output zips them into per-year records.

  • sdg-index and focus-area-index accept an operating_unit parameter (it is in the published spec) but return an empty array for every country, including ones with active projects. The server detects this and returns an explicit warning naming the working alternative, rather than an empty list that reads as "no such work in that country".

  • In group_by: "donor_country", per-donor amounts are used rather than the project total, so multi-donor projects aren't counted several times over. Note that upstream includes non-country funders (e.g. GFATM, UNDP) in the donor-country field.

The API's download/undp-project-data.zip endpoint is deliberately not exposed — it is a bulk binary download, not something to hand back through a tool call.

Configuration

Variable

Default

Purpose

UNDP_API_BASE

https://api.open.undp.org

API base URL.

UNDP_CACHE_TTL_MS

3600000

Cache lifetime. 0 disables caching.

UNDP_TIMEOUT_MS

60000

Per-request timeout (the big endpoints are slow).

UNDP_MAX_RESULT_CHARS

100000

Tool result size ceiling.

Tests

node test/schema.mjs        # offline: schema contract, no network
node test/smoke.mjs         # hits the live UNDP API
node test/minimal-args.mjs  # hits the live UNDP API

smoke.mjs drives the server as a real MCP client over stdio and exercises all 15 tools. minimal-args.mjs calls every tool with optional parameters omitted, and fails if any input schema emits a JSON-Schema default — Zod's .default() produced schemas that some MCP clients rejected as required-but-missing, so defaults are applied in the handlers instead. test/edge.mjs covers the 37 MB donor path, error handling and pagination continuity.

Data source

Data from the UNDP Open Data API. Financial values are USD; budget is allocated funding and expenditure is spent.

Hosting it (remote connector)

dist/index.js is the stdio server local clients run. dist/http-server.js serves the same 15 tools over Streamable HTTP so it can be hosted and added to claude.ai as a custom connector — the only way to reach it from the web app or mobile, which cannot talk to local servers. See DEPLOY.md.

npm run build && npm run start:http   # POST /mcp, GET /health

CI

GitHub Actions runs on every push and PR, plus weekly to catch upstream API changes:

  • Build and schema contract — Node 20 and 22. test/schema.mjs inspects tools/list only and does no network I/O, so it stays meaningful when the UNDP API is down.

  • Live API tests — kept in a separate job so an upstream outage reads as an upstream problem, not a broken build.

  • Extension builds — packs the .mcpb, runs the server from inside it, and uploads it as a build artifact.

test/as-desktop.mjs is excluded from CI: it reads the local claude_desktop_config.json, which does not exist on a runner.

Disclaimer

An independent project that reads UNDP's public Open Data API. Not an official UNDP product and not endorsed by UNDP. Data belongs to UNDP; see api.open.undp.org for their terms.

Licensed MIT — see LICENSE.

Available Tools

15 tools
undp_aggregate_projectsAggregate UNDP project fundingA

Aggregate a full year of UNDP projects by operating unit, region, donor country, donor type or CRS sector, returning totalled budget, expenditure and project counts. This is the tool for questions like 'which countries got the most funding in 2023' or 'how much did Germany fund' — it summarises the whole year server-side instead of paging through thousands of projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYesFour-digit year, e.g. '2023'.
limitNo
regionNoRestrict to one region id, e.g. 'RBA'.
sort_byNo
group_byNoDimension to group by.
donor_countryNoRestrict to projects funded by this donor country iso3.
operating_unitNoRestrict to one operating unit iso3.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It states that the tool aggregates server-side, covers a full year, and returns totals and counts, which is a clear read-only query profile. It does not mention authorization, rate limits, or default sort/limit behavior, but for a read-only aggregation tool this is a reasonable level of disclosure.

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 achieve both clarity and economy: the first packs the core behavior and output, the second provides concrete use cases and a contrast with paging. There is no fluff, and the most decision-relevant information is front-loaded.

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 tool with 7 parameters and no output schema, the description gives enough context to select and invoke it correctly: the aggregation behavior, return fields, and example use cases. Minor gaps remain, such as the default behavior when group_by is omitted and the effect of limit, but these do not prevent an agent from making a correct first call.

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?

The schema already covers year, region, group_by, donor_country, and operating_unit with descriptions (71% coverage), and the description adds meaning by illustrating the group_by dimensions and tying them to example questions. However, limit and sort_by have no schema descriptions and the description does not explain them either, leaving a gap that is only partially compensated.

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 ('Aggregate a full year of UNDP projects') and enumerates the grouping dimensions and return fields (totalled budget, expenditure, project counts). It further differentiates from sibling tools by emphasizing server-side summarization 'instead of paging through thousands of projects', making the tool's role unmistakable.

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 concrete example questions ('which countries got the most funding in 2023', 'how much did Germany fund') and contrasts with the alternative approach of paging through projects. While this clearly implies 'use this instead of search_projects for aggregate questions', it does not explicitly name that sibling or state exclusions like 'do not use this for individual project details'.

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

undp_get_operating_unitGet an operating unit's portfolioA

Get one operating unit's (country office's) full project portfolio, including each project's outputs and subnational locations. The upstream document is large, so projects are paginated and outputs are summarised by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
iso3YesOperating unit iso3 code, e.g. 'KEN'.
limitNo
queryNoFilter projects by title.
offsetNo
include_outputsNoInclude each project's outputs. Verbose.
include_locationsNoInclude subnational locations.

TDQS

A3.8/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 of behavioral disclosure. It adds meaningful context beyond the schema: the upstream document is large, projects are paginated, and outputs are summarised by default. This helps agents anticipate response size and default verbosity, though it does not detail pagination mechanics or output shape.

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. The main resource is front-loaded, and the pagination/summarisation caveats are delivered immediately after, giving agents the most decision-relevant information first.

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 6-parameter tool with no output schema and no annotations, the description covers the core purpose, return contents (projects, outputs, subnational locations), and important behavior (pagination and summarisation). It lacks explicit response-structure details and pagination parameter guidance, but is largely sufficient for correct invocation.

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 67%, so the schema already documents iso3, query, include_outputs, and include_locations. The description adds value by stating that outputs are summarised by default, which clarifies the include_outputs parameter. However, it does not explain limit/offset semantics beyond the generic pagination mention.

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 starts with a specific verb and resource: 'Get one operating unit's (country office's) full project portfolio'. It also clearly distinguishes itself from siblings like undp_list_operating_units (list vs. one unit) and undp_get_project (project vs. operating-unit portfolio).

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

Usage Guidelines2/5

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

No guidance is given for when to use this tool versus alternatives such as undp_search_projects or undp_get_project. The description implies this is the 'full portfolio' retrieval path but never explicitly states conditions, exclusions, or trade-offs between sibling tools.

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

undp_get_outputGet a UNDP project outputA

Get one project output: its CRS sector, gender marker, SDG tags, and budget / expenditure / disbursement broken down by fiscal year and donor. Output ids come from undp_get_project.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_idYesOutput id, e.g. '00051078'.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden of explaining behavior. It discloses what data the tool returns and the breakdown dimensions (fiscal year, donor), and 'Get one project output' signals a read-style operation. It does not mention error cases or authentication, but for a single-record retrieval this is a reasonable level of transparency.

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?

The description is a single, front-loaded sentence that leads with the action and resource, then enumerates the returned content and the ID source. There is no filler or redundant restatement of the tool name.

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 tool with one required parameter fully covered by the schema and no output schema, the description is complete enough to call correctly. It states exactly what will be returned and where to get the required ID, so no essential information 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 schema already describes output_id with an example, so baseline is 3 for high schema coverage. The description adds useful semantic context beyond the schema by stating that output IDs come from undp_get_project, which helps the agent locate valid identifiers. This extra guidance justifies a score above baseline.

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 ('Get'), a specific resource ('one project output'), and enumerates the returned fields: CRS sector, gender marker, SDG tags, and budget/expenditure/disbursement by fiscal year and donor. It also distinguishes itself by noting output IDs come from undp_get_project, making it easy to differentiate from sibling tools.

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?

The description clearly implies when to use this tool: when you need detailed data for a single project output. It also provides a routing hint by saying output IDs come from undp_get_project, which tells the agent how to obtain valid inputs. It does not explicitly name alternatives or exclusion conditions, but the context is sufficient for a simple getter.

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

undp_get_projectGet a UNDP projectA

Get the full record for one UNDP project: dates, budget and expenditure by fiscal year, outputs, subnational locations and linked documents. Project ids look like '00122701' and come from undp_search_projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesProject id, e.g. '00122701'.
include_outputsNoInclude the project's outputs.
include_documentsNoInclude linked document titles and URLs.
include_locationsNoInclude subnational locations with coordinates.

TDQS

A4/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 states 'Get' which implies a read-only operation, but does not explicitly disclose safety, authorization requirements, rate limits, or error behavior. The description lists what is returned but not the response format or potential failure modes (e.g., project not found). This is adequate for a simple retrieval but lacks explicit behavioral guarantees.

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?

The description is a single, well-structured sentence that front-loads the core purpose, then lists content, and ends with ID provenance. There is no fluff or repetition. Every clause earns its place, making it highly scannable for an agent.

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 partially fills the gap by listing the categories of data returned (dates, budget, outputs, locations, documents). It also mentions the optional include toggles, giving the agent awareness of response tailoring. However, it does not specify the exact structure or type of the return value (e.g., a JSON object), nor any error handling. Given the tool's simplicity, this is nearly complete.

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 100% and the schema descriptions are already clear for each parameter (e.g., 'Include the project's outputs'). The description adds value by explaining the origin of the project_id and the fact that it's a full record, but it does not elaborate on parameter semantics beyond the schema. Baseline 3 is appropriate when the schema handles documentation.

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 clearly states the verb ('Get') and resource ('full record for one UNDP project'), and enumerates the content: dates, budget and expenditure by fiscal year, outputs, subnational locations, and linked documents. It also distinguishes itself from siblings by noting project ids come from undp_search_projects, making it obvious this is the single-record fetch tool.

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?

The description explicitly tells the agent where to obtain project ids ('come from undp_search_projects'), which is essential routing guidance. It implies the tool is for when you already have a specific project id, and the optional include_* parameters signal that the caller can tailor the response. However, it does not explicitly contrast with alternatives like undp_get_output or undp_aggregate_projects, leaving some inference to the agent.

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

undp_list_approachesList UNDP approaches and markersA

List 'Our Approaches' — the policy markers UNDP tags projects with (gender, capacity development, and similar). The marker types and ids returned here feed the marker_type / marker_id filters on undp_search_projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFour-digit year.
operating_unitNoOperating unit iso3.
include_top_donorsNoInclude top donors and recipients per marker.

TDQS

A4/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden. 'List' implies a read-only operation and the description reveals that the output includes marker types and ids, but it doesn't state output shape, default behavior when optional filters are omitted, or whether include_top_donors changes the result set. Adequate but with clear gaps.

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 focused sentences with no filler. The first sentence defines the resource and gives examples; the second sentence is front-loaded with the downstream use.

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 simple optional-filter list tool, the essential information is present: what it lists, what the output contains, and how the output is consumed. With no output schema, a brief note on the default result set or response format would make it fully complete, but the current context is sufficient for correct invocation.

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 the parameters are already documented by the schema. The description adds a helpful connection to downstream filters but does not add meaning to the individual parameters beyond what the schema provides.

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 uses a specific verb and resource ('List Our Approaches — policy markers'), gives examples ('gender, capacity development, and similar'), and connects the result to marker_type/marker_id filters on undp_search_projects. This clearly separates it from sibling list tools for operating units, SDGs, etc.

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 that the returned marker types and ids are intended to feed the marker filters on undp_search_projects, giving a concrete when-to-use context. It doesn't explicitly enumerate alternatives to avoid, but this is not necessary given the clear downstream purpose.

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

undp_list_crs_sectorsList OECD DAC CRS sector codesA

List the OECD DAC CRS sector codes used to classify UNDP outputs (e.g. 15162 'Human rights'). Useful for decoding the crs field on an output.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoCase-insensitive match on sector name or code.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the behavioral burden. The verb 'List' implies a read-only operation, but the description does not explicitly state safety, return format, or side effects. It adds useful context about classifying UNDP outputs, but does not disclose additional behavior beyond the verb.

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?

The description is a single, focused sentence with no filler. It front-loads the purpose ('List the codes') and immediately provides a usage example, making it easy to scan.

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 simple list tool with one optional parameter and no output schema, the description covers purpose, use case, and an example. It does not mention the return structure or limits, but these are likely trivial for a code list, so the description is sufficient.

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?

The query parameter is fully described in the schema (case-insensitive match on sector name or code), so schema coverage is 100%. The description adds no additional meaning about the parameter beyond its purpose; the schema already handles it, 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 clearly states the verb 'List', the resource 'OECD DAC CRS sector codes', and gives an example (15162 'Human rights'). It also specifies its use case for decoding the `crs` field, which distinguishes it from sibling list tools like undp_list_operating_units.

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 provides a concrete use case ('useful for decoding the `crs` field'), telling an agent when to invoke it. It does not explicitly name alternatives, but the naming convention and sibling context make the purpose clear.

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

undp_list_donor_countriesList UNDP donor countriesA

List countries and territories that contribute funding to UNDP, with total budget and the contributing organisations behind each. Use query to look one up, or list them ranked by contribution.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNoCase-insensitive match on country name or iso3 code.
offsetNo
sort_byNo
include_organisationsNoInclude each country's contributing organisations. Verbose — pair with `query`.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description must carry the behavioral burden. It discloses query-vs-list behavior and that results include budget and contributing organisations, but it does not state defaults, pagination behavior, or whether include_organisations significantly changes response size (the schema's 'Verbose' note helps but lives outside the description).

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, no filler, with the core purpose front-loaded and the invocation pattern immediately following. Every clause contributes information, and the formatting makes it scannable.

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 five-parameter listing tool with no output schema and no annotations, the description captures the main purpose and two usage modes but omits default list size/ordering and pagination expectations. These are material gaps for an agent deciding whether to pass limit/offset/sort_by, so the description is adequate but not complete.

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 only 40% (query and include_organisations have descriptions; limit, offset, sort_by do not beyond the enum). The description adds meaning by tying query to lookup and 'ranked by contribution' to sorting, but it leaves limit and offset semantics entirely to the schema's bare types.

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 ('List') and resource ('countries and territories that contribute funding to UNDP'), and adds the distinguishing content ('total budget and the contributing organisations behind each'). This sets it apart from sibling list tools like undp_list_operating_units or undp_list_regions based on the donor-country domain alone.

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?

The description gives clear in-tool usage ('Use query to look one up, or list them ranked by contribution'), so an agent knows when to query versus list all. However, it never addresses when to choose this tool over the sibling undp_search_donors or another alternative, leaving that selection to inference.

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

undp_list_focus_areasList UNDP focus areasB

List UNDP's focus areas ('Our Focus' thematic pillars) with budget, expenditure, project and donor counts. Optionally include each area's top donors.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoFour-digit year.
budget_sourceNoBudget source iso3 or donor code.
operating_unitNoOperating unit iso3.
include_top_donorsNoInclude the top donors per focus area.

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations and no output schema, the description carries the full burden of disclosing behavior, but it only states that it lists counts and optionally top donors. It does not clarify filtering behavior, defaults when optional parameters are omitted, how budget_source is interpreted, or what the response shape looks like.

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?

The description is concise, front-loaded with the resource and core output metrics, with the optional behavior in a separate sentence. Every sentence contributes information an agent needs to understand what the tool returns.

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?

The description is complete enough for a simple list tool and names its main outputs, but it omits how year, budget_source, and operating_unit combine or what happens when none are supplied. Minor gaps remain given there is no output schema and no annotations.

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 the schema already documents the four parameters. The description adds no parameter-specific meaning beyond the schema, except for 'Optionally include each area's top donors', which maps to include_top_donors. Baseline 3 is appropriate given the schema does most of the work.

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 specifies a clear action ('List'), a precise resource ('UNDP's focus areas / 'Our Focus' thematic pillars'), and the included metrics (budget, expenditure, project and donor counts). This distinguishes it from sibling list tools like undp_list_regions or undp_list_sdgs by naming a unique resource and output content.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus the many sibling list/search/aggregate tools. It also does not explain how optional parameters such as year, budget_source, or operating_unit affect results, leaving usage entirely to inference.

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

undp_list_operating_unitsList UNDP operating unitsA

List UNDP operating units (country offices and regional/global units) with headline budget, expenditure and project counts. Use this to resolve a country name to the iso3 code that every other tool's operating_unit filter expects.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNoCase-insensitive match on unit name or iso3 code, e.g. 'kenya'.
offsetNo
sort_byNoSort key. Financial sorts are descending.
fund_typeNoFilter by fund type, e.g. 'Core', 'Other'.

TDQS

A4/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the behavioral disclosure burden. It does state the return content and the iso3 resolution purpose, but it does not mention pagination, default result limits, or whether all units are returned by default. This is a meaningful gap for a list tool with optional limit and offset parameters.

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 carry the full message with no filler. The purpose is front-loaded, and the usage guidance follows immediately. Every clause 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?

With no required parameters CST, no output schema, and no annotations, the description provides the essential call rationale and return content. It is not fully complete because default pagination behavior and the relationship to undp_get_operating_unit are left implicit, but a correct first call is well supported.

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 60%, with query, sort_by, and fund_type already documented. The description reinforces the query-to-iso3 relationship, but it adds little for the undocumented limit and offset parameters. The conventional names make them understandable, so a baseline 3 is appropriate.

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 verb ('List'), a specific resource ('UNDP operating units'), and the fields returned ('headline budget, expenditure and project counts'). It also clarifies that these units include country offices and regional/global units, which distinguishes it from region or SDG list siblings.

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?

The description gives an explicit use case: 'Use this to resolve a country name to the iso3 code that every other tool's operating_unit filter expects.' This clearly tells an agent when to call it, though it does not name alternatives or state when not to use it, so it stops short of a 5.

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

undp_list_regionsList UNDP regionsA

List the UNDP regional bureaux (RBA, RBAP, RBEC, RBLAC, RBAS, and global units) with aggregate budget, expenditure and project counts, optionally including the countries in each region.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_countriesNoInclude the member-country list for each region. Adds substantial output.

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 behavioral burden; it does disclose that the output contains aggregate budget, expenditure, project counts, and optionally embedded countries. However, it does not mention likely relevant traits such as pagination, output size limits, authentication, or a return envelope, and the 'Adds substantial output' warning lives only in the parameter schema, not the tool description.

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?

A single dense sentence front-loads the resource and action, enumerates the exact bureaux, and mentions the optional parameter. Every clause carries useful information with 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?

Given the low complexity, complete schema coverage, and no output schema, the description is nearly complete for selecting and invoking the tool: it identifies the region set, the returned aggregate fields, and the optional include_countries behavior. The omission of return envelope or pagination details is minor for a simple list 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 coverage for the single parameter is 100%, so the baseline is 3. The description mostly restates the schema's 'member-country list' idea as 'optionally including the countries in each region' and adds no deeper semantic detail about include_countries, while the schema itself already provides the useful output-size warning.

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 uses a specific verb and resource: it says 'List the UNDP regional bureaux' and names the exact bureaux (RBA, RBAP, RBEC, RBLAC, RBAS, and global units). This clearly distinguishes it from sibling list tools like undp_list_operating_units and undp_list_sdgs by identifying a unique resource and the aggregate metrics returned.

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?

The description implies when the tool is appropriate (when a caller wants UNDP regional bureau rollups), but it does not explicitly state when to prefer it over alternatives such as undp_list_operating_units or undp_aggregate_projects, and it gives no when-not-to-use guidance. For a simple list tool the context is adequate but the routing is left implicit.

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

undp_list_sdgsList SDGs with UNDP fundingA

List the 17 Sustainable Development Goals with UNDP project counts, budget and expenditure. Filterable by year, operating unit and budget source. Set include_targets for target-level detail on a single SDG.

ParametersJSON Schema
NameRequiredDescriptionDefault
sdgNoSDG code 1-17, to return just that goal.
yearNoFour-digit year. Defaults to the current year upstream.
budget_sourceNoBudget source iso3 or donor code.
operating_unitNoOperating unit iso3, e.g. 'KEN'.
include_targetsNoInclude per-target breakdown. Best combined with `sdg` — it is verbose.

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 transparency burden. It clarifies the read-only nature through the verb 'list', states what is returned (counts, budget, expenditure), and warns that target-level detail is intended for a single SDG. It does not discuss pagination, limits, or auth, but these are minor for a straightforward list operation.

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?

The description is two sentences with no filler. It front-loads the core purpose and return content, then lists filtering options and the one special behavior worth calling out. Every sentence earns its place.

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?

The description is complete for this tool's complexity: it names what is returned, the available filters, and the target-level mode. Since there is no output schema, the stated return fields are important and present; parameter details are fully covered by the input schema.

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 the parameters are already well documented. The description mostly restates the filtering parameters and the `include_targets` mode without adding meaning beyond what the schema already provides, so the baseline score of 3 is appropriate.

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: 'List the 17 Sustainable Development Goals' with UNDP project counts, budget and expenditure. It also distinguishes itself from target-level listing tools by explicitly reserving `include_targets` for target-level detail on a single SDG.

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?

The description gives clear usage context: the tool lists aggregate SDG funding data and can be filtered by year, operating unit, and budget source. It also indicates when to enable `include_targets`, though it does not explicitly name sibling alternatives or say when not to use this tool.

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

undp_list_sdg_targetsList SDG targetsA

List SDG target-level data (the 1.1, 1.2 … sub-goals) with associated UNDP funding. Filter by SDG code, target id and year.

ParametersJSON Schema
NameRequiredDescriptionDefault
sdgNoSDG code 1-17.
yearNoFour-digit year.
limitNo
offsetNo
targetNoSpecific target id, e.g. '1.1'.
include_top_donorsNoInclude the top donors funding each target.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing basic behavior. It communicates that this is a read-style list operation and that results carry UNDP funding data, but it does not mention pagination behavior, limits, output shape, or any side effects beyond 'list'.

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 with no filler. The core resource and granularity is front-loaded, and the filter options are stated directly in the second sentence.

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?

Adequate for a simple list tool, but gaps remain: no output schema, no annotations, and no mention of limit, offset, or include_top_donors behavior. An agent could still call it correctly with the filter parameters, but pagination and optionality are left under-specified.

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 67%, with limit and offset undocumented. The description reinforces the meaning of the target parameter by showing sub-goal examples and adds the funding context, but it does not compensate for the undocumented pagination parameters or explain how filters combine.

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 action ('List') and resource ('SDG target-level data') and clarifies granularity with the parenthetical sub-goal examples ('1.1, 1.2 …'). It also names the associated data ('UNDP funding'), which distinguishes it from the sibling undp_list_sdgs tool.

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?

The description makes clear it is used for listing target-level SDG data and filtering by SDG code, target id and year. However, it does not explicitly say when to choose this over alternative sibling tools or provide exclusions, leaving usage guidance mostly implied.

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

undp_list_signature_solutionsList UNDP signature solutionsA

List UNDP's six signature solutions (the Strategic Plan delivery areas) with aggregate funding and project counts.

ParametersJSON Schema
NameRequiredDescriptionDefault
include_detailsNoInclude top budget sources and top recipient offices for each solution.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns a list of six signature solutions with aggregate funding and project counts, which goes beyond the tool name and adds useful behavioral context. There are no unexpected side effects implied, and the scope of the output is clearly bounded to six items.

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?

The description is a single, tightly worded sentence with no wasted words. The core action and resource are front-loaded, and the parenthetical adds useful context without bloating the text.

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 read-only list tool with one optional boolean parameter and no output schema, the description provides the essential return information: six signature solutions with aggregate funding and project counts. The optional parameter behavior is already covered by the schema. Nothing an agent needs to select and 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.

Parameters3/5

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

Schema description coverage is 100%, since the single parameter include_details already has a clear description in the schema. The tool description adds no extra information about the parameter, but it does not need to because the schema fully documents it. This meets the baseline for schema-covered parameters.

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 verb ('List') and resource ('UNDP's six signature solutions'), and adds clarifying context by calling them 'the Strategic Plan delivery areas' and specifying the output includes aggregate funding and project counts. This clearly distinguishes it from the sibling list tools, which target different entities like operating units, regions, SDGs, and focus areas.

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?

The description makes it clear this tool is for listing signature solutions, so an agent can infer when to use it. However, it gives no explicit guidance on when not to use it or how it compares to sibling list tools, such as focus areas or approaches. The usage guidance is implied rather than stated.

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

undp_search_donorsSearch UNDP donorsA

Search the index of organisations that fund UNDP (governments, multilaterals, foundations, private sector) by name or id. A query is required — the full index holds thousands of donors and is too large to list. Returns the donor id used as budget_source elsewhere.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYesCase-insensitive match on donor name or id, e.g. 'germany', 'gates'.
offsetNo
countryNoFilter by the donor's country code, e.g. 'DEU'.

TDQS

A4/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 behavioral burden. It usefully reveals that the index is large, that a query is mandatory, and that it returns the donor id used as budget_source. However, it does not describe the response shape, pagination behavior, empty-result handling, or what happens when no match is found.

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?

The description is three concise sentences with no filler. It front-loads the tool's purpose, then gives the key usage constraint and the most important return-value fact. Every sentence 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?

Given the tool's relative simplicity, the description is nearly complete: it identifies the required query, explains why it is needed, and states the crucial return value (donor id used as budget_source). The main omission is a description of the output format, but enough is provided for correct invocation.

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?

The schema documents query and country but leaves limit and offset undocumented. The description adds meaning by explaining why query is required and that it matches on donor name or id, but it does not compensate for the missing limit/offset semantics. Overall coverage is approximately 50%, so the description only partially adds value beyond the schema.

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 uses the specific verb 'Search' and names a precise resource: 'the index of organisations that fund UNDP (governments, multilaterals, foundations, private sector)'. It also states search keys (name or id), clearly distinguishing this tool from sibling tools that search projects or list operating units and regions.

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?

The description explicitly notes that a query is required and explains why: the full index is too large to list. This gives clear context for when to use the tool. It does not explicitly name sibling alternatives, but no sibling appears to be a direct donor-search alternative.

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

undp_search_projectsSearch UNDP projectsA

Search UNDP projects for a given year, filtered by country, SDG, focus area, signature solution, budget source or policy marker. Returns a compact record per project (title, budget, expenditure, SDGs, donors). Results are paginated — follow next_offset for more. Use undp_get_project for the full detail of one project.

ParametersJSON Schema
NameRequiredDescriptionDefault
sdgNoSDG code 1-17.
yearYesFour-digit year. Required by the API, e.g. '2023'.
limitNoProjects per page (max 50). Each carries SDG, donor and marker lists, so a larger page cannot fit one result.
queryNoFree-text search over the title and description of EVERY project matching the other filters, not just one page. Costs a few extra requests on a cold cache. Combine with `year`/`operating_unit` to keep it quick.
offsetNo
sectorNoFocus area ('our focus') code.
marker_idNoPolicy marker subtype id.
sdg_targetNoSDG target code, e.g. '1.1'.
budget_typeNoBudget type, e.g. 'core' / 'non-core'.
marker_typeNoPolicy marker type, from undp_list_approaches.
budget_sourceNoBudget source iso3 or donor code.
operating_unitNoOperating unit iso3, e.g. 'KEN'.
signature_solutionNoSignature solution code.
include_descriptionNoInclude the (truncated) project description.

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses that results are paginated, that the tool returns a compact record per project, and that the query parameter searches across ALL matching projects (not just one page) and costs extra requests on a cold cache. This is meaningful behavioral context beyond what the schema provides. It doesn't mention rate limits or auth, but the disclosed behaviors are substantial.

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?

Three sentences with zero waste. The first sentence states the core function and filters, the second describes the return format and pagination, and the third routes to the sibling tool. Every sentence earns its place and the most important information is front-loaded.

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 search tool with 14 parameters and no output schema, the description is quite complete. It covers the return format, pagination, and the key alternative tool. It doesn't explain the meaning of each filter code (e.g., what a signature solution code looks like), but the schema descriptions cover those. The main gap is that it doesn't mention how to discover valid filter values (e.g., using undp_list_* tools), but the sibling names make that inferable.

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 93%, so the schema already documents most parameters well. The description adds value by summarizing the filter dimensions and clarifying the return shape (compact record with title, budget, expenditure, SDGs, donors). It also adds behavioral context for the query parameter (searches every project, costs extra requests) that goes beyond the schema. The description doesn't need to repeat each parameter since the schema is rich.

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 ('Search'), a resource ('UNDP projects'), and the key filtering dimensions (year, country, SDG, focus area, signature solution, budget source, policy marker). It also explicitly distinguishes itself from undp_get_project by noting it returns a compact record per project while the sibling provides full detail. This is a clear, specific purpose that an agent can act on.

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?

The description explicitly says to use undp_get_project for full detail of one project, providing a clear alternative and the condition that selects it. It also explains pagination behavior ('follow next_offset for more'), which guides the agent on how to use the tool correctly. This is explicit when/when-not guidance.

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. 15 tool updatesv1.0.0
    • First observedundp_aggregate_projects
    • First observedundp_get_operating_unit
    • First observedundp_get_output
    • First observedundp_get_project
    • First observedundp_list_approaches
    • First observedundp_list_crs_sectors
    • First observedundp_list_donor_countries
    • First observedundp_list_focus_areas
    • First observedundp_list_operating_units
    • First observedundp_list_regions
    • First observedundp_list_sdg_targets
    • First observedundp_list_sdgs
    • First observedundp_list_signature_solutions
    • First observedundp_search_donors
    • First observedundp_search_projects

TDQS

A3.9/5.0

Scored across 15 tools

Disambiguation4/5

Most tools are clearly distinct by resource type (operating units, regions, SDGs, projects, donors), but undp_list_operating_units and undp_get_operating_unit could be confused at first glance, and undp_list_sdgs vs undp_list_sdg_targets are similar in name though distinct in granularity. Overall, descriptions clarify boundaries well.

Naming Consistency4/5

The set follows a consistent undp_verb_noun pattern: list_*, get_*, search_*, aggregate_*. Minor deviation: undp_list_donor_countries is a list but requires a query, and undp_search_donors vs undp_list_donor_countries have overlapping list/search semantics. Still, the pattern is predictable.

Tool Count5/5

15 tools is well within the ideal range for a data-rich open data server. Each tool covers a distinct facet of the UNDP data model (reference lists, project search/detail, aggregation, donor lookup), and none feel redundant or superfluous.

Completeness4/5

The surface covers the core domain well: reference data (regions, SDGs, focus areas, sectors), project search and detail, output detail, operating unit portfolios, and aggregate queries. Minor gaps: no direct tool for listing all projects without search filters, and no tool for fetching a specific donor's full profile, but these are workable via existing tools.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers