Skip to main content
Glama
paulieb89

UK Legal Research MCP Server

by paulieb89

uk-legal-mcp

PyPI SafeSkill Glama Install in VS Code Install in VS Code Insiders Install in Cursor

UK legal research sources for your AI assistant.

uk-legal-mcp connects ChatGPT, Claude, VS Code, Cursor, and other MCP-aware clients to UK case law, legislation, Hansard, bills, votes, committees, OSCOLA citation parsing, and HMRC guidance. It returns primary source text and citation metadata so your agent can build evidence packs you can check and footnote.

No API keys are required for the legal sources. HMRC's authenticated Making Tax Digital endpoint is optional.

For best results, tell your assistant to use the uk-legal-mcp server and not to answer from memory when a UK legal source can be checked.


Quick Start

Use the hosted MCP endpoint:

https://uk-legal-mcp.fly.dev/mcp

For clients that use mcpServers JSON:

{
  "mcpServers": {
    "uk-legal": {
      "type": "http",
      "url": "https://uk-legal-mcp.fly.dev/mcp"
    }
  }
}

For local stdio use:

uvx uk-legal-mcp

Claude Desktop local config:

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

If a hosted tool stops responding, refresh the server from your client's Apps / Customise menu. For very large Acts, local mode can be more reliable because it uses your own IP rather than a shared cloud IP.


Related MCP server: legal-mcp

Try This First

After connecting the server, start a fresh chat and ask:

I am checking a UK legal source. Only use uk-legal-mcp. Find the source, give me the source URL, and tell me what metadata I should check before relying on it.

For legal work, ask for an evidence pack rather than a bare answer:

Only use uk-legal-mcp. Give me the source text or source summary, the source URL, citation metadata, and any caveats about jurisdiction, version, or uncertainty.

See the lawyer guide for ready-to-run prompts.


What It Covers

Source area

What your assistant can check

Case law

UK judgments from TNA Find Case Law, including neutral citations, court, date, judgment metadata, paragraph reads, and in-judgment search.

Legislation

Acts and Statutory Instruments from legislation.gov.uk, including tables of contents, sections, territorial extent, in-force signals, and point-in-time reads.

Parliament

Hansard debates and contributions, debate-to-division chains, member biographies, column references, and petitions.

Bills

Parliamentary Bills, stages, sponsors, publications, and bill history.

Votes

Commons and Lords divisions, counts, results, and per-member voting records.

Committees

Select committees, memberships, oral evidence, and written evidence.

Citations

OSCOLA-style citation parsing and resolution to canonical sources.

HMRC

VAT rate lookups, GOV.UK HMRC guidance search, and optional authenticated MTD VAT status checks.

The server also exposes judgment://, legislation://, and hansard:// resources for source text that is too large to return in a single search result.

Full details are in the tool reference and upstream API reference.


Examples

Legislation check: the assistant finds the Worker Protection Act duty, commencement position, territorial extent, and source links.

ChatGPT answer using uk-legal-mcp to summarise the Worker Protection Act duty, commencement, territorial extent, and source links

Parliamentary evidence: the assistant follows a House of Lords debate into a division result for an Automated Vehicles Bill amendment.

ChatGPT answer using uk-legal-mcp to connect an Automated Vehicles Bill Hansard debate to the division result for Lord Liddle's Amendment 28

More examples are in the lawyer guide.


Using It Safely

uk-legal-mcp helps your AI assistant find and quote UK legal sources. It does not replace legal judgement.

  • Check jurisdiction. Legislation can apply differently in England, Wales, Scotland, and Northern Ireland. When reading a section, check the extent field before relying on it.

  • Check whether a provision is current. Some sections may be repealed, amended, prospective, or not yet in force. The server returns in-force and version-date information where the source provides it.

  • Verify citations before relying on them. Ask the agent to resolve case citations and Hansard volume/column references against the primary source.

  • Separate exact matches from nearby candidates. Case names and party names can be similar. A good answer should say which source was verified and which candidates were merely related.

  • Treat the result as an evidence pack. The server returns primary source text and citation metadata. Your agent can summarise it, but you decide how the law applies.


For Developers

Run the streamable HTTP server locally:

python -m src.gateway

Run the declarative FastMCP manifest for inspection/dev tooling:

fastmcp run
fastmcp inspect

fastmcp run is for inspection/dev only — it wraps the FastMCP runner directly and skips the production uvicorn shape (_HttpGuard, _AcceptNormalizer, proxy_headers) that python -m src.gateway wires for the Fly deployment. The _HttpGuard GET-SSE shim is required by claude.ai's web connector, so use python -m src.gateway for anything prod-like.

Use a local checkout over stdio:

{
  "mcpServers": {
    "local-uk-legal": {
      "command": "uv",
      "args": ["run", "--project", "<abs-path>", "uk-legal-mcp"],
      "env": { "VIRTUAL_ENV": "" }
    }
  }
}

Release notes live in CHANGELOG.md.

Available Tools

35 tools
bills_get_billGet Bill DetailA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bill_idYesBill ID from bills_search_bills results.
max_summary_charsNoMaximum 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

ParametersJSON Schema
NameRequiredDescription
idYesBill ID
short_titleYesShort title of the bill
long_titleNoFull long title
summaryNoBill summary text, possibly truncated per max_summary_chars. Check summary_truncated and summary_original_length for full-text info.
summary_truncatedNoTrue if summary was cut to fit max_summary_chars
summary_original_lengthNoOriginal summary length in characters before any truncation
current_houseNoHouse where the bill currently sits
originating_houseNoHouse where the bill was introduced
current_stageNoCurrent legislative stage
sponsorsNoBill sponsors
stagesNoLegislative stages the bill has passed through
is_actNoWhether the bill has received Royal Assent
royal_assent_dateNoDate Royal Assent was given
urlYesParliament URL for this bill

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint, idempotentHint, and destructiveHint false. The description adds behavioral details beyond annotations: the summary truncation behavior (capped per max_summary_chars with a truncation flag) and conditional inclusion of Royal Assent date. 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.

Conciseness5/5

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

The description is concise with three sentences, each serving a distinct purpose: usage condition, return fields with caveat, and follow-up actions. No superfluous information.

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

Completeness5/5

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

Given the tool has only 2 parameters and an output schema, the description covers all necessary aspects: purpose, exact usage condition, parameter behavior, return fields, and recommended follow-up steps. It is complete for an agent to correctly invoke and interpret results.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds value: for max_summary_chars, it explains the default, token equivalence, when to increase (for substantive bills), and the truncation check. For bill_id, it reiterates the source. This goes beyond the schema's own descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: to get full bill detail given a bill_id. It specifies the exact return fields (sponsors, stage, title, summary, assent date) and distinguishes itself from the sibling tool 'bills_search_bills' by noting that the bill_id comes from that search tool.

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

Usage Guidelines4/5

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

The description explicitly says 'USE THIS TOOL WHEN you have a bill_id (from bills_search_bills) and want the full detail.' It also provides post-call guidance on using parliament_search_hansard or bills_search_bills for related queries. While it doesn't explicitly state when not to use it, the prerequisite condition is clear.

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 BillsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch term for bill titles and descriptions, e.g. 'online safety' or 'financial services'.
sessionNoNumeric 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.
houseNoFilter by originating house. Omit for all houses.
stageNoFilter by current legislative stage.
offsetNoNumber 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.
limitNoMaximum bills to return in this call. Default 20 keeps responses focused; raise up to 100 for bulk exports.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesThe search term that was used
offsetYesNumber of results skipped before this page
limitYesMaximum results requested in this call
returnedYesNumber of results actually on this page
totalNoTotal results matching the query across all pages, if the upstream API reported it. None if unknown.
has_moreYesTrue if more results exist beyond this page. Re-call with offset=offset+returned to fetch the next page.
billsNoMatching bills. Use the integer `id` field from any bill to call bills_get_bill for full detail.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds that it returns a paginated page of bill summaries with fields (title, current stage, whether Act). Explains pagination pattern implicitly through offset/limit hints. 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.

Conciseness5/5

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

Four sentences, front-loaded with usage instruction, no redundant information. Every sentence earns its place: use case, return format, next step, authority statement.

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

Completeness5/5

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

Covers search capability, pagination, linking to sibling tool, and notes authoritative source. Output schema exists, so return values are covered. Complete for a search tool with 6 parameters.

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

Parameters4/5

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

