UK Business Tools - Ledgerhall
Ledgerhall
Datos públicos del Reino Unido para agentes de IA. Una conexión. Companies House, Registro de la Propiedad, GOV.UK, tribunales, Parlamento: tu agente lo obtiene todo.
https://uk-business-mcp.fly.dev/mcpSin clave API. Sin cuenta. Gratuito y alojado.
Qué puedes hacer
Una vez conectado, tu agente de IA puede:
Consultar cualquier empresa del Reino Unido — directores, accionistas, historial de presentación de documentos, funcionarios inhabilitados
Investigar propiedades — ventas comparables, calificaciones EPC, listados de Rightmove, rendimientos de alquiler, impuesto de timbre
Buscar jurisprudencia y legislación — sentencias judiciales, leyes, debates de Hansard, orientación de HMRC
Consultar GOV.UK — buscar en más de 700.000 páginas, resolver códigos postales a ayuntamientos, encontrar documentos de políticas
Realizar diligencia debida — referencias cruzadas de Companies House, Charity Commission, Registro de la Propiedad, insolvencias en Gazette, registros de IVA
Related MCP server: Bizfile MCP
Configuración
claude.ai
Ve a Settings (abajo a la izquierda)
Haz clic en MCP Servers
Haz clic en Add
Pega:
https://uk-business-mcp.fly.dev/mcp
Claude Desktop
Añade a claude_desktop_config.json:
{
"mcpServers": {
"ledgerhall": {
"type": "http",
"url": "https://uk-business-mcp.fly.dev/mcp"
}
}
}Claude Code
claude mcp add --transport http ledgerhall https://uk-business-mcp.fly.dev/mcpChatGPT
Ve a Settings → Connected apps → Add MCP server
Pega:
https://uk-business-mcp.fly.dev/mcp
Cursor / otros editores
Añade a .cursor/mcp.json:
{
"mcpServers": {
"ledgerhall": {
"url": "https://uk-business-mcp.fly.dev/mcp"
}
}
}Qué incluye
Ledgerhall es un proxy FastMCP que agrupa cuatro servidores MCP especializados del Reino Unido en un único punto final. Cada servidor cubre una parte diferente del registro público del Reino Unido.
Prefijo | Servidor | Cobertura |
| Más de 700k páginas de GOV.UK, organizaciones, códigos postales | |
| Jurisprudencia, legislación, Hansard, orientación de HMRC, OSCOLA | |
| Companies House, Charity Commission, Registro de la Propiedad, Gazette, IVA | |
| Registro de la Propiedad, EPC, Rightmove, rendimientos, impuesto de timbre, planificación |
Cómo funciona
Proxy puro: sin almacenamiento de datos, sin herramientas personalizadas. Cada solicitud se reenvía al backend correspondiente. Las listas de herramientas se almacenan en caché durante 5 minutos. Construido con FastMCP create_proxy() y mount().
Próximamente
Cumplimiento en el Reino Unido — Registro de la FCA y comprobaciones de abogados de la SRA
Estadísticas del Reino Unido — Datos económicos de la ONS y perfiles del mercado laboral de Nomis
Los nuevos servidores aparecen automáticamente. No se necesitan cambios de configuración.
Enlaces
Página del producto: bouch.dev/ledgerhall
Habilidades de IA gratuitas: bouch.dev/tools
Creado por: BOUCH — Consultoría de IA, East Midlands
Licencia
MIT
Available Tools
74 toolsdd_charity_profileGet Charity ProfileARead-onlyIdempotent
Fetch the full Charity Commission profile for a charity number.
Returns trustees, latest income/expenditure, insolvency flags, governing document type, classifications, and countries of operation. Use charity_search first to find the charity number.
| Name | Required | Description | Default |
|---|---|---|---|
| charity_number | Yes | Charity Commission registration number (e.g. '1234567'). Returned by charity_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | No | Registered address of the charity (joined address lines). |
| insolvent | No | True if the charity is flagged as insolvent. |
| reg_status | No | Registration status code ('R', 'RM'). |
| charity_name | No | Registered charity name. |
| charity_type | No | Charity type. |
| latest_income | No | Latest filed annual income in GBP. |
| trustee_names | No | Trustees on record. Truncated to 30 entries. |
| charity_number | Yes | Charity registration number. |
| who_what_where | No | Who/What/Where classification entries. The list may be truncated truncated to 50 entries. |
| reg_status_label | No | Human-readable registration status. |
| in_administration | No | True if the charity is in administration. |
| latest_expenditure | No | Latest filed annual expenditure in GBP. |
| trustee_names_total | No | Total trustees upstream before truncation. |
| date_of_registration | No | Date of first registration. |
| who_what_where_total | No | Total classification entries upstream before truncation. |
| charity_co_reg_number | No | Companies House number for charities also registered as companies (Charitable Incorporated Organisations, etc.). |
| countries_of_operation | No | Countries the charity operates in (capped at 10 upstream). |
| trustee_names_truncated | No | True if the trustee list was truncated. |
| who_what_where_truncated | No | True if the classification list was truncated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the description is not required to repeat that. It adds useful context about the data fields (e.g., insolvency flags) but does not disclose potential edge-case behaviors like missing data or rate limits. This is adequate but not rich beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the core purpose and then listing returns and usage guidance. Every sentence earns its place with no fluff or repetition of schema/annotation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only lookup, the description provides enough context: it names the data source, lists returned content, and gives the prerequisite workflow. An output schema exists, so detailed return formatting is not needed here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage for the single parameter, and the schema description already explains what charity_number is and where it comes from. The tool description adds no further parameter-specific detail beyond the implied meaning of 'charity number', so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Fetch the full Charity Commission profile for a charity number', using a specific verb and resource. It also lists the key data returned (trustees, income/expenditure, insolvency flags, etc.), which distinguishes it from sibling tools like dd_charity_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Use charity_search first to find the charity number', which establishes the correct workflow and distinguishes when to use this tool vs. the search tool. This is direct, actionable guidance on usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_charity_searchSearch Charity Commission RegisterARead-onlyIdempotent
Search the Charity Commission register of England and Wales by name or keyword.
Returns matching charities with registration number, status, and
registration date. Use charity_profile for full details once you
have the charity number. The upstream searchCharityName endpoint
returns the full list in one shot — pagination is applied
client-side via offset/limit. A query that matches nothing is a
successful empty result (charities: []), not an error — the
upstream endpoint signals "no matches" with an HTTP 404, which is
translated back into an empty result here rather than surfaced as
a not-found failure.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return in this page. Default 20; raise to 100 for bulk views. | |
| query | Yes | Charity name or keyword to search for | |
| offset | No | Number of items to skip before this page. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Max items requested for this page. |
| query | Yes | Search term applied. |
| total | Yes | Total matches returned by upstream. |
| offset | Yes | Number of items skipped before this page (client-side). |
| has_more | Yes | True if more items may exist beyond this page. Re-call with offset=offset+returned to continue. |
| returned | Yes | Items actually returned on this page. |
| charities | No | Matching charity records. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, openWorld, and idempotent hints, and the description adds valuable behavior beyond them: the upstream endpoint returns the full list in one shot with client-side pagination, and a no-match query is a successful empty array rather than an error because an upstream 404 is translated to 'charities: []'. This prevents an agent from misinterpreting normal empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every sentence earns its place: purpose/return fields, routing to charity_profile, pagination behavior, and empty-result handling. There is no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's modest complexity, complete parameter schemas, rich annotations, and an output schema, the description covers everything an agent needs to invoke it correctly: what it searches, what it returns, how pagination works, and how no-match results are signalled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents query, limit, and offset. The description reinforces that query is a name or keyword but does not add meaningful semantic detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search the Charity Commission register of England and Wales') and names the returned fields: registration number, status, and registration date. It also distinguishes itself from the sibling charity profile tool by saying to use charity_profile for full details once a charity number is known.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly signals when to use this tool: to search the charity register by name or keyword. It also provides an explicit routing instruction to charity_profile for full detail. It does not enumerate exclusions or contrast with generic search siblings, but the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_chargesGet Company ChargesARead-onlyIdempotent
Fetch the complete Companies House charge history for a company.
Returns every registered charge (secured debt) — current and historic — with status, dates, secured parties, and what each charge covers (fixed/floating/negative-pledge flags and any free-text particulars). Satisfaction is represented as satisfied_on plus a charge-satisfaction filing entry, not a separate 'release' record. company_profile.has_charges is a True/False/unknown summary derived from this same data; use this tool when the specific charges matter, not just whether any exist.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| charges | No | Every charge, current and historic. |
| total_count | Yes | Total charges returned. |
| company_number | Yes | Companies House company number. |
| satisfied_count | No | Upstream count of satisfied charges, or null if not provided. |
| unfiltered_count | No | Upstream unfiltered charge count, or null if not provided. |
| part_satisfied_count | No | Upstream count of part-satisfied charges, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnly/openWorld/idempotent annotations by disclosing important behavior: how satisfaction is represented (not a separate 'release' record), which flags and particulars are included, and the relationship to company_profile.has_charges. This provides valuable interpretive context for an AI agent using the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary action, but it includes a few explanatory clauses that could be slightly tightened. Overall, each major piece (scope, return contents, satisfaction quirk, usage condition) earns its place and no redundant filler remains.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the input schema fully documents the parameter and an output schema exists, the description supplies all necessary invocation context plus enough semantic detail about the content. The tool is a straightforward read, and the description fully covers whether/how it relates to other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the sole parameter completely (Companies House company number, max length, format). The description adds no additional parameter detail, so with 100% schema coverage, a baseline 3 is appropriate; no value is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the complete Companies House charge history for a company.' It clearly differentiates itself from siblings by clarifying it covers specific charges rather than a summary, and explains what data is returned (status, dates, secured parties, flags). The distinction from company_profile.has_charges is explicitly named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit usage condition: 'use this tool when the specific charges matter, not just whether any exist.' This implies an alternative for checking existence (company_profile.has_charges). While it names the summary field rather than the sibling tool directly, the alternative is clear enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_filing_documentGet Companies House Filing DocumentARead-onlyIdempotent
Resolve a filing's document_metadata link to its authoritative source document.
Returns a resource_link (never embedded bytes, never base64) pointing at a company-document:// MCP resource — fetch it via resources/read to get the actual PDF. This tool only reads metadata (category, pages, available content types, byte size); it never downloads the document itself. Use company_filing_history first to find a filing's document_metadata URL.
Requires a resource-capable MCP client to retrieve the actual bytes — a tool-only client can see this result's metadata (company, category, page count, size) but cannot obtain the file through this tool call alone.
| Name | Required | Description | Default |
|---|---|---|---|
| mime_type | No | Which content representation to select, e.g. 'application/pdf'. Omit when the document has only one representation (the near-universal case) — it is auto-selected. Required if the document has more than one; omitting it in that case returns a validation error listing the choices. | |
| document_metadata_url | Yes | The document_metadata URL from a filing's links.document_metadata (returned by company_filing_history) — pass it through verbatim, not a document_id. Must be an exact https://document-api.company-information.service.gov.uk/document/{id} URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint, idempotentHint, and destructiveHint=false annotations, the description goes well beyond them: it states the tool never embeds bytes and never returns base64, only reads metadata, and requires a resource-capable MCP client for bytes. It explicitly discloses that tool-only clients cannot obtain the file, which is valuable behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and mostly front-loaded: purpose first, output type second, metadata-only behavior third, and workflow fourth. Almost every sentence earns its place. There's slight redundancy between 'never downloads' and 'can see this result's metadata but cannot obtain the file,' but it's honestly more clarifying than wasteful. A tight 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema to fall back on, the description fully compensates: it states the exact return shape (resource_link) and its type (company-document:// MCP resource), what metadata fields are available (company, category, page count, size, content types), and the prerequisite steps. This is exactly the completeness needed for a 2-param, no-output-schema resolver tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—both params are documented in the schema. The description adds semantic nuance beyond the schema by asserting the URL must be passed verbatim and must be an exact document-api URL, and by contextualizing mime_type selection as needing to only be set when multiple representations exist. This is valuable on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair: 'Resolve a filing's document_metadata link to its authoritative source document.' It clearly distinguishes this from siblings like dd_company_filing_history by explaining that this tool converts the discovered metadata URL into a concrete resource_link rather than listing filings or downloading content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit workflow guidance is provided: 'Use company_filing_history first to find a filing's document_metadata URL,' with follow-on instructions to fetch the actual PDF via resources/read. The description also warns about client capability constraints, telling tool-only clients exactly what they can and cannot do, which is clear when-to-use and when-not-to-use information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_filing_historyGet Company Filing HistoryARead-onlyIdempotent
Fetch one page of a company's Companies House filing chronology.
Returns the raw source facts for each filing — transaction ID, form type/category, dates, and the description_values CH uses to render its own text — as delivered upstream, not interpreted into DD conclusions. links.document_metadata on each filing is the identifier a future document-retrieval tool would need; no document content is fetched here.
Unlike company_officers/company_psc/company_charges, this does NOT auto-fetch every page — a long-lived company's filing history is unbounded in practice (a decades-old PLC can carry thousands of filings). total_count/returned/has_more are always reported truthfully for whatever page and category filter was requested; nothing is silently truncated. Narrow with category= for a specific slice (e.g. category='mortgage' for charge-related filings, category='insolvency' for administration/liquidation filings) — a note is included when an unfiltered history is large.
A company_number that doesn't resolve to any company returns a structured not_found error, distinct from a genuine zero-filing result — Companies House's filing-history endpoint alone cannot tell these apart, so existence is confirmed separately when the result would otherwise be empty.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter by CH filing category — comma-separated for multiple, e.g. 'mortgage' or 'mortgage,officers'. Omit for all categories. Common values: accounts, confirmation-statement, officers, address, capital, mortgage, persons-with-significant-control, incorporation, insolvency, resolution, annual-return, change-of-name, change-of-constitution, gazette, miscellaneous. | |
| start_index | No | Pagination offset. Default 0. Re-call with start_index=start_index+returned while has_more is true. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Results per page (Companies House caps at 100 regardless of a higher value). Default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note, e.g. suggesting a category filter when total_count is large and no category was applied. Informational only — never a truncation. |
| filings | No | Filings on this page. |
| category | No | The category filter applied to this query, or null if unfiltered. |
| has_more | Yes | True if start_index + returned < total_count. |
| returned | Yes | Filings returned on this page. |
| start_index | Yes | Pagination offset used for this page. |
| total_count | Yes | Total filings matching this query (across all pages). |
| company_number | Yes | Companies House company number. |
| items_per_page | Yes | Page size actually used (CH caps at 100 regardless of a higher request). |
| filing_history_status | No | Upstream filing-history status (e.g. 'filing-history-available'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, openWorld, idempotent, non-destructive), the description discloses key behaviors: it returns raw upstream facts not interpreted DD conclusions, does not fetch document content, reports total_count/returned/has_more truthfully, and never silently truncates. It also explains the not_found error distinct from an empty result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured into a first-sentence summary, a core behavior paragraph, and a pagination/filtering/error paragraph. Every sentence provides necessary context, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a one-page API read with 4 parameters and an output schema. The description adequately covers what is returned, how pagination works, making important distinctions from sibling tools, and how to handle errors, making it comprehensive for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description doesn't need to restate parameter details. However, it adds value by giving category filter usage examples (category='mortgage', 'insolvency') and clarifying the pagination re-call pattern with start_index=start_index+returned. This complements the schema's already detailed descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches one page of a company's Companies House filing chronology, with a specific verb ('fetch') and resource. It distinguishes itself from sibling tools (company_officers/psc/charges) by emphasizing it does not auto-fetch every page and does not fetch document content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly guides when to use this tool versus alternatives: it does NOT auto-fetch every page unlike related tools, advises narrowing with category= for specific slices, and notes document retrieval is not performed here. The description also explains how to handle not_found versus zero-filing results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_officersGet Company OfficersARead-onlyIdempotent
Fetch officers for a Companies House company number.
Returns directors, secretaries, and other officers with appointment dates, nationality, and country of residence. Resigned officers are excluded by default; set include_resigned=true for historical DD. Pagination is handled internally.
| Name | Required | Description | Default |
|---|---|---|---|
| start_index | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. | |
| items_per_page | No | Ignored — pagination is handled internally. Only accepted to avoid call failures. | |
| include_resigned | No | Include resigned/historic officers. Default false for backwards-compatible current-officer queries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total officers returned (filtered by include_resigned). |
| officers | No | Officer records. |
| company_number | Yes | Companies House company number. |
| include_resigned | Yes | Whether resigned officers were included in this result. |
| high_appointment_count_flag | No | Number of active officers with 10+ total appointments, or null if appointment counts were not fetched. Non-zero values are a nominee/phoenix director risk signal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses useful behaviors beyond the readOnlyHint/idempotent annotations: resigned officers are excluded by default, include_resigned=true is the opt-in, and pagination is handled internally. These are real operational details that change how an agent calls/de is treated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, no filler, main purpose explicitly stated up front, and the most important non-obvious behaviors are spaced out clearly. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existing output schema and the annotations and the rich schema coverage, the description fully covers what an agent needs to know to correctly select and invoke the tool. It covers the action, the returned data shape, the key parameter option, and the internal pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains each parameter — including the ignored start_index/items_per_page and the default false for include_resigned. The description mainly re-states what the schema covers, though it adds the note 'historical DD' which gives light additional context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with 'Fetch officers for a Companies House company number,' which names the exact verb and resource. It then states what is returned (directors, secretaries, other officers) and easily distinguishes this tool from sibling tools like dd_company_charges or dd_officer_appointments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is the tool to use for company officer lists and gives a concrete condition for the include_resigned parameter. It does not explicitly mention alternatives such as 'if you need a single officer's appointment history use dd_officer_appointments', so it misses explicit exclusion 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.
dd_company_profileGet Company ProfileARead-onlyIdempotent
Fetch the full Companies House profile for a company number.
Returns status, registered address, SIC codes, filing compliance (overdue accounts and confirmation statement flags), and whether the company has outstanding charges. Use company_search first to find the company number.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | Accounts filing status and due dates. |
| sic_codes | No | Standard Industrial Classification codes. |
| has_charges | No | True if the company has at least one outstanding or part-satisfied charge (secured debt) — not yet fully discharged. False if every charge on record is fully satisfied, or there are none. Null if the charges check could not be completed, or if a charge was returned with an unrecognized status that can't be confidently classified. Use company_charges for the full charge-by-charge detail. |
| company_name | No | Registered company name. |
| company_type | No | Companies House company type code. |
| company_number | Yes | Companies House company number. |
| company_status | No | Current status (active, dissolved, in liquidation, etc.). |
| date_of_creation | No | Incorporation date (ISO YYYY-MM-DD). |
| confirmation_statement | No | Confirmation statement filing status and next due date. |
| registered_office_address | No | Registered office address as returned by Companies House. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover the safety profile (read-only, idempotent, non-destructive), so the description adds value by disclosing exactly which pieces of company data the call returns. It also communicates that the result is a composite profile rather than a single filing or charge record. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loads the main purpose in the first sentence, and then adds only useful clarifying details. There is no repeated information from the tool name or title, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only lookup with a rich output schema, the description covers the tool's scope, return contents, and prerequisite workflow. Given the strong annotations and schema coverage, the agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already extensively documents company_number, including format examples and the fact that it comes from company_search, so parameter coverage is effectively 100%. The description reinforces the use of company_search but does not add substantial new parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Fetch the full Companies House profile for a company number') and then lists the concrete data returned (status, registered address, SIC codes, compliance flags, outstanding charges). This clearly distinguishes it from siblings like dd_company_charges, dd_company_filing_history, and dd_company_officers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear prerequisite: 'Use company_search first to find the company number.' This establishes the expected workflow. It does not explicitly mention when to prefer sibling tools such as dd_company_filing_history over this one, but the listed return fields and prerequisite provide adequate selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_pscGet Persons with Significant ControlARead-onlyIdempotent
Fetch Persons with Significant Control (beneficial ownership) for a company.
Returns PSC entries with natures of control, nationality, and country of residence. Flags overseas corporate PSC entries as a beneficial ownership risk signal. Returns an explanatory note for widely-held PLCs with no registrable PSC.
| Name | Required | Description | Default |
|---|---|---|---|
| company_number | Yes | Companies House company number (8 digits, e.g. '03782379'). Returned by company_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| psc | No | Persons with Significant Control records. |
| note | No | Explanatory note when total=0. Typical for widely-held listed PLCs where no single person or entity holds 25%+ of shares or voting rights. |
| total | Yes | Total PSC entries returned for this company. |
| company_number | Yes | Companies House company number. |
| overseas_corporate_psc_flag | No | Number of corporate PSCs registered outside the UK. Non-zero values indicate an offshore beneficial ownership chain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable behavioral context beyond that: it flags overseas corporate PSC entries as a beneficial-ownership risk signal and explains the special explanatory note for widely-held PLCs with no registrable PSC.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, direct, and front-loaded with the core action and resource. Every sentence contributes useful information about what is returned, a risk flag, or a meaningful edge case.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an output schema and helpful annotations, the description covers the main content, a special risk behavior, and an unusual empty-result case. Nothing important is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, company_number, and the input schema already describes it fully with length constraints, format, and an example. The description adds no parameter-level detail, which is acceptable given 100% schema coverage, so the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch Persons with Significant Control (beneficial ownership) for a company.' It also names the key data returned, distinguishing it from related company tools like dd_company_officers and dd_company_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The resource and terminology make the use case clear, but there is no explicit guidance about when to prefer this tool versus alternatives such as dd_company_officers or dd_company_profile. The distinction is implied strongly by 'beneficial ownership' rather than stated directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_company_searchSearch Companies HouseARead-onlyIdempotent
Search the Companies House register by company name or keyword.
Returns a paginated list of matching companies with name, number, status, SIC codes, incorporation date, and registered address. Use company_profile for the full record once you have the company number. Re-call with start_index=start_index+items_per_page to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name or keyword to search for | |
| start_index | No | Pagination offset. Default 0. | |
| company_type | No | Filter by company type (e.g. 'ltd', 'llp'). Omit to search all. | |
| company_status | No | Filter by company status (e.g. 'active', 'dissolved'). Omit to search all. | |
| items_per_page | No | Number of results to return (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching companies. Use the `company_number` field to call company_profile, company_officers, or company_psc for full detail. |
| query | Yes | The query string that was searched. |
| has_more | Yes | True if more results exist beyond this page. Re-call with start_index=start_index+items_per_page to fetch the next page. |
| returned | Yes | Number of items actually returned on this page. |
| start_index | Yes | Number of results skipped before this page (upstream start_index). |
| total_results | Yes | Total matching companies in Companies House (server-side). |
| items_per_page | Yes | Page size requested from the API for this call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by specifying that results are paginated and listing the returned fields (name, number, status, SIC codes, incorporation date, registered address). This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary purpose, and every sentence earns its place. The first sentence states what it does and what it returns; the second provides alternative tool guidance and pagination instructions. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to enumerate return types. It covers the core search purpose, pagination behavior, and directs to company_profile for full records. This is sufficient for an agent to select and invoke the tool correctly in the context of its sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of parameters with descriptions. The description adds meaning beyond the schema by explicitly teaching the pagination relationship between start_index and items_per_page. It also re-emphasizes that 'query' is a company name or keyword, reinforcing the schema's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search the Companies House register by company name or keyword.' It clearly differentiates from siblings by advising 'Use company_profile for the full record once you have the company number,' which distinguishes this tool from the related profile tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit alternative guidance: 'Use company_profile for the full record once you have the company number.' It also gives explicit pagination instructions with 'Re-call with start_index=start_index+items_per_page to fetch the next page,' telling the agent how to retrieve additional results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_disqualified_profileGet Disqualified Director ProfileARead-onlyIdempotent
Fetch the full disqualification record for a director by officer ID.
Returns all disqualification orders: reason, Act/section cited, disqualification period, and associated company names. Use disqualified_search first to find the officer ID.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned by disqualified_search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name. |
| surname | No | Family name, if split upstream. |
| forename | No | Given name, if split upstream. |
| officer_id | Yes | Companies House officer ID looked up. |
| nationality | No | Declared nationality. |
| officer_kind | Yes | Which CH endpoint returned the record: 'natural' (individual) or 'corporate' (legal entity). |
| date_of_birth | No | Date of birth on record. |
| disqualifications | No | All disqualification orders attached to this officer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds useful behavioral detail about the return content (reason, Act/section, period, company names), which goes beyond annotations. It doesn't mention auth/rate limits, but those are not critical given the read-only, simple nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: purpose, return details, and usage guidance. Every sentence adds distinct value, and the most important action is front-loaded. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only lookup with an output schema, the description covers all essential aspects: what it does, what data it returns, and how to get the required ID. No significant gaps for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for officer_id with a clear description (Companies House officer ID, returned by disqualified_search). The description repeats this information without adding new semantic meaning, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a full disqualification record for a director by officer ID. It distinguishes itself from sibling tools like dd_disqualified_search (which searches) and dd_charity_profile (which handles charities). The verb 'Fetch' and resource are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Use disqualified_search first to find the officer ID', establishing a clear prerequisite and directing the user to the correct sibling tool. This provides both when-to-use context and an alternative, leaving no ambiguity about the required prior step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_disqualified_searchSearch Disqualified DirectorsARead-onlyIdempotent
Check whether a named individual is banned from acting as a UK company director.
Use this tool when asked to check disqualified, banned, or barred directors. Query must be an individual's name (e.g. "Richard Howson") — NOT a company name, which always returns zero results.
Returns names, dates of birth, disqualification period snippets, and officer IDs that can be used with disqualified_profile for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Alias for query — the person's name. | |
| query | No | Person's name to search for, e.g. query='Richard Howson'. NOT a company name. | |
| start_index | No | Pagination offset (0-based). Default 0. | |
| items_per_page | No | Results per page (max 100). Default 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | Matching disqualified officer records. |
| query | Yes | Search query applied. |
| has_more | Yes | True if more items may exist beyond this page. Re-call with start_index=start_index+items_per_page to continue. |
| returned | Yes | Items actually returned on this page. |
| start_index | Yes | Pagination offset for this page. |
| total_results | Yes | Total matching records upstream at Companies House. |
| items_per_page | Yes | Page size requested. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds valuable behavioral context: returns specific fields (names, DOBs, disqualification snippets, officer IDs) and the zero-result behavior for company names. This goes beyond annotations, though it does not exhaustively describe pagination edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short paragraphs, front-loaded with the core purpose, followed by usage guidance and return-value summary. Every sentence earns its place with no padding or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple search tool with an output schema and comprehensive annotations, the description covers purpose, usage, limitations (company name returns zero), and return fields. It also cross-references a related tool for deeper details, making it contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter well-documented (e.g., query explicitly says 'NOT a company name'). The tool description reinforces the individual-name requirement but does not add substantial new meaning beyond the schema. Therefore baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'Check whether a named individual is banned from acting as a UK company director.' This clearly distinguishes the tool from sibling search tools (e.g., company, charity, or property searches) by targeting disqualified directors specifically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use this tool when asked to check disqualified, banned, or barred directors.' It further states when not to use it: 'NOT a company name, which always returns zero results.' It also points to a complementary tool, disqualified_profile, for full details, effectively differentiating search vs. profile use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_fetchFetch Full Record from UK Due Diligence RegisterARead-onlyIdempotent
Fetch the full record for an ID returned by search.
Routes by prefix to the appropriate register:
company:{number} → Companies House full profile
charity:{number} → Charity Commission full profile
disqualification:{officer_id} → Disqualified director full record
notice:{notice_id} → Gazette notice full legal text
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Prefixed record ID returned by search. Format: company:{number}, charity:{number}, disqualification:{officer_id}, or notice:{notice_id} |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive. The description adds beyond this by disclosing the routing behavior across different registers and the exact ID format required. This helps the agent understand that one tool serves multiple backends, which is not inferable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences plus a concise bullet list of four route mappings. Every element earns its place: the first sentence states the action, and the list provides essential routing rules in a scannable format. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is a single parameter, a rich output schema, and detailed annotations, the description covers the critical operational nuance—the prefix-based routing—that could otherwise be ambiguous. It is complete for an agent to correctly select and invoke the tool for any of the listed ID types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the input schema already fully documents the 'id' parameter with the same format examples. The description's routing list essentially repeats the schema's parameter description, adding no new semantic detail. Thus the baseline of 3 is appropriate since the schema carries the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch the full record for an ID returned by search' and then details the routing by prefix, which both specifies the action and distinguishes it from the sibling-specific fetchers like dd_company_profile and dd_charity_profile. The explicit list of prefix mappings makes the tool's scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: after a search, with IDs in a specific prefixed format. It does not explicitly state alternatives or exclusions, but the routing list implies which IDs are valid and that this is a unified entry point. It could be stronger by mentioning when to prefer dedicated sibling tools, but it is not misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_gazette_insolvencySearch Gazette Corporate Insolvency NoticesARead-onlyIdempotent
Search The Gazette's insolvency notice index by entity name.
Searches The Gazette's corporate-insolvency notice index using the authoritative Gazette notice-code taxonomy. Results are sorted by an internal DD severity score; the notice label itself remains a source fact.
Each result includes a notice_numeric_id. Read the full legal wording via the notice://{notice_numeric_id} resource.
The Gazette is the official UK public record. A notice here means the event has been formally published and is legally effective.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Company or individual name to search for in Gazette insolvency notices | |
| query | No | Alias for name. | |
| end_date | No | Filter notices up to this date (YYYY-MM-DD) | |
| start_date | No | Filter notices from this date (YYYY-MM-DD) | |
| entity_name | No | Deprecated alias for name. | |
| max_notices | No | Cap on notices returned, applied after severity/date sort. Default 20. The Gazette insolvency feed returns up to 100 results per search — raise to 100 to see the full set. | |
| notice_type | No | Filter by Gazette notice code (e.g. '2450' petition to wind up a company, '2452' winding-up order, '2410' appointment of administrators). Omit to search all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notices | No | Matching notices, sorted by severity (desc) then date (desc). |
| end_date | No | Upper bound of the date range filter, if any. |
| start_date | No | Lower bound of the date range filter, if any. |
| entity_name | Yes | Entity name that was searched. |
| total_notices | Yes | Total notices returned after deduplication, sorting, and cap. |
| max_notices_cap | Yes | The max_notices cap applied. Upstream may have more matching notices. |
| notice_type_filter | No | Notice code filter applied, or null if all codes searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses behavioral details beyond the read-only/idempotent annotations: internal DD severity sorting, the fact that the notice label is a source fact, the legal effectiveness of Gazette notices, and the notice_numeric_id trail. These are substantive additions that go beyond simply saying it is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first sentence, with follow-up and legal context in compact paragraphs. A small amount of redundancy exists between the opening phrase and the second sentence, but the organization is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with the rich annotations and output schema, gives an agent enough to correctly invoke the tool and understand the result: legal significance, sorting behavior, result identifier, and how to get the full notice. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all parameters described, so the schema does the heavy lifting. The description adds only minor context such as 'authoritative Gazette notice-code taxonomy' and does not meaningfully explain aliases or extended date semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation and resource: searching The Gazette's corporate-insolvency notice index by entity. It clearly distinguishes this from generic gazette or company searches by referencing the Gazette notice-code taxonomy and the notice:// result resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when the tool is appropriate—searching the official Gazette insolvency record—and provides a concrete follow-up: use notice://{notice_numeric_id} for full legal wording. It stops short of explicitly naming when to use or not use sibling alternatives like dd_gazette_notice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_gazette_noticeGet Gazette Notice Full TextARead-onlyIdempotent
Fetch the full legal wording of a Gazette notice by numeric notice ID.
Returns the complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text. Use gazette_insolvency first to find notice_numeric_id values.
| Name | Required | Description | Default |
|---|---|---|---|
| notice_id | Yes | Numeric Gazette notice ID. Returned as notice_numeric_id by gazette_insolvency. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds useful context about the return format (JSON-LD linked-data record with parties, legal basis, court, full text), going beyond annotation basics. Minor gap: no mention of error conditions or auth, but annotations lower the bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the purpose front-loaded. The first sentence states the action, the second describes the return value and prerequisite workflow. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) with rich annotations, an output schema, and a clear workflow instruction. The description covers purpose, return content, and how to obtain the required ID, making it complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter, and the schema description already explains notice_id as the numeric Gazette notice ID returned by gazette_insolvency. The description's mention of 'numeric notice ID' adds little beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches the full legal wording of a Gazette notice by numeric notice ID, with a specific verb and resource. It distinguishes itself from the sibling gazette_insolvency tool by focusing on full text vs. listing, and mentions the linked-data record content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use gazette_insolvency first to find notice_numeric_id values, providing clear workflow guidance and effectively differentiating this tool from its sibling listing tool. This is a direct when-to-use instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_land_title_searchSearch Price Paid Transactions by PostcodeARead-onlyIdempotent
Search HM Land Registry Price Paid Index by postcode or address.
Returns up to 10 recent sale transactions for the postcode: price, date, address, property type, and tenure (Freehold/Leasehold). Covers England and Wales only. Postcode gives the most reliable results — a full address is also accepted and the postcode is extracted automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| address_or_postcode | Yes | UK property address or postcode. Postcode is most reliable: e.g. 'NG1 1AB'. Full address also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Number of Price Paid transactions returned. Capped at 10 by the upstream SPARQL query. |
| postcode | Yes | Normalised UK postcode extracted from the input. |
| transactions | No | Recent Price Paid transactions for the postcode, sorted newest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details beyond the readOnlyHint and idempotentHint annotations, such as the explicit limit of 10 recent transactions, the returned fields, and the automatic postcode extraction from full addresses. It also discloses the England/Wales scope, enriching the agent's understanding of expected behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise, information-dense sentences that front-load the core purpose, then detail outputs and usage guidance. Every sentence adds value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the input format, output contents, geographic scope, and data source, making it self-sufficient for an agent to select and invoke the tool correctly. The presence of an output schema relieves the description from detailing return structure, and annotations cover safety aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a detailed description of the sole parameter, including examples and reliability notes. The tool description largely repeats this information without adding new semantic meaning, so it does not exceed the baseline for 100% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Search') and a specific resource ('HM Land Registry Price Paid Index'), and distinguishes it from generic property tools by naming the exact dataset and coverage (England and Wales). It also outlines the returned fields, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to use the tool, including geographic coverage ('Covers England and Wales only') and reliability tips ('Postcode gives the most reliable results — a full address is also accepted'). However, it does not explicitly mention alternatives or when not to use this tool, which prevents a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_officer_appointmentsGet Officer Appointment HistoryARead-onlyIdempotent
Fetch a person's full company appointment history by officer ID.
Returns every appointment — current and historic — with each company's number, name, status, role, and appointment/resignation dates. Use company_officers first to find an officer_id, then this tool to discover other companies that person has been a director or secretary of, including dissolved or insolvent ones not mentioned anywhere else. Always returns full history; there is no current-only filter, since historical discovery is the point.
| Name | Required | Description | Default |
|---|---|---|---|
| officer_id | Yes | Companies House officer ID. Returned as officer_id on entries from company_officers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Officer name as recorded at CH. |
| total | Yes | Total appointments returned. |
| officer_id | Yes | Companies House officer ID. |
| active_count | No | Upstream count of appointments Companies House categorizes as 'active' — this reflects the officer's own appointment/resignation state at that company, NOT whether the company itself is currently trading. An appointment at a company in liquidation or administration still counts as active here if the officer was never formally resigned. Check each appointment's own company_status field for the company's actual status. Null if not provided upstream. |
| appointments | No | Every appointment, current and historic. |
| date_of_birth | No | Partial date of birth (month/year), or empty if not disclosed upstream. |
| inactive_count | No | Upstream count of appointments Companies House categorizes as 'inactive', passed through as-is. Exact categorization semantics have not been independently verified against per-appointment data — treat as an unverified upstream fact, not a derived signal, or null if not provided. |
| resigned_count | No | Upstream count of resigned appointments, or null if not provided. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry safety profile, and description adds behavioral detail: it returns both current and historical appointments, includes entries for dissolved or insolvent companies not found elsewhere, and always returns full history. It does not add rate-limit or auth context, but description goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, and all information is directly relevant. The second sentence is somewhat long, but its chain details are essential for correct historical discovery; the final version re-emphasizes the full-history behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter, an output schema, and strong annotations, the description is fully sufficient. It includes the preceding workflow step, what the tool returns, its unique historical value, and a flag behavioral constraint about no current-only filter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and the schema coverage is 100%, so the schema already documents officer_id thoroughly. The description adds workflow context by saying the ID comes from company_officers, which helps an agent know how to find and supply it correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Fetch a person's full company appointment history by officer ID." It clearly differentiates this tool from siblings by emphasizing historic and dissolved/insolvent appointments, setting it apart from current-officer and profile tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to use company_officers first to obtain an officer_id, then use this tool for historical discovery. It also states the limitation clearly: "Always returns full history; there is no current-only filter, since historical discovery is the point."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_sanctions_screenScreen a Name Against Sanctions ListsARead-onlyIdempotent
Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.
Returns every list entry whose primary name or alias matches, with the regime, source reference and listing date. Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.
MATCHING is deterministic: normalised exact + alias match (case-, accent- and punctuation-insensitive). A company/entity legal name matches reliably; PERSON names with transliteration variants may not (e.g. 'Mohammed' vs 'Muhamad'). An empty result is therefore NOT a guarantee of clearance, and a hit on a common name may be a false positive to disambiguate. This is a screening aid, not a compliance determination.
lists_screened reports which of OFSI/OFAC/EU/UN were actually loaded — if
any is missing the result is partial. as_at is when the lists were last
refreshed on this server.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Person or company/entity name to screen against the consolidated sanctions lists. | |
| entity_type | No | Optional filter: 'person' or 'entity'. Omit to screen both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | No | Matching list entries. An empty list means no exact/alias match on the screened lists — NOT a guarantee of clearance (see the tool description on matching limits). |
| as_at | No | When this server last refreshed the loaded lists (ISO timestamp). Provenance for the screen — the lists update on designation. |
| query | Yes | The name that was screened. |
| match_count | Yes | Number of list entries that matched the query. |
| lists_screened | No | Which consolidated lists were loaded and actually screened for this call. A list absent here failed to load and was NOT screened — treat the result as partial if any of OFSI/OFAC/EU/UN is missing. |
| normalized_query | Yes | The normalised form used for matching (upper-cased, accent- and punctuation-stripped, whitespace-collapsed). |
| entity_type_filter | No | entity_type filter applied to the screen ('person'/'entity'), or null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, openWorld, idempotent, and non-destructive behavior. The description goes beyond by explaining matching normalization, false positive/negative risks, partial results when lists are missing, and the meaning of lists_screened and as_at. This adds substantive behavioral context that structured annotations alone do not convey, with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into focused paragraphs: purpose, matching semantics and caveats, and output field explanations. Every sentence provides essential information for a compliance screening tool. It is front-loaded with the main purpose and does not waste words on repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex due to compliance implications, but the description thoroughly covers return values (regime, source reference, listing date), data freshness, and partial-result indicators. Even though an output schema exists, the description's explication of lists_screened and as_at is valuable. Combined with the detailed matching caveats, the description is complete for an agent to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning for the 'name' parameter by explaining normalization (case/accent/punctuation-insensitive) and transliteration pitfalls, which helps users interpret results. It does not add much for 'entity_type', but the existing schema description suffices. Overall, the added matching semantics justify a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool screens names against UK OFSI, US OFAC, EU, and UN consolidated sanctions lists. This specific verb+resource+scope distinguishes it from all sibling tools, which are general search/profile tools. No ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use it to check whether a counterparty or associated persons appear on sanctions lists. It also provides critical usage caveats: matching is deterministic, person-name transliteration variants may not match, empty results are not a guarantee, and hits may be false positives. This gives clear when-to-use and when-to-be-cautious guidance, with no competing alternatives in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dd_searchSearch UK Due Diligence RegistersARead-onlyIdempotent
Search across all UK due diligence registers simultaneously.
Searches Companies House, Charity Commission, disqualified directors, and Gazette insolvency notices in parallel. Returns a list of result IDs — use fetch with each ID to retrieve the full record.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Company name, charity name, director name, or keyword to search for across all UK due diligence registers |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds crucial behavioral detail beyond annotations: it returns a list of result IDs (not full records) and searches in parallel across specific registers. This informs the agent that a second fetch call is required, which is essential for correct invocation. Slight gap: no mention of potential pagination or rate limits, but the provided behavior is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and each sentence serves a distinct function: what it does and what the output format is. No filler or repetition of schema details, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description fully covers the essential workflow: it searches a known set of registers, returns IDs, and directs the next step (fetch). Given that an output schema exists and annotations indicate read-only behavior, nothing else is needed for an agent to select and invoke the tool correctly. The description is complete for this moderately complex multi-register search.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, query, and the schema description covers it with 100% clarity ('Company name, charity name, director name, or keyword to search for across all UK due diligence registers'). The tool description adds no additional meaning beyond what the schema already provides. Baseline 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Search' and resource 'all UK due diligence registers simultaneously', listing the four named registers. This clearly differentiates the aggregate search from sibling tools like dd_company_search or dd_charity_search which target individual registers. The scope and intent are immediately obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states that it searches across all registers in parallel and instructs the agent to 'use fetch with each ID to retrieve the full record', providing clear follow-up usage. It does not explicitly mention when not to use this tool or name alternatives, but the context is sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_get_contentGet GOV.UK PageARead-onlyIdempotent
Get metadata and navigable section index for a GOV.UK page.
Returns the page title, document type, publication dates, and a list of sections with their anchor IDs and headings. Use govuk_get_section to read the body of a specific section, or govuk_grep_content to search within the page body.
| Name | Required | Description | Default |
|---|---|---|---|
| base_path | Yes | GOV.UK base_path, e.g. '/universal-credit' or 'universal-credit' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds value by specifying the exact return content (title, document type, publication dates, section list) and explicitly what it does not do (return page body), steering users to sibling tools. This is useful behavioral context beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: purpose, return values, and alternative tools. It is concise, front-loaded with the key verb and resource, and every sentence adds necessary information without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, informative schema, and existing output schema, the description fully covers what the tool does, what it returns, and how it relates to sibling tools. The agent has enough context to select and invoke it correctly without needing further detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with a clear description and example for base_path. The tool description itself does not add parameter semantics beyond what the schema already provides, so the baseline of 3 for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('GOV.UK page'), and clearly states what is returned (metadata and navigable section index). It explicitly distinguishes from sibling tools by noting that govuk_get_section reads a section body and govuk_grep_content searches within the page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use this tool vs alternatives: 'Use govuk_get_section to read the body of a specific section, or govuk_grep_content to search within the page body.' This clearly indicates the tool's scope (metadata/index) and points to alternatives for other use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_get_organisationGet GOV.UK OrganisationARead-onlyIdempotent
Get the profile of a UK government organisation by its slug.
Returns name, acronym, type, status, web URL, and parent/child organisations. Use govuk_list_organisations to browse all organisations and discover slugs.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Organisation slug, e.g. 'hm-revenue-customs'. Find slugs via govuk_list_organisations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| slug | No | Organisation slug, e.g. 'hm-revenue-customs'. Usable with govuk_search filters. |
| type | No | Organisation type, e.g. 'ministerial_department', 'executive_agency', 'non_ministerial_department', 'public_corporation'. |
| state | No | GOV.UK status, e.g. 'live', 'closed', 'transitioning'. |
| title | No | Full organisation title. |
| acronym | No | Organisation acronym, if set. |
| web_url | No | Absolute https://www.gov.uk URL for the organisation page. |
| contact_details | No | Contact details block from GOV.UK (phone, email, address) when available. |
| child_organisations | No | Titles of child organisations / agencies under this body. |
| parent_organisations | No | Titles of parent organisations this body reports into. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds a list of returned fields, but an output schema exists, so this is redundant. It provides no additional behavioral context beyond what annotations and schema already convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the core function, the second lists return fields and points to the sibling for slug discovery. Every sentence earns its place; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only tool with both input and output schemas, the description is complete. It covers what the tool does, what it returns, and how to obtain valid input (slugs). No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already includes an example ('hm-revenue-customs') and a pointer to govuk_list_organisations for finding slugs. The tool description's mention of 'slug' and 'discover slugs' merely repeats schema content, adding no new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('profile of a UK government organisation by its slug'), immediately distinguishing it from list-style siblings like govuk_list_organisations. It also lists return fields, making the tool's function unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use govuk_list_organisations for browsing/discovering slugs, which tells the agent when NOT to use this tool. This clear alternative makes the usage context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_get_sectionGet GOV.UK Page SectionARead-onlyIdempotent
Get the HTML content of one named section of a GOV.UK page.
Use govuk_get_content first to get the list of available section anchors, then call this with the anchor of the section you want to read.
| Name | Required | Description | Default |
|---|---|---|---|
| anchor | Yes | Section anchor ID from govuk_get_content sections list | |
| base_path | Yes | GOV.UK base_path, e.g. '/universal-credit' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is known. The description adds little beyond that—it confirms the read operation and the dependency on govuk_get_content, but does not describe return format, pagination, or error behavior. With annotations covering mutation risks, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The purpose is front-loaded, and the usage note is directly actionable. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with rich annotations and an output schema, the description fully captures the workflow: get anchors first, then fetch a section. No additional context is needed for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters fully described. The description reinforces the role of 'anchor' but adds no new semantic detail beyond what the schema already provides. Baseline 3 is correct when schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get the HTML content of one named section of a GOV.UK page', specifying the exact resource and scope. It distinguishes from siblings by emphasizing 'one named section', and the usage note explicitly references govuk_get_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequential guidance: 'Use govuk_get_content first to get the list of available section anchors, then call this with the anchor'. This names the alternative tool and provides clear when-to-use context, leaving no ambiguity about the required prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_grep_contentSearch within a GOV.UK content bodyARead-onlyIdempotent
Find body sections in a GOV.UK content item matching a pattern.
Returns a list of {anchor, heading, snippet, match} hits — small per-section
snippets centred on the match — so the LLM can decide which full sections to
read via govuk_get_section.
Use this when answering content-based questions ("what does this guide say about X?", "find the bit about eligibility") rather than navigating by section number.
Pattern is regex; if it doesn't compile, falls back to literal substring.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Regex or literal substring to search for within the page body, e.g. 'payment' or 'eligible.*income' | |
| max_hits | No | Maximum number of matching sections to return (1–100) | |
| base_path | Yes | GOV.UK base_path, e.g. '/guidance/register-for-vat' or '/universal-credit' | |
| case_insensitive | No | If true (default), match case-insensitively |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | Matching sections in document order |
| pattern | Yes | The pattern that was searched for |
| base_path | Yes | The content item that was searched |
| truncated | Yes | True if hit count reached max_hits and more matches may exist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, indicating a safe read operation. The description adds valuable behavioral context beyond annotations: the return format ('{anchor, heading, snippet, match} hits') and the regex fallback behavior ('if it doesn't compile, falls back to literal substring'), which are not inferable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose, the second explains the return format and when to use, and the third covers the regex fallback. Every sentence earns its place with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with an output schema, the description covers purpose, return format, usage guidance, fallback behavior, and relationship to sibling tools (govuk_get_section). No critical information is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter descriptions already explain each field thoroughly. The description adds marginal value by explaining the fallback from regex to literal substring, which is partially reflected in the schema's 'Regex or literal substring' wording, but it doesn't provide significant additional semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb+resource+scope: 'Find body sections in a GOV.UK content item matching a pattern.' It also distinguishes itself from sibling tools by explicitly noting this is for content-based questions 'rather than navigating by section number,' referencing govuk_get_section as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use this when answering content-based questions... rather than navigating by section number' and explains that the returned snippets help the LLM decide 'which full sections to read via govuk_get_section.' This clearly states when to use and names the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_list_organisationsList GOV.UK OrganisationsARead-onlyIdempotent
List all UK government organisations registered on GOV.UK.
Returns a paginated list of organisations including their slug, acronym, type, and status. Use this to browse the full government structure or discover slugs for use with govuk_get_organisation or govuk_search filters.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-based) | |
| per_page | No | Results per page (1–50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | 1-based page number requested. |
| total | No | Total number of organisations across all pages, if reported by GOV.UK. |
| has_more | Yes | True if more organisations exist beyond this page. Re-call with page=page+1 to fetch the next page. |
| per_page | Yes | Max organisations requested per page. |
| returned | Yes | Number of organisations returned in this response. |
| total_pages | No | Total number of pages available, if reported by GOV.UK. |
| organisations | No | Organisations on this page, in the order returned by GOV.UK. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false. The description adds behavioral context about pagination ('Returns a paginated list') and the specific fields returned (slug, acronym, type, status), which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and every sentence adds value—no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pagination tool with full schema coverage, output schema present, and strong annotations, the description is complete. It covers purpose, return content, pagination, and usage guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'page' and 'per_page' clearly described. The description does not add extra parameter meaning beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'List all UK government organisations registered on GOV.UK', which is a specific verb+resource combination. It also distinguishes itself from siblings by noting it helps 'discover slugs for use with govuk_get_organisation or govuk_search filters'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use this to browse the full government structure or discover slugs for use with govuk_get_organisation or govuk_search filters.' This names specific alternative tools and clarifies the use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_lookup_postcodeLook Up UK PostcodeARead-onlyIdempotent
Look up a UK postcode to retrieve its local authority, region, constituency, and other administrative geography.
Useful for determining which council area, parliamentary constituency, or NHS region a postcode falls within. Commonly used to direct users to the correct local service on GOV.UK (e.g. council tax, planning, waste).
Uses the postcodes.io public API (no key required).
| Name | Required | Description | Default |
|---|---|---|---|
| postcode | Yes | UK postcode, e.g. 'SW1A 2AA' or 'NG1 1AA'. Spaces optional. |
Output Schema
| Name | Required | Description |
|---|---|---|
| codes | No | GSS codes for all administrative geographies covering this postcode. |
| region | No | ONS region, e.g. 'East Midlands'. |
| country | No | Country, e.g. 'England', 'Scotland', 'Wales', 'Northern Ireland'. |
| latitude | No | Latitude in decimal degrees (WGS84). |
| postcode | No | Canonicalised postcode as returned by postcodes.io. |
| longitude | No | Longitude in decimal degrees (WGS84). |
| admin_county | No | Administrative county, where applicable (null in unitary areas). |
| local_authority | No | Local authority / council covering the postcode. |
| nhs_integrated_care_board | No | NHS Integrated Care Board, where available. |
| parliamentary_constituency | No | Parliamentary constituency (pre-2025 boundary). |
| parliamentary_constituency_2025 | No | Parliamentary constituency under the 2025 boundaries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable context beyond annotations by disclosing the external API dependency: 'Uses the postcodes.io public API (no key required).' This informs the agent about network reliance and lack of authentication requirements, exceeding the baseline for annotated tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose, the second gives use cases, the third provides an implementation detail. Every sentence contributes original value with no repetition of schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only lookup with one parameter, an output schema, and comprehensive annotations, the description fully covers the essentials: what it does, when to use it, what it returns, and external API details. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a descriptive example and length constraints. The description itself only refers to 'UK postcode' without adding new parameter syntax or format details. Baseline 3 is appropriate; the schema carries the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Look up a UK postcode to retrieve its local authority, region, constituency, and other administrative geography.' This specific verb+resource+output combination unambiguously distinguishes it from all sibling tools, none of which perform postcode lookups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: 'Useful for determining which council area, parliamentary constituency, or NHS region a postcode falls within. Commonly used to direct users to the correct local service on GOV.UK.' While it does not explicitly mention alternatives or when-not-to-use, the context makes the intended use clear, and no sibling tools offer postcode lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gov_govuk_searchSearch GOV.UKARead-onlyIdempotent
Search GOV.UK's 700k+ content items using the official Search API.
Returns a list of matching content items with title, description, link, format, owning organisation(s), and last updated timestamp.
Use filter_format to narrow to specific content types (e.g. 'transaction' for citizen-facing services, 'guide' for guidance, 'publication' for official documents). Use filter_organisations to restrict to a department.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of results to return (1–50) | |
| order | No | Sort order. Use '-public_timestamp' for newest-first (default relevance). | |
| query | Yes | Free-text search query, e.g. 'universal credit eligibility' or 'MOT check' | |
| start | No | Offset for pagination, e.g. 10 for the second page of 10 results | |
| filter_format | No | Filter by document format. Common values: 'guide', 'answer', 'transaction', 'publication', 'news_article', 'detailed_guide', 'hmrc_manual_section', 'travel_advice', 'organisation'. Leave blank to search all types. | |
| filter_organisations | No | Filter by organisation slug, e.g. 'hm-revenue-customs', 'department-for-work-pensions', 'driver-and-vehicle-standards-agency'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Max results requested for this page. |
| query | Yes | The free-text query that was searched. |
| start | Yes | Offset used for this page (zero-based). |
| total | Yes | Total matching results across all pages on GOV.UK. |
| results | No | Matching pages. Use the `link` field of any result as the `base_path` input to govuk_get_content for the full item. |
| has_more | Yes | True if more results exist beyond this page. Re-call with start=start+returned to fetch the next page. |
| returned | Yes | Number of results actually returned in this response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds beneficial context (returns list with specific fields, official API) but does not disclose rate limits, authentication needs, or pagination behavior beyond the schema's start parameter. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: first states purpose and source, second summarizes return fields, third gives filtering guidance. Every sentence earns its place, and the key verb 'Search' is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and annotations, the description sufficiently covers purpose, return shape, and filter usage. It lacks explicit guidance on when to use this tool versus sibling tools, but that is addressed in the usage dimension and does not significantly hinder completeness for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description enriches parameter semantics by providing concrete examples for filter_format (transaction, guide, publication) and filter_organisations (with departmental slugs), which is not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (search), resource (GOV.UK content items), and method (official Search API). It also distinguishes itself from siblings like gov_govuk_get_content (retrieval of specific items) and gov_govuk_grep_content (grep-style search) by emphasizing the API-based search over the broader content set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context, noting how to narrow with filter_format and filter_organisations, including practical examples for content types. It does not explicitly name alternative tools or exclusion criteria, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_bills_get_billGet Bill DetailARead-onlyIdempotent
USE THIS TOOL WHEN you have a bill_id (from bills_search_bills) and want the full detail.
Returns sponsors, current stage, long title, summary, and Royal Assent date if enacted. Summary text is capped per max_summary_chars — check summary_truncated in the response.
AFTER calling, use parliament_search_hansard(query=bill_short_title) to find the bill's parliamentary debates, or bills_search_bills with a related keyword for adjacent bills.
| Name | Required | Description | Default |
|---|---|---|---|
| bill_id | Yes | Bill ID from bills_search_bills results. | |
| max_summary_chars | No | Maximum characters of the bill summary text to return. Default 5,000 (~1,250 tokens) covers most bills. Raise for substantive government bills (Finance Act, Levelling-up) whose summary runs longer. Check summary_truncated in the response to see if it was cut. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Bill ID |
| url | Yes | Parliament URL for this bill |
| is_act | No | Whether the bill has received Royal Assent |
| stages | No | Legislative stages the bill has passed through |
| summary | No | Bill summary text, possibly truncated per max_summary_chars. Check summary_truncated and summary_original_length for full-text info. |
| sponsors | No | Bill sponsors |
| long_title | No | Full long title |
| short_title | Yes | Short title of the bill |
| current_house | No | House where the bill currently sits |
| current_stage | No | Current legislative stage |
| originating_house | No | House where the bill was introduced |
| royal_assent_date | No | Date Royal Assent was given |
| summary_truncated | No | True if summary was cut to fit max_summary_chars |
| summary_original_length | No | Original summary length in characters before any truncation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds important behavioral context: summary text is capped per max_summary_chars and users should 'check summary_truncated in the response.' It also specifies the Royal Assent field is included 'if enacted,' clarifying conditional data presence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized into three purposeful sections: when to use, what it returns, and next steps. Every sentence provides actionable information with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, output schema present), the description fully covers usage context, return contents, truncation behavior, and downstream actions. No gap in understanding remains for the agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and parameter descriptions are already detailed (e.g., bill_id source, max_summary_chars default/range/truncation). The tool description reinforces that max_summary_chars caps summary length but adds no new semantic info beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'USE THIS TOOL WHEN you have a bill_id (from bills_search_bills) and want the full detail,' which clearly states the verb (get), resource (bill detail), and prerequisite source of the ID. It further lists specific returned fields (sponsors, current stage, long title, summary, Royal Assent date), distinguishing it from the sibling search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'USE THIS TOOL WHEN' identifies the exact condition for use. It also provides post-call guidance: 'AFTER calling, use parliament_search_hansard... or bills_search_bills... for adjacent bills,' effectively indicating alternatives and when not to use this tool (when seeking debates or related bills).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_bills_search_billsSearch Parliamentary BillsARead-onlyIdempotent
USE THIS TOOL WHEN searching UK parliamentary bills by keyword, session, house, or legislative stage.
Returns a paginated page of bill summaries (title, originating and current house, current stage, whether it became an Act). AFTER calling, pass a bill_id into bills_get_bill for full detail (sponsors, long title, Royal Assent date).
Authoritative source for UK parliamentary bill status.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Filter by originating house: the House the bill was introduced in, wherever it sits now. Omit (or 'All') for all houses. | |
| limit | No | Maximum bills to return in this call. Default 20 keeps responses focused; raise up to 100 for bulk exports. | |
| query | Yes | Search term for bill titles and descriptions, e.g. 'online safety' or 'financial services'. | |
| stage | No | Filter by current legislative stage. | |
| offset | No | Number of results to skip before this page. Default 0 for the first page. Re-call with offset=offset+returned while has_more is true to paginate. | |
| session | No | Numeric parliamentary session ID (e.g. 40 = 2024-25, 39 = 2023-24). NOT a year string like '2025'. If you only know the year, omit this and filter the results instead. Omit to search all sessions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bills | No | Matching bills. Use the integer `id` field from any bill to call bills_get_bill for full detail. |
| limit | Yes | Maximum results requested in this call |
| query | Yes | The search term that was used |
| total | No | Total results matching the query across all pages, if the upstream API reported it. None if unknown. |
| offset | Yes | Number of results skipped before this page |
| has_more | Yes | True if more results exist beyond this page. Re-call with offset=offset+returned to fetch the next page. |
| returned | Yes | Number of results actually on this page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, and destructiveHint. The description adds value by describing the return content (paginated page of bill summaries with specific fields), the authoritative source claim, and the downstream step. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the usage directive, and every sentence carries essential information: what it does, what it returns, and how to proceed for more detail. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the schema documents pagination via offset and has_more, the description is largely complete. It covers the return fields and the follow-up tool. It doesn't explicitly mention pagination mechanics, but that is covered in the schema, so the description remains adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already fully documented. The description mentions keyword, session, house, and stage, but these map directly to schema parameters without adding new meaning or usage details beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (UK parliamentary bills) with clear dimensions (keyword, session, house, legislative stage). It clearly distinguishes from sibling law_bills_get_bill by noting it returns summaries and pointing to that tool for full detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'USE THIS TOOL WHEN searching...' and provides a follow-up action: pass a bill_id into bills_get_bill for full detail. This gives clear context and an alternative, leaving no ambiguity about when to use this tool versus the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_case_law_grep_judgmentSearch within a UK Court JudgmentARead-onlyIdempotent
USE THIS TOOL WHEN you have a judgment slug and want to find paragraphs whose text matches a pattern.
Returns a list of {eId, snippet, match} hits — small per-paragraph
snippets centred on the match. AFTER calling, read full paragraphs via
judgment_get_paragraph(slug, eId) or the judgment://{slug}/para/{eId}
resource.
Use case: content search within one judgment (e.g. "negligence", "test for foreseeability", "Donoghue"). For paragraph-number navigation by eId, call judgment_get_index instead.
Pattern is regex; if it doesn't compile, falls back to literal substring search.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | TNA judgment slug, e.g. 'uksc/2024/12' or 'ewca/civ/2023/450'. | |
| pattern | Yes | Regex pattern (or plain substring) to search within paragraph text. If the pattern doesn't compile as regex, falls back to literal substring match. | |
| max_hits | No | Cap on number of hits returned. | |
| case_insensitive | No | Default true. Set false for case-sensitive matching. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes | Matching paragraphs in document order |
| slug | Yes | The judgment slug that was searched |
| pattern | Yes | The pattern that was searched for |
| truncated | Yes | True if hit count reached max_hits and more matches may exist |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond the annotations (readOnlyHint, idempotentHint) by disclosing the exact return shape ({eId, snippet, match}), the 'small per-paragraph snippets' behavior, and the regex fallback to literal substring matching. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded with the trigger condition. Every sentence adds value: return format, use case, alternatives, and regex behavior. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with an existing output schema, the description covers the key usage scenario, distinguishes from related tools, explains the regex behavior, and points to the next step for reading full paragraphs. This is complete and self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter is already described. The description reinforces that 'pattern' is regex with fallback, but does not add new parameter-specific syntax or constraints beyond the schema. Baseline 3 is appropriate when schema carries the param load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource combo: 'find paragraphs whose text matches a pattern' within a UK Court Judgment. It clearly distinguishes from sibling tools like judgment_get_index and judgment_get_paragraph, and from broader search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use statement ('USE THIS TOOL WHEN you have a judgment slug...'), a concrete use case, and direct alternatives: 'For paragraph-number navigation by eId, call judgment_get_index instead.' Also explains the follow-up step to read full paragraphs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_case_law_searchSearch UK Case LawARead-onlyIdempotent
USE THIS TOOL WHEN searching UK case law by party names, court, judge, date, or free-text query.
Returns paginated judgment summaries: neutral citation, court, dates, slug, stable TNA URI. AFTER calling: pass slug into judgment_get_header / judgment_get_index / judgment_get_paragraph (or the judgment:// resource family) for content; pass the neutral citation into citations_resolve to verify before constructing an OSCOLA citation; use case_law_grep_judgment to find text within a single judgment. When a party name returns several candidates, narrow with court + year filters before grep-iterating across full judgments — targeted filtering beats scanning every candidate.
Coverage: TNA Find Case Law indexes UK judgments from roughly the early 2000s onwards. For older authorities, search for a modern judgment that quotes them and read that paragraph.
Authoritative source for UK case law. Web search returns out-of-date or unstable URLs — do not supplement.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page number (1-indexed) | |
| court | No | Filter by court slug. Values: 'uksc', 'ukpc', 'ewca/civ', 'ewca/crim', 'ewhc/kb', 'ewhc/ch', 'ewhc/comm', 'ewhc/fam', 'ewhc/pat', 'ewhc/ipec', 'ewhc/admin', 'ewhc/tcc', 'ewhc/costs', 'ewfc', 'ewcop', 'eat', 'ukut/iac', 'ukut/aac', 'ukut/tcc', 'ukut/lc', 'ukftt/tc', 'ukftt/grc', 'nica', 'niqb'. | |
| judge | No | Filter by judge surname. Case-insensitive substring match against the indexed form. Use the surname alone ('Reed', 'Sumption') or with the bare title ('Lord Reed'). Honorific suffixes silently zero the result set — do not append 'JSC', 'of Allermuir', 'KC' etc. Speculating a fuller form than what TNA indexed will return 0 hits with no error. | |
| limit | No | Maximum results to return (1–50). TNA returns up to 50 per request; this slices client-side. Default 10 for a tight shortlist. Set higher for breadth (e.g. 50 to scan the full result set). | |
| party | No | Filter by party name | |
| query | Yes | Full-text search query, e.g. 'negligence duty of care' | |
| to_date | No | Latest judgment date (YYYY-MM-DD). Same caveat as `from_date` — currently silently ignored by upstream. Filtering happens client-side at best. | |
| from_date | No | Earliest judgment date (YYYY-MM-DD). NOTE: the TNA atom.xml endpoint currently appears to ignore this filter — the same results come back regardless. Do not rely on it to narrow output; sort+slice client-side or refine `query` instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | Current page number (1-indexed) |
| results | Yes | Matching judgments for this page |
| has_more | Yes | Whether additional pages exist |
| total_pages | No | Total page count if available from API |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing upstream filter issues (from_date/to_date silently ignored), judge parameter quirks (honorific suffixes zero results), and pagination slicing behavior. The description also clarifies coverage limitations ('from roughly the early 2000s onwards') and TNA's stability as an authoritative source.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place by conveying a distinct operational fact or guidance. It is front-loaded with the primary directive, then structures follow-up actions, narrowing strategies, coverage caveats, and authority endorsement. No redundancy detected.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 8 parameters and rich sibling ecosystem, the description covers all essential context: return payload, downstream workflow, filter pitfalls, coverage scope, and comparison with non-specialized search. The presence of an output schema does not reduce the need for this descriptive completeness, and the description delivers fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds crucial parameter-level semantics: it warns that judge suffix forms fail, demonstrates correct usage ('Reed' or 'Lord Reed'), explains limit slicing client-side, and advises refinement strategy for date filters. This significantly exceeds schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear directive: 'USE THIS TOOL WHEN searching UK case law by party names, court, judge, date, or free-text query.' It identifies the specific resource (UK case law) and differentiates from sibling tools by listing what to do after calling (e.g., judgment_get_header, citations_resolve). No ambiguity about tool purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool and provides alternatives: 'use case_law_grep_judgment to find text within a single judgment' and 'pass the neutral citation into citations_resolve.' It also warns against using web search and describes fallback strategy for older authorities. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_citations_format_oscolaFormat OSCOLA Citation StringARead-onlyIdempotent
USE THIS TOOL AFTER citations_resolve to produce the correctly formatted OSCOLA citation string.
Pass the parsed fields returned by citations_resolve directly into this tool. Formats per OSCOLA 4th edition rules for each citation type.
Refuses (status: upstream_validation) if confidence is 0.0 — TNA confirmed the document does not exist — or if a neutral citation has no resolved_url (ambiguous court code, e.g. bare EWHC without a division). In either case, do NOT manufacture a citation; surface the failure and ask the user for the source URL or better identifying details.
DO NOT construct the input fields yourself. The structured input must come from citations_resolve — guessing fields is the primary citation-fabrication route and this tool is the guard against it.
Authoritative OSCOLA formatting for UK legal citations (no network call).
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | 'raw' from citations_resolve. Used as-is for EU retained law — the original text preserves the Regulation/Directive distinction. | |
| page | No | 'page' from citations_resolve (starting page in the law report). | |
| year | No | 'year' from citations_resolve. | |
| court | No | 'court' from citations_resolve, e.g. 'UKSC', 'EWCA CIV', 'EWHC (KB)'. | |
| number | No | 'number' from citations_resolve (judgment number within the year). | |
| volume | No | 'volume' from citations_resolve (law report volume, if any). | |
| section | No | 'section' from citations_resolve, e.g. '47', '12', '20A'. | |
| si_year | No | 'si_year' from citations_resolve. | |
| si_number | No | 'si_number' from citations_resolve. | |
| confidence | Yes | 'confidence' from citations_resolve. Refuses to format if 0.0 — that means TNA confirmed the document does not exist. Pass only the value citations_resolve returned; do not guess. | |
| resolved_url | No | 'resolved_url' from citations_resolve. Must be non-null for neutral citations. | |
| citation_type | Yes | 'type' field from citations_resolve result. | |
| report_series | No | 'report_series' from citations_resolve, e.g. 'WLR', 'AC', 'QB'. | |
| legislation_title | No | 'legislation_title' from citations_resolve, e.g. 'Companies Act 2006'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly and non-destructive behavior, so the description adds critical behavioral context: refusal conditions (confidence 0.0, missing resolved_url), the 'no network call' property, and the strong prohibition against constructing inputs manually to prevent citation fabrication. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although somewhat long, every sentence delivers essential operational guidance: ordering, input provenance, refusal triggers, and anti-fabrication policy. The bold 'USE THIS TOOL AFTER' and 'DO NOT construct' warnings are prominent, and the text is well-structured for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full invocation context: pipeline position, input requirements, failure modes, and authoritative formatting behavior. With an output schema present, return-value details are unnecessary. The tool's high-stakes nature (citation fabrication) justifies the thorough guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter described as coming from citations_resolve, so the schema carries the parameter details. The description enhances this by mandating that fields must be passed directly from citations_resolve and never guessed, adding provenance semantics that reduce fabrication risk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'produce the correctly formatted OSCOLA citation string' and 'Formats per OSCOLA 4th edition rules for each citation type.' It also distinguishes itself from sibling tools by explicitly saying 'USE THIS TOOL AFTER citations_resolve,' positioning it as the formatting step in a two-tool pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'USE THIS TOOL AFTER citations_resolve' and instructs to pass parsed fields directly. It also provides exclusions: refuses when confidence is 0.0 or when neutral citations lack a resolved_url, and tells the agent to surface the failure rather than fabricate a citation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_citations_networkGet Case Citation NetworkARead-onlyIdempotent
USE THIS TOOL WHEN you have a judgment slug and want to map every citation it makes — cases cited, legislation referenced, SIs, retained EU law.
Fetches the judgment XML from TNA and parses all OSCOLA citations within. Returns citations grouped by type, deduplicated and sorted. AFTER calling, pass any individual citation through citations_resolve to confirm it resolves and to retrieve its canonical URL.
Useful for authority-network analysis (what did this judgment rely on?) and for surfacing the legislative landscape a case sits inside.
| Name | Required | Description | Default |
|---|---|---|---|
| case_uri | Yes | TNA judgment URI slug, e.g. 'uksc/2024/12' or 'ewca/civ/2023/450'. Use the 'uri' field from case_law_search results — not the full URL. Do not include the 'https://caselaw.nationalarchives.gov.uk/' prefix. |
Output Schema
| Name | Required | Description |
|---|---|---|
| eu_refs | No | Retained EU law references, e.g. 'Regulation (EU) 2016/679' |
| si_refs | No | Statutory Instrument references, e.g. 'SI 2018/1234' |
| case_uri | Yes | The judgment URI that was fetched and parsed |
| law_report_refs | No | Law report citations, e.g. '[2020] 1 WLR 100' |
| total_citations | Yes | Sum of all de-duplicated citations across every bucket |
| legislation_refs | No | Legislation section references, e.g. 's.47 Companies Act 2006' |
| neutral_citations | No | Neutral citations referenced, e.g. '[2020] UKSC 14' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds concrete behavioral details: it fetches the judgment XML from TNA, parses OSCOLA citations, and returns grouped, deduplicated, and sorted results. This significantly extends transparency beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise: an upfront usage trigger, a brief process explanation, a follow-up instruction, and two high-level use cases. Every sentence earns its place, and the content is front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has a single parameter, a detailed schema, an output schema, and helpful annotations, the description fully covers input, process, follow-up, and use cases. It leaves no significant gaps for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage for the single parameter case_uri, including format, examples, and a prefix exclusion instruction. The description only uses the synonymous term 'judgment slug' and does not add new semantic information beyond the schema's rich definition, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool maps every citation a judgment makes, enumerating categories such as cases, legislation, SIs, and retained EU law. It is distinguished from siblings like law_citations_parse by focusing on the citation network extracted from a judgment's XML, with a specific verb+resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'USE THIS TOOL WHEN you have a judgment slug and want to map every citation,' which is an explicit usage condition. It also tells the agent to pass individual citations through citations_resolve afterward, providing clear follow-up guidance and alternative interaction via a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_citations_parseParse OSCOLA CitationsARead-only
USE THIS TOOL WHEN you have free text (a memo, an email, a clause) and want every OSCOLA-style citation it contains extracted and classified.
Identifies: neutral citations ([2024] UKSC 12), law reports ([2024] 1 WLR 100), legislation sections (s.47 Companies Act 2006), SIs (SI 2018/1234), retained EU law (Regulation (EU) 2016/679).
Parsing is pure regex by default. Ambiguous citations (e.g. bare [2024] EWHC without division) can OPTIONALLY be disambiguated by setting disambiguate=True, which asks the CONNECTED CLIENT's own model (not this server) to resolve the division via MCP sampling — off by default. Citations resolve to TNA / legislation.gov.uk URLs when possible.
AFTER calling, pass each citation through citations_resolve to verify it points at a real document before quoting or formatting it — the parser recognises the SHAPE of a citation but does not confirm the document exists.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Free text containing OSCOLA citations to extract. Supported: neutral citations ([2024] UKSC 12), law reports ([2024] 1 WLR 100), legislation sections (s.47 Companies Act 2006), SIs (SI 2018/1234), retained EU law (Regulation (EU) 2016/679). Max 50,000 chars. | |
| disambiguate | No | Default False — pure-regex parsing, no model in the loop. If True, ambiguous citations (e.g. bare EWHC without a division) are sent to the connected client's own LLM, via MCP sampling, to resolve the division. Opt in only when you want best-effort division resolution and accept that a model shapes the result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ambiguous | Yes | Citations with confidence < 0.7; may have been partially disambiguated via sampling |
| citations | Yes | All successfully parsed citations (confidence >= 0.7) |
| text_length | Yes | Character length of the input text |
| parse_duration_ms | Yes | Time taken to parse, in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=true annotation, the description discloses important behaviors: pure-regex default, optional MCP sampling for disambiguation with implications (model shapes result), URL resolution to TNA/legislation.gov.uk, and the important limitation that the parser recognizes shape but does not confirm existence. The description also mentions it connects to the client's model, which is beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (use case, supported types, behavior, follow-up). It is longer than average but every sentence adds relevant information. The 'USE THIS TOOL WHEN' directive is front-loaded. Minor redundancy with schema description keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, the description needn't explain return values. It covers input requirements, parsing behavior, optional disambiguation, URL resolution, and a recommended follow-up action. The combination of annotations, schema, and description leaves no significant gaps for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters (text and disambiguate). The description does restate some parameter context (e.g., disambiguate triggers MCP sampling), but it does not add meaning beyond what the detailed parameter descriptions already provide. Baseline 3 is appropriate because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: extracting and classifying OSCOLA-style citations from free text. It explicitly lists supported citation types (neutral citations, law reports, legislation sections, SIs, retained EU law), which distinguishes it from sibling tools like law_citations_format_oscola and law_citations_resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'USE THIS TOOL WHEN you have free text...' establishing the exact trigger scenario. It also provides explicit post-condition guidance: 'AFTER calling, pass each citation through citations_resolve to verify' — this gives the agent a clear workflow and indirectly distinguishes this tool from the resolve tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_citations_resolveResolve Single OSCOLA CitationARead-onlyIdempotent
USE THIS TOOL BEFORE constructing an OSCOLA citation string from known fields, OR to confirm a citation points at a real document.
Parses + resolves a single citation (neutral citation, SI, legislation section, retained EU law) and returns parsed fields plus resolved_url. For neutral citations, performs a live TNA HEAD check — non-200 sets confidence to 0.0 (document absent). Do NOT format or quote a confidence-0.0 citation.
If the TNA HEAD check fails (timeout, connection error), raises ToolError with {"error_category": "transient", "is_retryable": true}. One retry is attempted — retry this call or proceed without TNA verification.
Formatting a citation from "known" fields without prior resolution is the most common fabrication route. If this tool raises or returns no resolved_url, do NOT manufacture a citation — surface the failure and ask the user for the source URL.
Authoritative source for UK legal-citation resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes | A single OSCOLA citation to parse and resolve. E.g. '[2024] UKSC 12', 'SI 2018/1234', 's.47 Companies Act 2006' |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | Yes | Original citation text as found in the source |
| page | No | Starting page in the law report |
| type | Yes | Classification of the citation type |
| year | No | Year component of the citation |
| court | No | Court code: UKSC, UKPC, EWCA Civ, EWCA Crim, EWHC (KB), EWHC (Ch), EWHC (Comm), EWHC (Fam), EWHC (Pat), EWHC (IPEC), UKUT (IAC), UKUT (TCC), UKUT (AAC), UKUT (LC), EAT, UKFTT (TC), UKFTT (GRC) |
| number | No | Judgment number within the year |
| volume | No | Report volume number (for law reports) |
| section | No | Section number referenced |
| si_year | No | SI year (for SI YYYY/NNN citations) |
| si_number | No | SI number |
| confidence | Yes | Parse confidence 0.0–1.0. Citations below 0.7 are ambiguous and may have been sent for LLM disambiguation. |
| resolved_url | No | TNA Find Case Law or legislation.gov.uk URL if successfully resolved |
| report_series | No | Law report series abbreviation: WLR, AC, QB, KB, Ch, All ER, EWCA Civ, etc. |
| legislation_title | No | Title of legislation (for s.NN Act YYYY citations) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior, the description adds substantial context: live TNA HEAD check, confidence set to 0.0 on non-200, transient error retry behavior, and the instruction to surface failures rather than fabricate citations. This far exceeds the annotation baseline and provides critical operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is about 180 words but every sentence delivers essential information: primary use, behavior, failure modes, and critical cautions. It is front-loaded with a prominent uppercase usage directive and structured with clear paragraphs. No filler or redundancy; it earns its length for a tool with network-dependent behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema covering return values, so the description focuses on behaviors, errors, retries, confidence semantics, and anti-fabrication rules. It covers failure modes (timeout, connection error), retry policy, and user guidance on what to do if resolution fails. Given the complexity of live TNA checks and confidence scores, this is admirably complete without needing further elaboration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter `citation` is fully described in the input schema with explicit examples and length constraints, achieving 100% schema coverage. The description mentions citation types (neutral citation, SI, legislation section, retained EU law) which overlaps with the schema but does not add additional parameter-level syntax or format details. Schema carries the burden, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Parses + resolves') and resource ('a single citation') and immediately distinguishes itself by explaining the use case: 'USE THIS TOOL BEFORE constructing an OSCOLA citation string from known fields, OR to confirm a citation points at a real document.' This clearly differentiates it from siblings like law_citations_parse and law_citations_format_oscola.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('USE THIS TOOL BEFORE constructing...') and strong when-not-to-use warnings ('Do NOT format or quote a confidence-0.0 citation', 'do NOT manufacture a citation'). However, it does not explicitly name sibling alternatives, only implies that formatting from known fields is a different route. This is clear and actionable but stops short of named alternatives, so a 4 is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_committees_get_committeeGet Committee DetailARead-onlyIdempotent
USE THIS TOOL WHEN you have a committee_id and want the metadata + current membership.
Fetches committee detail and member list in parallel. AFTER calling, pass committee_id into committees_search_evidence to see what evidence has been submitted to this committee on what topics.
| Name | Required | Description | Default |
|---|---|---|---|
| committee_id | Yes | Committee ID from committees_search_committees results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Committee ID |
| url | No | Parliament URL for this committee |
| name | Yes | Committee name |
| No | Contact email | |
| house | No | Commons, Lords, or Joint |
| phone | No | Contact phone number |
| members | No | Current committee members |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by disclosing that the tool fetches committee detail AND member list in parallel, setting expectations for response composition. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first front-loads the trigger condition, the second states the action, and the third provides actionable next-step guidance. The ALL-CAPS emphasis on 'USE THIS TOOL WHEN' and 'AFTER calling' highlights the most decision-relevant text. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple single-parameter tool with full annotation coverage and an output schema, so the description need not explain return values. It covers what the tool does, when to use it, and the next step in the workflow, which is complete guidance for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; the schema already documents committee_id as coming from committees_search_committees results. The description reinforces this source and shows the parameter's role in the follow-up workflow, but it does not add significant new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Fetches committee detail and member list in parallel.' The trigger condition 'when you have a committee_id' clearly distinguishes this from sibling search tools like law_committees_search_committees, and the mention of 'metadata + current membership' defines the exact scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with an explicit when-to-use directive ('USE THIS TOOL WHEN you have a committee_id'), and it names a related alternative ('pass committee_id into committees_search_evidence') with a clear workflow instruction. The when-not-to-use is strongly implied by the conditional phrasing, making this a model of usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_committees_search_committeesSearch Parliamentary CommitteesARead-onlyIdempotent
USE THIS TOOL WHEN searching or listing UK parliamentary select committees by name, house, or active status.
Returns committee summaries (name, house, active status, ID). AFTER calling, pass committee_id into committees_get_committee for current membership, or into committees_search_evidence to retrieve oral and written evidence submitted to that committee.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Filter by house. | |
| limit | No | Maximum committees to return. Default 100 comfortably covers all currently-active UK select committees. Raise only for historical sweeps. | |
| query | No | Search term for committee names, e.g. 'defence' or 'treasury'. Filtered client-side against committee names. Omit to list all committees. | |
| active_only | No | If true, only return currently active committees. |
Output Schema
| Name | Required | Description |
|---|---|---|
| house | No | House filter applied, or None |
| query | No | Name substring filter applied, or None |
| total | Yes | Number of committees returned in this call |
| committees | No | Matching committees. Use committees_get_committee for membership detail. |
| active_only | Yes | Whether results were restricted to currently active committees |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context: it returns 'committee summaries (name, house, active status, ID)' and explicitly describes the follow-up actions, which tells the agent what to expect from the output and how to chain tools. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. The first line is a clear imperative ('USE THIS TOOL WHEN...'), immediately followed by the return summary and downstream steps. Every sentence earns its place: purpose, output, and usage flow. No fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (so return values are already structured) and annotations cover safety and idempotence, the description provides sufficient context for decision-making. It explains what the tool does, what it returns, and how to proceed with the results. It does not cover edge cases like empty results or error behavior, but these are not critical for a simple read-only search tool; the overall guidance is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%—all four parameters (house, limit, query, active_only) have detailed descriptions with defaults, bounds, and examples in the schema itself. The tool description does not add additional parameter-level meaning; it only mentions 'name, house, or active status' in the purpose, which maps to existing schema fields. Per the rubric, a baseline of 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'searching or listing UK parliamentary select committees by name, house, or active status.' It names the specific resource (UK parliamentary select committees), the actions (searching/listing), and the filtering dimensions. It also distinguishes itself from sibling tools by directing the user to pass committee_id to committees_get_committee or committees_search_evidence afterward, thereby clarifying its unique role in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'USE THIS TOOL WHEN searching or listing...' which is an explicit when-to-use directive. It also provides downstream usage guidance ('AFTER calling, pass committee_id into...'), which helps the agent choose the next tool. However, it does not explicitly state when NOT to use this tool or name direct alternatives for the same search task, which would elevate it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_committees_search_evidenceSearch Committee EvidenceARead-onlyIdempotent
USE THIS TOOL WHEN you have a committee_id and want the oral and written evidence submitted to it.
Returns ONE PAGE of evidence (default 20) plus total, the source's
count of matching items. evidence_type='both' lists all oral evidence
first, then all written evidence, each newest-published first as the
source orders it. Free-text titles are capped per max_title_chars;
witness lists are capped at 10 per item. An organisation witness (no
named individual) is rendered as ' ()'; a null
entry means the source gave no name for that witness at all. For
committees with many submissions, re-call with offset=offset+returned
while has_more is true.
Authoritative source for parliamentary committee evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum evidence items to return. Default 20. For evidence_type='both' a page may hold only oral, only written, or the last oral items followed by the first written items. | |
| offset | No | Number of evidence items to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true. For evidence_type='both' this is a position in the combined sequence (all oral evidence, then all written evidence). | |
| committee_id | Yes | Committee ID from committees_search_committees results. | |
| evidence_type | No | Type of evidence to search. | both |
| max_title_chars | No | Per-item cap on the free-text title field. Default 300 prevents context blow-up from verbose inquiry titles. Raise to 1000+ only when you need the full title text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Max evidence items requested for this page |
| total | Yes | Evidence items matching this query, from committees-api's totalResults (for evidence_type='both', the oral count plus the written count) |
| offset | Yes | Number of evidence items skipped before this page |
| evidence | No | Evidence items in this page. Titles are capped per max_title_chars; witness lists are capped at 10 per item. |
| has_more | Yes | True if evidence exists beyond this page (offset + returned < total). Re-call with offset=offset+returned to fetch the next page. |
| returned | Yes | Number of evidence items actually returned in this call |
| committee_id | Yes | Committee ID this page belongs to |
| evidence_type | Yes | Evidence type filter applied to this query |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses concrete behaviors: the one-page limit, the ordering of oral before written evidence, title/witness caps, rendering rules for organisation witnesses, null semantics, and the total field. This gives the agent a detailed operational picture far beyond the annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core usage condition, then proceeds logically through output characteristics, formatting rules, and pagination. Every sentence carries distinct information without redundancy, and the 'Authoritative source' note adds provenance without padding. Length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values are covered. The description covers pagination, ordering, formatting edge cases, parameter interactions, and the source authority. An agent has everything needed to invoke this tool correctly and interpret the results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining the combined ordering for evidence_type='both', the purpose of max_title_chars (avoiding context blow-up), and how offset interacts with the combined sequence for pagination. This is meaningful added context, though the schema already covers individual parameter meanings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'USE THIS TOOL WHEN you have a committee_id and want the oral and written evidence submitted to it', which names a specific verb ('search evidence'), a resource ('committee evidence'), and the key precondition (committee_id). This clearly differentiates it from sibling tools like law_committees_search_committees and law_committees_get_committee, which target committee discovery or metadata rather than evidence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'USE THIS TOOL WHEN' clause explicitly states the condition for use. It also gives pagination guidance ('re-call with offset=offset+returned while has_more is true'), which directs the agent on iterative usage. It does not mention when not to use it or name alternative tools, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_get_promptARead-onlyIdempotent
Get a prompt by name with optional arguments.
Returns the rendered prompt as JSON with a messages array. Arguments should be provided as a dict mapping argument names to values.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the prompt to get | |
| arguments | No | Optional arguments for the prompt |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful behavioral context by stating that it returns a rendered prompt as JSON with a messages array and that arguments should be a dict mapping names to values, which goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences long, front-loaded with the core action, and contains no filler. Every sentence provides value: the first states the purpose, the second clarifies output and argument format. Excellent conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, strong annotations, and the presence of an output schema, the description sufficiently covers the key behavioral aspects: what it does, how arguments are passed, and the output shape. No critical information is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, so the schema already documents each parameter. The description reinforces the arguments format ('dict mapping argument names to values') but adds little beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get a prompt by name' with a specific verb and resource, making the core purpose unambiguous. However, it does not explicitly differentiate itself from sibling tools like 'law_list_prompts' or the similarly named 'dd_get_prompt', so it falls 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this tool when you have a prompt name and want the rendered prompt. There is no explicit mention of alternatives or when not to use it, such as pointing to 'law_list_prompts' for discovery, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_hmrc_check_mtd_statusCheck MTD VAT StatusARead-onlyIdempotent
USE THIS TOOL WHEN you have a 9-digit VAT Registration Number and need that business's Making Tax Digital VAT mandate status.
Returns whether the business is mandated for MTD, effective date, and trading name.
Connects to the HMRC sandbox by default. Set HMRC_API_BASE to 'https://api.service.hmrc.gov.uk' for production. Requires HMRC_CLIENT_ID + HMRC_CLIENT_SECRET environment variables (OAuth 2.0). Raises if credentials are not configured — do not infer status.
| Name | Required | Description | Default |
|---|---|---|---|
| vrn | Yes | VAT Registration Number: 9 digits, e.g. '123456789'. GB prefix accepted and stripped automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| vrn | Yes | VAT Registration Number queried |
| mandated | Yes | Whether this business is mandated for MTD VAT |
| trading_name | No | Registered trading name if available |
| effective_date | No | Date from which MTD obligation applies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent hints in annotations, the description adds crucial operational context: the default to HMRC sandbox, the production URL via HMRC_API_BASE, and the need for HMRC_CLIENT_ID/SECRET credentials. It also discloses that the tool raises an error if credentials are missing, and explicitly warns not to infer status. This is exactly the kind of behavioral detail that annotations don't capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the most important 'when to use' statement first. It covers purpose, return values, and setup in just a few lines without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with an output schema and annotations, this description covers all essential aspects: trigger condition, return fields, environment configuration, and error behavior. The existence of an output schema means detailed return-value structure need not be in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions the VRN and its format in the trigger sentence, but the schema itself already provides full coverage with min/max lengths, an example, and the note about GB prefix stripping. No additional parameter meaning is added beyond the schema, so the baseline score for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with an explicit trigger: 'USE THIS TOOL WHEN you have a 9-digit VAT Registration Number and need that business's Making Tax Digital VAT mandate status.' This clearly specifies the verb (check), the resource (MTD VAT status), and the starting condition. It distinguishes from sibling VAT tools such as law_hmrc_get_vat_rate which handles rates, not mandate status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The tool is explicitly scoped to a scenario involving a VRN and the MTD mandate status. It also states environment and credential prerequisites, implying that this tool is not usable without proper configuration. However, it doesn't explicitly name alternate tools to use instead in other scenarios, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_hmrc_get_vat_rateGet VAT Rate for CommodityARead-onlyIdempotent
USE THIS TOOL WHEN you know the UK VAT category name for a good or service and want its VAT treatment.
Exact named-category lookup, not a free-text VAT classifier or tax advice. The query must equal a category name, ignoring only case, spacing, hyphens and apostrophe style. Extra qualifying words are never discarded: 'pet food' is its own category, and 'baby food' is not 'food'.
A match returns rate (standard, reduced, zero or exempt),
rate_percentage (None for exempt), conditions in notes, the GOV.UK
source_url, and that entry's verified_on date.
An unresolved query returns no rate: matched_category, rate,
rate_percentage and verified_on are all null, never a default.
Its notes list the category names. AFTER an unresolved result, retry
with a listed name or call hmrc_search_guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| commodity_code | Yes | Commodity code or plain-English description. E.g. 'food', 'domestic fuel', 'software', 'financial services', 'new build residential' |
Output Schema
| Name | Required | Description |
|---|---|---|
| rate | No | VAT rate category, or None when no specific category was confidently matched. None here is NOT a stand-in for any real rate — it means the lookup did not resolve, not that the item is outside VAT's scope. |
| notes | No | Any additional notes or conditions on this rate |
| source_url | Yes | GOV.UK/HMRC guidance page backing the matched entry; for an unresolved query, the general VAT rates page to consult instead |
| verified_on | No | Date the matched entry was last checked against GOV.UK/HMRC guidance. None for an unresolved query, since no entry was matched. A data-currency signal only — see `effective_from` for the rate's own legal commencement date, when known. |
| commodity_code | Yes | Commodity code or description queried |
| effective_from | No | Date the represented VAT treatment is known, on researched evidence, to have taken legal effect. None when no such commencement date has been established for this entry — that is common and does NOT imply the rate is new, uncertain, or unmatched. For data currency (when this entry was last checked against GOV.UK/HMRC guidance) see `verified_on` instead — the two are deliberately independent. |
| rate_percentage | No | Rate charged on a taxable supply: 20.0 (standard), 5.0 (reduced), 0.0 (zero). None for an exempt supply, which is not taxed at any rate (exempt is not the same as 0%), and None when `rate` is None. |
| matched_category | No | The static lookup table category the query exactly named (e.g. 'hot food'), or None when the query is not a category name. `rate`/`rate_percentage` are None whenever this is None — see `notes`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, so the description only needs to add non-safety behavior. It does this well: exact matching rules, normalization rules, the fact that extra words are never discarded, null-on-no-match behavior with no defaults, and the content of notes on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage trigger and is organized into clear sections: when to use, matching rules, successful return values, and unresolved-result behavior. Every sentence earns its place; nothing is redundant or decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a one-parameter lookup tool. It covers success behavior, failure behavior, parameter constraints, and the fallback sibling tool. The output schema handles structured return details, and the description adds the semantic meaning an agent needs to interpret the response correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already gives examples, but the description adds crucial semantics beyond it: the value must exactly equal a category name, not a free-text description or commodity code. It clarifies the potentially misleading 'commodity_code' property name and explains normalization and non-fuzzy matching in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's job: given a known UK VAT category name, return its VAT treatment. It explicitly distinguishes this from a free-text VAT classifier or tax advice, and names the sibling law_hmrc_search_guidance as the fallback, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The opening line is an explicit when-to-use trigger: use when you know the exact VAT category name. It also explains when not to use it (free-text queries, extra qualifying words) and tells the agent what to do after an unresolved result: retry with a listed name or call hmrc_search_guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_hmrc_search_guidanceSearch HMRC GuidanceARead-onlyIdempotent
USE THIS TOOL WHEN searching GOV.UK for HMRC tax guidance on a topic (VAT, income tax, corporation tax, etc.).
Returns matching guidance titles, URLs, summaries, and last-updated dates. Searches the official GOV.UK content API filtered to HMRC publications.
Authoritative source for current HMRC tax guidance. Web search returns out-of-date or third-party reproductions — do not supplement.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum guidance results to return (1–25). Passed to the GOV.UK search count param. | |
| query | Yes | Search query for HMRC guidance, e.g. 'VAT digital services', 'R&D tax relief SME' |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | The search query that was run |
| total | Yes | Number of guidance documents returned in this call |
| results | No | Matching HMRC guidance pages. Each entry's `summary` is capped per the max_summary_chars input parameter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description only needs to add context. It adds the return values (titles, URLs, summaries, last-updated dates) and specifies the source (official GOV.UK content API), which goes beyond the annotations. It does not mention rate limits or authentication, but for a read-only search this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long, front-loaded with the usage directive, and contains no fluff. Each sentence serves a distinct purpose: when to use, what it returns, where it searches, and why it's authoritative. It is exceptionally concise and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and only two parameters (one required), the description provides sufficient context: the purpose, the data source, the return fields, and a warning about alternatives. It is fully adequate for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for both query and limit parameters. The description does not add any parameter-specific semantics beyond what the schema already provides. Baseline 3 is appropriate because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: searching GOV.UK for HMRC tax guidance. It specifies the verb 'search', the resource 'HMRC tax guidance', and the scope (GOV.UK content API filtered to HMRC publications), distinguishing it from sibling tools like gov_govuk_search and other HMRC-specific tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'USE THIS TOOL WHEN searching GOV.UK for HMRC tax guidance' and warns against web search with 'do not supplement', providing clear when-not guidance. However, it does not name sibling tools as explicit alternatives, so it falls just short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_judgment_get_headerGet Judgment HeaderARead-onlyIdempotent
USE THIS TOOL WHEN you have a judgment slug and need metadata (parties, judges, neutral citation, court, dates).
Call case_law_search FIRST to get the slug. AFTER calling, use judgment_get_index to discover paragraphs, then judgment_get_paragraph to read specific ones. Authoritative source for UK judgment metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Judgment slug, e.g. 'uksc/2024/12' or 'ewca/civ/2023/450' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, setting the safety baseline. The description adds value by labeling the tool an 'Authoritative source for UK judgment metadata,' providing data reliability context beyond the schema. It doesn't contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, with the most important usage instruction front-loaded in the first sentence. Every sentence serves a purpose—purpose, workflow, and authority—with no redundant or irrelevant text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema and strong annotations, the description fully covers when to use it, how to obtain the slug, and how it fits into a larger workflow. It leaves no significant gaps for the agent to resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'slug' fully described and examples provided. The description only references 'judgment slug' without adding new format or syntax details, so it adds minimal value beyond the schema, warranting the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving judgment metadata (parties, judges, neutral citation, court, dates) given a slug. It distinguishes from sibling tools like judgment_get_index (paragraphs) and judgment_get_paragraph (individual paragraphs) by specifying the metadata focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'USE THIS TOOL WHEN' statement provides a clear precondition (having a slug) and the need for metadata. It also outlines the workflow: call case_law_search first to get the slug, then judgment_get_index, then judgment_get_paragraph, which guides the agent on sequencing and when alternatives are appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_judgment_get_indexGet Judgment Paragraph IndexARead-onlyIdempotent
USE THIS TOOL WHEN you have a judgment slug and want the paragraph navigation index (eId + preview line for every paragraph).
Call case_law_search FIRST to get the slug. AFTER calling, pass an eId from the returned list into judgment_get_paragraph to read that paragraph's full text, or use case_law_grep_judgment for content search across all paragraphs.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Judgment slug, e.g. 'uksc/2024/12' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, idempotentHint, and destructiveHint=false, the description adds useful behavioral context by specifying that the output contains eId and preview line per paragraph. It also clues the agent that this is a list/index operation rather than full-text retrieval, which supports correct follow-up tool selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose and keeps all sentences purposeful. It packs workflow, tool interrelationships, and output expectations into three concise lines without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has one fully documented parameter, includes an output schema, and benefits from complete annotation coverage. The description supplies the necessary contextual glue by linking to preceding and follow-up tools, making it sufficiently complete for accurate agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers the single parameter with a clear example ('uksc/2024/12'), and the description reinforces the meaning by saying the tool is used when you have a judgment slug and instructs you to get it from case_law_search. This adds practical guidance beyond the schema's bare definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool returns a paragraph navigation index with 'eId + preview line for every paragraph.' It names the specific resource (judgment paragraphs) and distinguishes itself from sibling tools like case_law_search, judgment_get_paragraph, and case_law_grep_judgment by positioning it as the index lookup step in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description begins with 'USE THIS TOOL WHEN you have a judgment slug,' providing an explicit trigger condition. It also prescribes the workflow: call case_law_search first to obtain the slug, then use this tool, and afterward feed eIds into judgment_get_paragraph or case_law_grep_judgment, thereby clarifying when to use this tool versus its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_judgment_get_paragraphGet Judgment ParagraphARead-onlyIdempotent
USE THIS TOOL WHEN you have a judgment slug + LegalDocML eId and want that paragraph's full text.
Call judgment_get_index FIRST to discover available eIds (or use case_law_grep_judgment to locate paragraphs by content). Returns the paragraph XML content (400–1,700 tokens typical).
| Name | Required | Description | Default |
|---|---|---|---|
| eId | Yes | Paragraph eId from judgment_get_index, e.g. 'para_12'. Numeric strings like '12' are accepted and normalized to 'para_12'. | |
| slug | Yes | Judgment slug, e.g. 'uksc/2024/12' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds value by disclosing the return type (paragraph XML content) and typical token range (400–1,700 tokens), which is not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the triggering condition, and no unnecessary words. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the availability of an output schema and comprehensive annotations, the description covers prerequisites (get_index first), alternatives (grep), return format, and expected size. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with detailed parameter descriptions and examples, including normalization of numeric eIds. The description adds minimal extra semantic value beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'USE THIS TOOL WHEN' and specifies the exact scope: full text of a paragraph given a judgment slug and LegalDocML eId. This clearly distinguishes it from sibling tools like law_judgment_get_index and law_judgment_get_header.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to call judgment_get_index FIRST to discover eIds and mentions case_law_grep_judgment as an alternative for locating paragraphs by content. This provides clear when-to-use and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_legislation_get_sectionGet Legislation SectionARead-onlyIdempotent
USE THIS TOOL WHEN you have a known Act / SI and want the parsed text of a specific section, regulation, or article, with extent and in-force metadata.
Returns the provision's own text and its own heading — never a neighbouring or enclosing Part/Chapter's content. Also returns territorial extent, in-force status, and prospective flag. Content capped per max_chars (default 10,000, ~2,500 tokens) — raise for unusually long definition sections; check content_truncated in the response.
Works uniformly across Act sections ('section-N'), SI regulations ('regulation-N'), and SI articles ('article-N') — pass the bare number regardless of which the document uses; you don't need to know which noun applies. Raises a not_found error (rather than returning a plausible but wrong node) if the number doesn't exist in this document — check legislation_get_toc for valid numbers.
ALWAYS check extent — a section may apply to England & Wales but not
Scotland or Northern Ireland. Reciting a section without checking
extent is a recurring legal-research error.
Alternative: call read_resource(uri="legislation://{type}/{year}/{number}/ section/{section}") for raw CLML XML; use this tool when you want the parsed structured response instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Legislation type code: 'ukpga' (Acts), 'uksi' (SIs), 'asp' (Scottish Acts), 'nia' (NI Acts). Use the value from legislation_search results. | |
| year | Yes | Year of enactment | |
| number | Yes | Chapter or SI number | |
| section | Yes | Provision number, e.g. '47' or '12A' — works for Act sections, SI regulations, and SI articles alike. Use the numeric part only — not 'section-47'/'regulation-47'/'article-47'. Schedules are not currently supported. | |
| max_chars | No | Maximum characters of section content to return. Default 10,000 (~2,500 tokens) covers almost every section. Raise to 50,000+ only for unusually long Finance Act definition sections. Check content_truncated in the response to see if it was cut. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | Yes | Section title or heading |
| extent | No | Territorial extent: list of 'England', 'Wales', 'Scotland', 'Northern Ireland'. Empty list means unknown — do not assume full UK extent. |
| content | Yes | Plain text content of the section, possibly truncated per max_chars. Check content_truncated and original_length for full-text information. |
| in_force | No | False if the section is explicitly marked repealed in CLML. True only when an InForce element is present in the section body (rare). Null for most sections — the data.xml endpoint does not carry a per-section current in-force boolean; null does not mean repealed. |
| warnings | No | Non-fatal retrieval or parsing warnings the caller should disclose where relevant. |
| prospective | No | True if this section has not yet come into force; None if unknown |
| version_date | No | Date of the version retrieved |
| source_format | No | Source parsed for this response. html_fallback means CLML XML was unavailable and text was parsed from the public HTML page. |
| section_number | Yes | Section number, e.g. '47', '12A', 'Schedule 2' |
| original_length | No | Original plain-text length in characters before any truncation |
| content_truncated | No | True if content was cut to fit max_chars |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover readOnly/idempotent/openWorld, and the description goes well beyond them: it explains truncation behavior (content capped per max_chars, check content_truncated), error behavior (not_found rather than a plausible-but-wrong node), what is and is not returned (own heading, never neighbouring Part/Chapter), and a domain caution about extent. This is rich behavioral disclosure that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the use-when clause and structured into short paragraphs, each carrying a distinct payload (scope, return boundaries, truncation, cross-type behavior, error, extent caveat, alternative). Slightly long but every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 still adds the essential context: truncation signals, not_found behavior, extent caveat, and the raw-XML alternative. For a 5-param, 4-required tool with cross-type input semantics, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description adds meaningful meaning beyond the schema for two params: it clarifies that 'section' takes the bare number regardless of Act/SI article noun, and it justifies the max_chars default and when to raise it. It does not re-explain type/year/number, but the added rationale for the ambiguous params earns above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (parsed text of a specific section/regulation/article), and distinguishes from siblings by naming the read_resource alternative and pointing to legislation_get_toc for valid numbers. An agent can tell it apart from law_legislation_get_toc and law_legislation_search without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with 'USE THIS TOOL WHEN you have a known Act / SI', names the alternative (read_resource for raw CLML XML), and gives the fallback (legislation_get_toc for valid numbers). Explicit when and when-not guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_legislation_get_tocGet Legislation Table of ContentsARead-onlyIdempotent
USE THIS TOOL WHEN you have a known Act / SI and want the structural table of contents (parts, chapters, individual sections/regulations/articles).
Returns structural elements with XML id and title, in document order, e.g. 'section-47: Definitions' for an Act or 'regulation-4: Maximum weekly working time' for an SI. Individual provisions are listed alongside their enclosing Part/Chapter/crossheading headings — both levels matter: the heading entries give you the document's shape, the provision entries give you what to pass to legislation_get_section. A provision with no heading in the source (rare) is listed as a bare id with no title. AFTER calling, pass the numeric identifier (use '47', NOT 'section-47') into legislation_get_section for full text.
Large statutes (Companies Act 2006 has many hundreds of items) are paginated via offset/limit. Check has_more and total_items.
Alternative: call read_resource(uri="legislation://{type}/{year}/{number}/
toc") for the full TOC as a newline-separated id: title string (no
pagination). Use this tool when you need the structured response with
offset / limit / has_more for stepping through large statutes.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Legislation type code: 'ukpga' (Acts), 'uksi' (SIs), 'asp' (Scottish Acts), 'nia' (NI Acts). Use the value from legislation_search results. | |
| year | Yes | Year of enactment | |
| limit | No | Maximum items to return in this call (default 200, max 1000). Raise only when you need a larger slice in one response. Check has_more and total_items to know if further pages exist. | |
| number | Yes | Chapter or SI number | |
| offset | No | Number of items to skip from the flattened TOC. Use with limit to page through very large statutes like the Companies Act 2006 (1300+ items). |
Output Schema
| Name | Required | Description |
|---|---|---|
| type | Yes | Legislation type code echoed from the request |
| year | Yes | Year of enactment echoed from the request |
| items | No | TOC entries in XML document order, formatted as '<id>: <title>', e.g. 'section-47: Definitions'. When calling legislation_get_section pass only the numeric part ('47', not 'section-47'). |
| limit | Yes | Page size applied after offset |
| number | Yes | Chapter or SI number echoed from the request |
| offset | Yes | Offset applied to the full TOC item list |
| has_more | Yes | True if more items remain beyond offset+returned |
| returned | Yes | Number of items in this response |
| total_items | Yes | Total structural items parsed from the XML, before offset/limit. Compare to `returned` and `has_more` to decide whether to paginate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower, yet the description adds real behavior: large statutes are paginated, check has_more/total_items, and items with no heading are returned as bare ids. It stops short of describing ordering guarantees or error behavior on bad type/number, so a 4 rather than 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger and output shape before pagination and the alternative, and every sentence carries information (id formats, heading pairing, pagination, alternative). It is longer than strictly necessary — the paragraph format could be tightened — but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter paginated lookup with an output schema already present, the description covers the remaining gaps: what the structure looks like, the id format to feed downstream, pagination controls, the rare titleless-entry edge case, and the competing read_resource route. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a non-obvious cross-tool parameter convention: the numeric identifier ('47', NOT 'section-47') is what must be passed onward, which the schema does not express. Offset/limit are described in the schema itself, so no extra credit there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get the structural table of contents for a known Act/SI) and enumerates exactly what comes back (parts, chapters, sections/regulations/articles). It is clearly distinguishable from legislation_get_section and read_resource, both of which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger ('USE THIS TOOL WHEN you have a known Act / SI') and names the alternative path (read_resource with the toc URI) along with the condition that selects it — needing structured offset/limit/has_more stepping. It also states the downstream step (pass the numeric id into legislation_get_section).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_legislation_searchSearch UK LegislationARead-onlyIdempotent
USE THIS TOOL WHEN searching UK Acts and Statutory Instruments by title, phrase, or full-text.
Returns ranked results: title, type, year, number, legislation.gov.uk URL, and next_steps hints (toc URI, section template). AFTER calling, chain to legislation_get_toc then legislation_get_section for structural drill-in.
Filter discipline: type and year are exact-match. Use only when you
already know the value. For currency-driven searches ("the recent
Renters' Rights Act"), query by phrase alone and read the year from the
results — guessing a year and filtering by it zeroes results when wrong.
For broader concept queries across content, set fulltext=True.
Authoritative source for UK primary and secondary legislation (legislation.gov.uk).
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type: 'ukpga' (Acts), 'uksi' (SIs), 'asp' (Scottish Acts), 'nia' (NI Acts). Exact-match — omit if you don't already know whether you're looking for an Act vs an SI. | |
| year | No | Filter by year of enactment (exact-match — a single integer, not a range). Omit unless you already know the Act's year. Speculating a year (e.g. 'this is recent so it must be 2026') and getting it wrong will zero out the result set. Better workflow: query without `year`, then read the year from the returned results. | |
| limit | No | Maximum results to return (1–50). Passed to the upstream results-count param. | |
| query | Yes | Search query, e.g. 'Housing Act 1988' or 'data protection personal data' | |
| fulltext | No | Default false → searches Act/SI titles only (best for finding a named Act, e.g. 'Housing Act 1988' returns ukpga/1988/50 first). Set true to search the full text of every Act/SI for the query (returns SIs and regulations that cite the term — e.g. 'rental deposits' would return many implementing instruments). |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | Total number of matches |
| results | Yes | Matching legislation items |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/destructive=false, and the description adds non-obvious behaviors: ranked results with next_steps hints, and the warning that guessing a year will zero out results. It also clarifies the `fulltext` switch from title-only to full-text search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet dense, front-loaded with the use case in caps. Each paragraph addresses a distinct aspect: scope, returns/workflow, filter discipline, and source authority—no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the detailed input schema and output schema, the description fully covers: what to search, how to filter safely, what results look like, and how to drill into sections. No important aspects of searching UK legislation are left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of params, but description adds strategic parameter usage beyond schema: exact-match semantics for `type`/`year` and the advice to omit them when unsure. It gives concrete examples for `fulltext` (e.g., 'rental deposits').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'USE THIS TOOL WHEN searching UK Acts and Statutory Instruments by title, phrase, or full-text,' which names the specific verb and resource scope. It distinguishes from sibling tools like law_case_law_search by explicitly limiting to UK Acts and SIs on legislation.gov.uk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear 'when to use' instructions and filter discipline, including exact-match warnings for `type` and `year`, and when to omit them. It also names the chaining workflow to legislation_get_toc and legislation_get_section, giving explicit alternatives for structural drill-in.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_list_promptsARead-onlyIdempotent
List all available prompts.
Returns JSON with prompt metadata including name, description, and optional arguments.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe read-only/idempotent behavior. Description adds that it returns JSON with prompt metadata including name, description, and optional arguments, which is useful. But it doesn't disclose any potential limitations or additional behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, information-dense, no filler. Perfectly front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with an output schema, the description is minimally sufficient. It could clarify domain ('law') but the name implies it. It doesn't explain the 'prompt' concept, but sibling existence suggests it's a known entity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description correctly omits parameter details, and the schema coverage is 100% with no params to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' with resource 'all available prompts', which is clear. However, it doesn't distinguish from sibling dd_list_prompts or state the law domain, so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this vs law_get_prompt or law_list_resources. No mention of alternatives or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_list_resourcesARead-onlyIdempotent
List all available resources and resource templates.
Returns JSON with resource metadata. Static resources have a 'uri' field, while templates have a 'uri_template' field with placeholders like {name}.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral detail beyond the annotations: it clarifies the return format ('Returns JSON with resource metadata') and explains the distinction between static resources ('uri' field) and templates ('uri_template' field with placeholders like {name}). This is useful context not covered by the readOnlyHint, openWorldHint, or idempotentHint annotations, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence conveys the core purpose, and the second provides essential output details. Every word contributes value, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with no parameters and an output schema, the description is complete. It covers the primary action, the output format, and the key distinction between resource types. There are no significant gaps in what an agent needs to know to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema coverage is 100% by default. The description appropriately focuses on output semantics rather than parameter details. Baseline 4 is appropriate when no parameters exist and the description compensates by explaining returned data structure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'List all available resources and resource templates' – a specific verb and resource that clearly identifies the tool's function. It distinguishes itself from sibling tools like law_read_resource (which fetches a specific resource) and law_get_prompt (which gets a prompt) by focusing on the enumeration of all resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention discovery workflows, prerequisites, or alternatives such as law_read_resource. Usage context is only implied by the tool's name and listing behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_find_memberFind Member of ParliamentARead-onlyIdempotent
USE THIS TOOL WHEN you have a member's name and need their integer member_id.
Returns all members matching the name query, each with the integer id,
party, constituency, house, and current-sitting status. Disambiguates
common-name matches (e.g. "Lord Smith" returns multiple peers).
CALL THIS BEFORE any tool that filters by member_id — including parliament_get_debate_contributions, parliament_member_debates, and parliament_member_interests. Name → ID first; ID-based filtering second. Skipping this step and text-searching by name returns unrelated results (see parliament_search_hansard's anti-bypass note for the Pannick case).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name or partial name, e.g. 'Starmer', 'Baroness Hale' |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | The name that was searched |
| total | Yes | Number of members matching the query |
| members | No | Matching members. Use the integer `id` field from any member to call parliament_member_debates or parliament_member_interests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as read-only, idempotent, open-world, and non-destructive. The description adds substantial behavioral context beyond annotations: it returns all name matches with id, party, constituency, house, and current-sitting status, and it disambiguates common-name matches such as 'Lord Smith'. It also warns about the consequence of bypassing this lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the triggering condition and then moves through return shape, disambiguation, and ordering requirements. Every sentence is actionable: the return fields help interpret results, the sibling references establish order of operations, and the anti-bypass warning prevents a known failure mode. There is no redundant restatement of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with a full output schema and clear annotations, the description supplies everything an agent needs: purpose, usage timing, return fields, disambiguation behavior, and workflow ordering relative to sibling tools. No important operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single parameter's schema already explains that it accepts a name or partial name with examples such as 'Starmer' and 'Baroness Hale'. The description reinforces that this is a name query used to obtain an integer ID, but adds no syntax, formatting, or matching behavior beyond the schema. This is the expected baseline when the schema fully documents parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: find a Member of Parliament by name and return their integer member_id. It also distinguishes this from sibling tools by naming ID-filtering tools and explaining that name must be resolved to ID first. An agent can identify the exact purpose 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool (when you have a member's name and need their integer member_id) and when not to bypass it (calling ID-filtering tools before this one). It names concrete alternatives such as parliament_get_debate_contributions, parliament_member_debates, and parliament_member_interests, and warns that skipping this step produces unrelated results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_get_debate_contributionsGet Contributions In A DebateARead-onlyIdempotent
USE THIS TOOL WHEN you have a debate_ext_id and want verbatim contributions, optionally filtered to one member.
Canonical path for "everything a member said in this debate" regardless of vocabulary — text-search tools (parliament_member_debates, parliament_search_hansard) filter by contribution TEXT, dropping members who spoke without using your phrase verbatim. This tool filters by MemberId on the debate's Items list, so vocabulary doesn't matter.
Typical chain: parliament_find_member(name) → member_id, then parliament_search_hansard or parliament_lookup_by_column → debate_ext_id, then this tool. The parliament module's instructions describe the full composition pattern.
Without member_id, returns every contribution (~100-200 for a long debate).
If the wire returns no contributions for a member you expect to have spoken, report the empty result honestly — do NOT reconstruct quotes from training data. Authoritative source for member contributions.
| Name | Required | Description | Default |
|---|---|---|---|
| member_id | No | Optional integer Members API ID. When given, only that member's contributions in this debate are returned — regardless of which words they used. Resolves via parliament_find_member. When omitted, every contribution in the debate is returned (typical debate: 100-200 items). | |
| debate_ext_id | Yes | Debate GUID (DebateSectionExtId). Chain from parliament_search_hansard top_debates[].debate_ext_id, parliament_lookup_by_column matches[].debate_ext_id, or any tool that surfaces a debate identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Page size requested |
| topic | No | Topic phrase filter applied, if any |
| total | Yes | Number of contributions returned in this call |
| offset | No | Skip applied to this page |
| has_more | No | True if a full page was returned (more may exist) |
| member_id | Yes | Parliament Members API member ID |
| contributions | No | Hansard contributions for the member. Each `text` field is capped at 3000 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world. The description goes beyond them by disclosing result volume (~100-200 when unfiltered), the exact field the filter operates on (MemberId on Items list), and a strong honesty directive against fabricating quotes. That is genuinely additive behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger and canonical-purpose statement, then chains and caveats. Slightly long with some repetition of the member-list filtering idea across paragraphs, but every block earns its place. Minor redundancy keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain return shape, and it instead supplies the decision context an agent needs: when to use it, how to decompose the ID, how it differs from text search, and what to do on empty results. Complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the schema documents both params fully; baseline would be 3. The description adds real meaning beyond the schema: the semantic reason member_id matters ('vocabulary doesn't matter') and the expected result size when omitted, tying the parameter to the user's actual goal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('get verbatim contributions' for a debate_ext_id) and explicitly contrasts with sibling text-search tools (parliament_member_debates, parliament_search_hansard), explaining they filter by text while this filters by MemberId. An agent can distinguish this from every sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('WHEN you have a debate_ext_id'), the alternative tools and why they fail here, and a concrete typical chaining sequence. It even states the fallback/empty-result policy, leaving nothing ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_get_debate_divisionsGet Divisions Held In A DebateARead-onlyIdempotent
USE THIS TOOL WHEN you have a debate_ext_id and want the divisions (formal votes) held within it.
Most debates contain no divisions — Business of the House sittings, statements, urgent questions, debates without a vote. A populated list typically appears around bill stages, motions, and contested amendments. Empty list is the honest result, not a failure mode.
Each returned division carries TWO IDs:
id— Hansard-side reference. Useful for cross-referencing in Hansard.votes_id— Lords/Commons Votes API ID (cross-resolved by date+number). AFTER calling, passvotes_idasdivision_idinto votes_get_division for the full member-by-member voting record.
The two upstreams use distinct ID-spaces (Hansard Number=3 might be
Votes-API divisionId=3392). The cross-resolve runs once per (date, house)
group — typically one extra HTTP per debate. votes_id is None when the
cross-resolve found no match.
| Name | Required | Description | Default |
|---|---|---|---|
| debate_ext_id | Yes | Debate GUID (DebateSectionExtId). Chain from parliament_search_hansard contribution.debate_ext_id, top_debates[].debate_ext_id, or parliament_policy_position_summary top_debates[].debate_ext_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| divisions | No | Divisions held in this debate, in chronological order. Empty when no divisions occurred. Each element's `id` chains to votes_get_division. |
| debate_ext_id | Yes | Echo of the input debate GUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses that an empty list is a normal result, the cross-resolve runs once per (date, house) group with an extra HTTP call, and votes_id may be None. These are non-obvious behavioral details that enrich the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a usage clause, expectation-setting, bullet-point ID explanations, and behavioral notes. Every sentence contributes value; length is justified by the complexity of the cross-referencing behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations are comprehensive, the description covers the non-obvious aspects: the two ID spaces, the empty-list semantics, and the cross-resolve overhead. It fully prepares an agent to invoke the tool and chain its output correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter debate_ext_id is fully described in the schema with field type, minLength, and chaining sources. The description adds only that you need to have the ID, not new semantics. With 100% schema coverage, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets divisions (formal votes) held within a debate, with a specific verb+resource. It distinguishes itself from siblings by noting the two ID types and the follow-up call to votes_get_division, and the 'USE THIS TOOL WHEN' clause clarifies the exact precondition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'USE THIS TOOL WHEN you have a debate_ext_id and want the divisions'. Also gives context on when divisions are absent (most debates) and directs users to call votes_get_division after passing votes_id, effectively mapping the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_lookup_by_columnResolve A Hansard Column CitationARead-onlyIdempotent
USE THIS TOOL WHEN you have an OSCOLA-style Hansard citation (column + volume + house) and need the debate.
Example input: 'HL Deb 14 Oct 2025, vol 849, col 200'. AFTER calling, read the contribution at the cited column via read_resource(uri="hansard://debate/{debate_ext_id}/header") — or, equivalently, call parliament_get_debate_contributions(debate_ext_id) for the full list as a structured tool response.
Each match carries:
contribution_count— real contribution count from the debate's Itemssource/source_code— citation finality (1=Rolling, 2=Daily, 3=BoundVolume, 4=Historic). Resolution is NOT gated on publication state.
Empty matches typically means the volume_number is wrong (opposing
counsel sometimes cites running-volume rather than bound-volume) or the
column is in a Written Statement (use the 'W'-suffixed column as-is).
It does NOT mean the citation is fabricated — surface the failure.
Authoritative source for OSCOLA Hansard column resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Restrict to one House. Default 'both' searches across both Houses. | both |
| column_number | Yes | Hansard column number from an OSCOLA footnote, e.g. '200' for 'HL Deb 14 Oct 2025, vol 849, col 200'. String (not integer) to accommodate column suffixes like '1162W' for written answers. | |
| volume_number | Yes | Hansard volume number (the 'vol 849' part of an OSCOLA citation). Required — the endpoint only resolves citations when given the volume; sitting date is NOT a substitute (verified live 2026-05-29). |
Output Schema
| Name | Required | Description |
|---|---|---|
| house | Yes | House filter applied. |
| matches | No | Debate sections containing the cited column, in upstream relevance order. Each element's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header, and carries `source`/`source_code` for the citation's publication state. Resolution is NOT gated on publication state — Daily Part, Bound Volume, and Historic columns all resolve. Empty matches typically mean the volume number is wrong (running-volume vs bound-volume number), the column is a Written Answer/Statement needing its suffix (e.g. '1162W'), or a very recent column not yet indexed upstream. |
| column_number | Yes | Echo of the requested column number. |
| total_results | Yes | Number of debate matches found. |
| volume_number | Yes | Echo of the requested volume number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral details beyond annotations: resolution is not gated on publication state, empty matches mean a likely incorrect volume or written statement (not fabrication), and the tool surfaces failures as instructed. This complements the readOnlyHint and idempotentHint by explaining edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage trigger, includes a concrete example, and is logically organized: usage, follow-up instructions, match fields, failure modes, and authoritative source. Every sentence contributes distinct value—no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having a rich schema and annotations, the description additionally covers output fields, next-step tool usage, interpretation of empty results, and the tool's authority. This makes the description complete and self-contained for an agent to invoke and act on the result reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters thoroughly (100% coverage), so the baseline is 3. The description goes further by noting that column_number is a string to accommodate suffixes like 'W', and that volume_number was 'verified live 2026-05-29', plus explains how incorrect volume numbers cause empty matches. This adds interpretive value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: resolving OSCOLA Hansard column citations. It gives an explicit example input and distinguishes itself from sibling tools by directing the user to read_resource or parliament_get_debate_contributions as follow-up steps, making the tool's role very specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'USE THIS TOOL WHEN' and specifies the exact citation format required. It also explains when not to worry about empty matches (wrong volume or written statement) and suggests alternative actions, providing strong contextual guidance for tool selection and next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_member_debatesGet Member DebatesARead-onlyIdempotent
USE THIS TOOL WHEN you have a member_id and want contributions where THAT member used a specific topic phrase verbatim (text-body search).
CALL parliament_find_member(name) FIRST to obtain the integer member_id.
This is a name-based text-body search — it matches contributions whose TEXT contains the topic phrase. A member who spoke in a debate but didn't use your phrase verbatim is filtered out. For verbatim retrieval of every contribution by a member in a known debate (regardless of vocabulary), use parliament_get_debate_contributions(debate_ext_id, member_id=...) instead.
Each contribution's text field is capped at 3000 characters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum contributions to return. Default 20. | |
| topic | No | Optional phrase to find in THIS member's contribution text bodies. Hansard searches the words the member actually said, NOT the topic or title of the debate. Pass tokens this member would have spoken — distinctive arguments ('disproportionate sanction'), statutory references ('section 21'), or motion numbers ('Motion C1') — not the bill's name (members rarely say e.g. 'Renters\' Rights Bill' verbatim in their speeches). If you want 'every contribution this member made in a specific debate' regardless of words used, find the debate_ext_id then use parliament_get_debate_contributions(debate_ext_id, member_id=...). | |
| offset | No | Number of contributions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true. | |
| member_id | Yes | Parliament Members API integer ID. Obtain from parliament_find_member. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Page size requested |
| topic | No | Topic phrase filter applied, if any |
| total | Yes | Number of contributions returned in this call |
| offset | No | Skip applied to this page |
| has_more | No | True if a full page was returned (more may exist) |
| member_id | Yes | Parliament Members API member ID |
| contributions | No | Hansard contributions for the member. Each `text` field is capped at 3000 characters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description adds useful behavior beyond them: matching is verbatim text-body only, non-matching contributions are filtered out, and each contribution's text is capped at 3000 characters. It does not cover rate limits or auth, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the primary use case, then prerequisite, caveat, and alternative. The structure is scannable and every sentence serves a purpose, though some content duplicates the schema's already detailed parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations cover safety, the description supplies what an agent still needs: member_id sourcing, verbatim text-search semantics, the distinction from the alternative tool, and the text truncation limit. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents member_id, topic, limit, and offset in detail. The description largely reinforces the topic semantics already present in the schema and adds the member_id prerequisite, but does not significantly extend parameter meaning beyond the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: it returns contributions by a specific member matching a topic phrase via text-body search. It also explicitly distinguishes this tool from parliament_get_debate_contributions, so an agent can tell which sibling to use without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions ('WHEN you have a member_id and want contributions where THAT member used a specific topic phrase verbatim'), a prerequisite ('CALL parliament_find_member FIRST'), and a named alternative with the exact situation that selects it. This is complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_member_interestsGet Member Financial InterestsARead-onlyIdempotent
USE THIS TOOL WHEN you have a member_id and need their registered financial interests (donations, directorships, land, gifts).
CALL parliament_find_member(name) FIRST to obtain the integer member_id.
Returns ONE PAGE of interests (default 20, caller controls via limit). For prolific members (big donors, many directorships, extensive land holdings), re-call with offset=offset+returned while has_more is true to paginate. Description text is capped per max_description_chars; raise it for forensic provenance work that needs the full narrative.
This is the authoritative source for UK MP and peer financial-interest declarations (via the Members API). Web search returns stale snapshots.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max interests per call. Hard-capped at 20 by the upstream interests-api.parliament.uk (verified live 2026-05-29: Take=100 still returns 20). For prolific members, paginate via offset; total size is in totalResults on the response. | |
| offset | No | Number of interests to skip before this page. Default 0 for the first page. To paginate prolific members (100+ interests), re-call with offset=offset+returned while the previous response had has_more=true. | |
| category | No | Filter by interest category. Common categories: 'donations' (donations and support), 'gifts_uk' (gifts/hospitality from UK), 'employment' (employment and earnings), 'land' (land and property), 'shareholdings', 'overseas_visits'. Omit for all categories. | |
| member_id | Yes | Parliament Members API integer ID. Get from parliament_find_member. | |
| max_description_chars | No | Per-entry cap on the free-text description field. Default 500 prevents context blow-up on members with lengthy donation or directorship narratives. Raise to 2000+ only for forensic provenance work. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Max interests requested for this page |
| offset | Yes | Number of interests skipped before this page |
| category | No | Category filter applied to this query, or None for all categories |
| has_more | Yes | True if there may be more interests beyond this page. Re-call with offset=offset+returned to fetch the next page. |
| returned | Yes | Number of interests actually returned in this call |
| interests | No | The interests in this page. `description` text is capped per the max_description_chars input parameter. |
| member_id | Yes | Parliament Members API member ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds substantial beyond annotations: pagination semantics (one page, default 20, offset pattern), hard-capped limit of 20, per-entry description truncation, and the fact that web search returns stale snapshots. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the use-case trigger, then prerequisite, then pagination, then authority note. Every sentence earns its place; it is detailed yet tightly written with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the main flow (member_id from find_member), pagination for large result sets, parameter limits, description truncation trade-off, and the authoritative source. Given the tool's complexity (5 params, pagination, large result sets), this description is fully adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters with clear meanings (member_id, limit, offset, category, max_description_chars). The description adds pragmatic context on how to use these parameters together, especially the pagination loop and when to raise the character cap. This exceeds the baseline of 3 but does not reinvent the wheel.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'USE THIS TOOL WHEN you have a member_id and need their registered financial interests' – a specific verb+resource+condition. It clearly distinguishes from web search by declaring itself the authoritative API source for MP/peer financial-interest declarations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call parliament_find_member(name) first to obtain the member_id. Provides detailed pagination guidance for prolific members (re-call with offset while has_more is true) and advises raising max_description_chars for forensic work. No ambiguity about when to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_policy_position_summaryHansard Policy Position Summary (deterministic facets)ARead-onlyIdempotent
USE THIS TOOL WHEN you want debate-level corpus signals on a topic — by_house, by_year, by_section breakdowns — without reading every contribution.
Aggregates Hansard debate-level signals on a topic. Pure counts — no LLM, no editorial labels. Sweeps /search/Debates.json with pagination (up to max_debates_scanned), then aggregates by_house, by_section, by_year, by_month, and top_debates from debate metadata. Also captures the corpus-wide envelope counts (total_contributions, total_written_statements, total_divisions, etc.) from /search.json for cross-section scope.
AFTER calling, pick a debate from top_debates and pass its debate_ext_id into parliament_get_debate_contributions to drill into who said what.
Note on member-level facets: Hansard's search API exposes debate metadata, not per-contribution member identifiers, at the corpus level. by_party and top_contributors are therefore omitted from this deterministic summary. To see who spoke in a specific debate, read hansard://debate/{debate_ext_id}/header for an ordered contribution index, or call parliament_member_debates for one named member.
This is the authoritative source for UK Hansard corpus-level signals.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Restrict to one House. Default 'both'. | both |
| topic | Yes | Phrase to find in Hansard contribution text bodies for the facet aggregation. Same semantics as parliament_search_hansard.query: tokens that appear in members' actual speeches, not bill titles or topic metadata. The aggregator sweeps top_debates[] returned by /search/Debates.json — those debates are matched on the phrase appearing in titles or contribution text, so passing a Bill title (e.g. 'Renters\' Rights Bill') usually works for THIS tool even though it wouldn't for member-level text search, because debate-level matching uses metadata in addition to body text. | |
| to_date | No | End date (YYYY-MM-DD) | |
| from_date | No | Start date (YYYY-MM-DD) | |
| max_debates_scanned | No | Hard cap on debates sampled from /search/Debates.json to compute facets. Default 200 issues ≤4 upstream calls (take=50 each). Raise to 2000 (≤40 calls) for an exhaustive sweep on a heavily-debated topic. Hansard rate limit: 1000 req/5min. |
Output Schema
| Name | Required | Description |
|---|---|---|
| house | Yes | House filter applied |
| topic | Yes | Phrase searched in Hansard |
| by_year | No | Counts of debates by sitting year, desc by year |
| to_date | No | End date filter applied |
| by_house | No | Counts of debates by house (Commons vs Lords) |
| by_party | No | Counts by party. ALWAYS EMPTY in this summary — Hansard's search API only exposes member identifiers at the per-debate level, not the corpus level. For party breakdown within one debate, read hansard://debate/{ext_id}/header. For one member's contributions across the corpus, use parliament_member_debates. |
| from_date | No | Start date filter applied |
| by_section | No | Counts of debates by Hansard section bucket (Chamber / Westminster Hall / Written Answers / Written Statements) |
| top_debates | No | Top 20 debates ranked by upstream relevance_rank, with debate_ext_id for hansard://debate/{debate_ext_id}/header drill-down. contribution_count is null in this preview shape (would require a secondary call per debate). |
| total_debates | Yes | Total distinct debates touching this topic (TotalDebates) |
| debates_scanned | Yes | Number of debates pulled from /search/Debates.json for the facet breakdown (≤ max_debates_scanned) |
| total_divisions | Yes | TotalDivisions upstream count. Non-zero → consider votes_search_divisions. |
| top_contributors | No | ALWAYS EMPTY in this summary — see by_party note. Use parliament_member_debates after picking a debate from top_debates. |
| by_month_recent_12 | No | Counts of debates by YYYY-MM for the most recent 12 months in the sample, desc by month |
| total_contributions | Yes | Total contributions in Hansard matching topic+filters (TotalContributions) |
| total_written_answers | Yes | TotalWrittenAnswers upstream count |
| total_written_statements | Yes | TotalWrittenStatements upstream count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: discloses that output is pure counts with no LLM or editorial labels, that it sweeps /search/Debates.json with pagination, the upstream rate limit (1000 req/5min), and explicitly why by_party/top_contributors are omitted. This is unusually informative behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger and core purpose, then organized into scoping, follow-up, and omission paragraphs. Some sentences (e.g. 'This is the authoritative source...') are promotional padding, but overall it is well structured for its complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, an output schema present, and 100% parameter coverage, the description fully equips an agent: what it computes, how it scopes, its cost profile, and the correct follow-up traversal to drill into speakers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents house, topic, dates and max_debates_scanned, including the Bill-title matching nuance. The description reinforces the topic semantics but adds little parameter detail beyond what the schema already carries, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (aggregates Hansard debate-level signals on a topic) and enumerates the exact facets produced (by_house, by_section, by_year, by_month, top_debates), which distinguishes it from sibling search/member tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit when-to-use trigger ('USE THIS TOOL WHEN you want debate-level corpus signals... without reading every contribution') and names the downstream alternative ('pass its debate_ext_id into parliament_get_debate_contributions to drill into who said what'), plus routes member-level questions to parliament_member_debates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_search_hansardSearch Hansard DebatesARead-onlyIdempotent
USE THIS TOOL WHEN searching Hansard by topic, bill title, or text phrase.
Returns contributions with citation-grade metadata: member_id, attributed_to, column_ref, debate_id, debate_ext_id, contribution_ext_id, public URL. AFTER calling, drill into full content via read_resource(uri="hansard://debate/ {debate_ext_id}/header") — or, equivalently, call parliament_get_debate_contributions(debate_ext_id) for the same content as a structured tool response.
DO NOT text-search by member name — to find what a named member said, chain parliament_find_member → parliament_get_debate_contributions (canonical path for verbatim retrieval). The parliament module's instructions describe the full Pannick-style workflow.
Pagination: limit + offset honour the upstream paginated endpoint. For breadth across a topic, see parliament_policy_position_summary.
Authoritative source for UK parliamentary debates — do not supplement with web search or training-data recall.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Restrict to one House. Default 'both' returns Commons + Lords contributions. | both |
| limit | No | Max contributions per call (1–100). Default 20. Paginate further with offset; total corpus size is in total_corpus on the response. | |
| query | Yes | Phrase to find in Hansard contribution text bodies. Hansard searches the words members actually said in their speeches — NOT debate titles, topic metadata, or written headlines. Pass tokens that would appear in someone's speech: distinctive arguments ('disproportionate sanction'), statutory references ('section 21'), or specific phrases. Bill titles (e.g. 'Renters\'s Rights Bill') often DON'T match because members refer to 'the Bill' or 'this legislation' in their speeches. Tokenised matching: 'housing benefit fraud' will match contributions saying 'fraud in housing benefit claims'. For 'all contributions in a specific debate' regardless of words used, drill via top_debates[].debate_ext_id into parliament_get_debate_contributions. | |
| offset | No | Skip this many contributions before the page. Default 0. Re-call with offset=offset+returned to paginate; has_more flags whether more remain. | |
| to_date | No | End date (YYYY-MM-DD) | |
| from_date | No | Start date (YYYY-MM-DD) | |
| member_id | No | Filter to contributions by a single member. Pass the integer Members API ID (resolve a name via parliament_find_member). The prior `member` field accepted a name string but Hansard's /search.json silently ignored it — the spec requires `memberId`. | |
| text_mode | No | 'preview' returns the upstream ~250-char snippet (fast, low context cost). 'full' returns ContributionTextFull (still capped at 3000 chars). For full contribution text without the cap, read the resource hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}. | preview |
| contribution_type | No | Which Hansard section to paginate. 'Spoken' = chamber + Westminster Hall debates (the default; what a lawyer usually means). 'Written' = written answers and statements. 'Corrections' = published corrections to the record. The corpus envelope (total_debates, total_divisions, etc.) is independent of this and always populated. | Spoken |
Output Schema
| Name | Required | Description |
|---|---|---|
| house | No | House filter applied |
| limit | No | Page size requested |
| query | Yes | The phrase that was searched in Hansard |
| total | Yes | Number of contributions returned in this call |
| offset | No | Skip applied to this page (Hansard API: skip) |
| to_date | No | End date filter applied, if any |
| has_more | No | True if a full page was returned (more may exist; re-call with offset=offset+limit) |
| from_date | No | Start date filter applied, if any |
| member_id | No | Members API integer ID filter applied, if any (echoed from input). |
| text_mode | No | Whether contribution `text` carries the upstream preview or full body (still capped). |
| date_range | No | (min, max) SittingDate of returned contributions, or None if empty |
| top_debates | No | Top-ranked debates touching this topic (from upstream Debates[] preview, capped at 4 by Hansard's /search.json). Each entry's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header. |
| total_corpus | No | Total contributions in Hansard matching this query (TotalContributions). Use to decide whether to paginate further or escalate to parliament_policy_position_summary. |
| contributions | No | Matching Hansard contributions with full citation metadata. |
| top_divisions | No | Top-ranked divisions touching this topic (from upstream Divisions[] preview, capped at 4). Each entry's `id` chains to votes_get_division; `debate_section_ext_id` chains back to the parent debate. |
| total_debates | No | TotalDebates — distinct debates touching this topic. |
| total_members | No | TotalMembers — member-name matches in the corpus. |
| house_breakdown | No | Counts by house across the returned page |
| party_breakdown | No | ALWAYS EMPTY. Hansard's contribution schema has no structured party field (see HansardContribution.party) — an aggregation over unjustified values would just be a party-shaped guess. Kept as a field (rather than removed) for schema stability. For real party facets, resolve member_id per contribution via parliament_find_member; this tool does not do that automatically — it would cost one extra HTTP call per distinct member in the page. |
| total_divisions | No | TotalDivisions. Non-zero → consider `top_divisions` previews below or chain to votes_search_divisions. |
| total_petitions | No | TotalPetitions. |
| total_committees | No | TotalCommittees. |
| total_corrections | No | TotalCorrections — published corrections to the Hansard record. |
| total_written_answers | No | TotalWrittenAnswers. |
| total_written_statements | No | TotalWrittenStatements. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world. The description adds genuinely useful context beyond that: which fields are returned (citation-grade metadata), the pagination model (limit+offset honour upstream), and that the source is authoritative and should not be supplemented by web search or training data. It does not disclose rate limits or failure modes, but the additions are substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and clearly sectioned (search, return fields, drill-down, exclusions, pagination, authority). Slightly dense and multi-topic for a single description, but every block earns its place. The drill-down sentence is somewhat redundant with the usage-guidelines section.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-param, 3-enum, output-schema-bearing search tool, the description covers just about everything an agent needs: what it does, what it returns, how to drill below the preview, how to paginate, what NOT to do, and authoritative-source expectations. With an output schema present it correctly avoids over-explaining return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description still adds value with the non-obvious guidance that Hansard matches words spoken in speeches, not bill titles, and that member name text-search is silently ignored (the reason member_id exists). That is a semantic insight the schema alone doesn't convey, raising this above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope ('searching Hansard by topic, bill title, or text phrase') and explicitly contrasts itself with siblings: it says NOT to text-search by member name and routes to parliament_find_member / parliament_get_debate_contributions. It also distinguishes topic search from debate drill-down. This is precise enough for an agent to select it over law_parliament_member_debates and law_parliament_get_debate_contributions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (topic/bill/phrase search) and when-not (member-name lookup), plus the canonical chained workflow (find_member → get_debate_contributions) for verbatim retrieval. It even names parliament_policy_position_summary for topic breadth. This is a complete routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_parliament_search_petitionsSearch UK Parliament PetitionsARead-onlyIdempotent
USE THIS TOOL WHEN searching UK Parliament petitions by keyword or topic.
Returns petition title, state, signature count, and dates for government response or parliamentary debate if applicable. Filter by state (open, closed, debated, etc.) to narrow to live or historical petitions.
This is the authoritative source for UK Parliament petitions (petition.parliament.uk).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum petitions to return. Default 20. | |
| query | Yes | Search term for petition titles, e.g. 'ban trophy hunting' or 'NHS funding'. | |
| state | No | Filter by petition state. | all |
| offset | No | Number of petitions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | No | Page size requested |
| query | Yes | The term that was searched in petitions |
| state | Yes | Petition state filter applied to this query |
| total | Yes | Number of petitions returned in this call |
| offset | No | Skip applied to this page |
| has_more | No | True if a full page was returned (more may exist) |
| petitions | No | Matching petitions (title, state, signature count, key dates, URL). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is covered. However, the description falsely claims users can filter by 'open, closed, debated, etc.' while the input schema only allows 'open', 'closed', and 'all'. This is a misleading behavioral disclosure that could cause invalid calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with every sentence serving a purpose: usage trigger, return fields, filtering guidance, and authoritative source. Despite the state inaccuracy, the structure is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and comprehensive annotations, so the description does not need to explain returns or safety. However, the misleading 'debated' filter option creates a gap in completeness, as the agent cannot reliably know the valid state values without cross-referencing the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description actively misleads on the 'state' parameter by suggesting 'debated' is a valid filter value, which contradicts the enum definition. It adds no other meaningful semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'searching UK Parliament petitions by keyword or topic.' It clearly distinguishes itself from sibling tools like law_parliament_search_hansard and law_bills_search_bills by focusing exclusively on petitions and naming the authoritative source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description opens with 'USE THIS TOOL WHEN searching UK Parliament petitions,' providing explicit use context. It does not explicitly name alternatives or exclusions, but the scope is narrow and clear, making it obvious when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_read_resourceARead-onlyIdempotent
Read a resource by its URI.
For static resources, provide the exact URI. For templated resources, provide the URI with template parameters filled in.
Returns the resource content as a string. Binary content is base64-encoded.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | The URI of the resource to read |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral details beyond annotations: it returns content as a string, and binary content is base64-encoded. This explains the response format for a read operation. It does not mention authentication, rate limits, or error behavior, but with annotations present, the bar is lower and the added context is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, each earning its place. It front-loads the core purpose ('Read a resource by its URI'), then adds needed detail about URI formats and the return format. No filler or redundant repetition with schema or annotations. This is an appropriately sized and well-structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no nested objects) and the existence of an output schema, the description covers everything essential: what the tool does, how to provide the URI for both static and templated resources, and the return format including binary handling. The annotations handle safety and idempotency. No critical gaps remain, making this complete for its context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameter description ('The URI of the resource to read'), so the baseline is 3. The description goes beyond the schema by explaining the distinction between static and templated resources, clarifying how to supply the URI in each case. This adds meaningful semantic context that the schema alone does not provide, justifying a score of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read a resource by its URI,' using a specific verb and resource. It explains static vs templated resources, adding clarity about the tool's scope. However, it does not explicitly differentiate from sibling tools like law_legislation_get_section or law_judgment_get_paragraph, so it misses the 'distinguishes from siblings' criterion for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on how to use the tool: 'For static resources, provide the exact URI. For templated resources, provide the URI with template parameters filled in.' This gives practical guidance but does not state when to use this tool versus alternatives (e.g., when you have a URI from law_list_resources), nor does it mention exclusions. It implies usage a generic resource reader but lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_votes_get_divisionGet Division DetailARead-onlyIdempotent
USE THIS TOOL WHEN you have a division_id + house and want the full member-by-member voting record.
Voter lists are truncated to 100 per side to fit response limits; total voter counts are always accurate regardless of truncation. Chain from votes_search_divisions or parliament_get_debate_divisions (which cross-resolves Hansard division refs into votes-API division_ids).
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Which house this division belongs to. | Commons |
| division_id | Yes | Division ID from votes_search_divisions results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Division ID |
| date | Yes | Date of the division |
| house | Yes | Commons or Lords |
| title | Yes | Division title / motion text |
| passed | Yes | Whether the motion passed |
| truncated | No | Whether voter lists were truncated to fit response limits |
| aye_voters | No | Members who voted Aye (may be truncated) |
| ayes_count | Yes | Total Aye votes |
| noe_voters | No | Members who voted No (may be truncated) |
| noes_count | Yes | Total No votes |
| total_aye_voters | No | Total number of Aye voters before truncation |
| total_noe_voters | No | Total number of No voters before truncation |
| is_government_win | No | Whether the government won (Lords only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses an important behavioral trait beyond the annotations: voter lists are truncated to 100 per side but total voter counts remain accurate. This is critical context for interpreting results and goes beyond what the annotations (readOnlyHint, openWorldHint, etc.) already convey. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with a clear directive. It uses only three sentences, each earning its place: the usage trigger, the truncation caveat, and the chaining context. No wasted words or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, complete schema descriptions, and presence of an output schema, the description covers all necessary contextual needs. It explains truncation behavior, emphasizes accuracy of counts, and provides chaining sources, making it fully complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (division_id source and house enum). The description adds little new semantic meaning; it merely reaffirms the inputs and points to chaining sources, which the schema already mentions for division_id. The baseline of 3 for high schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving the full member-by-member voting record for a given division. It specifies the required inputs (division_id + house) and distinguishes it from sibling tools like law_votes_search_divisions and law_parliament_get_debate_divisions by focusing on the detail retrieval rather than search or cross-resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly begins with 'USE THIS TOOL WHEN you have a division_id + house' and provides clear chaining guidance from related tools (votes_search_divisions or parliament_get_debate_divisions). This tells the agent exactly when to invoke this tool and where to obtain the necessary IDs, which is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_votes_search_divisionsSearch Parliamentary DivisionsARead-onlyIdempotent
USE THIS TOOL WHEN searching Commons or Lords formal votes by topic, date, or member.
Returns one page of division summaries (title, date, vote counts,
pass/fail) plus total, the source's count of all matching divisions.
While has_more is true, re-call with offset=offset+returned. AFTER
calling, pass division_id + house into votes_get_division for the full
member-by-member voter lists.
Authoritative source for UK parliamentary vote records.
| Name | Required | Description | Default |
|---|---|---|---|
| house | No | Which house to search. | Commons |
| limit | No | Maximum divisions to return. Default 25. The Lords API honours up to 100; the Commons API returns at most 25 per call, so page by `returned`, not `limit`. | |
| query | No | Search term for division titles, e.g. 'Rwanda' or 'Online Safety Bill'. Omit to browse recent divisions. | |
| offset | No | Number of divisions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true. | |
| to_date | No | End date (YYYY-MM-DD). | |
| from_date | No | Start date (YYYY-MM-DD). | |
| member_id | No | Filter to divisions where this member voted. Get the member ID from parliament_find_member. |
Output Schema
| Name | Required | Description |
|---|---|---|
| house | Yes | Commons or Lords |
| limit | No | Page size requested (the Commons API returns at most 25 regardless) |
| query | No | The search term, if any (None = browse recent) |
| total | Yes | Total divisions matching the filters, from the source API's searchTotalResults count |
| offset | No | Skip applied to this page |
| has_more | No | True if divisions beyond this page exist (offset + returned < total) |
| returned | Yes | Number of divisions returned in this call |
| divisions | No | Matching divisions. Use the integer `id` field with votes_get_division to fetch the full voter list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral detail beyond annotations: it explains the pagination contract ('While has_more is true, re-call with offset=offset+returned'), the response shape, and the required next step. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the trigger condition. Every sentence earns its place: usage, return summary, pagination rule, follow-up action, and source authority. The formatting, including line breaks and the 'AFTER calling' cue, aids scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema, output schema, and annotations, the description supplies the missing workflow context: how to page, what fields come back, and how to proceed to member-level results. Nothing an agent needs to call and use this tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. Each parameter is already well-documented in the schema, including the Commons/Lords limit discrepancy and member_id sourcing. The description only loosely reinforces 'topic, date, or member' and pagination without adding new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and scope: 'searching Commons or Lords formal votes by topic, date, or member.' It clearly distinguishes itself from the related sibling tool law_votes_get_division by positioning this tool as the search step and the sibling as the follow-up for full voter lists.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('USE THIS TOOL WHEN searching Commons or Lords formal votes') and tells the agent to follow up with votes_get_division. It does not explicitly state when not to use this tool or name a direct alternative, though the downstream role is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_company_searchBRead-only
Search Companies House for a company by name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes that this is a safe read operation, and the description's 'Search' action is consistent. However, the description adds no additional behavioral context (e.g., result limits, matching behavior, or required authorities) beyond the annotation, so it meets the baseline but does not go further.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that directly states the tool's core function. Every word earns its place, and it is front-loaded with the verb and resource. It is appropriately concise for a simple search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single parameter, a read-only annotation, and an output schema present, the description is adequate for a basic search tool. However, it lacks any mention of limitations, regional scope, or differentiation from sibling tools, making it incomplete for agents choosing among many similar search tools in the larger context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description coverage for the 'name' parameter. The description only says 'by name,' which maps the parameter to a company name but does not specify exact vs. fuzzy matching, required format, or whether it is the registered name or trading name. This minimal compensation is insufficient given the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Search'), resource ('Companies House'), and object ('company by name'). However, it does not distinguish between this tool and the sibling dd_company_search, which likely performs a similar search, so it misses the sibling differentiation required for a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as dd_company_search, dd_company_profile, or other Company House tools. It does not mention exclusions, alternatives, or specific contexts, leaving the agent to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_epc_certificateARead-only
Fetch a single EPC certificate by its GOV.UK certificate number.
Use after property_epc_summaries has listed the candidates and you have picked one — this is faster than property_epc(postcode, address) as it makes a direct lookup with no address matching or postcode re-fetch.
The parameter is named lmk_key as a compatibility alias; pass the certificate number, which is returned in every property_epc_summaries row. (property_epc_search is deprecated and raises — do not call it.)
Returns the full EPC certificate, or null only when no such certificate is lodged. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
| Name | Required | Description | Default |
|---|---|---|---|
| lmk_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint, it discloses null vs error behavior: 'Returns the full EPC certificate, or null only when no such certificate is lodged... If the EPC service cannot be reached the tool raises an error instead.' This is critical for not misinterpreting errors as absence of data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary action and then provides usage context, parameter clarification, and return semantics. Slight redundancy: the null behavior is repeated twice ('or null only when no such certificate is lodged' and 'A null result means no such certificate is lodged'), which could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter look-up tool, it covers the purpose, orchestration (using summaries first), parameter origin, return values, and error handling. The presence of an output schema means it need not describe the return structure in detail, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema only defines lmk_key as string with no description. The description adds essential meaning: 'The parameter is named lmk_key as a compatibility alias; pass the certificate number, which is returned in every property_epc_summaries row.' This fully compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Tool states a specific verb and resource: 'Fetch a single EPC certificate by its GOV.UK certificate number.' It also distinguishes from siblings by mentioning it is faster than property_epc and used after property_epc_summaries, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use after property_epc_summaries has listed the candidates and you have picked one.' It also names an alternative (property_epc) and warns against deprecated property_epc_search, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_planning_searchARead-only
Find the council planning portal URL for a postcode.
| Name | Required | Description | Default |
|---|---|---|---|
| postcode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read operation. The description adds that it returns a URL, but no deeper behavior (e.g., whether it returns multiple results, if the postcode must be formatted a certain way). Given the annotation, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no redundancy. It conveys the essential action and input with maximum efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required parameter, read-only, output schema present). The description fully covers what the tool does and the input needed. With an output schema, no return-value details are necessary. It is complete for the given complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so the description must clarify the parameter. It does state 'for a postcode', which tells the agent the parameter is a postcode string. However, it does not specify expected format (e.g., with/without space, case) or any validation rules, leaving some gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Find') and resource ('council planning portal URL') with a clear parameter ('for a postcode'). It distinguishes from siblings like prop_epc_certificate or prop_ppd_transactions by specifying the exact output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use: whenever a council planning portal URL is needed for a postcode. It provides context but does not explicitly mention alternatives or exclusions, yet the purpose is narrow enough that no ambiguity exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_ppd_transactionsARead-only
Land Registry Price Paid transactions for a postcode, most recent first.
Returns up to limit most recent transactions within snapshot coverage
(coverage_from-coverage_to in the response's provenance).
Unfiltered by default -- category-B bulk transfers and commercial sales are
included. Pass property_type (F=flat, D=detached, S=semi, T=terraced,
O=other) to restrict the result to a single type.
Not a complete property history. Check provenance.older_records_exist
and provenance.sample_complete before saying anything about what a
property has or has not sold for. An empty result means "no sales within
the stated coverage" -- never "never sold". For clean residential
comparable sales, use property_comps.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| postcode | Yes | ||
| property_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral caveats: results are limited to snapshot coverage, provenance flags like older_records_exist and sample_complete must be checked, and an empty result only means no sales within coverage. These are non-obvious behaviors that materially affect interpretation, and they are clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: core function, filtering behavior, parameter semantics, and critical interpretive caveats are all covered. The use of bold labels and short paragraphs makes it scannable, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and carries return-shape details, the description covers all decision-relevant context: what the results mean, how to interpret empty results, when to use an alternative tool, and how to restrict results. An agent can correctly select, invoke, and interpret this tool without needing additional implicit knowledge.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully carries the burden of explaining parameters. It explains limit as 'Returns up to limit most recent transactions,' defines postcode as the query key, and lists all property_type codes with their meanings (F=flat, D=detached, etc.). Every parameter is given functional meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Land Registry Price Paid transactions for a postcode, most recent first.' It names the data source, the specific query resource, and the ordering behavior, and it distinguishes this tool from property_comps by noting the alternative is for 'clean residential comparable sales.' This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says the tool is 'Unfiltered by default' and that category-B bulk transfers and commercial sales are included, telling the agent when filtering with property_type is appropriate. It also directs users to property_comps for 'clean residential comparable sales' and warns against treating empty results as 'never sold,' giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_blocksBRead-only
Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of calendar months ending today; default 24. Results are limited to available coverage. | |
| postcode | Yes | ||
| search_level | No | sector |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already set readOnlyHint=true, so the read-only safety profile is established. The description adds the analytical intent (block-buy opportunities) but does not disclose data coverage, response behavior, or limitations beyond what the months parameter notes. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly worded sentence with the core idea front-loaded; the em-dash expansion earns its place. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The presence of an output schema and readOnlyHint covers returns and safety, but the description omits usage context and leaves search_level and postcode semantics underspecified. An agent would struggle to choose this over sibling property tools or to set search_level correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%; only 'months' is documented. The description adds no parameter-level detail, never mentioning search_level or the role of postcode beyond the general purpose. This fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('identify') and resource ('buildings with multiple flat sales'), with 'block-buy opportunities' giving an investment-oriented context that distinguishes it from sibling property tools like prop_ppd_transactions or prop_property_comps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool instead of sibling property tools; no exclusions, prerequisites, or alternative tool mentions. The only contextual clue is the purpose statement, which implies use for block-buy analysis but leaves selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_compsARead-only
Comparable sales from Land Registry Price Paid Data.
Defaults return the standard residential set:
property_type=None means residential (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O" for a single type, or "ALL" to disable type filtering (firehose).
transaction_category defaults to "A" (standard sales). Pass None to include category-B (bulk transfers, non-standard conveyances).
filter_outliers=False by default; set True for IQR-trimmed stats AND transaction list (1.5*IQR rule, needs >=4 prices).
limit caps returned transactions (max 200). enrich_epc attaches EPC floor area and price-per-sqft to each transaction — slower but richer.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| months | No | Number of calendar months ending today; default 24. Results are limited to available coverage. | |
| address | No | ||
| postcode | Yes | ||
| enrich_epc | No | ||
| search_level | No | sector | |
| property_type | No | ||
| filter_outliers | No | ||
| transaction_category | No | A |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses several behavioral traits: default property/transaction filtering, the IQR trimming rule and its 4-price minimum, the hard 200-transaction cap, and slower enriched EPC output. It does not discuss rate limits or error cases, but the added behavioral context substantially exceeds the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose, then organized into scannable bullets for defaults and parameter effects. Every sentence adds operational value; there is no filler or repetition of schema fields beyond what is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with an output schema, the description covers the core defaults and behavioral nuances needed to make a correct first call. The main gaps are search_level (no explanation of accepted values or geographic scope) and address, but the default-oriented guidance and output schema make the tool usable as-is.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at only 11%, the description compensates well by explaining property_type values, transaction_category semantics, filter_outliers behavior, limit's max, and enrich_epc's effect. It leaves search_level and address undocumented, and months is only explained in the schema, but the most consequential parameters receive meaning beyond type/default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'Comparable sales from Land Registry Price Paid Data' states the tool's resource and output concisely. However, while this distinguishes it from the raw-transaction sibling prop_ppd_transactions by implication, it never explicitly names an alternative or states what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives rich guidance on how to change defaults (property_type, transaction_category, filter_outliers), but no guidance on when to choose this tool over siblings such as prop_property_blocks, prop_ppd_transactions, or prop_property_yield. There is no when-to-use or when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_epcARead-only
Energy Performance Certificate data for a UK property or postcode area.
With address: returns the matched EPC certificate for that specific property. Without address: returns the record count and, when the bounded response contains every matching summary, the rating distribution. Property-type breakdown and floor-area statistics are NOT available — the EPC service exposes them only on individual certificates.
Returns null only when no certificates are lodged for the postcode. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.
| Name | Required | Description | Default |
|---|---|---|---|
| address | No | ||
| postcode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, it adds crucial behavioral semantics: null means no certificates lodged, whereas an error means the service is unreachable and should never be treated as evidence of absence. This error-vs-null distinction is a non-obvious defensive detail that prevents misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose, then logically proceeds through address-dependent behavior, limitations, and null/error semantics. Each sentence carries necessary information with no redundancy or filler, making it efficient despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the two-parameter schema, the presence of an output schema, and the readOnlyHint annotation, the description covers all behavioral aspects an agent needs: scope, conditional output, limitations, and error handling. Nothing essential for correct use is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully by explaining the effect of the address parameter: supplying it returns the matched certificate; omitting it returns record count and rating distribution. This workload-dependent behavior is essential for correct invocation and not deducible from the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Energy Performance Certificate data for a UK property or postcode area.' It clearly distinguishes two modes (with and without address) and what each returns. It also explicitly lists unavailable aggregations, making its scope unmistakable even without naming a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context about when to use this tool (for a specific property or postcode summary) and what it does not provide (property-type breakdown, floor-area statistics), implying that a different tool would be needed for those. However, it does not explicitly name an alternative sibling tool, so the guidance stops short of a direct when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_epc_searchARead-only
DEPRECATED — use property_epc_summaries then epc_certificate.
This tool returned score, floor_area, property_type, habitable_rooms and inspection_date for every certificate at a postcode. The EPC service no longer exposes those fields in a search: they exist only on a full certificate. Reproducing the old response would require one upstream request per certificate, so this tool is unsupported rather than silently degraded or silently expensive.
| Name | Required | Description | Default |
|---|---|---|---|
| postcode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description goes far beyond that by disclosing that the tool is deprecated, unsupported, and would be expensive if force-reimplemented. It explains the behavioral trap (silent degradation vs. cost) and the decision to mark it unsupported. This adds significant context not available from annotations, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a tight two-sentence paragraph. The critical deprecation notice and replacement are front-loaded in the first sentence. The second sentence explains the historical behavior and reasoning in a compact way. Every word earns its place; no filler or redundancy. Structure is optimal for a deprecated tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated tool, the description is complete: it tells the agent it should not be used, provides the exact alternative sequence, explains why it is unsupported, and states what it used to do. The presence of an output schema is irrelevant because the tool is not meant to be called. There is nothing an agent needs to correctly decide to avoid it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the only parameter (postcode) is 0%, and the description does not explicitly describe the parameter. The phrase 'for every certificate at a postcode' implicitly ties the postcode parameter to the tool's purpose, but provides no format, constraints, or examples. Given the low coverage, the description should compensate more, though the deprecation status reduces the practical need. Still, the semantics are not well specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly opens with 'DEPRECATED — use property_epc_summaries then epc_certificate', clearly identifying the tool's status and directing to the replacement. It then states the original purpose (returned score, floor_area, property_type, habitable_rooms, inspection_date for each certificate at a postcode), which distinguishes it from siblings. This is a clear, specific statement of what the tool does (or did) and how it relates to alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it says do not use it, and names the exact sequence to use instead. It further explains the reasoning (the EPC service no longer exposes those fields in a search) and the design choice (unsupported rather than silently degraded or expensive). This is exemplary usage guidance, leaving no ambiguity about whether or when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_epc_summariesARead-only
List EPC certificate summaries at a postcode — for candidate selection.
Returns one bounded page. Each entry contains only what the EPC search exposes: certificate_number, address, uprn (often absent), energy band, registration_date and schema_type. Energy score, floor area and property type are NOT available here — fetch a specific certificate for those.
Workflow when a Rightmove listing has no house number:
property_epc_summaries(postcode) to list candidates.
Narrow by address text and, where present, uprn.
epc_certificate(lmk_key=) for the chosen one, then cross-check its floor_area against the listing.
If several candidates remain equally plausible, present them all — do not guess. Selecting arbitrarily attaches another property's data.
complete is false when the postcode holds more records than this page
returns. Upstream page traversal is not snapshot-stable, so a multi-page
result is a bounded sample, not a guaranteed-complete set.
An empty results list means no certificates are lodged. If the EPC service
cannot be reached the tool raises an error instead — never treat an error as
evidence that a property has no certificate.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| postcode | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already present, the description adds important behavioral context beyond annotations: results are one bounded page, complete may be false when more records exist, page traversal is not snapshot-stable, an empty results list means no certificates, and an unreachable EPC service raises an error rather than returning empty. These are valuable edge-case disclosures that prevent misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence earns its place: purpose, field limitations, workflow, ambiguity handling, pagination caveat, and empty/error semantics. The most important facts are front-loaded, and the structured workflow makes the text easy to follow without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's role in a multi-step EPC lookup workflow and the existence of an output schema, the description is complete. It covers what the tool returns, what it deliberately omits, how to continue the workflow, how to handle ambiguity, and how to interpret empty versus error results. No critical operational context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden for parameter meaning. It clearly ties the postcode parameter to the lookup scope and explains page-related behavior via the 'bounded page' and 'complete is false' semantics. It does not explicitly state the page parameter's role or postcode format requirements, but the schema's default and the surrounding text make the main usage sufficiently clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List EPC certificate summaries at a postcode — for candidate selection.' It clearly distinguishes itself from certificate retrieval by saying 'Energy score, floor area and property type are NOT available here — fetch a specific certificate for those.' This makes it easy for an agent to tell it apart from siblings like prop_property_epc_certificate and prop_property_epc_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit numbered workflow for when a Rightmove listing has no house number, assigning this tool to step 1 and prop_epc_certificate to step 3. It also provides exclusion guidance: do not guess when several candidates remain, and do not treat an error as evidence of no certificate. This is clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_property_yieldARead-only
Gross rental yield for a UK postcode.
Combines Land Registry sale comps (median sale price) with Rightmove rental listings (median monthly rent) to produce a gross yield percentage.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of calendar months ending today; default 24. Results are limited to available coverage. | |
| postcode | Yes | UK postcode (e.g. "NG1 2NS"). | |
| search_level | No | PPD search granularity — "postcode", "sector" (default), or "district". | sector |
| auto_escalate | No | Compatibility parameter. Does NOT widen the search area on the live source (see `warnings`); previously postcode→ sector→district. Default True. Set False for strict-locality only. | |
| property_type | No | Filter sales by type. None (default) = residential set (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O" for one type, "ALL" for firehose. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful behavioral context by explaining the data sources and the median-based calculation. It does not contradict annotations and provides meaningful methodology detail beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two focused sentences that front-load the primary purpose and then explain the method. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich output schema, full parameter documentation, and readOnly annotation, the description covers the essential behavior. It could mention caveats such as data coverage limitations or that this is gross yield (not net of costs), but the existing context is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all five parameters. The description adds no parameter-specific semantics beyond stating the core median sale price/median rent calculation, which is already reflected in the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('Gross rental yield for a UK postcode') and a specific computation combining Land Registry sale comps and Rightmove rental listings to produce a gross yield percentage. This clearly distinguishes it from sibling property tools like prop_rental_analysis or prop_property_comps.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating what the tool computes, so an agent can infer it should be used when a gross yield percentage for a UK postcode is needed. However, it provides no explicit when-to-use guidance, exclusions, or alternatives relative to the many sibling property tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_rental_analysisBRead-only
Rental market analysis and achievable rent estimate.
auto_escalate widens the Rightmove search RADIUS when fewer than 5 listings are found (thin market). This is rental-radius escalation and is unaffected by the PPD geography containment: it does not change a postcode's outcode or sector, so it carries none of the limit-dependence that disabled PPD auto-widening. Response includes thin_market, escalated_from, escalated_to fields when escalation occurs.
| Name | Required | Description | Default |
|---|---|---|---|
| radius | No | ||
| postcode | Yes | ||
| auto_escalate | No | ||
| purchase_price | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explaining the thin-market radius escalation, its relationship to PPD geography containment, and the response fields surfaced when escalation occurs. This gives the agent useful behavioral understanding of a non-obvious edge case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-line purpose is front-loaded, and the auto_escalate paragraph is dense but directly relevant to correct invocation. The PPD geography containment wording is somewhat jargony, but it earns its place by clarifying a subtle difference from another tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the most intricate parameter behavior and notes relevant response fields, which is helpful given the annotations and output schema. Still, with zero schema-level parameter descriptions and an unexplained purchase_price field, an agent may not fully understand how purchase_price affects the rental estimate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful semantics for radius and auto_escalate, including the fewer-than-5-listings threshold and the effect on search radius. However, schema description coverage is 0%, and postcode and purchase_price are left unexplained, so the description only partially compensates for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Rental market analysis and achievable rent estimate,' which clearly identifies the tool's resource and intended output. It does not explicitly contrast with nearby siblings such as prop_property_yield or prop_rightmove_search, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over alternatives like prop_property_yield or prop_rightmove_search. The auto_escalate explanation is parameter behavior rather than tool-selection context, so the agent gets no explicit when-to-use or when-not-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_rightmove_listingARead-only
Full detail for a single Rightmove listing.
property_id is the numeric Rightmove property ID (the digits at the end of a rightmove.co.uk/properties/... URL), max 12 digits. Full URLs are not accepted. include_images fetches and embeds photos and floorplans as MCP image content. max_images caps the number of property photos (default 3); floorplans always included.
| Name | Required | Description | Default |
|---|---|---|---|
| max_images | No | ||
| property_id | Yes | ||
| include_images | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description adds useful behavioral detail beyond that: include_images fetches and embeds photos/floorplans as MCP content, max_images caps photos, and floorplans are always included. This meaningfully informs the agent of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each clause earns its place. The opening sentence establishes scope, then each subsequent sentence nails down an input format or an image behavior, with the critical constraint front-loaded. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input side is well covered, but there is no output schema and the description does not indicate what a 'full detail' response contains. An agent can likely interpret the result at runtime, but the definition would be more complete with at least a few expected fields or return-format hints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, yet the description fully explains all three parameters: property_id format and constraints, include_images image-embedding behavior, and max_images cap with floorplan inclusion. This is exactly the compensation needed when the schema carries no semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Full detail for a single Rightmove listing', clearly identifying a specific resource and retrieval intent. It implies a distinction from prop_rightmove_search, though it does not use a direct verb like 'retrieves'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational guidance: the property ID is numeric, max 12 digits, full URLs are rejected, and image behavior is controlled by include_images and max_images. It does not explicitly name 'prop_rightmove_search' as the alternative for listings, but 'single listing' makes the appropriate use case apparent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_rightmove_searchCRead-only
Fetch Rightmove listings for a postcode.
listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". Images are excluded from results.
| Name | Required | Description | Default |
|---|---|---|---|
| radius | No | ||
| sort_by | No | ||
| postcode | Yes | ||
| max_pages | No | ||
| max_price | No | ||
| listing_type | No | sale | |
| min_bedrooms | No | ||
| property_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds one behavioral detail: 'Images are excluded from results.' This is useful and consistent with the annotation, but no other behavioral traits (e.g., pagination, rate limits, default behavior) are disclosed. The bar is lower due to annotations, and the description adds some context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the main purpose. It wastes no words, but the inline parameter lists could be better structured. Overall, it is concise without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with zero schema description coverage, the description only touches on 2 parameters and lacks detail on behavior like pagination (max_pages), radius, and filtering. It also fails to clarify the relationship with the sibling prop_rightmove_listing. An output schema exists, but the description itself is still incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 values for listing_type and sort_by, but the other 6 parameters (radius, max_pages, max_price, min_bedrooms, property_type) are not elaborated. The partial coverage is insufficient for a tool with 8 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the main purpose with a specific verb ('Fetch'), a resource ('Rightmove listings'), and a scope ('for a postcode'). However, it does not differentiate from the sibling tool prop_rightmove_listing, which likely serves a similar or related purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives like prop_rightmove_listing. The description only lists parameter value options, not usage context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prop_stamp_dutyARead-only
UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| price | Yes | ||
| non_resident | No | ||
| first_time_buyer | No | ||
| additional_property | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds 'full breakdown' which hints at the output's detail level, but it does not disclose any edge cases, limitations, or specifics of the calculation beyond what the annotations provide. The description is not contradictory and offers minimal added behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence of nine words, with no wasted wording. It is front-loaded and efficiently communicates the tool's core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has four input parameters and a moderately complex calculation logic, but the description gives no context about the SDLT rules, thresholds, or how the boolean flags affect the result. Although an output schema exists, the description is too sparse to guide correct invocation without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no parameter-specific guidance. While the parameter names (price, non_resident, first_time_buyer, additional_property) are somewhat self-explanatory, the description does not explain units (e.g., GBP), how booleans interact, or the effect of each flag. This fails to compensate for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'UK Stamp Duty Land Tax (SDLT) calculation with full breakdown' clearly states the tool's verb ('calculation') and resource (UK Stamp Duty Land Tax). It distinguishes itself from sibling property tools by naming the specific tax calculation, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when a UK stamp duty calculation is needed, but it provides no explicit guidance on when to use this tool versus alternatives or when not to use it. No sibling tool is mentioned, and there is no exclusions or prerequisite context.
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.
74 tool updates
v0.2.1- First observed
dd_charity_profile - First observed
dd_charity_search - First observed
dd_company_charges - First observed
dd_company_filing_document - First observed
dd_company_filing_history - First observed
dd_company_officers - First observed
dd_company_profile - First observed
dd_company_psc - First observed
dd_company_search - First observed
dd_disqualified_profile - First observed
dd_disqualified_search - First observed
dd_fetch - First observed
dd_gazette_insolvency - First observed
dd_gazette_notice - First observed
dd_land_title_search - First observed
dd_officer_appointments - First observed
dd_sanctions_screen - First observed
dd_search - First observed
gov_govuk_get_content - First observed
gov_govuk_get_organisation - First observed
gov_govuk_get_section - First observed
gov_govuk_grep_content - First observed
gov_govuk_list_organisations - First observed
gov_govuk_lookup_postcode - First observed
gov_govuk_search - First observed
law_bills_get_bill - First observed
law_bills_search_bills - First observed
law_case_law_grep_judgment - First observed
law_case_law_search - First observed
law_citations_format_oscola - First observed
law_citations_network - First observed
law_citations_parse - First observed
law_citations_resolve - First observed
law_committees_get_committee - First observed
law_committees_search_committees - First observed
law_committees_search_evidence - First observed
law_get_prompt - First observed
law_hmrc_check_mtd_status - First observed
law_hmrc_get_vat_rate - First observed
law_hmrc_search_guidance - First observed
law_judgment_get_header - First observed
law_judgment_get_index - First observed
law_judgment_get_paragraph - First observed
law_legislation_get_section - First observed
law_legislation_get_toc - First observed
law_legislation_search - First observed
law_list_prompts - First observed
law_list_resources - First observed
law_parliament_find_member - First observed
law_parliament_get_debate_contributions - First observed
law_parliament_get_debate_divisions - First observed
law_parliament_lookup_by_column - First observed
law_parliament_member_debates - First observed
law_parliament_member_interests - First observed
law_parliament_policy_position_summary - First observed
law_parliament_search_hansard - First observed
law_parliament_search_petitions - First observed
law_read_resource - First observed
law_votes_get_division - First observed
law_votes_search_divisions - First observed
prop_company_search - First observed
prop_epc_certificate - First observed
prop_planning_search - First observed
prop_ppd_transactions - First observed
prop_property_blocks - First observed
prop_property_comps - First observed
prop_property_epc - First observed
prop_property_epc_search - First observed
prop_property_epc_summaries - First observed
prop_property_yield - First observed
prop_rental_analysis - First observed
prop_rightmove_listing - First observed
prop_rightmove_search - First observed
prop_stamp_duty
TDQS
Scored across 74 tools
Multiple tools overlap significantly within domains: prop_property_epc, prop_property_epc_summaries, prop_property_epc_search (deprecated but present) all handle EPC data, and gov_govuk_search vs gov_govuk_grep_content vs gov_govuk_get_section vs gov_govuk_get_content cover overlapping content retrieval. Several DD tools (dd_company_search vs prop_company_search, dd_search vs dd_fetch) duplicate functionality with unclear distinctions. The prefixes help, but within each cluster an agent will struggle to select the right tool.
Naming is inconsistent across modules: some use domain prefixes with snake_case verbs (gov_govuk_search, law_judgment_get_header), others use short opaque prefixes with no clear pattern (dd_search, prop_company_search), and one uses a different hierarchy (prop_property_epc vs prop_epc_certificate). The `law_` prefix mixes legal and DD tools inconsistently, and deprecated tools remain visible. No uniform verb_noun or consistent prefix convention.
74 tools is far beyond the well-scoped range, and the surface appears to bundle four independent domains (GOV.UK content, legal research, due diligence, property data) into one server. Many tools are near-duplicates (e.g., dd_company_search vs prop_company_search; prop_property_epc vs prop_property_epc_summaries), and the deprecated prop_property_epc_search should be removed. The count itself creates selection overhead that outweighs any benefit.
Each domain has notable gaps: GOV.UK lacks a tool to fetch full page content (only sections via govuk_get_section); property data has search and EPC tools but no explicit valuation or sale-date filtering beyond vague descriptions; law covers judgments/legislation/Hansard but lacks tools for court documents or lower-court records. The due-diligence domain is the most complete, but the overall surface has no cohesive workflow — it is four partial APIs stapled together. Deprecated tools and missing document retrieval (dd_company_filing_document requires a resource-capable client) create dead ends.
Maintenance
Related MCP Connectors
UK area & property intelligence for AI agents: reports, EPC, comparables, with source provenance.
US public-records intelligence for AI agents — companies, SEC, courts, spending, licenses.
CompanyLens is a remote MCP server giving AI agents instant access to official company registry data across 19 jurisdictions in Europe, the Americas, and Asia-Pacific. Eighteen read-only tools let you search companies and people, look up officers and beneficial owners, map corporate networks through shared directors, screen names against the UK disqualified directors register, find every company at a registered address, and pull filing history — all from a single connector. Visit our website: https://companylens.io
Search UK companies, land registry prices, charities, OS locations, and traffic data
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceProvides UK company lookups via Companies House, web scraping, and search tools designed to be context-efficient for AI agents. It includes integrated micro-payment monetization and supports data extraction and format conversion.-
- AlicenseNot gradedqualityAmaintenanceProvides real-time company verification and corporate intelligence by accessing global registries like UK Companies House, Singapore ACRA, and OpenCorporates. It enables AI agents to perform KYC tasks, retrieve company profiles, and conduct automated risk assessments for due diligence workflows.75 npmMIT
- AlicenseAqualityCmaintenanceConnects AI agents to AgentData's company intelligence platform, enabling natural language queries for structured company data like tech stacks, emails, people, and signals.66 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables looking up UK companies, officers, ownership, filings, and running due diligence checks via the Companies House API, usable from AI tools like Claude or Cursor.9 npm13MIT