Skip to main content
Glama

portugal-mcp

CI Live sources PyPI

Portugal's public data for AI assistants, in one MCP server. Ask Claude (or any MCP client) about the weather and warnings, a postal code, unemployment or inflation, the Euribor, what Parliament voted, who won a public contract, how busy the emergency rooms were, whether a medicine is in shortage, the cheapest fuel nearby, when the next train to Porto leaves or how much has burned this fire season.

Read-only, no API keys, no accounts. Every answer comes from an official or public open-data source and says which one and for which date. Not affiliated with any of the sources.

Português: servidor MCP com os dados públicos de Portugal (IPMA, INE, Banco de Portugal, Parlamento, Portal BASE, dados.gov.pt, SNS, Infarmed, DGEG, MOBI.E, Carris Metropolitana, horários da CP, Metro de Lisboa, Carris e Fertagus, incêndios do EFFIS). Só leitura, sem chaves. As ferramentas aceitam perguntas em português.

What it covers

Feature

Tools

Source

clima

weather_forecast, weather_warnings, fire_risk, sea_forecast, earthquakes

IPMA

geo

postal_code, where_is, municipality, public_holidays

GeoAPI.pt (CAOP, CTT, INE census); holidays computed from the Labour Code

ine

ine_search, ine_indicator

INE indicator API

bpstat

bpstat_search, bpstat_series

Banco de Portugal BPstat

parlamento

parliament_search, parliament_initiative, parliament_votes, parliament_deputies

Assembleia da República open data

contratos

public_contracts, public_contracts_summary

IMPIC / Portal BASE

dados

open_data_search, open_data_dataset, open_data_preview

dados.gov.pt

saude

sns_find_institutions, sns_emergency_stats, sns_surgery_wait_stats, sns_consultation_wait_stats, sns_search_datasets, sns_query_dataset

SNS Transparency portal

medicamentos

medicine_availability, pharmacies, find_medicine_near, medicine_help

Infarmed public pages, pharmacies on duty

energia

fuel_prices, fuel_station_detail, fuel_types, ev_chargers, ev_charger_detail

DGEG, MOBI.E

transportes

bus_find_stops, bus_next_arrivals, bus_line_info, bus_service_alerts, bus_vehicle_positions

Carris Metropolitana API

transit

transit_operators, transit_find_stops, transit_departures, transit_trips_between

Official GTFS timetables of CP, Metro de Lisboa, Carris and Fertagus

incendios

wildfires

EFFIS (Copernicus, CC BY 4.0)

There are 47 tools in total. If your client struggles with that many, load only what you need with PORTUGAL_MCP_FEATURES (see below).

Things to know

  • Statistics are dated. INE, BPstat and SNS figures are official series with a reference period, often a few months back. Answers quote the period.

  • Health and medicines: information, not advice. SNS figures are monthly statistics, not live emergency-room queues. Per-pharmacy stock is not public in Portugal, so the tools never claim a pharmacy has a medicine. In an emergency call 112; for health advice call SNS 24, 808 24 24 24.

  • Parliament: votes are recorded per parliamentary group, as the Parliament publishes them. The first call downloads about 100 MB (roughly a minute), then it is cached for a day.

  • Public contracts: the yearly BASE files are 15-55 MB, so the first query for a year takes a minute or two. Amounts are contract prices without VAT as reported by the buyer. Tax numbers (NIF) of individual people are hidden; company and public-body NIFs are shown.

  • Fuel / EV: the first EV query loads the national MOBI.E feed (about 80 s), then it is cached.

  • Timetables are scheduled, not live. CP, Metro de Lisboa, Carris and Fertagus publish official GTFS timetables; each is loaded into a local SQLite file on first use (Carris takes about 20 s) and refreshed when the operator publishes a new one. transit_trips_between finds direct services only (no changes). Metro do Porto and STCP do not publish a current official feed.

  • Wildfires are satellite-mapped burnt areas (EFFIS), a day or more after the fact, not live incidents. For today's danger use fire_risk; in an emergency call 112.

Related MCP server: IPMA MCP Server

Install

Needs Python 3.10+. With uv nothing else is required:

uvx portugal-mcp --list-tools

Or with pip: pip install portugal-mcp.

Claude Code

claude mcp add portugal -- uvx portugal-mcp

Claude Desktop

Add this to claude_desktop_config.json (also in claude_desktop_config.snippet.json):

{
  "mcpServers": {
    "portugal": {
      "command": "uvx",
      "args": ["portugal-mcp"]
    }
  }
}

Codex and other MCP clients

Any client that runs stdio servers works: command uvx, args ["portugal-mcp"]. For HTTP, run portugal-mcp --http, which serves streamable HTTP on 127.0.0.1:8000 (change it with MCP_HOST / MCP_PORT).

Configuration

Variable

Default

What it does

PORTUGAL_MCP_FEATURES

all

Comma list of features to load (clima,geo,ine) or to drop (-contratos,-parlamento).

PORTUGAL_MCP_CACHE_DIR

OS cache dir

Where downloaded files are cached.

PORTUGAL_MCP_LOG_LEVEL

INFO

Log level; logs go to stderr.