Schema description coverage is 100%, baseline 3. Description adds extra context for session (explains numeric ID vs year), offset (pagination re-call pattern), and limit (default and max). This goes beyond schema descriptions, providing actionable guidance.

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

Purpose5/5

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

Description starts with explicit 'USE THIS TOOL WHEN searching UK parliamentary bills by keyword, session, house, or legislative stage', clearly stating the verb and resource. It differentiates from sibling 'bills_get_bill' by indicating this returns summaries, and after calling, pass bill_id to get full detail.

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

Usage Guidelines5/5

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

States exact use case upfront and instructs to use 'bills_get_bill' for full detail. Provides guidance on session parameter (numeric ID, not year) with fallback if only year known. No ambiguity.

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 JudgmentA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesTNA judgment slug, e.g. 'uksc/2024/12' or 'ewca/civ/2023/450'.
patternYesRegex pattern (or plain substring) to search within paragraph text. If the pattern doesn't compile as regex, falls back to literal substring match.
case_insensitiveNoDefault true. Set false for case-sensitive matching.
max_hitsNoCap on number of hits returned.

Output Schema

ParametersJSON Schema
NameRequiredDescription
slugYesThe judgment slug that was searched
patternYesThe pattern that was searched for
hitsYesMatching paragraphs in document order
truncatedYesTrue if hit count reached max_hits and more matches may exist

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and description adds return format (list of {eId, snippet, match}), regex fallback to literal substring, and cap on max_hits.

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

Conciseness5/5

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

Description is front-loaded with 'USE THIS TOOL WHEN', followed by concise bullets. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the complexity (search within judgment with regex), the description covers input, output, and post-call procedure. Output schema exists, and description explains return value structure.

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

Parameters3/5

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

Schema coverage is 100%, so baseline 3. Description repeats fallback behavior for pattern and default for case_insensitive, but does not add significant new meaning beyond schema.

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

Purpose5/5

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

Title and description clearly state 'Search within a UK Court Judgment' with specific verb and resource. Distinguishes from sibling judgment_get_index which is for paragraph-number navigation.

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

Usage Guidelines5/5

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

Explicitly says 'USE THIS TOOL WHEN you have a judgment slug and want to find paragraphs whose text matches a pattern.' Also provides when-not-to-use alternatives like judgment_get_index for paragraph navigation.

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 StringA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
citation_typeYes'type' field from citations_resolve result.
confidenceYes'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_urlNo'resolved_url' from citations_resolve. Must be non-null for neutral citations.
yearNo'year' from citations_resolve.
courtNo'court' from citations_resolve, e.g. 'UKSC', 'EWCA CIV', 'EWHC (KB)'.
numberNo'number' from citations_resolve (judgment number within the year).
report_seriesNo'report_series' from citations_resolve, e.g. 'WLR', 'AC', 'QB'.
volumeNo'volume' from citations_resolve (law report volume, if any).
pageNo'page' from citations_resolve (starting page in the law report).
legislation_titleNo'legislation_title' from citations_resolve, e.g. 'Companies Act 2006'.
sectionNo'section' from citations_resolve, e.g. '47', '12', '20A'.
si_yearNo'si_year' from citations_resolve.
si_numberNo'si_number' from citations_resolve.
rawNo'raw' from citations_resolve. Used as-is for EU retained law — the original text preserves the Regulation/Directive distinction.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds value by stating it formats per OSCOLA 4th edition, is authoritative for UK legal citations, and makes no network call. It also describes refusal behavior for low confidence or missing resolved_url.

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

Conciseness4/5

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

The description is a single paragraph that is front-loaded with the main purpose and includes key instructions, but it could be slightly more structured. However, it is reasonably concise and every sentence adds value.

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

Completeness5/5

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

Given the complexity of the tool (14 parameters, multiple citation types), the description and schema together provide comprehensive guidance: usage, failure modes, and constraints. An output schema exists, and the description explains return behavior via status, making it complete.

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

Parameters4/5

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

With 100% schema coverage, each parameter is described as coming from citations_resolve, which is reinforced in the description. The description adds the crucial guidance that fields must not be guessed, providing context beyond the schema.

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

Purpose5/5

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

The description clearly states the tool formats an OSCOLA citation string after citations_resolve, specifying the verb 'Format' and resource 'OSCOLA Citation String', and it implicitly distinguishes from siblings by being the only formatting tool.

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

Usage Guidelines5/5

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

The description explicitly says to use the tool after citations_resolve, instructs not to construct input fields but to pass from resolve, and details failure cases with guidance to surface errors, providing clear when-to-use and when-not-to-use.

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 NetworkA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
case_uriYesTNA 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

ParametersJSON Schema
NameRequiredDescription
case_uriYesThe judgment URI that was fetched and parsed
neutral_citationsNoNeutral citations referenced, e.g. '[2020] UKSC 14'
legislation_refsNoLegislation section references, e.g. 's.47 Companies Act 2006'
si_refsNoStatutory Instrument references, e.g. 'SI 2018/1234'
eu_refsNoRetained EU law references, e.g. 'Regulation (EU) 2016/679'
law_report_refsNoLaw report citations, e.g. '[2020] 1 WLR 100'
total_citationsYesSum of all de-duplicated citations across every bucket

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and idempotentHint=true, and the description adds context: it fetches judgment XML from TNA, parses OSCOLA citations, and returns results grouped, deduplicated, and sorted. This goes beyond annotations and provides full behavioral transparency.

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

Conciseness5/5

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

The description is well-structured with a clear call-to-action at the start, followed by technical details and usage guidance. Every sentence adds value, and there is no redundancy.

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

Completeness5/5

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

Given that an output schema exists (context signal: 'Has output schema: true'), the description does not need to detail return values. It covers all necessary aspects: what, when, how, and follow-up steps. The tool is simple (one param) and the description is complete.

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

Parameters5/5

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

The single parameter 'case_uri' has a detailed description in the schema (100% coverage) that goes beyond basic type: it provides format examples, source advice ('use the 'uri' field from case_law_search results'), and what to exclude. This adds significant meaning.

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

Purpose5/5

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

The description clearly states the tool's purpose: mapping all citations (cases, legislation, SIs, retained EU law) from a judgment slug. It uses specific verbs like 'map' and 'fetch', and the title reinforces this. The description also distinguishes it from sibling tools 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.

Usage Guidelines5/5

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

The description explicitly says when to use this tool ('when you have a judgment slug and want to map every citation it makes') and provides post-call guidance ('AFTER calling, pass any individual citation through citations_resolve'). This clarifies usage order and alternatives.

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

citations_parseParse OSCOLA CitationsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesFree 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.
disambiguateNoDefault 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

ParametersJSON Schema
NameRequiredDescription
citationsYesAll successfully parsed citations (confidence >= 0.7)
ambiguousYesCitations with confidence < 0.7; may have been partially disambiguated via sampling
text_lengthYesCharacter length of the input text
parse_duration_msYesTime taken to parse, in milliseconds

TDQS

A4.6/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true and destructiveHint=false, which the description matches. It adds behavioral context: default pure-regex parsing, optional LLM-based disambiguation via MCP sampling, and URL resolution without existence confirmation. This 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.

Conciseness4/5

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

The description is well-organized with clear sections and bullet points. It is slightly verbose but every sentence adds value. The structure aids readability and comprehension.

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

Completeness5/5

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

Given the tool's complexity (multiple citation types, optional disambiguation, output schema exists), the description is complete. It covers usage, behavior, parameter details, and post-processing steps, leaving no major gaps.

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

Parameters4/5

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

Schema coverage is 100%, and the description adds meaningful detail beyond the schema. For 'text', it elaborates on supported citation formats; for 'disambiguate', it explains the trade-off and when to enable it. This provides practical guidance.

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

Purpose5/5

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

The description clearly states it extracts and classifies OSCOLA-style citations from free text. It lists specific citation types and distinguishes from sibling tools like citations_resolve (verification) and citations_format_oscola (formatting).

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

Usage Guidelines5/5

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

Explicitly says 'USE THIS TOOL WHEN' and gives clear use cases. It also advises 'AFTER calling, pass each citation through citations_resolve to verify', providing a clear workflow and excluding misuse. It explains when to use the optional disambiguation parameter.

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 CitationA
Read-onlyIdempotent
Inspect

USE THIS TOOL BEFORE constructing an OSCOLA citation string from known fields, OR when you have a citation and want to confirm it points at a real document.

