UK Legal Research
Server Details
UK legal research — case law, legislation, Hansard, bills, votes, committees, HMRC, citations
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- paulieb89/uk-legal-mcp
- GitHub Stars
- 10
- Server Listing
- UK Legal Research MCP Server
Glama MCP Gateway
Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.
Full call logging
Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.
Tool access control
Enable or disable individual tools per connector, so you decide what your agents can and cannot do.
Managed credentials
Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.
Usage analytics
See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.
Tool Definition Quality
Average 4.6/5 across 35 of 35 tools scored. Lowest: 3.5/5.
Every tool has a clearly distinct purpose, with detailed descriptions that prevent ambiguity. Tools covering similar domains (e.g., multiple parliament search tools) are carefully differentiated by their search approach and input requirements.
All tools follow a consistent snake_case verb_noun pattern (e.g., bills_get_bill, case_law_search, citations_resolve). Even generic tools adhere to this style. No mixing of conventions.
With 35 tools, the count is on the higher side but appropriate for the wide-ranging domain of UK legal research. Each tool contributes to specific sub-domains (bills, case law, citations, committees, HMRC, legislation, parliament, votes) without unnecessary duplication.
The tool surface covers nearly all essential aspects of UK legal research: searching and retrieving bills, case law, and legislation; parsing and resolving citations; exploring committee evidence; accessing Hansard debates and member interests; and checking HMRC guidance and VAT rates. Gaps like full judgment text retrieval are mitigated by paragraph-level access and indexing.
Available Tools
35 toolsbills_get_billGet Bill DetailARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral context beyond annotations: it lists returned fields (sponsors, current stage, etc.), notes the summary character cap and truncation indicator, and explains adjustability of max_summary_chars. 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 well-structured with a clear 'USE THIS TOOL WHEN' lead, followed by a list of return fields, a note on parameter behavior, and post-call suggestions. Every sentence adds value; 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?
Given the presence of an output schema (as noted in context signals), the description does not need to detail return values. It covers the tool's purpose, usage context, parameter specifics, and follow-up actions. It is complete 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%, yet the description adds significant meaning: bill_id's origin is clarified, and max_summary_chars includes detailed guidance on default value (5000), adjustment for large bills, and how to check truncation. This provides context beyond the schema's properties.
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 a clear directive 'USE THIS TOOL WHEN you have a bill_id... and want the full detail.' It specifies the verb (get), resource (bill detail), and distinguishes from sibling tools by noting the source of the bill_id. The tool is properly named and scoped.
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 the tool ('when you have a bill_id from bills_search_bills and want the full detail') and provides post-call recommendations: use parliament_search_hansard for debates or bills_search_bills for adjacent bills. This gives clear guidance on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bills_search_billsSearch Parliamentary BillsARead-onlyIdempotentInspect
USE THIS TOOL WHEN searching UK parliamentary bills by keyword, session, house, or legislative stage.
Returns a paginated page of bill summaries (title, 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. Omit 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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds that it returns paginated bill summaries with fields like title, current stage, and whether it became an Act, plus it claims authority. 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 concise and well-structured. The first sentence front-loads the purpose. No unnecessary words; every sentence adds value. Ideal length for an agent to quickly grasp.
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 return format (paginated summaries), hints at the workflow (use bills_get_bill for details), and provides filter dimensions. With an output schema assumed present, this 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 coverage is 100% with detailed parameter descriptions. The tool description adds valuable usage tips: the session parameter nuance (numeric ID, not year string) and pagination via offset. This extra context aids correct invocation.
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 states 'USE THIS TOOL WHEN searching UK parliamentary bills by keyword, session, house, or legislative stage.' It clearly identifies the resource (bills) and action (search), and distinguishes from sibling tools like bills_get_bill.
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: when to search bills and suggests following up with bills_get_bill for full detail. It does not explicitly state exclusions, but the workflow guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_law_grep_judgmentSearch within a UK Court JudgmentARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that pattern is regex with fallback to literal substring, return format (list of {eId, snippet, match}), and that results are small snippets. Annotations already indicate read-only, idempotent, non-destructive; description adds valuable behavioral 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?
Front-loaded with 'USE THIS TOOL WHEN', brief yet comprehensive. Every sentence is purposeful, 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?
Covers return format, workflow (use with judgment_get_paragraph), search behavior, and parameter details. Output schema exists, but description independently explains 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 covers all parameters with descriptions (100% coverage). The description adds context about regex fallback for pattern and clarifies the purpose of eId in combination with other tools, but does not significantly expand on parameter meaning beyond 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 'USE THIS TOOL WHEN you have a judgment slug and want to find paragraphs whose text matches a pattern.' It distinguishes from siblings like judgment_get_index and judgment_get_paragraph.
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 tells when to use, provides alternatives, and gives examples like 'negligence', 'test for foreseeability'. It also explains the workflow of reading full paragraphs after searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
case_law_searchSearch UK Case LawARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. The description adds behavioral details: paginated summaries, date filter caveat (silently ignored), judge filter case-insensitivity, and coverage limitations. 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?
Front-loaded with purpose, then structured with returns, post-call steps, strategy, coverage, and authority. Every sentence adds value; no redundancy. Efficiently guides agent without excess.
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 8 parameters, output schema, and complex sibling ecosystem, the description is complete. Covers usage, post-call workflow, caveats, and authoritative source. No gaps identified.
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 good descriptions. The tool description enhances semantics by providing strategic usage context for parameters (e.g., narrowing with court+year, judge filter quirks, limit slicing). Adds value beyond 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 it searches UK case law and distinguishes from siblings like case_law_grep_judgment and citations_resolve. It specifies search dimensions (party names, court, judge, date, free-text) and emphasizes 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?
Explicitly says 'USE THIS TOOL WHEN searching UK case law' and provides detailed post-call guidance, narrowing strategies, and warnings against supplementing with web search. It also advises on filtering before iterating.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citations_format_oscolaFormat OSCOLA Citation StringARead-onlyIdempotentInspect
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 | ||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior. The description adds details about refusal conditions (confidence=0.0, missing resolved_url), the fact that it's authoritative with no network call, and its role as a guard against citation fabrication.
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 (about 120 words) and well-structured: usage instruction, behavior explanation, warnings. Every sentence adds 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 complexity (14 parameters, 5 citation types) and the presence of an output schema, the description covers all essential aspects: when to use, how it behaves, refusal conditions, and guardrails. No gaps.
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% (baseline 3). The description adds meaning by emphasizing that inputs must come from citations_resolve, explains the special handling of 'raw' for EU retained law, and clarifies the refusal logic for confidence and resolved_url. This exceeds the schema alone.
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 states the tool formats OSCOLA citation strings after using citations_resolve, distinguishing it from siblings like citations_resolve and citations_parse. The purpose is clear and 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 gives explicit use instructions: 'USE THIS TOOL AFTER citations_resolve', warns against constructing input manually, and specifies what to do when it refuses. Alternatives and context for when-not-to-use are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citations_networkGet Case Citation NetworkARead-onlyIdempotentInspect
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' |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description details behavior beyond annotations: fetches judgment XML from TNA, parses OSCOLA citations, returns grouped by type, deduplicated, and sorted. Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint false, and description adds context without 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?
Description is seven sentences, all providing essential information. Front-loaded with purpose, 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 single parameter, clear schema, and annotations, the description fully covers usage context, workflow (fetch, parse, group, sort), and the next step (citations_resolve). Output schema exists, so return values need not be detailed.
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?
Only one parameter case_uri, whose schema description already provides comprehensive guidance (slug format, source field, prefix exclusion). The tool description doesn't add significant meaning beyond what the schema offers, 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 clearly states the tool maps every citation in a judgment, including cases, legislation, SIs, and retained EU law. It specifies the verb 'map' and resource 'citations network', and distinguishes from siblings like 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 begins with 'USE THIS TOOL WHEN you have a judgment slug', clearly indicating when to use it. It also instructs to pass citations to citations_resolve after calling, providing a clear workflow. No explicit when-not conditions, but the context implies this is the first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citations_parseParse OSCOLA CitationsARead-onlyInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds that parsing is pure regex by default, and optional disambiguation uses MCP sampling (model in loop). It also states that citations resolve to TNA URLs when possible. This provides behavioral context beyond 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 clear 'USE THIS TOOL WHEN' opening, a list of citation types, an explanation of disambiguation, and a post-call advice. It is slightly verbose but every sentence is informative and 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 presence of an output schema, the description adequately covers the tool's scope, limitations (regex by default, optional disambiguation), and workflow integration with 'citations_resolve'. It references sibling tools and provides actionable 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%, but the description adds value by explaining the purpose of each parameter: 'text' is free text with supported citation types, and 'disambiguate' is a boolean for optional model-based resolution. This goes beyond the schema's minimal 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's purpose: extracting and classifying OSCOLA-style citations from free text. It lists specific citation types (neutral citations, law reports, etc.) and distinguishes itself from the sibling 'citations_resolve' by advising to use that for verification after parsing.
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 you have free text...' and provides a follow-up action ('pass each citation through citations_resolve'). It also explains when to opt into disambiguation. However, it does not explicitly mention when not to use the tool or compare with other siblings like 'citations_network'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
citations_resolveResolve Single OSCOLA CitationARead-onlyIdempotentInspect
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) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes live TNA HEAD check, confidence-0.0 behavior, transient error handling with ToolError and retryable flag. Adds context beyond annotations (readOnlyHint, idempotentHint). 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?
Well-structured with imperative first line, then details and warnings. Every sentence adds value, though slightly verbose. Front-loaded with key usage instruction.
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?
Complete for a tool with live checking and error handling. Covers success, failure, retry, ethical warnings. Output schema exists, so return values not needed in 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?
Only one parameter with 100% schema coverage. The example in description adds context but does not significantly expand beyond schema's description. 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 specifies the verb 'parses + resolves' and the resource 'a single citation', listing exact types (neutral citation, SI, legislation section, retained EU law). It distinguishes from siblings like citations_format_oscola (formatting) and citations_parse (parsing without 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?
Explicitly states when to use: 'BEFORE constructing an OSCOLA citation string' or 'to confirm a citation points at a real document'. Provides exclusions: 'Do NOT format or quote a confidence-0.0 citation'. Mentions alternatives: retry or proceed without TNA verification on transient errors. Warns against fabrication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
committees_get_committeeGet Committee DetailARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare safe read-only, open-world, idempotent behavior. The description adds behavioral detail about parallel fetching and the composite output (detail + member list), which is not captured by 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?
Two focused sentences plus a third for next steps. No filler, every sentence earns its place. Usage instruction is front-loaded as requested.
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 tool with one parameter, extensive annotations, and an output schema, the description covers purpose, usage, behavioral traits, and parameter origin completely.
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 already describes committee_id as integer. Description adds crucial context: committee_id comes from 'committees_search_committees results', linking tools and preventing misuse.
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 returns 'metadata + current membership' for a committee given its ID, using verbs 'Fetches committee detail and member list'. It distinguishes itself from sibling 'committees_search_evidence' by suggesting a follow-up action.
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 you have a committee_id', provides a clear use case, and tells the agent what to do after calling, implicitly excluding the sibling tool for evidence search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
committees_search_committeesSearch Parliamentary CommitteesARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, etc. The description adds return fields and parameter nuances (e.g., limit covers active committees, query filtered client-side), adding value without 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 very concise: one sentence for purpose, one for returns, one for next steps. Front-loaded with imperative, 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?
Given moderate complexity and existing output schema, the description covers essential information: what it does, what it returns, and how to chain to related tools. No gaps.
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 baseline is 3. The description adds context beyond the schema, like explaining default limit coverage and client-side filtering, enhancing understanding.
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 a clear imperative: 'USE THIS TOOL WHEN searching or listing UK parliamentary select committees by name, house, or active status.' It identifies the specific resource and verbs, and distinguishes from siblings by mentioning follow-up 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?
Explicitly states when to use ('USE THIS TOOL WHEN...') and provides guidance on next steps, but does not explicitly contrast with other search tools among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
committees_search_evidenceSearch Committee EvidenceARead-onlyIdempotentInspect
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). Free-text titles are capped per max_title_chars; witness lists are capped at 10 per item. 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. When evidence_type='both' the limit is split across oral and written (roughly half each). | |
| offset | No | Number of evidence items to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true. | |
| 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 |
| 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 there may be more evidence beyond this page. Re-call with offset=offset+returned to fetch the next page. Conservative: when evidence_type='both', True if either oral or written upstream page came back full. |
| 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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description's job is to add context. It does so by disclosing the one-page behavior, caps on titles and witness lists, and the authoritative source. 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?
The description is extremely concise, using three sentences to convey all necessary information. It front-loads the use-case with 'USE THIS TOOL WHEN' and then efficiently covers pagination, caps, and authority. Every sentence is purposeful.
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 presence of an output schema (indicated by context signals), the description doesn't need to explain return values. It covers pagination mechanics, caps, and the authoritative nature. For a search tool with clear parameters, this provides complete context for an agent to use 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%, providing descriptions for all 5 parameters. The description adds value by explaining the rationale behind the max_title_chars cap (prevents context blow-up) and confirming the pagination pattern. This goes beyond the schema, justifying 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 that the tool searches for oral and written evidence by committee_id. It distinguishes from sibling tools like committees_search_committees and committees_get_committee by specifying the evidence focus. The verb 'search' and resource 'evidence' are specific and 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 explicitly instructs to use the tool when you have a committee_id. It provides detailed pagination guidance, including how to handle multiple pages with offset and has_more. This is actionable and makes the tool's usage clear without confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_promptARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by specifying the return format (JSON with messages array) and the argument format (dict). It aligns with annotations and provides useful behavioral 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 concise, with three sentences that front-load the core purpose, then explain return type and arguments. No extraneous 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 read-only tool with annotations and output schema, the description adequately covers purpose, return type, and argument structure. Missing error handling or edge cases, but acceptable.
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 100% schema coverage, the description adds only minor clarification about argument format. It does not significantly enhance understanding 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 retrieves a prompt by name with optional arguments, distinguishing it from listing tools. However, the term 'prompt' is not defined, leaving some ambiguity about what exactly is being retrieved.
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 what the tool does but does not provide explicit guidance on when to use it versus alternatives like list_prompts, nor when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmrc_check_mtd_statusCheck MTD VAT StatusARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it connects to HMRC sandbox by default, requires environment variables, and raises error if unconfigured. Annotations already indicate readOnly, idempotent, and non-destructive, and description aligns perfectly.
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 composed of four concise sentences, each providing unique value: purpose/usage, return fields, environment setup, and error handling. It is front-loaded and 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?
Given the single parameter, detailed annotations, and existence of an output schema, the description covers purpose, usage, return values, and operational notes. It is complete for a straightforward check 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?
The single parameter 'vrn' has 100% schema coverage with detailed description (format, length, GB prefix handling). The description only mentions it as '9-digit VAT Registration Number' without adding new semantic 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 clearly states the verb 'Check' and the resource 'MTD VAT Status', specifying it checks Making Tax Digital mandate status for a business given a VRN. It is distinct from sibling tools like hmrc_get_vat_rate.
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 starts with 'USE THIS TOOL WHEN' and provides clear conditions (having a 9-digit VAT Registration Number). It also mentions sandbox vs production and credential requirements. However, it does not explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmrc_get_vat_rateGet VAT Rate for CommodityARead-onlyIdempotentInspect
USE THIS TOOL WHEN you have a UK commodity or service description and want its VAT rate category.
Returns the rate (standard 20%, reduced 5%, zero 0%, exempt), effective date, and any relevant conditions or exceptions.
IMPORTANT: Uses a static lookup table current as of 22 Nov 2023 (Autumn Statement). Rates may have changed in subsequent Budgets — for time-sensitive advice, verify against GOV.UK via 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 | Yes | VAT rate category |
| notes | No | Any additional notes or conditions on this rate |
| commodity_code | Yes | Commodity code or description queried |
| effective_from | Yes | Date from which this rate applies |
| rate_percentage | Yes | Applicable rate as percentage: 20.0 (standard), 5.0 (reduced), 0.0 (zero/exempt) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable context: it uses a static lookup table current as of 22 Nov 2023, and notes that rates may have changed, advising verification for time-sensitive cases. 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?
Description is concise and well-structured: a bold usage instruction, a clear list of return fields, and an important caveat about data freshness. Every sentence adds value 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?
Given the tool's simplicity (single parameter, output schema present, comprehensive annotations), the description is complete. It covers purpose, usage, return values, data source limitations, and provides an alternative for time-sensitive queries.
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 has one parameter 'commodity_code' with a detailed description and examples, achieving 100% schema description coverage. The tool description does not add additional meaning beyond what the schema already provides for this parameter, so 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's purpose: to get the VAT rate for a UK commodity or service description. It distinguishes itself from sibling tools like hmrc_search_guidance by specifying its scope and directing users to alternative tools for time-sensitive advice.
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 usage guidance: 'USE THIS TOOL WHEN you have a UK commodity or service description and want its VAT rate category.' It also clarifies when not to use it (for time-sensitive advice, use hmrc_search_guidance instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmrc_search_guidanceSearch HMRC GuidanceARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations by specifying the source (GOV.UK content API filtered to HMRC publications), noting the authoritative nature, and warning about out-of-date third-party information. Annotations already indicate readOnly, idempotent, non-destructive, but the description provides essential 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 extremely concise—four sentences with no fluff. The first sentence is directive and front-loaded with the core purpose. Every sentence adds value (usage guidance, return format, source, warnings).
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 parameters, no nested objects, output schema exists), the description covers all necessary context: what it searches, what it returns, its authoritative nature, and limitations. No gaps for the agent to infer.
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 clear parameter descriptions. The description compensates by providing example queries (e.g., 'VAT digital services') and explaining that `limit` is passed to GOV.UK search count param, adding context beyond the schema while maintaining conciseness.
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 specific verb ('searching') and resource ('GOV.UK for HMRC tax guidance'), lists example tax types (VAT, income tax), and distinguishes it from sibling search tools by specifying the domain (HMRC guidance) and source (GOV.UK API).
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', providing clear context. It also warns against using web search for this purpose, implying when not to use it (third-party sources). However, it does not explicitly name alternative tools for other search needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
judgment_get_headerGet Judgment HeaderARead-onlyIdempotentInspect
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 | ||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint. The description adds behavioral context beyond annotations by specifying the kind of metadata returned and its authoritative nature, without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with 'USE THIS TOOL WHEN', no redundant words. Every sentence provides essential information about purpose, usage, and workflow.
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 tool with one parameter, rich annotations, and an output schema, the description is complete. It covers when to use, prerequisites (slug from case_law_search), and relationship to sibling tools. No gaps.
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 provides a detailed description of the slug parameter with examples (100% coverage). The description adds value by explaining where to obtain the slug (from case_law_search), enhancing usage context 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?
Description clearly states it retrieves metadata (parties, judges, neutral citation, court, dates) given a judgment slug. It distinguishes from sibling tools like judgment_get_index and judgment_get_paragraph by specifying its 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?
Explicitly instructs when to use ('USE THIS TOOL WHEN you have a judgment slug and need metadata'), provides a clear workflow (call case_law_search first, then judgment_get_index, then judgment_get_paragraph), and notes it is the authoritative source for UK judgment metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
judgment_get_indexGet Judgment Paragraph IndexARead-onlyIdempotentInspect
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 | ||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint false. The description adds behavioral context: returns a navigation index with eId and preview line per paragraph. This is sufficient beyond annotations but lacks detail on pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (two sentences), front-loaded with 'USE THIS TOOL WHEN', and structured in logical steps. Every sentence provides essential guidance with 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?
Given the tool's low complexity (1 parameter, clear annotations, output schema present), the description sufficiently covers what the tool does, inputs, outputs, and usage workflow. No gaps identified.
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?
Only one parameter (slug) with 100% schema coverage and a clear schema description. The description does not add meaning beyond 'the slug is used to get the index', which is already implied. 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?
Description explicitly states the verb 'get' and resource 'judgment paragraph index', and specifies the output 'eId + preview line for every paragraph'. It clearly differentiates from siblings by mentioning judgment_get_paragraph and case_law_grep_judgment as subsequent steps.
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?
Provides explicit 'USE THIS TOOL WHEN' condition (having a judgment slug wanting navigation index), instructs to call case_law_search first, and describes what to do with the returned eIds (use judgment_get_paragraph or case_law_grep_judgment). This gives 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.
judgment_get_paragraphGet Judgment ParagraphARead-onlyIdempotentInspect
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 | ||
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already confirm safe read operation; description adds typical output token range (400–1700) and that it returns XML content. Could mention potential errors but 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?
Three concise sentences, front-loaded with usage guidance. Every sentence adds 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 output schema exists and annotations cover safety, description provides essential input context, prerequisites, alternatives, and typical output size. Complete for this 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 covers both parameters fully. Description adds practical context on obtaining eId from judgment_get_index, which helps users provide correct parameter values.
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?
Clearly states the tool retrieves a judgment paragraph given slug and eId. Differentiates from siblings by referencing judgment_get_index and case_law_grep_judgment.
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 specifies when to use (have slug + eId) and provides prerequisite (call judgment_get_index) and alternative (case_law_grep_judgment).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
legislation_get_sectionGet Legislation SectionARead-onlyIdempotentInspect
USE THIS TOOL WHEN you have a known Act / SI and want the parsed text of a specific section, with extent and in-force metadata.
Returns full section text, 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.
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 | Section number, e.g. '47' or '12A'. Use the numeric part only — not 'section-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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and non-destructive hints. Description adds details about content truncation (max_chars default and adjustment) and response fields to check (content_truncated).
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?
Description is concise (9 sentences), front-loaded with purpose, and every sentence adds value without 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 output schema exists, description need not detail return format; it covers usage, behavioral notes, and parameter specifics adequately. Warning about extent completes the 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?
Schema coverage is 100%, but description adds concrete usage details: for section parameter, 'Use the numeric part only' and schedules not supported; for max_chars, specific guidance about Finance Act sections and checking truncation.
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 retrieves parsed text of a legislation section with extent and in-force metadata, and differentiates from siblings like legislation_search and read_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?
Explicitly states when to use (known Act/SI, want parsed structured response), provides alternative (read_resource for raw XML), and includes a strong warning about checking extent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
legislation_get_tocGet Legislation Table of ContentsARead-onlyIdempotentInspect
USE THIS TOOL WHEN you have a known Act / SI and want the structural table of contents (parts, chapters, sections, schedules).
Returns structural elements with XML id and title, e.g. 'section-47: Definitions'. AFTER calling, pass the numeric section 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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it indicates the output contains structural elements with XML id and title, explains pagination behavior with has_more/total_items, and instructs to pass numeric section identifiers to legislation_get_section. 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 front-loaded with usage guidance, then explains output and pagination, followed by an alternative. It is structured and each sentence adds value, though slightly verbose but still concise enough.
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 appropriately covers usage context, pagination, and alternatives without needing to detail return values. It provides complete guidance for an agent to use the tool effectively.
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 has 100% description coverage. The description adds usage context for limit and offset (e.g., 'Raise only when you need a larger slice', 'Use with limit to page through very large statutes') and clarifies that type comes from search results, enhancing understanding 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 starts with 'USE THIS TOOL WHEN you have a known Act / SI and want the structural table of contents', providing a specific verb and resource. It distinguishes from sibling tools like legislation_get_section and read_resource by stating 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 explicitly states when to use this tool and provides an alternative (read_resource URI) for a different representation. It also explains pagination usage with offset/limit for large statutes, but lacks explicit 'when not to use' exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
legislation_searchSearch UK LegislationARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Both annotations and description are present. Annotations declare readOnlyHint, openWorldHint, idempotentHint, destructiveHint. Description adds: authoritative source (legislation.gov.uk), ranked results with next_steps hints, exact-match behavior for filters, and explanation of title vs full-text search. 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?
Well-structured with bold directive at start, clear separation of output, workflow, and filter discipline. Each sentence adds value, but slightly verbose; could be tightened slightly without losing 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 presence of an output schema (not shown), the description adequately covers return format (title, type, year, etc.) and next steps. No gaps for a search tool with good annotations and 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 description coverage is 100%. Description adds value beyond schema comments by explaining exact-match behavior for type and year, giving workflow advice (omit if unsure), examples for query, and differentiation between title and full-text search for fulltext parameter. Limit parameter explanation is relevant.
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 'USE THIS TOOL WHEN searching UK Acts and Statutory Instruments', clearly specifying the verb (search) and resource. Distinguishes from sibling tools like bills_search_bills and case_law_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?
Explicitly tells when to use this tool, provides chain workflow (legislation_get_toc then legislation_get_section), and gives detailed filter discipline: use type and year only when known, otherwise omit. Recommends querying by phrase for currency-driven searches and setting fulltext=True for broader concept queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_promptsARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. Description adds return format details (JSON with metadata), but no additional behavioral traits beyond what annotations 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?
Two sentences: first states purpose, second states output. No wasted words, efficiently 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?
With an output schema present, the description appropriately explains the return structure. No critical gaps for a simple list 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?
No parameters in schema (0 params), so baseline of 4 applies. Description does not need to add param info as none exist.
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 'List all available prompts' with a specific verb and resource. While it distinguishes from the sibling tool `get_prompt`, it does not explicitly contrast them.
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 versus alternatives like `get_prompt`. The context lacks when-not or context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_resourcesARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds value by detailing the return format (JSON with resource metadata) and explaining the difference between static resources and templates, which goes beyond 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 short sentences, each essential. It front-loads the main purpose and adds structural details about resource types without unnecessary 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?
Given the tool's simplicity (no parameters), the description provides sufficient context about the purpose and output format, especially with an output schema presumably covering return fields. The explanation of static vs template resources ensures completeness.
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 no parameters, so schema coverage is 100%. The description does not need to add parameter info; the baseline is 4 for zero parameters. No further clarification required.
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 lists all available resources and resource templates, distinguishing between static resources and templates with specific field details ('uri' vs 'uri_template'). This differentiates it from siblings like 'list_prompts' and 'read_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 implies usage for exploring available resources but does not explicitly state when to use this tool versus alternatives like 'read_resource'. No exclusion or when-not guidance is provided, relying on sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_find_memberFind Member of ParliamentARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds that it returns all matches, disambiguates common names, and returns specific fields (id, party, constituency, etc.). 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?
Concise, well-structured description with a clear action directive, bullet-like return info, and workflow context. Every sentence adds value 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?
Completely covers the tool's role in the workflow, return fields, disambiguation, and usage consequences. Given the output schema exists, the description provides sufficient context for an AI agent to use 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%, and the description provides examples ('Starmer', 'Baroness Hale') and constraints (maxLength, minLength) beyond the schema, adding practical 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 clearly states the tool's purpose: convert a member's name to an integer member_id. It specifies the return fields and disambiguation of common names, making it very distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use this tool before any ID-based filtering tools, listing specific tools and warning against skipping this step with a concrete example (Pannick case). Provides clear workflow guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_get_debate_contributionsGet Contributions In A DebateARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behaviors: it returns verbatim contributions, when member_id is omitted it returns all contributions (~100-200 items), and it warns against reconstructing quotes from training data if the wire returns empty. The annotations already declare readOnlyHint, idempotentHint, and non-destructive; the description adds useful behavioral context 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 three paragraphs plus a closing instruction. It is front-loaded with the primary usage directive. While it is somewhat lengthy, every sentence adds value—paraphrasing schema details, providing chains, and warning against hallucination. Minor redundancy could be trimmed, but overall 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?
Given that an output schema exists, the description appropriately omits return value details. It covers usage context, parameter relationships, behavior with and without member_id, and troubleshooting (empty results). The tool's complexity is low (2 params, no enums, simple return), and the description is fully self-contained within that scope.
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 with descriptions for both parameters. The description enhances these by explaining the practical significance of member_id (filtering by MemberId vs text) and debate_ext_id (chain from other tools). It adds meaning beyond the schema's mechanical 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 title 'Get Contributions In A Debate' and opening sentence clearly specify that the tool retrieves verbatim contributions given a debate_ext_id, optionally filtered by member. It distinguishes itself from sibling tools like parliament_member_debates and parliament_search_hansard by explaining the difference in filtering logic (by MemberId vs text).
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 the tool ('USE THIS TOOL WHEN you have a debate_ext_id'), explains the typical chain of tools (find_member → search/debate_ext_id → this tool), and contrasts with text-search tools that filter by vocabulary. It also advises on handling cases with no contributions, providing clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_get_debate_divisionsGet Divisions Held In A DebateARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds context about empty lists not being failures, explains the two ID spaces (Hansard and Votes API) and the cross-resolve mechanism with an extra HTTP call, which goes beyond 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 well-structured with clear sections (usage statement, notes on emptiness, two IDs, cross-resolve). Each sentence adds value without redundancy, and it is concise given the 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?
The description explains the two returned IDs and their purposes, handles edge cases (empty list), and mentions the extra HTTP call. It is complete for a tool that has an output schema, and no explanation of return values 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?
Only one parameter (debate_ext_id) with 100% schema description coverage. The description adds extra context beyond the schema by explaining where to chain the ID from (parliament_search_hansard, etc.), raising it above the baseline 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 starts with 'USE THIS TOOL WHEN you have a debate_ext_id and want the divisions (formal votes) held within it.' It clearly specifies the verb 'get divisions' and the resource 'debate', distinguishing it from siblings like votes_get_division and parliament_search_hansard.
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...'), notes that most debates contain no divisions and that an empty list is honest, and provides downstream instructions ('AFTER calling, pass votes_id as division_id into votes_get_division').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_lookup_by_columnResolve A Hansard Column CitationARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behaviors: resolution is not gated on publication state, interpretation of source codes, and common failure reasons. All align with annotations (readOnly, idempotent). 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?
Well-structured with example, bullet points, and clear sections. Slightly long but justified by the complexity; could trim minor redundancies.
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?
Fully explains output fields (contribution_count, source_code), failure modes, and post-resolution steps. Output schema exists but description provides practical context. Completeness is high.
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%, but description adds critical context: column_number as string to allow suffixes, volume_number as required and date not a substitute, house enum default behavior. Adds value beyond 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 resolves OSCOLA-style Hansard citations with a specific input example. It distinguishes from sibling tools like parliament_search_hansard by focusing on column resolution rather than 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?
Explicitly states 'USE THIS TOOL WHEN' followed by the citation format. Provides guidance on when to use complementary tools (read_resource, parliament_get_debate_contributions) and what empty matches mean, including instructions to surface failures.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_member_debatesGet Member DebatesARead-onlyIdempotentInspect
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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the tool as read-only, idempotent, non-destructive. The description adds important behavioral details: the text-body search is verbatim, contributions are filtered by the exact topic phrase, and each contribution's text is capped at 3000 characters. This goes beyond annotations but does not mention rate limits or authentication requirements.
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, with clear sections for usage, prerequisites, behavior, and alternatives. Every sentence adds value, and the critical information is presented upfront.
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 a detailed input schema, annotations, and an output schema, the description covers all necessary context: when to use, prerequisites, behavior, limitations, and alternatives. It is complete and leaves no ambiguity for an AI agent.
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?
All four parameters have detailed descriptions in the schema (100% coverage). The tool description adds extra context for the topic parameter (e.g., examples of what to search) and reiterates the prerequisite for member_id. This adds value beyond the schema alone.
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: retrieving contributions where a specific member used a particular topic phrase verbatim. It distinguishes itself from the sibling tool parliament_get_debate_contributions by specifying that this tool performs a text-body search, not a retrieval of all contributions in a debate.
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 tells when to use this tool (when you have a member_id and want verbatim text-body search) and what prerequisite action to take (call parliament_find_member first). It also provides a clear alternative (parliament_get_debate_contributions) for retrieving all contributions regardless of phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_member_interestsGet Member Financial InterestsARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, idempotentHint, openWorldHint), the description discloses pagination behavior, a hard cap of 20 per call, a default limit, and a max_description_chars cap. Also notes data authoritativeness and freshness differences vs web search. This adds significant value.
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 and front-loaded purpose. Slightly verbose due to all-caps emphasis and extra details, but each sentence contributes necessary guidance. Could be slightly tightened without losing clarity.
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 5 parameters, pagination complexity, and an existing output schema, the description covers prerequisite, usage, pagination, data source authoritativeness, and parameter behaviors. It is sufficiently complete for an AI 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%, but the description adds substantial meaning: explains member_id's origin, limit's hard cap, offset for pagination, common category enums, and when to raise max_description_chars. This goes well beyond the schema's minimal 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 retrieves registered financial interests for UK MPs and peers, with specific examples (donations, directorships, land, gifts). It distinguishes itself from sibling tools like parliament_find_member and parliament_get_debate_contributions by focusing on financial interests.
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 when a member_id is needed for financial interests and provides a prerequisite: call parliament_find_member first. Includes pagination instructions. Does not explicitly mention alternatives, but the context and 'USE THIS TOOL WHEN' provide clear direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_policy_position_summaryHansard Policy Position Summary (deterministic facets)ARead-onlyIdempotentInspect
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 |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds significant behavioral context: 'Pure counts — no LLM, no editorial labels', 'Sweeps /search/Debates.json with pagination', 'Hansard rate limit: 1000 req/5min', and details about max_debates_scanned. 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?
The description is well-structured with clear sections (USE THIS TOOL WHEN, aggregation description, after-calling guidance, limitations note). It front-loads the purpose in bold. While somewhat lengthy, every sentence adds value. Minor redundancy could be trimmed but overall effective.
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 presence of an output schema (mentioned in context signals), the description does not need to detail return values. It adequately covers the tool's purpose, usage, limitations, and relationship to sibling tools. It provides complete guidance for an AI agent to correctly select and invoke the 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%. The description adds meaningful context for parameters, especially 'topic' which explains matching semantics and why Bill titles work, and 'max_debates_scanned' which explains default behavior and rate limit implications. This goes beyond the schema's 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's purpose: 'Aggregates Hansard debate-level signals on a topic... Pure counts — no LLM, no editorial labels.' It distinguishes from sibling tools by specifying that it provides corpus-level breakdowns without reading every contribution, and contrasts with parliament_get_debate_contributions for drilling into specific debates.
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 the tool: 'USE THIS TOOL WHEN you want debate-level corpus signals on a topic — by_house, by_year, by_section breakdowns — without reading every contribution.' It also provides clear follow-up guidance: 'AFTER calling, pick a debate from top_debates and pass its debate_ext_id into parliament_get_debate_contributions.' Additionally, it explains what the tool does not provide (member-level facets) and directs to alternative tools for that information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_search_hansardSearch Hansard DebatesARead-onlyIdempotentInspect
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 | Counts by party across the returned 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. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, etc. The description adds significant behavioral context: pagination via limit+offset, query tokenization behavior, bill title matching caveat, text_mode details, and response metadata (total_corpus, has_more). 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?
Front-loaded with purpose, structured in clear paragraphs, no unnecessary words. Every sentence provides value. Concise given the 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?
Complete for a search tool with output schema: covers workflow (drill into full content via read_resource or parliament_get_debate_contributions), pagination, parameter intricacies, and sourcing. No gaps.
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%, but the description adds crucial meaning: explains query tokenization, bill title mismatches, member_id clarification (old member field issue), text_mode behavior, and offset pagination details. Significantly enriches 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: 'USE THIS TOOL WHEN searching Hansard by topic, bill title, or text phrase.' It specifies the verb (search) and resource (Hansard), and distinguishes it from siblings like parliament_find_member and 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 guidance on when to use (by topic/bill/text) and when not (member name), plus alternatives: chain parliament_find_member → parliament_get_debate_contributions for member search, or parliament_policy_position_summary for breadth. Also notes authoritative source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parliament_search_petitionsSearch UK Parliament PetitionsARead-onlyIdempotentInspect
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). |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable context: it returns specific fields (title, state, signature count, dates) and notes that results include government response or debate dates if applicable. 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 short paragraphs, each earning its place. The usage directive is front-loaded. No redundant or unnecessary sentences. 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?
Given the presence of output schema (mentioned) and annotations, the description covers all needed aspects: purpose, parameters, return fields, filtering, pagination hints (offset description explains re-call logic), and authoritative source. No gaps.
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 fully documents all parameters. The description adds minimal additional meaning (e.g., example search terms for query), but baseline 3 is appropriate since it doesn't introduce new semantic information 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?
Description starts with 'USE THIS TOOL WHEN searching UK Parliament petitions by keyword or topic,' clearly specifying the exact resource (UK Parliament petitions) and action (search). It distinguishes from sibling tools like bills_search_bills by focusing exclusively on petitions.
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 (searching petitions) and mentions filtering by state to narrow results. While it doesn't explicitly list when not to use it, the sibling context and clear scope make usage unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_resourceARead-onlyIdempotentInspect
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 |
Tool Definition Quality
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 valuable behavioral details: returns content as string, with base64 encoding for binary data. This 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 three concise sentences, front-loaded with the core purpose, and every sentence adds distinct value 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?
Given a single simple parameter and an output schema that presumably details return structure, the description is complete: it covers the two resource types and mentions encoding for binary content. No gaps remain for an agent to understand usage.
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 description for the 'uri' parameter is minimal ('The URI of the resource to read'), but the tool description adds crucial context: for static resources provide exact URI, for templated resources fill in parameters. This meaningfully enhances the schema information.
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' and elaborates on static vs templated resources, making the purpose unmistakable. It implicitly distinguishes from sibling tools that are specific to resource types (e.g., bills_get_bill).
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 to use based on having a URI and handling static vs templated resources, but does not provide guidance on when to use alternative sibling tools that are more specific, such as legislation_get_section or judgment_get_paragraph.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
votes_get_divisionGet Division DetailARead-onlyIdempotentInspect
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) |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and non-destructive behavior. The description adds important behavioral context: voter lists are truncated to 100 per side for response limits, but total counts remain accurate. This goes beyond annotations and provides practical knowledge for agent usage.
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 with two sentences: a clear usage directive and a behavioral note. Every sentence adds value, and the structure is front-loaded for immediate understanding. No unnecessary information is present.
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 core purpose, prerequisites, and a critical behavioral detail (truncation). With an output schema existing, return formatting is not needed. Some context about potential errors or edge cases is missing, but overall it is sufficiently complete for the tool's simplicity.
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 coverage is 100%, so both parameters (division_id and house) are fully described in the schema. The description only mentions the parameters without adding new semantic details. Per guidelines, baseline 3 is appropriate as the schema already carries the 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 explicitly states the tool's purpose: retrieving the full member-by-member voting record given a division_id and house. It distinguishes itself from sibling tools by directing chaining from votes_search_divisions or parliament_get_debate_divisions, making the purpose clear and 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 provides clear usage instructions: 'USE THIS TOOL WHEN you have a division_id + house'. It also suggests chaining from specific tools to obtain the needed division_id. However, it does not explicitly state when not to use the tool or offer alternative tools for similar tasks, slightly reducing clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
votes_search_divisionsSearch Parliamentary DivisionsARead-onlyIdempotentInspect
USE THIS TOOL WHEN searching Commons or Lords formal votes by topic, date, or member.
Returns division summaries (title, date, vote counts, pass/fail). 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 (Commons API max-per-page). | |
| 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 |
| query | No | The search term, if any (None = browse recent) |
| total | Yes | Number of divisions returned in this call |
| offset | No | Skip applied to this page |
| has_more | No | True if a full page was returned (more may exist) |
| divisions | No | Matching divisions. Use the integer `id` field with votes_get_division to fetch the full voter list. |
Tool Definition Quality
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds that it returns division summaries (title, date, vote counts, pass/fail) and states it's the authoritative source. No behavioral 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?
Description is 4 sentences, front-loaded with the usage instruction, no filler. Each sentence adds value: purpose, return type, workflow hint, and authority claim.
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 7 optional parameters, full schema coverage, and availability of output schema, the description effectively communicates the tool's role and how it fits into a search-and-detail workflow. It mentions return fields and source authority, making it 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 detailed descriptions for all 7 parameters. The tool description does not add parameter-level semantics beyond what the schema already provides, 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 explicitly states the tool's purpose: searching Commons or Lords formal votes by topic, date, or member. It uses a clear verb (search) and resource (parliamentary divisions), and distinguishes from sibling tool votes_get_division by outlining 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 starts with 'USE THIS TOOL WHEN' specifying the exact scenario. It also provides clear guidance on the follow-up tool (votes_get_division) for full details, effectively differentiating use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [{ "email": "your-email@example.com" }]
}The email address must match the email associated with your Glama account. Once published, Glama will automatically detect and verify the file within a few minutes.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Your Connectors
Sign in to create a connector for this server.