portugal-mcp --refresh downloads the large files ahead of time (Parliament, this year's contracts, EV chargers, timetables) and then exits.

Example questions

  • "Vai chover no Porto esta semana? Há avisos?"

  • "Qual é o risco de incêndio hoje em Monchique?"

  • "What's the unemployment rate in Portugal, latest month?"

  • "Como evoluiu a Euribor a 6 meses nos últimos 12 meses?"

  • "O que o Parlamento votou sobre habitação este mês, e como votou cada partido?"

  • "Quais os maiores ajustes diretos de 2026? Quanto a Câmara de Lisboa contratou este ano?"

  • "Preciso de ibuprofeno em Coimbra — está em rutura? Que farmácias estão de serviço?"

  • "Gasóleo mais barato perto de Setúbal" / "Carregadores rápidos perto do Marquês"

  • "Quando passa o próximo autocarro na paragem do Cais do Sodré?"

  • "Comboios diretos de Lisboa Oriente para o Porto amanhã de manhã?" / "Próximo elétrico 28 nos Prazeres?"

  • "Quanta área ardeu este ano no Algarve?"

Development

python -m venv .venv && .venv/bin/pip install -e ".[dev]"
pytest              # offline unit tests (fixtures, no network)
pytest -m live      # hits every real source; CI runs this daily
ruff check .

CONTRIBUTING.md explains how features are laid out and the rules for adding a source. SECURITY.md explains how to report a vulnerability.

Maintenance

  • CI: lint and unit tests on Linux and Windows for every push and pull request, plus pip-audit.

  • Live sources: a daily run against the real APIs that opens an issue when a source changes its format.

  • Dependabot: proposes dependency and GitHub Actions updates. Actions are pinned by commit SHA.

  • Releases: only from a version tag, and only after the tests pass. Publishing goes through PyPI trusted publishing and the official MCP Registry, with no stored tokens.

Replaces

This package merges four earlier servers by the same author, which are now deprecated: sns-portugal-mcp, portugal-medicines-mcp, portugal-fuel-ev-mcp and carris-metropolitana-mcp. Their tools continue here. The SNS, medicine and bus tools now carry a prefix (sns_, medicine_, bus_) so they stay unambiguous among the 47 tools.

License

MIT. The data belongs to its publishers and is used under their open-data terms; please credit them when you reuse it.

Available Tools

42 tools
bpstat_seriesA

Observations of Banco de Portugal series (ids from bpstat_search).

Args: series_ids: one or more series ids (max 10), e.g. [12559924]. last_n: latest observations per series (1-500). Ignored when since is given. since: "YYYY-MM-DD" — return every observation from this date. lang: "PT" or "EN".

NameRequiredDescriptionDefault
langNoPT
sinceNo
last_nNo
series_idsYes

Output Schema

NameRequiredDescription

No output parameters

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 burden. It does disclose useful constraints — max 10 series, last_n capped at 1-500, and that since overrides last_n — which goes beyond the schema. It does not cover error behavior for invalid ids, rate limits, or whether the call is purely read-only, so the disclosure is helpful but partial.

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 purpose statement is front-loaded and the Args block is compact with one line per parameter. Slightly terse phrasing ('Observations of ...') is the only cost; there is no redundant 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?

An output schema exists, so return values need not be described, and all four inputs are covered. The remaining gap is edge-case behavior (what happens when more than 10 ids are passed, or an unknown id), which matters for a data-retrieval tool but is minor.

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

Parameters5/5

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

Schema description coverage is 0%, yet the Args block documents all four parameters: types, example format ([12559924]), numeric ranges (max 10; 1-500), the 'YYYY-MM-DD' format for since, allowed lang values ('PT'/'EN'), and the interaction rule that since overrides last_n. This fully compensates for the empty 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?

States a specific resource ('Observations of Banco de Portugal series') and explicitly routes id discovery to the sibling bpstat_search, which is the one sibling an agent could confuse it with. The verb+resource pairing plus the cross-reference makes the tool's role unambiguous.

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 mention of 'ids from bpstat_search' implies the correct call sequence (search first, then fetch), but there is no explicit 'use this when...' or 'do not use for...' statement, and no guidance on choosing between last_n and since beyond the precedence note.

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

bus_find_stopsA

Find Carris Metropolitana bus stops by name and/or near a coordinate.

Use this first whenever the user names a place, street, station or gives a location, to get the stop_id needed by bus_next_arrivals. Results include the lines serving each stop.

Args: query: Text to match in the stop name (accent/case-insensitive, all words must match), e.g. "Gare do Oriente", "Cacilhas terminal". A 6-digit stop id also works. lat, lon: A coordinate (WGS84). Results are sorted by straight-line distance from it. Note: buses inside Lisbon city are mostly run by Carris (a different company, not covered here); Carris Metropolitana serves the wider region. radius_m: Only stops within this many metres of lat/lon. Default 500 when no query is given; unlimited when a query is given. limit: Max stops to return (default 10, max 50).

NameRequiredDescriptionDefault
latNo
lonNo
limitNo
queryNo
radius_mNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

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

No annotations are supplied, so the description carries the full burden and does well: it discloses distance-sorted results, result contents (lines serving each stop), accent/case-insensitive matching requiring all words, that a 6-digit id is accepted as a query, and the conditional radius default. It omits only edge behavior such as what is returned when nothing matches or when lat/lon is supplied without a query and no stops fall in range.

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?

Purpose and the 'use this first' routing rule are front-loaded, then a compact Args block gives per-parameter detail. The Lisbon/Carris caveat is the only aside, and it earns its place by preventing a false-negative conclusion.

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?

An output schema exists, so return values need not be described, and the description still notes that results include serving lines. With five optional parameters, no annotations, and a coordinate-based search, everything an agent needs to call this correctly is present.

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

Parameters5/5

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

Schema description coverage is 0%, and the description fully compensates: every one of the five parameters gets concrete semantics (matching rules, WGS84, default 500 m only when no query, default 10 / max 50). The conditional interaction between radius_m default and the presence of query is information available nowhere in 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 first sentence names a specific verb and resource (find bus stops) and scopes it to a named operator, Carris Metropolitana. It is immediately distinguishable from siblings like bus_next_arrivals and bus_line_info, which are explicitly framed as downstream consumers of this tool's output.

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?

Explicitly states 'Use this first whenever the user names a place, street, station or gives a location', and names the dependent tool (bus_next_arrivals) that consumes the returned stop_id. It also adds a genuine scope exclusion — Lisbon city buses are Carris, not covered here — which prevents a predictable misfire.

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

bus_line_infoA

Details of a Carris Metropolitana line: name, route ends, directions, municipalities.

Use for "where does line 4715 go?", "which bus goes from Cacilhas to Almada?", or to check whether a line passes a stop (include_stops=True). If line is not an exact line number it is treated as text (e.g. "Oriente Setubal") and the matching lines are listed instead. trips_today = 0 means the line does not run today (some lines are seasonal or weekday-only). Departure times past midnight are written "24:30", "25:10" (same service day).

Args: line: 4-digit line number ("4715") or free text matched against line names. include_stops: Also list every stop (id + name) in order for each direction.

NameRequiredDescriptionDefault
lineYes
include_stopsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations at all, the description carries the full burden and does real work: it discloses the free-text fallback (non-exact input lists matching lines rather than erroring), explains that trips_today = 0 means the line does not run today, and warns about past-midnight times written as '24:30'. It doesn't cover behavior on zero matches or result-set size limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the returned fields, then usage examples, then a compact Args block. Every line carries information the agent would not otherwise have; nothing is filler.

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?

An output schema exists, so return values needn't be spelled out, and the description instead spends its budget on edge cases the schema can't express (seasonal/weekday-only lines, midnight rollover, free-text fallback). For a 2-parameter lookup tool this is complete.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and does: 'line' is documented as either a 4-digit number or free text matched against line names, with the divergent behavior for each case, and 'include_stops' is documented as listing every stop id+name in order per direction. This adds meaning well beyond the bare string/boolean types in 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 opens with a specific verb+resource ('Details of a Carris Metropolitana line') and enumerates the concrete fields returned (name, route ends, directions, municipalities). The follow-up examples ('where does line 4715 go?') make it unmistakable versus siblings like bus_find_stops or bus_next_arrivals.

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 clear use cases and even routes an internal decision ('include_stops=True' to check whether a line passes a stop). What it lacks is an explicit exclusion naming the sibling to use instead for stop lookup or arrival times, so the agent must infer that boundary from the sibling names.

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

bus_next_arrivalsA

Upcoming buses at a Carris Metropolitana stop, real-time where available.

Use for "when is the next bus at X?" (get stop_id from bus_find_stops first). Each arrival says whether it is "realtime" (live GPS estimate) or "scheduled" (timetable only: the bus may not have started its trip yet). minutes_from_now uses the real-time estimate when present. Times are Europe/Lisbon. Only today's operational day is covered, so late at night the list may be short or empty.

Args: stop_id: 6-digit stop id, e.g. "060361". line_id: Optional 4-digit line number to keep only that line, e.g. "2794". limit: Max arrivals to return (default 10, max 50).

NameRequiredDescriptionDefault
limitNo
line_idNo
stop_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does it well: it explains the realtime vs scheduled distinction and the caveat that a scheduled bus may not have started its trip, that minutes_from_now prefers the real-time estimate, that times are Europe/Lisbon, that only today's operational day is covered, and that the list may be short or empty late at night.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then caveats, then args — no wasted sentences and the operational-day warning is placed where it will be read. The Args block restates parameter names already in the schema, which is slightly redundant, but the format constraints it adds justify its presence.

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?

An output schema exists, so return-value semantics needn't be spelled out here, and the behavioral caveats an agent needs to interpret an empty or short list are all present. Nothing material is missing for a 3-parameter read tool without annotations.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate and does: stop_id is a 6-digit id with an example, line_id is an optional 4-digit line filter with an example, and limit is documented with default 10 and max 50 — the max is not in the schema at all.

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

Purpose5/5

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

States a specific verb + resource + scope: 'Upcoming buses at a Carris Metropolitana stop, real-time where available.' The real-time qualifier distinguishes it from timetable/schedule siblings, and the tool is clearly not a stop finder (bus_find_stops) nor a vehicle-position feed (bus_vehicle_positions).

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?

Gives an explicit trigger phrase ('when is the next bus at X?') plus the prerequisite workflow: obtain stop_id from bus_find_stops first. It does not, however, mention when a caller would prefer bus_vehicle_positions or bus_line_info instead, so there is no stated exclusion.

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

bus_service_alertsA

Service alerts (detours, works, strikes, stops not served) for Carris Metropolitana.

Use before recommending a trip, or when the user asks "is line X disrupted?". Filter by line and/or stop; with no filter, returns all current alerts (there are often ~100). Alerts are mostly published in Portuguese only.

Args: line_id: 4-digit line number, e.g. "4407". stop_id: 6-digit stop id, e.g. "160584". include_upcoming: Also return alerts that start in the future (default True). language: Preferred language ("pt" or "en"); falls back to what exists. limit: Max alerts to return (default 20, max 100).

NameRequiredDescriptionDefault
limitNo
line_idNo
stop_idNo
languageNopt
include_upcomingNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/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 behavioral burden. It usefully discloses the likely volume (~100 alerts with no filter), that alerts are mostly Portuguese-only, and how defaults behave, though it does not discuss update frequency or source reliability.

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 front-loaded with purpose and usage, then presents parameters in a compact, scannable block. Every sentence and parameter note adds actionable information.

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?

Given there is an output schema, the description need not explain return values. It covers all five parameters, their formats/defaults, the no-filter behavior, language limitation, and when to invoke the tool, leaving no material gap for correct invocation.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate, and it does: line_id is described as a 4-digit line number with an example, stop_id as a 6-digit stop id with an example, include_upcoming and language defaults are explained, and limit is given a default and maximum.

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 resource and scope: service alerts for Carris Metropolitana, including the kinds of disruptions covered. It clearly distinguishes this tool from sibling bus tools such as bus_next_arrivals, bus_line_info, and bus_find_stops.

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 gives explicit usage guidance: use before recommending a trip, or when the user asks whether a line is disrupted. It also explains that filtering by line and/or stop is optional and that no filter returns all current alerts.

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

bus_vehicle_positionsA

Live GPS positions of the buses currently running on a Carris Metropolitana line.

Use for "where is the 3508 right now?" or to see how many buses are out on a line. Each vehicle includes its position, heading, speed, the stop it is at / heading to, and how many seconds old the fix is.

Args: line_id: 4-digit line number, e.g. "3508".

NameRequiredDescriptionDefault
line_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does a fair job: it discloses that each vehicle carries position, heading, speed, current/next stop, and the fix age in seconds, which tells the agent how fresh and how rich the data is. It omits error/no-vehicle behavior and any rate-limit or caching expectations for live data.

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?

Purpose is front-loaded in the first sentence, followed by use cases, payload contents, and then the Args block. Every sentence adds information an agent would otherwise have to guess; nothing is padding.

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?

An output schema exists, so return-value explanation is optional, and the description still summarizes the payload shape helpfully. The only real gap is what happens for an unknown or non-operating line (empty result vs. error), which matters for a live-data tool with a free-form string id.

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

Parameters5/5

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

Schema coverage is 0% and line_id has no schema description, so the description must compensate — and it does, specifying a 4-digit line number with the concrete example "3508". That is exactly the format detail an agent needs to construct a valid call.

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 and resource — live GPS positions of buses on a Carris Metropolitana line — and the qualifier 'currently running' pins down the scope. An agent can distinguish it from bus_next_arrivals or bus_line_info without reading either schema.

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

Usage Guidelines4/5

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

Gives two concrete usage scenarios ("where is the 3508 right now?" and counting buses out on a line), which clearly frames when to reach for it. It stops short of naming the sibling alternatives that handle other bus questions, so there is no explicit when-not guidance.

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

earthquakesA

Recent earthquakes recorded by IPMA.

Args: region: "mainland" (mainland Portugal and Madeira) or "azores". days: look back this many days (max 30). min_magnitude: only quakes at or above this magnitude. limit: max rows (newest first).

NameRequiredDescriptionDefault
daysNo
limitNo
regionNomainland
min_magnitudeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose a real constraint (days max 30) and ordering behavior (rows returned newest first), which is valuable. It says nothing about return shape, empty-result behavior, or whether results are cached/live beyond 'recent', leaving gaps for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded and each parameter line is one clause with no filler. The 'Args:' docstring formatting is slightly mechanical but costs almost nothing in length.

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?

All four parameters are explained despite 0% schema coverage, and an output schema exists so return values need not be described. The main residual gap is the absence of any safety/read-only statement, though the tool is self-evidently a read query.

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 0%, so the description must compensate, and it largely does: region gets its two allowed values with a parenthetical covering Madeira, days gets a max of 30, min_magnitude is defined as a lower bound, and limit is defined as a row cap with newest-first ordering. It stops short of syntax details (e.g., decimal precision) and does not repeat the schema defaults.

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

Purpose4/5

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

The first line gives a specific resource and source: recent earthquakes recorded by IPMA. There is no direct sibling conflict among the listed tools, so no cross-tool differentiation is required, but the description does not state geographic coverage limits beyond the region parameter.

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

Usage Guidelines3/5

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

Usage is implied by the parameter list (look back N days, filter by magnitude, cap rows), but there is no explicit when-to-use or when-not-to-use statement and no alternative tool is named. An agent can infer it is a query tool for seismic events, but nothing more.

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

ev_charger_detailA

Everything about one MOBI.E charging site: all its points with live status, power, connectors and price, plus operator contact, opening hours and accepted authentication (app, RFID card, credit card...).

Use after ev_chargers. Accepts a site_id (e.g. "EZC-AMD-00051"), a point_id (e.g. "AMD-00051-1") or an EVSE id (e.g. "PTEZCEAMD00051*1").

NameRequiredDescriptionDefault
site_or_point_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations at all, the description carries the full disclosure burden. It reveals the richness of the payload (live status, pricing, auth methods), which implies a read, but never states permissions, rate limits, or what happens with a malformed or unknown id.

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, front-loaded with the payload description, then the sequencing hint, then the argument formats. No filler and no repetition of structured fields.

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?

An output schema exists so return-value explanation is unnecessary, and the single required parameter is fully disambiguated. The only gap is error behavior for unresolvable ids, minor for a one-parameter lookup.

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

Parameters5/5

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

Schema coverage is 0% — the sole parameter 'site_or_point_id' is bare in the schema. The description fully compensates by naming all three accepted id forms and giving a concrete example of each ("EZC-AMD-00051", "AMD-00051-1", "PT*EZC*E*AMD*00051*1"), which is exactly what an agent needs to build the call.

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

Purpose5/5

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

States a specific verb+resource: retrieve everything about one MOBI.E charging site, enumerating the returned facets (points, live status, power, connectors, price, operator contact, hours, auth methods). This clearly separates it from the list-oriented sibling ev_chargers without either schema being opened.

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?

"Use after ev_chargers" gives explicit sequencing relative to the sibling that produces the ids this tool needs. It stops short of stating when NOT to use it or when to prefer fuel_station_detail, so it is clear context rather than a full routing rule.

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

ev_chargersA

Public EV charging sites near a point in Portugal (MOBI.E network), nearest first, with live status and the price the network publishes for each charging point.

Use for "where can I charge near X?", "fast chargers near me", "is there a free CCS charger nearby?". Needs coordinates; if the user gives a place name, use known coordinates for it. Covers mainland Portugal, Azores and Madeira.

Args: lat, lon: Point to search around (WGS84). radius_km: Search radius (default 5, max 100). min_power_kw: Only points that can deliver at least this power, e.g. 50 for fast DC. connector: "CCS" (CCS2), "Type 2", "CHAdeMO", "CEE", or "DC" / "AC". available_only: Only points whose live status is "available" right now. limit: Max sites to return (default 10, max 50).

Each site: operator, address, distance_km, opening hours and its matching points, each with status (available, in use, out of order...), max power, connectors and price (per_kwh / per_minute / per_session in EUR, from the feed). IMPORTANT: these are the charging operator's published fees and may not be the whole bill: see price_note and tell the user. data_freshness says how old the inventory and live status are. The first call of the day downloads ~220 MB from MOBI.E and can take 1-3 minutes.

NameRequiredDescriptionDefault
latYes
lonYes
limitNo
connectorNo
radius_kmNo
min_power_kwNo
available_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it warns that the first call of the day downloads ~220 MB and may take 1-3 minutes (a real latency/side-effect trait), discloses data staleness via data_freshness, and flags that published fees may not be the whole bill, instructing the agent to relay price_note. These are exactly the non-obvious behaviors an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then Args and a return summary — a structure an agent can scan. It is somewhat long, and the enumeration of return fields overlaps with the existing output schema, though the 'tell the user about price_note' instruction justifies part of that restatement.

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

Completeness5/5

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

For a 7-parameter tool with an output schema and no annotations, the description covers what the schema cannot: geographic coverage, cold-start cost, live-status semantics, freshness, and the pricing disclaimer. Nothing needed to call it correctly or to interpret results responsibly 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 0% and the schema has no enums, so the description must compensate — and it does, documenting units (WGS84), defaults and caps (radius 5/100, limit 10/50), the semantics of min_power_kw with a concrete example (50 for fast DC), and the accepted connector values (CCS2, Type 2, CHAdeMO, CEE, DC/AC). The value list is the single most important addition since the schema types connector as a bare string; only minor ambiguity (e.g. how 'DC' interacts with min_power_kw) remains.

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 resource (public EV charging sites on the MOBI.E network), the geographic scope (mainland Portugal, Azores, Madeira) and the ordering (nearest first with live status and prices). It is clearly distinguishable from the fuel_* siblings and from ev_charger_detail, which the 'each site' summary implicitly frames as the bulk-listing counterpart.

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?

Gives concrete trigger phrasings ('where can I charge near X?', 'fast chargers near me') and the prerequisite that coordinates are required, with a fallback instruction if the user supplies a place name. It stops short of explicitly naming ev_charger_detail as the tool for drilling into a single site, so routing to the sibling is left implicit.

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

find_medicine_nearA

One-shot answer to "I need medicine X in city Y — what do I do?" in Portugal.

Runs medicine_availability(medicine) and pharmacies(city or lat/lon), and returns: the shortage status (compact), the pharmacies on duty today and the ones open now (nearest first when lat/lon are given), the help lines (Linha 1400, SNS 24, 112) and next steps. It never says a pharmacy has the medicine: stock is not public.

Args: medicine: Brand name or active substance, e.g. "quetiapina", "Brufen 400". city: Municipality or town, e.g. "Lisboa". Or give lat/lon instead. lat, lon: Optional user position (sorts pharmacies by distance). limit: Max pharmacies returned (default 8).

NameRequiredDescriptionDefault
latNo
lonNo
cityNo
limitNo
medicineYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does real work: it discloses the output contents (shortage status, on-duty and open-now pharmacies, help lines, next steps), the nearest-first ordering when lat/lon is supplied, and the critical caveat that stock is not public so it will never claim a pharmacy has the medicine. It omits read-only framing, failure behavior when neither city nor lat/lon is given, and any rate/coverage limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the user question it answers, then composition, then returns, then args — a logical scan order. The returns sentence is a dense run-on listing five outputs, which could be broken up, but no sentence is filler.

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

Completeness4/5

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

For a five-param aggregator with an output schema and no annotations, the definition covers composition, output shape, ordering, and the key stock caveat. Gaps are minor: no statement of what happens if neither city nor lat/lon is supplied, and no bounds guidance for limit beyond the default.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate, and it does: all five parameters are explained with format examples ('quetiapina', 'Brufen 400', 'Lisboa'), the default for limit, and the city-vs-lat/lon alternative. This adds meaning well beyond the bare typed properties.

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 composite action — running medicine_availability + pharmacies to answer one question — and names both underlying sibling tools. An agent can tell immediately this is an aggregator rather than a raw lookup, distinct from medicine_availability and pharmacies alone.

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 framing sentence ('I need medicine X in city Y — what do I do?') gives a clear trigger condition, and naming the two sibling calls it composes implies the alternative of calling those directly. It stops short of explicitly saying 'use the lower-level tools when you only need shortage status or pharmacy hours.'

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

fire_riskA

Wildfire danger (RCM, risco de incêndio rural) for a municipality, today or tomorrow.

Args: municipality: concelho name, e.g. "Sintra", "Monchique". day: 0 = today, 1 = tomorrow. Scale: 1 reduzido, 2 moderado, 3 elevado, 4 muito elevado, 5 máximo.

NameRequiredDescriptionDefault
dayNo
municipalityYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/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 does disclose the meaning of the returned scale (1 reduzido through 5 máximo), which is genuinely valuable, but it says nothing about data source/freshness, behavior for unknown or ambiguous municipality names, or whether tomorrow's value can be unavailable. For a lookup tool the risk is low, so a 3 is fair.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-liner followed by compact Args and Scale blocks; every line carries information the agent needs. The format is efficient, with only minor redundancy between the title term and the parenthetical Portuguese name.

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 an output schema present, the description need not describe return shape, and both parameters are documented, so the essentials for correct invocation are covered. Gaps are secondary: no note on data freshness or handling of invalid municipality names, which matter more for a lookup whose failures may be silent.

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 0%, so the description must compensate, and it largely does: municipality is defined as a concelho name with two concrete examples ('Sintra', 'Monchique'), and day is mapped to explicit values (0 = today, 1 = tomorrow). It stops just short of stating what the default is or what happens for out-of-range day values, which the schema's default hint only partially covers.

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 first sentence names a specific resource (wildfire danger / RCM / risco de incêndio rural), its geographic scope (municipality), and its temporal scope (today or tomorrow), with the Portuguese term in parentheses for disambiguation. No sibling tool covers this domain, so the agent can route to it unambiguously.

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

Usage Guidelines3/5

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

Usage is implied by the domain (ask about fire danger, get the level) but there is no explicit when-to-use or when-not guidance, and no reference to adjacent siblings like weather_forecast or weather_warnings that an agent might otherwise pick. The day parameter hints at the two supported timeframes but that is a parameter rule, not usage routing.

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

fuel_pricesA

Cheapest fuel stations in Portugal for one fuel type, cheapest first (official DGEG prices).

Use for "where is diesel/petrol/LPG cheapest in Lisboa / near me / in Braga?". Give an area as a district, a municipality, or a point (lat + lon, with radius_km); with no area it searches all of Portugal. Names are case- and accent-insensitive ("evora" works).

Args: fuel_type: A DGEG fuel name or id, e.g. "Gasóleo simples" (regular diesel, 2101), "Gasolina simples 95" (regular 95 petrol, 3201), "Gasolina 98", "GPL Auto" (LPG), or plain words: "diesel", "petrol", "95", "98", "lpg", "cng". See fuel_types() for the full list. district: Portuguese district, e.g. "Lisboa", "Porto", "Faro". municipality: Municipality (concelho), e.g. "Sintra", "Vila Nova de Gaia". Overrides district. lat, lon: A point (WGS84). Results get distance_km and are limited to radius_km. radius_km: Search radius around lat/lon (default 10). brand: Only this brand (substring match), e.g. "Galp", "Prio", "Intermarché". limit: How many stations to return (default 10, max 50).

Each station: price_eur (per litre, or per kg/m3 for gas), brand, name, address, municipality, distance_km (with lat/lon), coordinates and last_update (the station's last price update). Also returns how many stations matched and the min/median/max price. Always mention the source (DGEG) and the last_update when quoting prices.

NameRequiredDescriptionDefault
latNo
lonNo
brandNo
limitNo
districtNo
fuel_typeYes
radius_kmNo
municipalityNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations, so the description carries the full burden and does well: it discloses sort order (cheapest first), data source (official DGEG), price units (per litre vs per kg/m3 for gas), the last_update freshness field, and the instruction to always cite source and update time. It stops short of stating read-only character, caching/update cadence, or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary followed by a usable Args block and a short returns paragraph. The "Each station: ..." enumeration partly duplicates the output schema, but the closing instruction to always cite DGEG and last_update 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?

For an 8-parameter, annotation-free lookup tool this is essentially complete: input forms, defaults, geographic precedence, units, ordering, provenance, and the sibling that enumerates legal fuel_type values. Return details being duplicated is harmless given an output schema exists.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate and it does for all eight parameters: fuel_type accepts DGEG names, numeric ids, or plain words like "diesel"/"lpg"; district vs municipality with precedence; lat/lon triggering distance_km within radius_km; brand as a substring match; limit default 10 max 50. It also notes case/accent-insensitive name matching, which the schema cannot express.

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?

Names a specific resource and operation (cheapest fuel stations in Portugal, cheapest first, DGEG source) and distinguishes scope from siblings by directing agents to fuel_types() for the full fuel list. An agent can tell this is the search-a-price tool, not the detail tool, without opening the schema.

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

Usage Guidelines4/5

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

Gives concrete trigger phrasings ("where is diesel cheapest in Lisboa / near me / in Braga") and states the default when no area is given (searches all of Portugal), plus the municipality-overrides-district rule. It doesn't explicitly say when to prefer fuel_station_detail or fuel_types instead, so routing is implied rather than fully enumerated.

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

fuel_station_detailA

Full details of one fuel station: every fuel it sells with price and last update, opening hours, services (car wash, shop, tyre air...) and payment methods.

Use after fuel_prices, with a station id from its results.

NameRequiredDescriptionDefault
station_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

No annotations are present, so the description carries the burden; it implies a read-only lookup and tells the agent what the response contains, which is useful. It does not state behavior for an unknown/invalid station id, coverage limits, or any rate/auth considerations.

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 short sentences, front-loaded with the resource and its contents, followed immediately by the call condition. No redundant restatement of the tool name or 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?

A read-only single-parameter detail lookup with an output schema, so return values need not be spelled out; the description still summarizes them well. Only the error/edge-case behavior for a bad id is left unaddressed, which is minor here.

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

Parameters3/5

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

Schema coverage is 0% and the schema only types station_id as an integer. The description compensates by explaining where the id comes from (results of fuel_prices), which is real added meaning, but it does not clarify id format or validity constraints.

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?

Names a specific resource and scope ('Full details of one fuel station') and enumerates the payload (prices with last update, opening hours, services, payment methods). This is clearly distinguishable from the sibling fuel_prices (list of prices) and ev_charger_detail (different resource).

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?

'Use after fuel_prices, with a station id from its results' gives an explicit sequencing rule and the source of the required argument, which implies fuel_prices is the discovery step and this is the follow-up. It stops short of stating when not to use it (e.g., browsing all stations), but the dependency guidance is clear.

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

fuel_typesA

List DGEG fuel types (id, name, unit) and the districts accepted by fuel_prices.

Only needed when unsure which fuel name to pass; fuel_prices also understands "diesel", "petrol", "95", "98", "lpg".

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/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" clearly implies a read-only reference lookup with no mutation, and the description identifies what is returned (fuel type ids/names/units and accepted districts), though it does not discuss authentication, caching, or rate limits.

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 short sentences with no filler. The core list purpose is front-loaded, followed immediately by the usage caveat and alternative.

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 zero parameters and an output schema present, the description does not need to explain return values in detail. It provides enough context about what the tool lists, when to use it, and which sibling handles common fuel names, making it complete for this simple reference lookup.

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 tool takes zero parameters, so there are no parameter semantics to explain. The baseline for a zero-parameter tool is 4, and the description appropriately does not invent parameter details.

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: it lists DGEG fuel types with their id, name, and unit, and also lists the districts accepted by fuel_prices. It clearly distinguishes itself from the sibling fuel_prices tool by explaining that fuel_prices accepts common fuel names directly.

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 says it is only needed when the agent is unsure which fuel name to pass, and it names fuel_prices as the primary alternative that understands "diesel", "petrol", "95", "98", and "lpg". This gives a clear when-to-use and when-not-to-use rule.

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

ine_indicatorA

Values of an INE indicator, latest periods first.

Args: varcd: 7-digit indicator code from ine_search, e.g. "0008074". place: geography name to keep, e.g. "Portugal", "Lisboa", "Norte", "Porto". Default: "Portugal" when present, otherwise all geographies. periods: how many of the latest reference periods to return (1-24). category: keep only rows whose category labels contain this text (e.g. "Total", "Mulheres"). lang: "PT" or "EN". limit: max rows.

NameRequiredDescriptionDefault
langNoPT
limitNo
placeNo
varcdYes
periodsNo
categoryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden, and it does disclose useful traits: default geography resolution ('Portugal when present, otherwise all geographies'), the periods range 1-24, and substring-matching filter semantics for category. It says nothing about error behavior for an invalid varcd, unknown place names, or result ordering across geographies, which matters for a 6-parameter retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded summary sentence followed by a compact Args block; no filler and each line carries information. The docstring-style layout is slightly mechanical but appropriate given six undocumented parameters.

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?

An output schema exists, so return shape need not be described, and the description covers all six parameters plus default-resolution behavior for the riskiest one (place). Remaining gaps are edge-case behavior (invalid codes, ambiguous place names) and the periods/limit interaction, which are modest for a read-only statistics lookup.

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 0%, so the description carries parameter meaning, and it does so for all six parameters with worked examples ('0008074', 'Portugal', 'Total', 'Mulheres') and the PT/EN enum that the schema itself does not declare. Minor shortfalls: limit is only 'max rows' with no mention of its default of 40 or how it interacts with periods, and units for periods are implied, not stated.

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

Purpose4/5

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

States the resource (INE indicator values) and the ordering guarantee ('latest periods first'), which is genuinely informative. It does not name a specific sibling to differentiate from, though it does point back to ine_search as the source of varcd, and the verb phrase 'Values of' is slightly passive.

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 varcd entry ('7-digit indicator code from ine_search') implicitly tells the agent this is a second-step tool after ine_search, which is useful routing. However there is no explicit when-to-use/when-not statement, no mention of when to prefer bpstat_series or open_data_search, and no guidance on when a wider or narrower query is appropriate.

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

medicine_availabilityA

Is a medicine in shortage in Portugal? Checks Infarmed's published availability information.

Use when someone can't find a medicine, or asks whether X is in shortage ("rutura", "esgotado", "falta"). Searches by brand or active substance (Portuguese names work best, e.g. "quetiapina", "Ozempic", "ácido acetilsalicílico"; dose and form narrow it, e.g. "quetiapina 300 mg libertação prolongada").

Checks, all from www.infarmed.pt (latest versions are found automatically):

  • shortages Infarmed is actively monitoring (with its circulars and advice);

  • the monthly list of medicines whose export is temporarily suspended because of shortage / supply risk in Portugal;

  • the quarterly prior-notification list (LNP) of medicines with availability concerns.

status is one or more of: monitored_shortage, export_suspended, prior_notification, no_issue_in_published_lists. "No issue" does not prove the medicine is available: Infarmed's full shortage search is not queried (see not_checked).

Args: medicine: Brand name or active substance, optionally with strength/form. limit: Max rows returned per list (default 15).

NameRequiredDescriptionDefault
limitNo
medicineYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and does well: it discloses the source (www.infarmed.pt), the three lists checked, automatic latest-version behavior, supported status values, and the important limitation that Infarmed's full shortage search is not queried. It does not explicitly state read-only behavior or error handling, keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core question and then structured into source details, status values, and arguments. It is somewhat long, but for a multi-list availability check most sentences earn their place; the structure is clear and scannable.

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

Completeness5/5

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

Given the tool's complexity, the description is complete enough to call it correctly: it explains sources, checked lists, status semantics, important limitations, and both parameters. Since an output schema exists, it does not need to document return structure in detail.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates with an Args section. It explains that 'medicine' accepts brand name or active substance, optionally with strength/form, and gives useful examples; it also clarifies that 'limit' caps rows per list.

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

Purpose4/5

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

The description states a specific question and verb ('Is a medicine in shortage in Portugal? Checks Infarmed's published availability information'), making the resource and scope clear. It does not explicitly distinguish itself from nearby-stock or pharmacy-finding siblings such as find_medicine_near, which keeps it at 4 rather than 5.

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

Usage Guidelines4/5

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

It gives clear usage triggers ('when someone can't find a medicine, or asks whether X is in shortage') and even lists Portuguese synonyms like 'rutura', 'esgotado', and 'falta'. It also warns that a 'no issue' result does not prove availability, but it does not name alternative sibling tools for locating stock nearby.

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

medicine_helpA

Verified help lines in Portugal for medicine problems: 112, SNS 24, Linha 1400, Infarmed.

Use when someone can't find a medicine, needs urgent advice, or asks who to call. Each line has its number, what it is for, hours where published, and the page it was checked on.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

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: it discloses that the content is verified reference data, that each record contains number, purpose, hours 'where published', and the source page it was checked on. That provenance and the hours-availability caveat are genuinely useful behavioral context for a read-only lookup; it stops short of stating outright that it performs no writes or that data is static.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the resource and its contents in one sentence, then immediately gives the usage triggers. No filler, no restatement of the name or title.

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?

A zero-parameter reference lookup with an output schema, so the description only needs to convey scope and content shape — both are covered, including the caveat that hours are only published for some lines.

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 tool takes zero parameters, which is the baseline-4 case; nothing about the call can be mis-specified. The description adds no parameter detail because none is needed.

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?

Names a specific resource (verified Portuguese help lines for medicine problems) and enumerates the actual entries returned: 112, SNS 24, Linha 1400, Infarmed. This clearly separates it from siblings like medicine_availability, find_medicine_near and pharmacies, which are about medicines/stock rather than who to call.

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?

Gives three concrete activation triggers: can't find a medicine, needs urgent advice, or asks who to call. There is no explicit exclusion or named alternative (e.g., 'use medicine_availability to check stock instead'), so it stops short of full routing guidance but the context is clear.

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

municipalityC

A municipality (concelho): district, INE code, area, parishes, 2021 census, town-hall contacts.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not say whether this is a read-only lookup, how matching works, whether errors occur for unknown names, or any other operational trait; the field list is the only substantive context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loads the resource, but it is a fragment rather than a structured statement of what the tool does. It avoids waste but omits essential framing.

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

Completeness2/5

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

Although an output schema exists and can explain return values, the description still needs to state the operation and clarify input semantics. With no annotations and no parameter documentation, the definition is not complete enough for an agent to confidently select and invoke the tool.

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

Parameters2/5

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

The single required parameter 'name' has 0% schema description coverage, and the description never explains what 'name' means or its expected format. It only implies that a municipality name is involved through the tool title and the parenthetical '(concelho)'.

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

Purpose2/5

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

The description is a noun phrase defining what a municipality is and listing data fields, but it never states an action such as 'get' or 'look up'. An agent can infer retrieval, but the purpose is largely a restatement of the tool name rather than a clear verb+resource statement.

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?

There is no guidance on when to use this tool versus siblings like ine_search or where_is, nor any mention of prerequisites or expected input context. The description gives no usage conditions at all.

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

open_data_datasetA

Details and downloadable files of one dados.gov.pt dataset (id or slug from open_data_search).

NameRequiredDescriptionDefault
datasetYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It implies a read-only lookup and mentions downloadable files, but it does not describe authentication needs, rate limits, whether files are URLs or embedded content, or other operational behavior.

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 with no wasted text. It states the resource, the returned content, and the parameter source efficiently.

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 one-parameter lookup with an output schema available, the description provides enough to call the tool correctly and understand the parameter source. It is slightly incomplete in not distinguishing this tool from open_data_preview, but the core context is present.

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 0%, so the description must explain the single parameter. It does so by saying the argument is a dataset 'id or slug from open_data_search', which adds meaningful expected-value guidance beyond the bare schema type.

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

Purpose4/5

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

The description states a specific resource and operation: details and downloadable files for one dados.gov.pt dataset. It also clarifies that the dataset argument comes from open_data_search, which helps distinguish it from the search tool, though it does not explicitly contrast with open_data_preview.

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 phrase 'id or slug from open_data_search' implies the intended workflow: first search, then fetch dataset details. However, it does not explicitly say when to use this tool versus open_data_preview, nor does it state any exclusions or prerequisites.

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

open_data_previewA

First rows of a CSV or JSON file hosted on dados.gov.pt (reads at most 512 KB).

Args: url: a resource url from open_data_dataset (must be on dados.gov.pt). rows: how many rows to return (1-100).

NameRequiredDescriptionDefault
urlYes
rowsNo

Output Schema

NameRequiredDescription

No output parameters

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 full behavioral burden. It usefully discloses the 512 KB read limit and the 1-100 row constraint, but omits error behavior for oversized or unsupported files and does not clarify whether the full file is fetched or truncated.

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 short and front-loaded: the first sentence states what it does and the main constraint, followed by concise parameter notes. 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?

An output schema exists, so return-value explanation is unnecessary. For a simple two-parameter read preview, the description covers format, host restriction, size cap, and row limits. Error handling on unsupported or oversized files is the main omission.

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 0%, so the description must compensate. It explains that url must be a resource URL from open_data_dataset and hosted on dados.gov.pt, and that rows must be between 1 and 100. It does not mention the default of 20, but otherwise adds real meaning beyond the bare schema.

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

Purpose4/5

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

The description states a specific operation: return the first rows of a CSV or JSON file hosted on dados.gov.pt. It also ties the url input to open_data_dataset, which distinguishes it from sibling tools. It is clear, though it does not explicitly frame itself as a preview-before-download step.

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

Usage Guidelines3/5

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

Usage is implied through 'a resource url from open_data_dataset', which tells the agent this follows dataset discovery. However, there is no explicit when-to-use/when-not-to-use guidance and no named alternative for full downloads.

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

parliament_deputiesB

Members of Parliament (deputados): party, constituency (círculo), status. Seats per party included.

Args: name: part of the parliamentary or full name. party: group acronym, e.g. "PSD", "PS", "CH". constituency: e.g. "Lisboa", "Porto", "Açores", "Europa". include_inactive: also list deputies who left or were replaced. Default false.

NameRequiredDescriptionDefault
nameNo
limitNo
partyNo
legislatureNo
constituencyNo
include_inactiveNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It usefully discloses the output content (party, constituency, status, seats per party) and the include_inactive default, but omits behaviors like pagination/limit handling and what 'inactive' filtering entails.

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 overview sentence and compact Args list are front-loaded and waste-free. The example values add practical value without bloat.

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?

An output schema exists so return values needn't be explained, but with 0% schema coverage the undocumented limit and legislature parameters leave gaps an agent would need to guess at.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It documents name, party, constituency, and include_inactive with helpful examples, but omits limit and legislature entirely, leaving two of six params unexplained.

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

Purpose4/5

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

States a clear resource (Members of Parliament/deputados) and the fields returned (party, constituency, status, seats per party). It is clearly distinguishable from siblings like parliament_votes and parliament_initiative, though it doesn't explicitly name which sibling to prefer.

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 Args section implies how to narrow results (name, party, constituency), but there is no explicit guidance on when to use this versus parliament_search or when not to use it. Usage is inferable rather than stated.

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

parliament_initiativeA

Full record of one initiative: every phase with dates, every vote with each group's position, text link.

Args: initiative_id: the id from parliament_search (e.g. "356403"), or a reference like "Proposta de Lei 3".

NameRequiredDescriptionDefault
legislatureNo
initiative_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations exist, so the description carries the disclosure burden. It usefully characterizes the returned content (full phase history, per-group vote breakdown, text link), implying a read-only detail fetch, but says nothing about authentication, rate limits, or behavior for an invalid/missing initiative id.

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 content summary is front-loaded in a single dense clause, then the args block. No filler, though the prose-style 'Args:' block mixed into a description is slightly awkward for an agent parsing intent.

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?

An output schema exists, so the description needn't explain return structure, and it still gives a useful preview of what the record contains. The one incompleteness is the undocumented `legislature` parameter for a tool whose id may need session scoping.

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

Parameters3/5

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

Schema coverage is 0% and there is no description of `legislature` anywhere, which is a real gap since it likely scopes which parliamentary session the id refers to. The `initiative_id` param is well served though: format example ("356403") plus the accepted free-text reference form adds meaning beyond the bare string type.

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

Purpose4/5

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

States a specific resource and enumerates exactly what the record contains (phases with dates, per-group vote positions, text link), which distinguishes it from the search-style siblings. It doesn't explicitly name parliament_search as its complement in the purpose line, only in the args block, so it stops short of a 5.

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

Usage Guidelines4/5

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

The args section explicitly states where the identifier comes from ("the `id` from parliament_search"), giving the agent a concrete entry path and an alternative accepted form ("Proposta de Lei 3"). No when-not-to-use guidance is given, so it isn't a full 5.

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

parliament_votesB

Recent plenary votes, with how each parliamentary group voted.

Args: party: show this group's position on each vote (e.g. "PS", "CH"); only votes where it is recorded. query: words in the initiative title. since: "YYYY-MM-DD". result: "aprovado" or "rejeitado". limit: max votes, newest first.

NameRequiredDescriptionDefault
limitNo
partyNo
queryNo
sinceNo
resultNo
legislatureNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/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 discloses useful behavior such as newest-first ordering, party filtering only where recorded, and result values, but it does not cover permissions, pagination beyond limit, or the omitted legislature parameter.

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 front-loaded and compact, with a clear Args list that avoids repetition. It is appropriately sized for a retrieval tool, though the Args formatting is slightly mechanical.

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 tool has six parameters, no annotations, and an output schema. The description covers purpose and most filters, but it omits legislature and provides no usage alternatives, leaving clear gaps for an agent selecting and invoking the tool.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It documents five of six parameters with examples and formats, but it completely omits the legislature parameter, leaving a meaningful gap.

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

Purpose4/5

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

The description states a specific resource and content: recent plenary votes with each parliamentary group's position. It is clear what the tool returns, but it does not explicitly distinguish itself from sibling tools such as parliament_search or parliament_initiative.

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 explains what each filter does but gives no guidance on when to use this tool versus alternatives. There are no exclusions, prerequisites, or named sibling tools to route the agent.

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

pharmaciesA

Pharmacies in a Portuguese municipality, with which ones are on duty today and open now.

Use for "farmácia de serviço em X", "pharmacy open now near me", or to list pharmacies to call. Each pharmacy has name, address, phone, coordinates, today's hours, open_now, on_duty (official duty roster for the duty day 09:00-09:00) and the duty type (e.g. "Permanente - Aberta 24h"). Results are sorted: on duty first, then open now, then distance (when lat/lon are given). Stock is not public: never say a pharmacy has a medicine.

Args: city: Municipality or town/parish, e.g. "Lisboa", "Porto", "Cascais", "Alvalade, Lisboa" (add ", " to disambiguate a town). lat, lon: Optional user position: adds distance_km and allows radius_km. With no city, the municipality is found from the coordinate. radius_km: Keep only pharmacies within this distance of lat/lon. on_duty_only: Only pharmacies on the duty roster today. open_now_only: Only pharmacies open right now. limit: Max pharmacies returned (default 20, max 100).

NameRequiredDescriptionDefault
latNo
lonNo
cityNo
limitNo
radius_kmNo
on_duty_onlyNo
open_now_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it discloses the returned fields, the sort order (on-duty, then open-now, then distance), the duty-day boundary definition (09:00–09:00), that on_duty comes from an official roster, and the lat/lon-without-city fallback behavior. These are non-obvious traits an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then uses cases, then return shape and caveat, then args — a sensible order with no filler. The Args block is long but justified at 0% schema coverage; minor duplication with the earlier field list is the only waste.

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?

An optional-everything seven-parameter tool with no annotations and no schema descriptions still leaves no ambiguity: all params, their interactions, the sort order, and the correctness caveat about stock are covered. The output schema means the return-value enumeration is a bonus rather than a necessity.

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

Parameters5/5

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

Schema coverage is 0%, so the description is the sole documentation and it fully compensates: every one of the seven parameters is explained, city includes disambiguation examples, radius_km is tied to lat/lon availability, and limit states the default 20 / max 100. The dependency rules (radius requires position) are stated explicitly.

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?

Opens with a specific verb+resource+scope: pharmacies within a Portuguese municipality, with duty status and open-now status. It is clearly distinguishable from stock-oriented siblings (medicine_availability, find_medicine_near) because it explicitly states stock is not public.

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?

Gives concrete trigger phrases ("farmácia de serviço em X", "pharmacy open now near me", "list pharmacies to call") and an explicit when-not: never claim a pharmacy stocks a medicine. That exclusion routes the agent away from the wrong use without needing the sibling list.

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

postal_codeA

Look up a Portuguese postal code (código postal, 'XXXX-XXX' or 'XXXX').

Returns district, municipality, locality and the streets the code covers, plus a central point.

NameRequiredDescriptionDefault
codeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations exist, so the description carries the full behavioral burden. It discloses the accepted input formats and enumerates returned fields, but the returned fields are already declared by the output schema, and it says nothing about error handling or whether the 4-digit short form returns a single match or many.

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 short sentences, front-loaded with the action and resource, with the format guidance and return contents following in order of need. Nothing is wasted.

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 one-parameter read lookup with an output schema, this covers what an agent needs: the action, the input format, and a preview of the result shape. The only real gap is behavior for invalid or ambiguous code prefixes.

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 0% and the single 'code' parameter is undocumented in the schema, so the description must compensate. It does so by specifying the exact formats 'XXXX-XXX' and 'XXXX', which is the key semantic detail needed to call the tool correctly.

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

Purpose4/5

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

States a specific verb and resource ('Look up a Portuguese postal code') and even gives the accepted code formats. The resource is unambiguous, but the description never differentiates itself from nearby geo siblings such as municipality or where_is.

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

Usage Guidelines3/5

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

Usage is only implied: an agent can infer this is for resolving a postal code into district/municipality/locality/streets. There is no explicit when-to-use or when-not, and no alternative tools are named.

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

public_contractsA

Search Portuguese public contracts (Portal BASE) for one year.

Args: query: words in the contract object, e.g. "software", "limpeza", "ambulâncias". buyer: public body name or 9-digit NIF, e.g. "Município de Lisboa", "SPMS". supplier: company name or NIF. procedure: e.g. "Ajuste Direto", "Concurso público", "Consulta Prévia". min_value, max_value: contract price range in euros. year: contract-file year (default: this year; 2012 onwards). sort: "value" (largest first) or "date" (newest first). limit: max rows.

NameRequiredDescriptionDefault
sortNovalue
yearNo
buyerNo
limitNo
queryNo
supplierNo
max_valueNo
min_valueNo
procedureNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/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 discloses the default year, the '2012 onwards' lower bound, the default sort ('value' = largest first), and that limit caps rows. It does not state read-only nature, result pagination, or what happens when filters match nothing, leaving gaps for an unannotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One front-loaded sentence states purpose and scope, followed by a compact per-argument list where each line adds real information. The 'Args:' docstring formatting is slightly programmer-flavored but costs nothing in length.

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?

An output schema exists so return values need not be explained, and the description fully specifies the 9-parameter filter surface including units, formats, defaults and enumerated sort values. An agent has everything needed to construct a call correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries everything: it explains each of the 9 parameters, gives realistic example values including Portuguese terms, clarifies that buyer/supplier accept either a name or a 9-digit NIF, gives the price units (euros), and enumerates the sort modes.

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

Purpose4/5

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

States a specific verb and resource ('Search Portuguese public contracts') plus the data source (Portal BASE) and a scope constraint ('for one year'). It does not distinguish itself from the sibling public_contracts_summary, so an agent must infer that this returns individual contracts rather than aggregates.

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

Usage Guidelines3/5

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

Usage is only implied by the parameter list and query examples ('software', 'limpeza'). There is no explicit when-to-use/when-not-to-use guidance and no mention of the sibling summary tool as an alternative for aggregate questions.

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

public_contracts_summaryA

Totals for one buyer or supplier in a year: number of contracts, total value, by procedure, top partners.

Args: entity: name or 9-digit NIF of a public body or a company. role: "buyer", "supplier" or "any". year: default this year. top: how many top counterparties to list.

NameRequiredDescriptionDefault
topNo
roleNoany
yearNo
entityYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden; it implies a read-only aggregation and discloses the shape of the summary (counts, totals, procedure breakdown, top counterparties). It does not state the underlying data source or coverage, whether entity names are fuzzy-matched, or how the ranking in 'top partners' is computed (by value or by count).

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 summary sentence is front-loaded and wastes no words, followed by a tight per-argument block. Slightly telegraphic phrasing ('by procedure, top partners') but nothing extraneous.

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?

With four parameters at 0% schema coverage and an output schema present, the description does cover the calling surface adequately. What it leaves out is the routing question an agent actually faces: how this differs from `public_contracts`, and how ambiguous entity names are handled.

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 0%, so the description must carry all parameter meaning — and it largely does: `entity` accepts a name or 9-digit NIF, `role` takes buyer/supplier/any (values the schema does not enumerate), `year` defaults to the current year, `top` is the count of counterparties to list. The only gap is a small inconsistency: the schema default for `year` is null while the description says 'this year', without confirming null means current year.

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

Purpose4/5

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

The description states a concrete resource (public contracts) and an aggregate operation (totals for one entity in a year), and enumerates the output dimensions: count, total value, breakdown by procedure, top partners. That is enough to distinguish it from a raw listing tool. It stops short of naming the sibling `public_contracts` explicitly, so the differentiation is inferred rather than stated.

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

Usage Guidelines3/5

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

Usage is implied by the word 'totals' versus the sibling `public_contracts`, which presumably returns individual contract records, but the description never says when to prefer one over the other. There is no guidance on prerequisites, entity-name resolution, or what happens when a name matches multiple bodies.

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

public_holidaysA

Portugal's national public holidays for a year (default: this year), with weekday.

Carnival is listed as optional: it is usually a day off by government decision, not by law. Municipal holidays (one per concelho, e.g. Lisbon 13 June, Porto 24 June) are not included.

NameRequiredDescriptionDefault
yearNo
upcoming_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose important behavioral caveats: default year is the current year, weekdays are included, Carnival is optional, and municipal holidays are excluded. It could say more about valid year ranges or read-only nature, but the behavioral context is solid for a simple lookup tool.

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 short, front-loaded, and every sentence adds useful scope information. The exclusions are clearly separated and no wording is wasted.

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?

An output schema exists, so return values need not be explained. However, the description omits the upcoming_only parameter and any guidance on valid year ranges, which leaves a noticeable gap for a tool with 0% schema description coverage.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for both parameters. It clarifies the year parameter's default ('this year') but does not mention the upcoming_only parameter at all, leaving one of two parameters semantically undocumented.

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

Purpose4/5

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

The description clearly states that this returns Portugal's national public holidays for a year, including weekday, and distinguishes the scope from Carnival and municipal holidays. It is specific but does not explicitly contrast with a sibling tool, so 4 is appropriate.

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 useful scope guidance: Carnival is optional and municipal holidays are excluded, which helps an agent know when this tool is and is not appropriate. It stops short of naming an alternative or giving explicit when-to-use instructions, so it is not a 5.

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

sea_forecastA

Coastal sea forecast: wave height and period, wave direction, sea temperature (IPMA).

Args: place: coastal spot, e.g. "Nazaré", "Peniche", "Faro", "Funchal". Or pass lat/lon for the nearest one. day: 0 = today, 1 = tomorrow, 2 = the day after.

NameRequiredDescriptionDefault
dayNo
latNo
lonNo
placeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations exist, so the description carries the full disclosure burden. It usefully reveals the provider (IPMA) and the covered measures, implying Portuguese coastal coverage, but says nothing about units (metres vs feet, °C), whether place or lat/lon wins when both are supplied, or what happens for an unknown spot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in one sentence and then gives a compact Args block; there is essentially no filler. The Args formatting is slightly redundant with the schema but remains easy to scan.

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?

An output schema exists, so return-value detail is not required, but for a tool with four undocumented-schema parameters and no annotations, the description should also cover units and place/lat-lon precedence. It is adequate to call the tool but not fully complete.

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 0%, so the description must compensate, and it largely does: it gives example place values ('Nazaré', 'Peniche', 'Faro', 'Funchal'), explains the lat/lon fallback to the nearest spot, and decodes day (0=today, 1=tomorrow, 2=day after). Only the precedence between place and lat/lon and the neither-provided case are left unstated.

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

Purpose4/5

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

States a specific resource (coastal sea forecast) plus the exact quantities returned: wave height and period, wave direction, sea temperature, with the data source (IPMA) named. This distinguishes it from the land-oriented weather_forecast sibling, though it never explicitly contrasts the two.

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

Usage Guidelines3/5

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

Usage is only implied: an agent must infer that this is the tool for sea/beach conditions rather than general weather. There is no explicit when-to-use, when-not, or named alternative (e.g. weather_forecast) to disambiguate the two forecast tools.

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

sns_consultation_wait_statsA

Hospital outpatient consultations per month and the % of FIRST specialist consultations (referred by a family doctor via CTH/SIGA) held within the guaranteed maximum time (TMRG).

Use for "how long is the wait for a first hospital appointment at X?", "is hospital Y on time with first consultations?", "how many consultations did the Centro region do?". Official monthly statistics (latest month usually 2-3 months back, provisional); there is no breakdown by specialty in the open data.

Per period (latest first): consultations_in_month / _year_to_date (total, first, subsequent) and first_consultations_within_max_time_pct for the month and year-to-date.

Args: institution: Hospital or ULS name; mapped to its ULS. region: Norte | Centro | LVT (Lisboa) | Alentejo | Algarve. Ignored if institution is given. period: Latest month to include, "YYYY-MM" (default: newest available). months: How many months back (default 6, max 24).

NameRequiredDescriptionDefault
monthsNo
periodNo
regionNo
institutionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses data provenance and freshness ('official monthly statistics, latest month usually 2-3 months back, provisional'), a hard coverage limit (no specialty breakdown), and the precedence rule that region is ignored when institution is supplied. It does not cover failure modes (unknown institution names, out-of-range periods) or behavior when data is missing.

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?

Well front-loaded: purpose, then triggering questions, then caveats, then args — an agent can stop reading after sentence one and still act. Slight redundancy in restating 'for the month and year-to-date' and a longer-than-needed list of returned fields given an output schema exists.

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 four-optional-parameter statistics tool with no annotations, everything needed to call it correctly is present: scope, data lag/provisionality, coverage gaps, period semantics, and the institution-vs-region precedence rule. An output schema exists, yet the description still summarizes returned fields as a bonus.

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

Parameters5/5

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

Schema description coverage is 0%, yet the Args block fully compensates: institution is mapped to its ULS, region enumerates all five values, period specifies the "YYYY-MM" format and default, and months gives default 6 with a max of 24. The critical precedence rule ('region ignored if institution is given') is stated explicitly and is not derivable from 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 opening sentence states a specific metric set (monthly hospital outpatient consultations plus % of first specialist consultations within the guaranteed maximum time) and a specific scope (TMRG/CTH/SIGA referrals). This is clearly distinguishable from siblings like sns_surgery_wait_stats and sns_emergency_stats, which cover different event types.

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?

Three concrete user-question templates ('how long is the wait for a first hospital appointment at X?', 'is hospital Y on time…', 'how many consultations did the Centro region do?') make the triggering context unambiguous. It also sets a boundary ('no breakdown by specialty in the open data'), but it never names or routes against a sibling tool.

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

sns_emergency_statsA

Emergency-department (urgência) visits per month: by type and by Manchester triage colour.

Use for "how busy is the ER at X?", "how many emergency visits in the Algarve last month?", "what share of ER visits are green/blue (non-urgent)?". OFFICIAL MONTHLY STATISTICS ONLY — not the live queue (the latest month is usually 2-3 months back and provisional). For live waiting times send the user to https://tempos.min-saude.pt. Not medical advice: in an emergency call 112; SNS 24 (808 24 24 24) for advice.

Scope: one institution, one region, or (neither) all of mainland Portugal's SNS hospitals.

Per period (latest first): visits_in_month and visits_year_to_date by type (general, paediatric, obstetric, psychiatric, total), triage_in_month by colour (red = immediate, orange = very urgent, yellow = urgent, green = less urgent, blue = non-urgent, white = not clinical / other) and triage_share_in_month_pct.

Args: institution: Hospital or ULS name, accent-insensitive ("Santa Maria", "São João", "Hospital de Faro"). A hospital is mapped to its ULS; check scope. region: Norte | Centro | LVT (Lisboa) | Alentejo | Algarve. Ignored if institution is given. period: Latest month to include, "YYYY-MM" (default: newest available). months: How many months back to return (default 6, max 24).

NameRequiredDescriptionDefault
monthsNo
periodNo
regionNo
institutionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it warns the latest month is usually 2-3 months back and provisional, explains that a hospital name is mapped to its ULS (check `scope`), and notes region is ignored when institution is given. It does not say what happens on an unknown institution name or an out-of-range period, which is the main remaining gap for a data-lookup tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose, then use-cases, then scope, then output fields, then args. It is on the long side and some content (enumerating what red/orange/yellow mean, the 112/SNS 24 disclaimer) sits beyond what is needed to call the tool, especially since an output schema exists.

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 zero-required-parameter statistics tool with an output schema, nothing essential is missing: scope semantics, data lag, defaults, and unit/format conventions are all covered. An agent could invoke it correctly from the description alone.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate and it does: `institution` is accent-insensitive with worked examples, `region` enumerates the five accepted values, `period` specifies the YYYY-MM format and default of newest available, and `months` gives default 6 and max 24. Every parameter is fully specified in prose where the schema is bare.

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 precise verb+resource: monthly emergency-department visits broken down by visit type and Manchester triage colour. It immediately distinguishes itself from the live-queue alternative by declaring 'OFFICIAL MONTHLY STATISTICS ONLY' and pointing live waiting times elsewhere, so an agent can route correctly without opening the schema.

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

Usage Guidelines5/5

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

Gives concrete example queries it answers ('how busy is the ER at X?', 'what share of ER visits are green/blue?') and explicit exclusions ('not the live queue', send the user to tempos.min-saude.pt for waiting times). It also states the scope rule: one institution, one region, or all mainland SNS hospitals.

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

sns_find_institutionsA

Find SNS hospitals / local health units (ULS) by name, or the nearest ones to a coordinate.

Use this first when the user names a hospital or a place ("hospitals near Lisbon", "is there an emergency department near 38.72,-9.14?"), then pass stats_entity to sns_emergency_stats / sns_surgery_wait_stats / sns_consultation_wait_stats.

Each result: name, its parent ULS, coordinates, distance_km (when lat/lon given), whether it reports emergency / consultation / surgery data on tempos.min-saude.pt, and stats_entity — the name under which the official statistics report it (statistics are per ULS / hospital group, not per building). This list does NOT contain live waiting times; for live emergency waits send the user to https://tempos.min-saude.pt.

Args: query: Part of the name, accent-insensitive, e.g. "Santa Maria", "Faro", "ULS Algarve". lat, lon: Sort by distance from this point (WGS84), e.g. Lisbon 38.7223, -9.1393. Without query, umbrella ULS entries are skipped (they duplicate a hospital's location). emergency_only: Only places that report emergency-department data. limit: Max results (default 10, max 50).

NameRequiredDescriptionDefault
latNo
lonNo
limitNo
queryNo
emergency_onlyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so: it enumerates each returned field, explains that `stats_entity` is a ULS/group-level name rather than a building-level one, and discloses a non-obvious quirk ('Without `query`, umbrella ULS entries are skipped (they duplicate a hospital's location)'). It also warns about the absence of live wait times, preventing a likely misuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then return shape, then args — a logical order with no filler sentences. It is on the long side (~200 words): the important 'umbrella ULS skipped without query' caveat is buried inside the lat/lon sub-bullet rather than surfaced earlier.

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 5-param, zero-annotation, zero-schema-documentation tool, the description supplies everything an agent needs to select and call it correctly, plus the hand-off contract to the three stats tools. An output schema exists, so return values need not be re-explained, and the field enumeration is justified anyway because it clarifies `stats_entity`.

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

Parameters5/5

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

Schema coverage is 0%, so the description must compensate and it does for all five params: `query` is accent-insensitive with examples, `lat`/`lon` are WGS84 and sort by distance with a sample coordinate, `emergency_only` filters to emergency-reporting sites, and `limit` gives default (10) and max (50). It also explains the interaction between `lat/lon` and `query`, which the schema cannot express.

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?

Opens with a specific verb and resource: 'Find SNS hospitals / local health units (ULS) by name, or the nearest ones to a coordinate.' It explicitly separates this lookup role from the statistics siblings (sns_emergency_stats, sns_surgery_wait_stats, sns_consultation_wait_stats) that consume its `stats_entity` output.

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?

States a clear trigger ('Use this first when the user names a hospital or a place') with two concrete example queries, defines the follow-up step (pass `stats_entity` to the stats tools), and gives an explicit when-not with a redirect ('This list does NOT contain live waiting times; for live emergency waits send the user to https://tempos.min-saude.pt').

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

sns_query_datasetA

Run an ODSQL query on any SNS Transparency portal dataset (Opendatasoft Explore API v2.1).

Use after sns_search_datasets for anything the curated tools don't cover. Clauses are ODSQL:

  • where: instituicao like "santa maria" and tempo >= date'2026-01-01' (like is a case- and accent-insensitive "contains"; dates use date'YYYY-MM-DD')

  • select: tempo, instituicao, total_urgencias or aggregates sum(total_urgencias) as total

  • group_by: regiao or tempo (combine with aggregates in select)

  • order_by: tempo desc Most hospital-activity datasets (field tempo, monthly) store YEAR-TO-DATE CUMULATIVE values: December is the annual total; a single month = this month minus the previous one. Many datasets have a regiao and an instituicao (or entidade) field. Official statistics, not live data.

Args: dataset_id: e.g. "ocupacao-do-internamento" (from sns_search_datasets). where, select, group_by, order_by: ODSQL clauses (optional). limit: Rows to return (default 20, max 100). offset: Skip rows, for paging.

NameRequiredDescriptionDefault
limitNo
whereNo
offsetNo
selectNo
group_byNo
order_byNo
dataset_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With zero annotations the description carries the full burden, and it delivers real behavioral context the agent could not otherwise know: results are "official statistics, not live data", and hospital-activity datasets store year-to-date cumulative values so a single month must be differenced. It also discloses the limit ceiling (max 100) and paging via offset. It stops short of stating read-only semantics or failure behavior for a bad dataset_id, which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening sentence front-loads purpose and API version, then bullets keep the clause reference scannable. The cumulative-values warning is the longest block, but it is high-value domain context rather than filler. Slightly dense, yet no sentence is expendable.

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?

An output schema exists, so return shape needs no explanation, and the description covers the query dialect, field conventions (tempo, regiao, instituicao/entidade), and result-size controls. The main remaining gap is error/empty-result behavior and whether the call requires any auth, which for a 7-parameter free-form query tool would help.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must compensate entirely, and it does: every parameter is explained with concrete ODSQL syntax (where with `like` and date'YYYY-MM-DD', select with aggregates, group_by, order_by), dataset_id gets a real example, and limit is given a default and max. This is meaningfully more than the schema's bare titles and defaults.

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 and resource: "Run an ODSQL query on any SNS Transparency portal dataset (Opendatasoft Explore API v2.1)". It immediately distinguishes itself from the curated siblings (sns_emergency_stats, sns_surgery_wait_stats) by framing itself as the general-purpose escape hatch, and even names the upstream API so the query dialect is unambiguous.

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?

"Use after sns_search_datasets for anything the curated tools don't cover" gives both the prerequisite tool and the exclusion condition that routes the agent here. The dependency on sns_search_datasets for dataset_id is reinforced in the Args section, so an agent knows the entry path.

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

sns_search_datasetsA

Search the ~150 datasets of the SNS Transparency portal (titles and descriptions are in Portuguese).

Use when the curated tools don't cover the question — e.g. hospital bed occupancy ("ocupação"), births/caesareans ("partos"), INEM pre-hospital calls, SNS 24 calls, family doctor coverage ("médico de família", "inscritos"), medicines spending, staff ("trabalhadores"), cancer screening ("rastreios"). Then call sns_query_dataset with the dataset_id and the field names returned here. Portuguese keywords work best; matching is accent-insensitive.

Args: query: Keywords, e.g. "ocupação internamento", "partos", "urgência". Empty = list all (id + title). limit: Max results (default 10, max 50; ignored when listing all).

NameRequiredDescriptionDefault
limitNo
queryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/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 behavioral burden and does well: it discloses Portuguese-language titles/descriptions, accent-insensitive matching, empty-query listing behavior, and that limit is ignored when listing all. It does not cover error behavior or rate limits, but the key search semantics are clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by usage guidance, workflow, and parameter notes. The examples and formatting earn their place by making search behavior and follow-up steps immediately actionable.

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?

Given an output schema exists, the description need not explain return values in detail, and it still explains the important listing behavior. It also connects the tool to sns_query_dataset, making the overall workflow complete for an agent.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining query as Portuguese keywords with examples, empty query as list-all returning id and title, and limit as default 10, max 50, ignored when listing all. This adds substantial meaning beyond the bare 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?

States a specific verb and resource: search the ~150 datasets of the SNS Transparency portal. It also distinguishes itself from curated tools and names the follow-up sibling sns_query_dataset, so an agent can place it precisely.

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?

Explicitly says when to use it: when curated tools do not cover the question, with concrete examples such as hospital bed occupancy, births, INEM calls, and cancer screening. It also states the next step: call sns_query_dataset with the returned dataset_id and field names.

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

sns_surgery_wait_statsA

Surgery access indicators per month: surgical waiting list, % within the guaranteed maximum time, mean days from admission to surgery, and surgeries performed.

Use for "how long is the wait for surgery at X?", "how many people are on the surgery list in the Norte region?", "how many operations did hospital Y do?". Official monthly statistics (latest month usually 2-3 months back, provisional). The open data has NO breakdown by specialty or procedure — say so if asked for one.

Per period (latest first):

  • waiting_list: patients on the surgical waiting list (LIC) at month end, how many are still within the legal maximum guaranteed response time (TMRG, 180 days for normal priority since 2018) and the % within it.

  • mean_days_before_surgery_in_month / _year_to_date: average days between hospital admission and the operation for scheduled inpatient surgery (this is NOT the time on the waiting list).

  • surgeries_in_month / surgeries_year_to_date: scheduled (= inpatient + day surgery) and urgent.

Args: institution: Hospital or ULS name ("Santa Maria", "Coimbra", "IPO Porto"); mapped to its ULS. region: Norte | Centro | LVT (Lisboa) | Alentejo | Algarve. Ignored if institution is given. period: Latest month to include, "YYYY-MM" (default: newest available). months: How many months back (default 6, max 24).

NameRequiredDescriptionDefault
monthsNo
periodNo
regionNo
institutionNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses that figures are official monthly statistics, usually lagging 2-3 months, provisional, and lacking specialty/procedure breakdowns. It also clarifies metric definitions such as LIC, TMRG, and that mean days before surgery is not time on the waiting 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?

The description is front-loaded with purpose, use cases, and limitations, then organizes metric definitions and arguments into clearly labeled sections. Despite its length, every part earns its place by compensating for the absent annotations and undocumented schema parameters.

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?

Given four parameters, 0% schema coverage, no annotations, and the presence of an output schema, the description is complete enough for correct invocation. It covers input semantics, data freshness, limitations, and metric meanings without needing to duplicate return-structure documentation.

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

Parameters5/5

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

Although schema description coverage is 0%, the Args section fully explains all four parameters: institution mapping to ULS, region values and precedence, period format and default, and months default/max. This adds clear semantics beyond the bare schema 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?

The description states a specific resource and scope: monthly surgery access indicators including waiting list, TMRG compliance, mean days to surgery, and surgeries performed. It distinguishes itself from sibling tools like sns_consultation_wait_stats by focusing explicitly on surgical waiting statistics.

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 usage examples for wait times, regional list sizes, and hospital operation volumes, and it explicitly notes the lack of specialty/procedure breakdown. However, it does not name alternative tools or state when to use another sibling instead, leaving routing slightly implicit.

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

weather_forecastA

5-day weather forecast for a place in Portugal (IPMA, official).

Args: place: district capital or island town, e.g. "Lisboa", "Porto", "Faro", "Funchal", "Ponta Delgada". lat, lon: use instead of place for anywhere else; the nearest IPMA forecast location is used. Returns daily min/max temperature, rain probability, weather type, wind, and today's UV index.

NameRequiredDescriptionDefault
latNo
lonNo
placeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose a genuinely important behavior: with lat/lon 'the nearest IPMA forecast location is used', so the agent knows results may be snapped to a nearby station rather than the exact point. It also lists the returned fields. It does not cover failure behavior for unknown place names or non-Portuguese coordinates.

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 core purpose is front-loaded in the first clause, followed by a compact parameter block and a one-line return summary. No sentence is 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?

An output schema exists, so the return-value sentence is a bonus rather than a necessity, and the location-snapping behavior is well covered. The gap is the all-optional parameter set with no statement of the valid call combinations or error conditions.

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 0%, but the description compensates well: 'place' is defined as a district capital or island town with four concrete examples, and lat/lon is framed as an alternative input mode. It does not state that at least one of the three optional parameters must be supplied, which is a real ambiguity given all params are optional.

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

Purpose5/5

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

States a specific verb+resource (5-day weather forecast) with explicit scope: Portugal, IPMA as the official source. The scope statement alone separates it from siblings like sea_forecast and weather_warnings, which cover different domains.

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 place-vs-lat/lon argument split implies the usage pattern, and 'use instead of place for anywhere else' gives a selection rule between the two modes. But there is no guidance on when to pick this over weather_warnings or sea_forecast, and no note on what to do when a location is outside IPMA coverage.

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

weather_warningsA

Active IPMA weather warnings (rain, wind, heat, cold, snow, fog, sea, thunderstorms).

Args: area: optional district or island group, e.g. "Lisboa", "Madeira", "Açores". Omit for the whole country. include_green: also list green (no-warning) entries. Default false.

NameRequiredDescriptionDefault
areaNo
include_greenNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/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. 'Active' implies only currently-in-effect warnings are returned and include_green clarifies what is excluded by default, which is useful. It does not mention data freshness, source update cadence, or any auth constraints, leaving some behavioral gaps for a tool with zero annotation coverage.

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 purpose is front-loaded in one line, followed by a compact args list where each entry earns its place. Slightly list-heavy but no wasted prose.

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?

An output schema exists, so return values need not be described, and both parameters are explained with defaults and examples. Complete enough for a two-param read tool; only minor gaps around data freshness remain.

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 0%, so the description must compensate, and it does: area is given concrete examples ('Lisboa', 'Madeira', 'Açores') plus the omit-for-country semantics, and include_green is explained with its default. This adds real meaning beyond the bare schema types.

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

Purpose4/5

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

States a specific resource (active IPMA weather warnings) and enumerates the warning categories covered, which lets an agent distinguish it from weather_forecast or sea_forecast. It stops short of explicitly naming those siblings as alternatives.

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 area parameter documentation implies when to scope down ('omit for the whole country') and include_green clarifies the default behavior. However, there is no explicit guidance on when to prefer this tool over weather_forecast or sea_forecast, so selection relies on the agent inferring from names.

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

where_isA

Which parish, municipality and district a coordinate is in, plus altitude, land use and hazard maps.

NameRequiredDescriptionDefault
latYes
lonYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Since there are no annotations, the description must bear the full burden. It provides excellent behavioral context by listing the rich data returned, including 'altitude, land use and hazard maps,' which informs the agent about the depth of the output beyond simple location names.

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 definition is a single, highly effective sentence that gets straight to the core functionality and scope without any extraneous detail.

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?

Given the minimal input schema and lack of annotations, this description is exceptionally complete. It informs the AI exactly what the tool does and what types of data the user will receive upon invocation.

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 input schema only defines 'lat' and 'lon' as basic numbers. The description significantly adds value by defining the semantic context of those parameters—that they are lookup points for detailed geographic and environmental analysis.

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

Purpose4/5

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

The description clearly defines the function as coordinate resolution (finding parish, municipality, and district) based on the input coordinates. While highly specific, it does not explicitly contrast itself against every related sibling tool, which prevents a perfect score.

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 tool implies usage when detailed geographic and environmental context (like land use and hazards) is required for a given point. However, it provides no explicit guidance on when *not* to use it, nor does it route the agent to alternatives like `municipality`.

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. 42 tool updatesv0.1.1
    • First observedbpstat_search
    • First observedbpstat_series
    • First observedbus_find_stops
    • First observedbus_line_info
    • First observedbus_next_arrivals
    • First observedbus_service_alerts
    • First observedbus_vehicle_positions
    • First observedearthquakes
    • First observedev_charger_detail
    • First observedev_chargers
    • First observedfind_medicine_near
    • First observedfire_risk
    • First observedfuel_prices
    • First observedfuel_station_detail
    • First observedfuel_types
    • First observedine_indicator
    • First observedine_search
    • First observedmedicine_availability
    • First observedmedicine_help
    • First observedmunicipality
    • First observedopen_data_dataset
    • First observedopen_data_preview
    • First observedopen_data_search
    • First observedparliament_deputies
    • First observedparliament_initiative
    • First observedparliament_search
    • First observedparliament_votes
    • First observedpharmacies
    • First observedpostal_code
    • First observedpublic_contracts
    • First observedpublic_contracts_summary
    • First observedpublic_holidays
    • First observedsea_forecast
    • First observedsns_consultation_wait_stats
    • First observedsns_emergency_stats
    • First observedsns_find_institutions
    • First observedsns_query_dataset
    • First observedsns_search_datasets
    • First observedsns_surgery_wait_stats
    • First observedweather_forecast
    • First observedweather_warnings
    • First observedwhere_is

TDQS

B3.3/5.0

Scored across 42 tools

Disambiguation4/5

Most tools are partitioned by source/domain and action, such as search vs detail vs summary, and the descriptions make boundaries clear. The main overlaps are around medicines (medicine_help, medicine_availability, find_medicine_near, pharmacies) and the two dataset-search families, but they are still distinguishable.

Naming Consistency4/5

All names use snake_case and most follow consistent domain prefixes such as sns_, parliament_, public_contracts_, fuel_, ev_, and bus_. A few noun-only names (earthquakes, pharmacies, municipality) and singular/plural detail naming slightly break a strict verb_noun pattern, but the set remains predictable.

Tool Count2/5

At 42 tools, the surface is well above the 3-15 well-scoped range and crosses the 25+ threshold for being too many. The server spans many unrelated Portugal public-service domains, and while each cluster is individually coherent, the total tool count is heavy and some composite/one-shot tools add extra surface area.

Completeness3/5

Covered domains generally have search-to-detail or lifecycle coverage, such as INE/BPstat, parliament, public contracts, SNS statistics, fuel, EV charging, and buses. However, there are notable gaps: no general address/place geocoding despite many lat/lon-based tools, transport coverage is limited to Carris Metropolitana, and municipal holidays are explicitly excluded.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides access to Portuguese weather data from IPMA (Instituto Português do Mar e da Atmosfera), including weather forecasts, meteorological warnings, seismic data, UV index, and real-time observations from weather stations across Portugal.
    6
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying Portugal's national open data portal (dados.gov.pt) through natural language.
    413 npm
    MIT