Parses + resolves a single citation (neutral citation, SI, legislation section, retained EU law) and returns the parsed fields plus a resolved_url. Raises ValueError if nothing recognisable is found.

For neutral citations, performs a live HTTP HEAD check against TNA Find Case Law to confirm the judgment exists. If TNA returns non-200, confidence is set to 0.0 — the citation parsed successfully but the document does not exist at the constructed URL. DO NOT format or quote a citation with confidence 0.0 as verified; surface the failure and ask the user for the source URL or better identifying details.

Formatting a citation from "known" fields (year, court, number) without prior resolution is the most common citation-fabrication route — the formatter accepts whatever you give it and produces plausible-looking output for invented inputs. 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 or better identifying details.

Authoritative source for UK legal-citation resolution.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationYesA single OSCOLA citation to parse and resolve. E.g. '[2024] UKSC 12', 'SI 2018/1234', 's.47 Companies Act 2006'

Output Schema

ParametersJSON Schema
NameRequiredDescription
rawYesOriginal citation text as found in the source
typeYesClassification of the citation type
yearNoYear component of the citation
courtNoCourt 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)
numberNoJudgment number within the year
report_seriesNoLaw report series abbreviation: WLR, AC, QB, KB, Ch, All ER, EWCA Civ, etc.
volumeNoReport volume number (for law reports)
pageNoStarting page in the law report
legislation_titleNoTitle of legislation (for s.NN Act YYYY citations)
sectionNoSection number referenced
si_yearNoSI year (for SI YYYY/NNN citations)
si_numberNoSI number
resolved_urlNoTNA Find Case Law or legislation.gov.uk URL if successfully resolved
confidenceYesParse confidence 0.0–1.0. Citations below 0.7 are ambiguous and may have been sent for LLM disambiguation.

TDQS

A4.6/5.0
Behavior5/5

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

The description discloses the live HTTP HEAD check for neutral citations, confidence=0.0 handling, ValueError on unrecognizable input, and the fabrication warning. These details go beyond annotations (readOnlyHint, idempotentHint) and provide 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.

Conciseness4/5

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

The description is front-loaded with the key usage instruction and structured in paragraphs that each add value. It is longer than minimal but every sentence earns its place; minor tightening possible.

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

Completeness5/5

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

Given the tool's complexity (external resolution, error states, confidence handling) and presence of an output schema, the description covers all necessary behavioral aspects for correct agent usage, including failure handling and warnings against misuse.

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

Parameters4/5

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

The single parameter 'citation' has schema coverage 100%, but the description adds context on accepted formats (neutral citation, SI, legislation section) with examples, increasing semantic value beyond the schema description.

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

Purpose5/5

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

The description explicitly states the tool resolves OSCOLA citations to verify existence, and distinguishes from sibling 'citations_format_oscola' by warning against using the formatter without resolution. The verb 'resolve' and resource 'OSCOLA citation' are clear.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use (before formatting or to confirm document existence) and when-not-to-use (do not manufacture citations on failure). It implies alternatives (the formatter) but does not explicitly name them as alternatives outside the warning.

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 DetailA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
committee_idYesCommittee ID from committees_search_committees results.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesCommittee ID
nameYesCommittee name
houseNoCommons, Lords, or Joint
phoneNoContact phone number
emailNoContact email
urlNoParliament URL for this committee
membersNoCurrent committee members

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false, so the description's addition of parallel fetching adds value beyond annotations 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.

Conciseness5/5

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

The description is two sentences, front-loaded with usage condition, and every word is purposeful with no redundancy.

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

Completeness5/5

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

For a simple one-parameter tool with an output schema, the description covers the essential behavior and follow-up action, making it complete.

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

Parameters3/5

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

Schema description coverage is 100% and the parameter is well-described in the schema. The description does not add new semantics beyond what the schema already provides, so base score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool fetches committee detail and member list in parallel, using the verb 'Fetches' and specifying the resource as 'metadata + current membership'. It distinguishes from siblings by noting that evidence is handled by committees_search_evidence.

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

Usage Guidelines5/5

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

The description explicitly states 'USE THIS TOOL WHEN you have a committee_id and want the metadata + current membership' and advises to use committees_search_evidence for evidence, providing clear context and alternatives.

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 CommitteesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch term for committee names, e.g. 'defence' or 'treasury'. Filtered client-side against committee names. Omit to list all committees.
houseNoFilter by house.
active_onlyNoIf true, only return currently active committees.
limitNoMaximum committees to return. Default 100 comfortably covers all currently-active UK select committees. Raise only for historical sweeps.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNoName substring filter applied, or None
houseNoHouse filter applied, or None
active_onlyYesWhether results were restricted to currently active committees
totalYesNumber of committees returned in this call
committeesNoMatching committees. Use committees_get_committee for membership detail.

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds that it returns committee summaries (name, house, active status, ID) and hints at further usage, but this adds minimal new behavioral context beyond the annotations.

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

Conciseness5/5

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

The description is two focused sentences plus a follow-up line, all front-loaded with the core usage instruction. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the presence of an output schema, the description does not need to explain return values. It covers purpose, usage, and next steps sufficiently for a search/list tool with 4 optional parameters.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description briefly mentions filters (name, house, active status) but does not add meaningful detail beyond what is already in the schema descriptions.

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

Purpose5/5

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

The description explicitly states 'USE THIS TOOL WHEN searching or listing UK parliamentary select committees' with specific filters (name, house, active status). It clearly distinguishes from siblings by mentioning the next steps of passing committee_id to committees_get_committee or committees_search_evidence.

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

Usage Guidelines4/5

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

The description provides explicit guidance on when to use the tool and what to do after (pass committee_id to related tools). However, it does not explicitly state when NOT to use this tool or list alternative tools, though siblings are provided separately.

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 EvidenceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
committee_idYesCommittee ID from committees_search_committees results.
evidence_typeNoType of evidence to search.both
offsetNoNumber of evidence items to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true.
limitNoMaximum evidence items to return. Default 20. When evidence_type='both' the limit is split across oral and written (roughly half each).
max_title_charsNoPer-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

ParametersJSON Schema
NameRequiredDescription
committee_idYesCommittee ID this page belongs to
evidence_typeYesEvidence type filter applied to this query
offsetYesNumber of evidence items skipped before this page
limitYesMax evidence items requested for this page
returnedYesNumber of evidence items actually returned in this call
has_moreYesTrue 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.
evidenceNoEvidence items in this page. Titles are capped per max_title_chars; witness lists are capped at 10 per item.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the agent knows it is safe. The description adds valuable behavioral context beyond annotations: it explains pagination (returns one page, default 20, has_more), caps on free-text titles (max_title_chars) and witness lists (10 per item). 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.

Conciseness5/5

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

The description is concise with three sentences, no fluff. It is front-loaded with 'USE THIS TOOL WHEN' for immediate usability. Every sentence adds value: usage condition, behavioral details, and authority statement.

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

Completeness5/5

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

Given the tool's complexity (pagination, multiple evidence types, caps), the description covers key aspects: what it returns, pagination loop, and caps. The output schema exists (not shown but indicated), so return structure is documented elsewhere. The 'Authoritative source' statement adds useful context. The description is complete enough 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.

Parameters4/5

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

Schema description coverage is 100%, with each parameter already having a description. The tool description adds additional context, such as explaining offset usage for pagination and the effect of max_title_chars on title length. This complements the schema well, providing deeper meaning for parameters involved in pagination and output control.

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

Purpose5/5

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

The description starts with 'USE THIS TOOL WHEN you have a committee_id and want the oral and written evidence submitted to it,' clearly specifying the verb (search/return) and resource (committee evidence). It distinguishes itself from sibling tools like committees_search_committees (lists committees) and committees_get_committee (details a single committee), so the purpose is 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.

Usage Guidelines4/5

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 committee_id and want the oral and written evidence'). It also provides pagination guidance ('re-call with offset=offset+returned while has_more is true'). However, it does not explicitly state when not to use it or mention alternatives, though the sibling list and context signals partially cover that.

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

get_promptA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the prompt to get
argumentsNoOptional arguments for the prompt

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, indicating no destructive side effects. Description adds value by specifying return format ('JSON with a messages array') and argument structure, which annotations do not cover. 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.

Conciseness5/5

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

Three sentences, front-loaded with the main action, no unnecessary words. Every sentence adds distinct information: what it does, what it returns, and how to provide arguments.

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

Completeness4/5

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

Given that an output schema exists, description appropriately mentions the return format. It covers input parameters and basic behavior. Could mention error cases or prompt absence, but overall sufficient for a simple read-only tool with good annotations.

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

Parameters4/5

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

Schema coverage is 100%, baseline 3. Description adds meaning by stating 'Arguments should be provided as a dict mapping argument names to values', which clarifies the structure of the optional object parameter beyond the schema's generic 'object' type.

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

Purpose5/5

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

Description clearly states verb 'Get', resource 'prompt', and method 'by name with optional arguments'. It distinguishes from sibling tool 'list_prompts' which lists prompts, as this tool retrieves a single specific prompt. Purpose is unambiguous.

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

Usage Guidelines3/5

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

Description implies usage for retrieving a specific prompt by name and notes optional arguments, but does not explicitly state when to use this tool over alternatives like 'list_prompts' nor mention conditions like prompt existence. Guidance is implicit rather than explicit.

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 StatusA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vrnYesVAT Registration Number: 9 digits, e.g. '123456789'. GB prefix accepted and stripped automatically.

Output Schema

ParametersJSON Schema
NameRequiredDescription
vrnYesVAT Registration Number queried
mandatedYesWhether this business is mandated for MTD VAT
effective_dateNoDate from which MTD obligation applies
trading_nameNoRegistered trading name if available

TDQS

A4.5/5.0
Behavior5/5

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

The annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds significant behavioral context: default sandbox connection, production override via HMRC_API_BASE, required OAuth credentials, and error behavior when credentials are missing. It also includes a caution not to infer status. 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.

Conciseness5/5

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

The description is concise (roughly 80 words) and well-structured: a clear usage directive in the first sentence, followed by return details, environment setup, and credential requirements. Every sentence adds necessary information without redundancy.

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

Completeness5/5

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

For a simple tool with one parameter, annotations covering safety, and an output schema (context indicates it exists), the description covers all critical aspects: purpose, return content, environment configuration, credential prerequisites, and error conditions. There are no gaps given the tool's complexity.

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

Parameters3/5

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

The input schema provides a detailed description for the single parameter 'vrn' (format, examples, handling of GB prefix), giving 100% coverage. The tool description does not add additional parameter information beyond what the schema provides. Per the guidelines, high schema coverage warrants a baseline of 3.

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

Purpose5/5

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

The description clearly states the tool's purpose: checking MTD VAT status for a given VAT registration number. It uses a specific verb ('check') and resource ('MTD status'), and the title reinforces this. Among sibling HMRC tools (e.g., hmrc_get_vat_rate, hmrc_search_guidance), this tool is uniquely identified, so no confusion.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool ('USE THIS TOOL WHEN you have a 9-digit VAT Registration Number and need that business's Making Tax Digital VAT mandate status.'). It also provides context about environment setup (sandbox vs production) and credentials. However, it does not explicitly state when not to use it or mention alternatives, but given the sibling tools cover different functionality, no exclusion is needed.

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 CommodityA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
commodity_codeYesCommodity code or plain-English description. E.g. 'food', 'domestic fuel', 'software', 'financial services', 'new build residential'

Output Schema

ParametersJSON Schema
NameRequiredDescription
commodity_codeYesCommodity code or description queried
rateYesVAT rate category
rate_percentageYesApplicable rate as percentage: 20.0 (standard), 5.0 (reduced), 0.0 (zero/exempt)
effective_fromYesDate from which this rate applies
notesNoAny additional notes or conditions on this rate

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses that the tool 'Uses a static lookup table current as of 22 Nov 2023 (Autumn Statement)' and notes that rates may have changed. This goes beyond annotations (readOnlyHint=true, idempotentHint=true) by explaining the data source and freshness. 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.

Conciseness5/5

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

The description is extremely concise: three short sentences plus a bolded usage note. Every sentence provides essential information without redundancy. It is front-loaded with the usage directive.

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

Completeness5/5

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

Given the tool's simplicity (one parameter, read-only, output schema present), the description covers purpose, usage guidelines, data limitations, and fallback tool. It is complete and provides all necessary 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.

Parameters4/5

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

The parameter schema already provides a description ('Commodity code or plain-English description'). The tool description adds examples ('E.g. 'food', 'domestic fuel'', 'software'). This adds value beyond the schema, but does not specify format constraints or validation details, so it's above baseline but not perfect.

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

Purpose5/5

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

The description explicitly states 'USE THIS TOOL WHEN you have a UK commodity or service description and want its VAT rate category.' It clearly identifies the verb (get) and resource (VAT rate for commodity), and distinguishes from the sibling hmrc_search_guidance by noting it as a fallback 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.

Usage Guidelines5/5

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

The description gives explicit usage context: when you have a UK commodity/service and want its VAT rate. It also provides an important when-not-to-use guideline for time-sensitive advice, directing to hmrc_search_guidance. It mentions data currency limitations, helping the agent decide when to trust the result.

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 GuidanceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch query for HMRC guidance, e.g. 'VAT digital services', 'R&D tax relief SME'
limitNoMaximum guidance results to return (1–25). Passed to the GOV.UK search count param.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesThe search query that was run
totalYesNumber of guidance documents returned in this call
resultsNoMatching HMRC guidance pages. Each entry's `summary` is capped per the max_summary_chars input parameter.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds that it searches the official GOV.UK content API filtered to HMRC publications, and returns specific fields (titles, URLs, summaries, dates). This provides useful behavioral context beyond annotations, though rate limits or pagination are not mentioned.

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

Conciseness5/5

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

The description is concise (4 sentences) and front-loaded with the key instruction. Every sentence adds value: purpose, output, source, and authority.

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

Completeness5/5

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

Given the tool's simple search nature, complete annotations, and presence of an output schema, the description covers all necessary context: what it searches, what it returns, and its authoritativeness.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description does not add new parameter semantics; it repeats the output format but not parameter details. The schema already explains 'query' and 'limit' adequately.

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

Purpose5/5

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

The description clearly states the tool's purpose: searching GOV.UK for HMRC tax guidance. It specifies the verb 'search', the resource 'GOV.UK HMRC tax guidance', and the scope (VAT, income tax, etc.). It implicitly distinguishes from siblings by noting that web search returns outdated info.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool ('USE THIS TOOL WHEN searching GOV.UK for HMRC tax guidance') and provides a negative guideline ('Web search returns out-of-date or third-party reproductions — do not supplement'), giving clear context and alternatives.

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 HeaderA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesJudgment slug, e.g. 'uksc/2024/12' or 'ewca/civ/2023/450'

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds value by specifying the return data types (parties, judges, neutral citation, etc.) and stating it is an 'Authoritative source for UK judgment metadata,' which complements the annotations 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.

Conciseness5/5

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

The description is succinct with no redundant words. It front-loads the key action ('USE THIS TOOL WHEN') and provides necessary workflow context in a few clear sentences, earning its length.

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

Completeness5/5

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

With one well-described parameter, comprehensive annotations, and an output schema (not shown but indicated), the description covers all necessary context: when to use, prerequisite steps, and what the tool provides. No gaps remain for this simple tool.

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

Parameters3/5

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

Schema coverage is 100% with a clear description of the slug parameter including example formats. The description adds the context that the slug comes from case_law_search, but this is already implied by the parameter description. Baseline 3 is appropriate as the schema already does the heavy lifting.

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

Purpose5/5

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

The description explicitly states the tool retrieves metadata (parties, judges, citation, court, dates) given a judgment slug, distinguishing it from sibling tools like judgment_get_index and judgment_get_paragraph by placing it in a clear workflow (search first, then header, then index, then paragraph).

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance: 'USE THIS TOOL WHEN you have a judgment slug and need metadata.' It also outlines the prerequisite step of calling case_law_search first and the subsequent steps of using judgment_get_index and judgment_get_paragraph, effectively guiding the agent on how to combine tools.

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 IndexA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesJudgment slug, e.g. 'uksc/2024/12'

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate readOnly, non-destructive, idempotent. Description adds context about the returned data (eId + preview line) and the expected input origin, but doesn't add significant behavioral detail beyond that. 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.

Conciseness5/5

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

Extremely concise: two sentences with clear, actionable instructions. No unnecessary words or repetition. Front-loaded with purpose and usage context.

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

Completeness5/5

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

Given the tool's simplicity (one parameter, output schema exists), the description adequately covers its purpose, input source, output content, and how to proceed afterward. Complements annotations and schema.

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

Parameters3/5

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

Schema covers the single 'slug' parameter with description and example. The description reinforces the parameter's role ('you have a judgment slug') but adds minimal semantic value beyond the schema, which already has 100% coverage.

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

Purpose5/5

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

The description clearly states the tool returns a paragraph navigation index (eId + preview line) given a judgment slug, and distinguishes from siblings like judgment_get_paragraph 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.

Usage Guidelines5/5

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

Explicitly instructs to call case_law_search first to obtain the slug, then use this tool, and afterwards use judgment_get_paragraph or case_law_grep_judgment. Provides clear workflow and alternatives.

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 ParagraphA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
slugYesJudgment slug, e.g. 'uksc/2024/12'
eIdYesParagraph eId from judgment_get_index, e.g. 'para_12'. Numeric strings like '12' are accepted and normalized to 'para_12'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint), the description adds that the tool returns paragraph XML content with a typical token range (400–1,700 tokens). This provides useful behavioral context 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.

Conciseness5/5

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

The description is extremely concise: two sentences that front-load the purpose and provide essential usage guidance without any unnecessary words. Every sentence serves a clear function.

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

Completeness5/5

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

Given the tool's simplicity (2 required params, good schema coverage, annotations, output schema exists), the description covers all necessary context: purpose, prerequisites, output format, typical size, and sibling references. No gaps remain for this type of tool.

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

Parameters4/5

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

The input schema already describes both parameters well (slug format, eId normalization). The description adds context by linking eId to judgment_get_index and using the term 'LegalDocML eId', which reinforces the schema but does not significantly expand parameter meaning beyond what is already present. With 100% schema coverage, baseline is 3; the added context raises it to 4.

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

Purpose5/5

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

The description clearly states the tool's purpose: retrieving a paragraph's full text given a judgment slug and eId. It uses specific verbs ('get') and resources ('paragraph'), and distinguishes 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.

Usage Guidelines5/5

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

The description explicitly tells when to use the tool ('when you have a judgment slug + LegalDocML eId') and provides guidance on prerequisites ('Call judgment_get_index FIRST...or use case_law_grep_judgment'), which helps the agent decide between tools.

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 SectionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesLegislation type code: 'ukpga' (Acts), 'uksi' (SIs), 'asp' (Scottish Acts), 'nia' (NI Acts). Use the value from legislation_search results.
yearYesYear of enactment
numberYesChapter or SI number
sectionYesSection number, e.g. '47' or '12A'. Use the numeric part only — not 'section-47'. Schedules are not currently supported.
max_charsNoMaximum 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

ParametersJSON Schema
NameRequiredDescription
titleYesSection title or heading
section_numberYesSection number, e.g. '47', '12A', 'Schedule 2'
contentYesPlain text content of the section, possibly truncated per max_chars. Check content_truncated and original_length for full-text information.
content_truncatedNoTrue if content was cut to fit max_chars
original_lengthNoOriginal plain-text length in characters before any truncation
in_forceNoFalse 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.
extentNoTerritorial extent: list of 'England', 'Wales', 'Scotland', 'Northern Ireland'. Empty list means unknown — do not assume full UK extent.
version_dateNoDate of the version retrieved
prospectiveNoTrue if this section has not yet come into force; None if unknown
source_formatNoSource parsed for this response. html_fallback means CLML XML was unavailable and text was parsed from the public HTML page.
warningsNoNon-fatal retrieval or parsing warnings the caller should disclose where relevant.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint. The description adds important context: content capped per max_chars, check content_truncated, always check extent for territorial applicability, and that schedules are not supported. 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.

Conciseness5/5

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

The description is two concise paragraphs. The first sentence immediately states when to use. Every sentence adds value: purpose, warning about extent, alternative, behavior of max_chars, and output hint. No fluff.

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

Completeness5/5

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

Given 5 parameters (4 required), full schema coverage, output schema exists, and detailed annotations, the description covers all necessary aspects: usage conditions, parameter behavior (especially max_chars and section format), important warnings (extent, truncation), and alternative tool. Complete for the task.

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

Parameters5/5

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

Schema description coverage is 100%, but the description adds practical guidance beyond schemas, e.g., max_chars default ~2,500 tokens, raise for long definition sections, check content_truncated. For 'section', it clarifies to use numeric part only and that schedules not currently supported.

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

Purpose5/5

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

The description explicitly states the tool's purpose: retrieving parsed text of a specific section with metadata. It distinguishes from the sibling tool read_resource by specifying this returns structured parsed data. The verb 'get' and resource 'legislation section' are clear.

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

Usage Guidelines5/5

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

The description starts with 'USE THIS TOOL WHEN you have a known Act / SI and want the parsed text...' and provides an explicit alternative: 'call read_resource(...) for raw CLML XML; use this tool when you want the parsed structured response instead.' It also advises to check extent, a recurring legal-research error.

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 ContentsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesLegislation type code: 'ukpga' (Acts), 'uksi' (SIs), 'asp' (Scottish Acts), 'nia' (NI Acts). Use the value from legislation_search results.
yearYesYear of enactment
numberYesChapter or SI number
offsetNoNumber of items to skip from the flattened TOC. Use with limit to page through very large statutes like the Companies Act 2006 (1300+ items).
limitNoMaximum 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYesLegislation type code echoed from the request
yearYesYear of enactment echoed from the request
numberYesChapter or SI number echoed from the request
offsetYesOffset applied to the full TOC item list
limitYesPage size applied after offset
returnedYesNumber of items in this response
total_itemsYesTotal structural items parsed from the XML, before offset/limit. Compare to `returned` and `has_more` to decide whether to paginate.
has_moreYesTrue if more items remain beyond offset+returned
itemsNoTOC 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').

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the tool as read-only, idempotent, and open-world. The description adds significant behavioral context: pagination via offset/limit, has_more and total_items, example of large statutes (Companies Act 2006), output format with XML ids and titles, and the workflow to pass numeric section ids to legislation_get_section. 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.

Conciseness5/5

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

The description is concise (about 150 words) and well-structured: usage instruction first, then output description, pagination details, and alternative tool. Every sentence adds value, with no repetition or fluff.

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

Completeness4/5

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

Given the presence of an output schema (not shown) and 100% schema coverage, the description is complete for core usage: input parameters, pagination, and cross-tool workflow. It could mention error conditions or prerequisites (e.g., valid type/year/number) but these are minimal gaps.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds value beyond the schema by explaining the purpose of offset/limit in pagination, providing default and max values, and clarifying that type codes come from search results. It also contextualizes parameters for large statutes.

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

Purpose5/5

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

The description clearly states the tool retrieves the structural table of contents for a known Act or SI, using specific verb 'get' and resource 'table of contents'. It differentiates from siblings like legislation_get_section and read_resource by specifying distinct use cases and output formats.

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

Usage Guidelines4/5

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

The description explicitly says when to use (known Act/SI, want TOC) and provides clear alternatives (read_resource for full TOC string, legislation_get_section for section text). It also explains pagination for large statutes. However, it does not explicitly state when NOT to use the tool, which would strengthen guidance.

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

list_promptsA
Read-onlyIdempotent
Inspect

List all available prompts.

Returns JSON with prompt metadata including name, description, and optional arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the agent knows it's safe and idempotent. The description adds minimal behavioral context beyond the output format.

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

Conciseness5/5

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

Two concise sentences that front-load the purpose. Every word contributes meaning with no redundancy.

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

Completeness5/5

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

Given no parameters, rich annotations, and an existing output schema, the description fully covers what the agent needs to know: the action (list), the resource (prompts), and the return type (JSON metadata).

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

Parameters4/5

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

No parameters exist, and schema coverage is 100%. The description does not need to add parameter semantics, but it mentions 'optional arguments' in the output, which is relevant to the return value.

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

Purpose5/5

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

The description clearly states 'List all available prompts.' and specifies the return format (JSON with metadata), making the purpose unambiguous and distinct from siblings like get_prompt and list_resources.

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

Usage Guidelines3/5

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

The description implies usage (to list prompts), but does not explicitly guide when to use or provide alternatives. Siblings like get_prompt suggest a pattern, but no direct guidance is given.

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

list_resourcesA
Read-onlyIdempotent
Inspect

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}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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 metadata) and distinguishing static vs template resources, which is 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.

Conciseness5/5

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

Two concise sentences with front-loaded purpose, no unnecessary words.

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

Completeness5/5

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

Given no parameters, an output schema exists, and the description covers the tool's listing behavior, it is complete for its simple function.

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

Parameters4/5

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

Zero parameters, baseline 4. No parameter documentation needed.

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

Purpose5/5

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

The description specifies 'List all available resources and resource templates' with clear differentiation between static and template resources, providing distinct fields and template placeholders. This is specific and not a tautology.

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

Usage Guidelines4/5

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

Clear context that this tool lists all resources and templates, implicitly for discovery. No explicit when-not or alternatives mentioned, but the purpose is straightforward.

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 ParliamentA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName or partial name, e.g. 'Starmer', 'Baroness Hale'

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesThe name that was searched
totalYesNumber of members matching the query
membersNoMatching members. Use the integer `id` field from any member to call parliament_member_debates or parliament_member_interests.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. The description adds behavioral context: the tool returns multiple matches for common names (disambiguation) and must be called before other member_id-based tools. This enriches the agent's understanding 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.

Conciseness5/5

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

The description is efficiently structured: first line states use case and output, second paragraph details return fields, third provides workflow guidance. No redundant sentences; each sentence adds critical information.

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

Completeness5/5

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

Given the tool's simplicity (one parameter, clear purpose), the description covers all necessary aspects: input semantics, output structure, disambiguation, and integration with sibling tools. The presence of an output schema further reduces the description's burden, but it still provides a useful summary.

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

Parameters4/5

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

With 100% schema description coverage, the description adds value by explaining how the 'name' parameter is used (query to find members) and what the result contains. It also gives examples ('Starmer', 'Baroness Hale') and notes that partial names work, which is helpful beyond the schema's minimal description.

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

Purpose5/5

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

The description clearly states the tool's purpose: given a member's name, return their integer member_id. It specifies the output fields (id, party, constituency, house, status) and distinguishes itself from sibling tools by positioning itself as a prerequisite for member_id-based filtering tools.

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

Usage Guidelines5/5

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

The description explicitly tells when to use this tool ('when you have a member's name and need their integer member_id') and when not to skip it ('CALL THIS BEFORE any tool that filters by member_id'). It lists specific sibling tools that depend on it and warns against alternative approaches (text-searching by name) using an example (Pannick case).

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 DebateA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
debate_ext_idYesDebate 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.
member_idNoOptional 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).

Output Schema

ParametersJSON Schema
NameRequiredDescription
member_idYesParliament Members API member ID
topicNoTopic phrase filter applied, if any
offsetNoSkip applied to this page
limitNoPage size requested
totalYesNumber of contributions returned in this call
has_moreNoTrue if a full page was returned (more may exist)
contributionsNoHansard contributions for the member. Each `text` field is capped at 3000 characters.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, destructiveHint, idempotentHint, openWorldHint. Description adds context about expected item count (100-200), clarifies that vocabulary doesn't matter, and warns against reconstructing quotes. Does not contradict annotations.

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

Conciseness5/5

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

Compact yet thorough. Every sentence adds value—usage instruction, chain guidance, behavioral notes, and a pitfall warning. Well-organized with clear sections.

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

Completeness5/5

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

Given complexity, annotations, and output schema, the description covers all necessary aspects: when to use, how to chain, what to expect, and how to handle empty results. Complements structured fields effectively.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. Description reinforces schema information (e.g., where to get debate_ext_id, effect of member_id) but does not add significant new parameter semantics beyond what schema already provides.

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

Purpose5/5

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

Clearly states verb (get contributions), resource (debate contributions), and scope (by debate_ext_id, optionally filtered by member_id). Distinguishes from sibling tools like parliament_member_debates by explaining the difference in filtering logic.

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

Usage Guidelines5/5

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

Explicitly tells when to use (when you have debate_ext_id) and when to provide member_id vs omit. Provides a typical chain with other tools and instructs to report empty results honestly, avoiding hallucination.

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 DebateA
Read-onlyIdempotent
Inspect

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, pass votes_id as division_id into 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
debate_ext_idYesDebate 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

ParametersJSON Schema
NameRequiredDescription
debate_ext_idYesEcho of the input debate GUID.
divisionsNoDivisions held in this debate, in chronological order. Empty when no divisions occurred. Each element's `id` chains to votes_get_division.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint. Description adds cross-resolution details, that votes_id may be None, and that empty list is not an error. No contradictions, but could mention rate limits or other behaviors.

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

Conciseness4/5

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

Well-structured with bold directive and bullet points. Slightly verbose but each sentence adds value. Could be tightened but effective.

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

Completeness4/5

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

Given output schema exists (not shown), description provides necessary workflow context (two IDs, cross-resolution, post-processing). Does not explain full output fields, but schema handles that.

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

Parameters4/5

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

Schema coverage is 100% with a single parameter. Description explains where to get the debate_ext_id (from other tools), adding value beyond the schema's basic description.

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

Purpose5/5

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

The description clearly states the tool fetches divisions (formal votes) for a given debate_ext_id. It distinguishes from siblings like votes_get_division and votes_search_divisions by explaining the returned IDs and the workflow.

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

Usage Guidelines5/5

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

Explicitly states 'USE THIS TOOL WHEN you have a debate_ext_id and want the divisions.' Provides context on when divisions typically occur (bill stages, motions) and notes that empty list is honest. Also instructs to pass votes_id to votes_get_division for full records.

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 CitationA
Read-onlyIdempotent
Inspect

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 Items

  • source / 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
column_numberYesHansard 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_numberYesHansard 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).
houseNoRestrict to one House. Default 'both' searches across both Houses.both

Output Schema

ParametersJSON Schema
NameRequiredDescription
column_numberYesEcho of the requested column number.
volume_numberYesEcho of the requested volume number.
houseYesHouse filter applied.
total_resultsYesNumber of debate matches found.
matchesNoDebate 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.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnly and idempotent hints; the description adds valuable behavioral details: explanation of contribution_count, source codes with interpretations, behavior on empty matches (surface failure, not assume fabrication), and that resolution is not gated on publication state.

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

Conciseness4/5

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

Well-structured with example, after-call instructions, output field interpretation, and common errors. Slightly verbose but each section serves a purpose.

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

Completeness5/5

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

Given the tool's complexity and the presence of an output schema, the description is thorough: covers usage, output meaning, failure modes, and follow-up steps. No gaps evident.

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

Parameters4/5

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

Input schema covers all 3 parameters with descriptions (100% coverage). The description adds extra meaning: clarifies that volume_number is required and date is not a substitute, and explains column_number suffix usage. This adds value beyond the schema.

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

Purpose5/5

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

The description clearly states the tool resolves an OSCOLA-style Hansard column citation to find the debate, with a concrete example. It distinguishes from sibling tools like parliament_search_hansard and parliament_get_debate_contributions by specifying that this tool is for column resolution.

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

Usage Guidelines4/5

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

Explicitly says 'USE THIS TOOL WHEN you have an OSCOLA-style Hansard citation...' and provides post-resolution steps. While it doesn't explicitly state when not to use it, the context is clear and the example aids selection.

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 DebatesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
member_idYesParliament Members API integer ID. Obtain from parliament_find_member.
topicNoOptional 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=...).
offsetNoNumber of contributions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true.
limitNoMaximum contributions to return. Default 20.

Output Schema

ParametersJSON Schema
NameRequiredDescription
member_idYesParliament Members API member ID
topicNoTopic phrase filter applied, if any
offsetNoSkip applied to this page
limitNoPage size requested
totalYesNumber of contributions returned in this call
has_moreNoTrue if a full page was returned (more may exist)
contributionsNoHansard contributions for the member. Each `text` field is capped at 3000 characters.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false. Description adds that text is capped at 3000 characters, explains the text-body search nature, and clarifies filtering behavior. 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.

Conciseness4/5

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

Well-structured with clear sections, but could be slightly more concise. Still, every sentence adds value and front-loads purpose.

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

Completeness5/5

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

Covers purpose, parameters, usage guidelines, behavioral quirks (text cap), pagination, and references sibling tools. Adequate for a tool with 4 params and output schema.

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

Parameters5/5

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

Schema coverage is 100%, but description adds valuable context for 'topic' parameter (e.g., what phrases to search, avoid bill names) and explains offset pagination. Significantly enhances schema.

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

Purpose5/5

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

The description starts with 'USE THIS TOOL WHEN...' and clearly states the verb (get contributions), resource (member contributions by topic phrase), and differentiates from sibling tool 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.

Usage Guidelines5/5

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

Provides explicit when to use (having member_id and wanting contributions with specific phrase) and when not to use (for all contributions regardless of vocabulary, use parliament_get_debate_contributions). Also gives prerequisite to call parliament_find_member first.

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 InterestsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
member_idYesParliament Members API integer ID. Get from parliament_find_member.
categoryNoFilter 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.
offsetNoNumber 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.
limitNoMax 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.
max_description_charsNoPer-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

ParametersJSON Schema
NameRequiredDescription
member_idYesParliament Members API member ID
categoryNoCategory filter applied to this query, or None for all categories
offsetYesNumber of interests skipped before this page
limitYesMax interests requested for this page
returnedYesNumber of interests actually returned in this call
has_moreYesTrue if there may be more interests beyond this page. Re-call with offset=offset+returned to fetch the next page.
interestsNoThe interests in this page. `description` text is capped per the max_description_chars input parameter.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. Description adds critical details: hard cap on limit (verified live), pagination logic, and max_description_chars. Could mention rate limits but not required given context.

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

Conciseness5/5

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

Well-structured, front-loaded with use case and prerequisite. Each sentence adds distinct value without redundancy. Appropriate length for the tool's complexity.

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

Completeness5/5

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

Given 5 parameters, presence of output schema, and sibling tools, the description fully covers pagination, filtering, limits, and source authority. No gaps remain for agent decision-making.

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

Parameters4/5

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

Schema covers all 5 parameters fully (100% coverage). Description adds value by explaining limit cap, pagination mechanism, and purpose of max_description_chars, going beyond schema basics.

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

Purpose5/5

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

The description clearly states 'get their registered financial interests' with specific categories. It distinguishes from siblings by noting it's the authoritative source and referencing the prerequisite parliament_find_member.

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

Usage Guidelines5/5

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

Explicitly says 'USE THIS TOOL WHEN you have a member_id and need their registered financial interests.' Provides prerequisite call to parliament_find_member and pagination instructions.

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)A
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesPhrase 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.
from_dateNoStart date (YYYY-MM-DD)
to_dateNoEnd date (YYYY-MM-DD)
houseNoRestrict to one House. Default 'both'.both
max_debates_scannedNoHard 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

ParametersJSON Schema
NameRequiredDescription
topicYesPhrase searched in Hansard
from_dateNoStart date filter applied
to_dateNoEnd date filter applied
houseYesHouse filter applied
total_contributionsYesTotal contributions in Hansard matching topic+filters (TotalContributions)
total_debatesYesTotal distinct debates touching this topic (TotalDebates)
total_written_statementsYesTotalWrittenStatements upstream count
total_written_answersYesTotalWrittenAnswers upstream count
total_divisionsYesTotalDivisions upstream count. Non-zero → consider votes_search_divisions.
debates_scannedYesNumber of debates pulled from /search/Debates.json for the facet breakdown (≤ max_debates_scanned)
by_partyNoCounts 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.
by_houseNoCounts of debates by house (Commons vs Lords)
by_sectionNoCounts of debates by Hansard section bucket (Chamber / Westminster Hall / Written Answers / Written Statements)
by_yearNoCounts of debates by sitting year, desc by year
by_month_recent_12NoCounts of debates by YYYY-MM for the most recent 12 months in the sample, desc by month
top_contributorsNoALWAYS EMPTY in this summary — see by_party note. Use parliament_member_debates after picking a debate from top_debates.
top_debatesNoTop 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).

TDQS

A5/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds significant behavioral context: 'Pure counts — no LLM, no editorial labels' and explains the aggregation process (sweeps /search/Debates.json with pagination, aggregates by house/section/year/month/top_debates). It also mentions rate limits (1000 req/5min) and envelope counts from /search.json. 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.

Conciseness5/5

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

The description is appropriately sized and front-loaded with the usage guideline. Every sentence provides necessary information: what the tool does, how it works, what to do after, limitations, and parameter details. No wasted words; it is comprehensive yet efficient.

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

Completeness5/5

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

Given the tool's complexity (5 parameters, 1 required, output schema exists), the description covers all aspects: purpose, inputs, process, outputs (by_house, by_year, etc.), limitations (no member-level facets), and post-call actions. It is fully complete for an agent to select and invoke the tool correctly.

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

Parameters5/5

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

Schema coverage is 100% (all 5 parameters described). The description adds value beyond the schema: for 'topic', it explains that bill titles work due to debate-level matching; for 'max_debates_scanned', it explains the default corresponds to ≤4 upstream calls and can be raised for exhaustive sweeps with rate limit context. This compensates fully for the rich schema.

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

Purpose5/5

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

The description clearly states the tool's purpose: aggregating debate-level corpus signals on a topic (by_house, by_year, by_section) without reading every contribution. It uses a specific verb-resource pair ('aggregate Hansard debate-level signals') and distinguishes from siblings like parliament_search_hansard 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.

Usage Guidelines5/5

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

The description explicitly starts with 'USE THIS TOOL WHEN' and provides usage context. It instructs users to pick a debate from top_debates and call parliament_get_debate_contributions for detail. It also explains when not to use (for member-level facets) and suggests alternative tools (parliament_member_debates, hansard://debate).

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 DebatesA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesPhrase 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.
from_dateNoStart date (YYYY-MM-DD)
to_dateNoEnd date (YYYY-MM-DD)
houseNoRestrict to one House. Default 'both' returns Commons + Lords contributions.both
member_idNoFilter 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_modeNo'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_typeNoWhich 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
offsetNoSkip this many contributions before the page. Default 0. Re-call with offset=offset+returned to paginate; has_more flags whether more remain.
limitNoMax contributions per call (1–100). Default 20. Paginate further with offset; total corpus size is in total_corpus on the response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesThe phrase that was searched in Hansard
from_dateNoStart date filter applied, if any
to_dateNoEnd date filter applied, if any
houseNoHouse filter applied
member_idNoMembers API integer ID filter applied, if any (echoed from input).
text_modeNoWhether contribution `text` carries the upstream preview or full body (still capped).
offsetNoSkip applied to this page (Hansard API: skip)
limitNoPage size requested
totalYesNumber of contributions returned in this call
total_corpusNoTotal contributions in Hansard matching this query (TotalContributions). Use to decide whether to paginate further or escalate to parliament_policy_position_summary.
total_debatesNoTotalDebates — distinct debates touching this topic.
total_divisionsNoTotalDivisions. Non-zero → consider `top_divisions` previews below or chain to votes_search_divisions.
total_written_statementsNoTotalWrittenStatements.
total_written_answersNoTotalWrittenAnswers.
total_correctionsNoTotalCorrections — published corrections to the Hansard record.
total_petitionsNoTotalPetitions.
total_committeesNoTotalCommittees.
total_membersNoTotalMembers — member-name matches in the corpus.
top_debatesNoTop-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.
top_divisionsNoTop-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.
party_breakdownNoCounts by party across the returned page
house_breakdownNoCounts by house across the returned page
date_rangeNo(min, max) SittingDate of returned contributions, or None if empty
has_moreNoTrue if a full page was returned (more may exist; re-call with offset=offset+limit)
contributionsNoMatching Hansard contributions with full citation metadata.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true. The description adds rich behavioral context: it details return fields (member_id, column_ref, debate_id, etc.), pagination behavior (limit+offset, has_more), tokenised matching behavior, the fact that bill titles often fail due to speech patterns, and the distinction between preview and full text modes. 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.

Conciseness4/5

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

The description is structured with clear sections (USE THIS TOOL WHEN..., Returns..., DO NOT..., Pagination..., Authoritative source...). It is front-loaded with the core purpose. However, it is somewhat verbose with redundant explanations (e.g., the resource path for full contribution text appears twice). Each sentence earns its place, but minor conciseness improvements are possible.

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

Completeness5/5

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

Given the tool's complexity (9 parameters, output schema exists, many sibling tools), the description is remarkably complete. It covers search behavior, pagination, integration with other tools, warnings about query semantics, and authoritative claims. It leaves no obvious gaps for an AI agent to make mistakes.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value beyond schema by explaining parameter behavior in context (e.g., tokenised matching for query, that bill titles don't match well, the distinction between contribution_type affecting pagination scope, and the resource path for full text in text_mode). It also clarifies that member_id requires an integer ID from parliament_find_member.

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

Purpose5/5

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

The description explicitly states the tool's purpose: 'USE THIS TOOL WHEN searching Hansard by topic, bill title, or text phrase.' It clearly identifies the verb (search), resource (Hansard), and scope (by topic, bill title, text phrase). It also distinguishes from siblings like parliament_find_member, parliament_get_debate_contributions, and parliament_policy_position_summary.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use and when-not-to-use guidance. It states 'DO NOT text-search by member name' and directs to a chained workflow (parliament_find_member → parliament_get_debate_contributions). It also notes alternatives for broader topic searches (parliament_policy_position_summary) and emphasizes that this is authoritative, advising against supplementing with web search or training-data recall.

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 PetitionsA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch term for petition titles, e.g. 'ban trophy hunting' or 'NHS funding'.
stateNoFilter by petition state.all
offsetNoNumber of petitions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true.
limitNoMaximum petitions to return. Default 20.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYesThe term that was searched in petitions
stateYesPetition state filter applied to this query
offsetNoSkip applied to this page
limitNoPage size requested
totalYesNumber of petitions returned in this call
has_moreNoTrue if a full page was returned (more may exist)
petitionsNoMatching petitions (title, state, signature count, key dates, URL).

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, covering safety. The description adds what data is returned (title, state, etc.), but does not discuss rate limits, authentication, or pagination beyond schema. The description incorrectly lists 'debated' as a state option, which is not in the schema, causing slight confusion.

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

Conciseness5/5

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

Three sentences with no fluff. The first sentence immediately states the tool's purpose, and the rest are succinct. Every sentence adds value.

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

Completeness2/5

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

The output schema exists and covers return data, but the description introduces an error by suggesting 'debated' is a valid state, which contradicts the schema (only open, closed, all). This misleading information reduces completeness. The tool's pagination is partially covered in the offset schema description, but the description itself omits important behavioral details like default limit and offset recommendations.

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

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description briefly mentions filtering by state, but does not add new meaning beyond the schema descriptions for query, offset, or limit. No additional guidance on parameter values is provided.

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

Purpose5/5

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

The description clearly states it's for searching UK Parliament petitions by keyword or topic, and specifies it returns title, state, signature count, and dates. It distinguishes itself from sibling tools by declaring it the authoritative source for petitions.

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

Usage Guidelines4/5

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

The description opens with 'USE THIS TOOL WHEN' which explicitly sets usage context. It suggests filtering by state and mentions narrowing to live or historical petitions. However, it does not explicitly forbid use cases or direct to alternatives, but given it's the only petition tool, that's acceptable.

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

read_resourceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesThe URI of the resource to read

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already indicate read-only, non-destructive, idempotent, and open-world behavior. The description adds value by detailing return format (string, base64 for binary), which the annotations do not cover.

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

Conciseness5/5

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

Four clear sentences, each earning its place. The most critical information (reads by URI) appears first, followed by usage details and return format. No redundancy.

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

Completeness4/5

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

Given the tool's simplicity (one parameter, rich annotations, output schema exists), the description covers input formatting and return type. It could mention error cases (e.g., resource not found) but is otherwise complete.

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

Parameters5/5

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

The description adds significant meaning beyond the schema: it explains how to construct the URI for both static and templated resources, which the schema's brief description does not convey.

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

Purpose5/5

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

The description clearly states the tool reads a resource by its URI, distinguishing between static and templated resources. This is a specific verb+resource pair that differentiates from sibling tools like 'list_resources' or specialized readers.

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

Usage Guidelines4/5

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

The description provides explicit guidance on URI format for static vs. templated resources, aiding correct parameter usage. However, it does not explicitly state when to use this tool over sibling tools or 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.

votes_get_divisionGet Division DetailA
Read-onlyIdempotent
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
division_idYesDivision ID from votes_search_divisions results.
houseNoWhich house this division belongs to.Commons

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesDivision ID
titleYesDivision title / motion text
dateYesDate of the division
houseYesCommons or Lords
ayes_countYesTotal Aye votes
noes_countYesTotal No votes
passedYesWhether the motion passed
is_government_winNoWhether the government won (Lords only)
aye_votersNoMembers who voted Aye (may be truncated)
noe_votersNoMembers who voted No (may be truncated)
truncatedNoWhether voter lists were truncated to fit response limits
total_aye_votersNoTotal number of Aye voters before truncation
total_noe_votersNoTotal number of No voters before truncation

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint), the description adds critical behavioral detail: 'Voter lists are truncated to 100 per side to fit response limits; total voter counts are always accurate regardless of truncation.' This informs the agent of important limitations and guarantees.

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

Conciseness5/5

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

Three sentences, each purposeful. The first sentence front-loads the usage condition, the second explains a key behavioral trait, and the third gives chaining options. No wasted words.

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

Completeness5/5

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

The description covers when to use, key behavioral details (truncation), and sourcing guidance. With an output schema present and full parameter descriptions, no further information is needed for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for both parameters. The description adds no additional meaning 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.

Purpose5/5

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

The description explicitly states 'USE THIS TOOL WHEN you have a division_id + house and want the full member-by-member voting record.' This is a specific verb-resource pairing and distinguishes from sibling tools like votes_search_divisions by specifying the context of having the ID.

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

Usage Guidelines5/5

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

The description provides explicit when-to-use guidance with the imperative directive. It also indicates where to obtain the division_id (from votes_search_divisions or parliament_get_debate_divisions), effectively telling the agent when not to use this tool (when they don't have an ID).

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 DivisionsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch term for division titles, e.g. 'Rwanda' or 'Online Safety Bill'. Omit to browse recent divisions.
houseNoWhich house to search.Commons
from_dateNoStart date (YYYY-MM-DD).
to_dateNoEnd date (YYYY-MM-DD).
member_idNoFilter to divisions where this member voted. Get the member ID from parliament_find_member.
offsetNoNumber of divisions to skip before this page. Default 0. Re-call with offset=offset+returned while has_more is true.
limitNoMaximum divisions to return. Default 25 (Commons API max-per-page).

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryNoThe search term, if any (None = browse recent)
houseYesCommons or Lords
offsetNoSkip applied to this page
limitNoPage size requested
totalYesNumber of divisions returned in this call
has_moreNoTrue if a full page was returned (more may exist)
divisionsNoMatching divisions. Use the integer `id` field with votes_get_division to fetch the full voter list.

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety. Description adds 'Authoritative source' but does not disclose pagination behavior or any additional behavioral nuances 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.

Conciseness5/5

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

Four sentences, first sentence front-loaded with usage instruction. No wasted words, every sentence adds value.

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

Completeness5/5

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

Given full schema coverage, annotations, and an implied output schema, the description completes the picture by indicating the workflow (use with votes_get_division) and stating the source authority.

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

Parameters3/5

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

Schema coverage is 100%, so the schema fully documents all 7 parameters. The description adds a brief note on using after for full lists but no additional parameter-level meaning beyond what is in the schema.

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

Purpose5/5

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

Clearly states the verb 'search' and resource 'Commons or Lords formal votes' with specific facets (topic, date, member). Distinct from sibling votes_get_division by noting that this tool returns summaries and the other provides detailed voter lists.

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

Usage Guidelines5/5

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

Explicitly says 'USE THIS TOOL WHEN' and provides when-not-to-use by directing to votes_get_division for full lists, giving a clear workflow.

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

TDQS

A4.6/5.0
Disambiguation5/5

Each tool targets a distinct aspect of UK legal research with clear guidance on usage and chaining. Overlaps are explicitly described (e.g., parliament_search_hansard vs parliament_member_debates), ensuring agents can differentiate easily.

Naming Consistency5/5

All tools follow a consistent 'domain_verb_noun' pattern (e.g., bills_get_bill, case_law_search, citations_resolve). No mixing of conventions (all snake_case), making the tool set highly predictable.

Tool Count5/5

34 tools cover a broad range of legal research domains (bills, case law, legislation, committees, Hansard, HMRC, etc.) without redundancy. Each tool has a specific purpose, well-scoped for the server's comprehensive mission.

Completeness5/5

The tool surface covers core UK legal research workflows: search, retrieve, drill-down, citation resolution, and cross-referencing across bills, case law, legislation, Hansard, committees, and HMRC. No obvious gaps for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to search and analyze legal documents from multiple jurisdictions including US federal and state law, case law, EU regulations, UK legislation, Canadian law, Congress bills, SEC filings, and FDA data through free government APIs.
    6
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables US case law search, citation parsing, practice management via Clio, and federal court filings through PACER.
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides programmatic access to UK legal documents with hybrid semantic search and Model Context Protocol integration for AI assistants.
    65
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/paulieb89/uk-legal-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server