Skip to main content
Glama
paulieb89

UK Business Tools - Ledgerhall

by paulieb89

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": true
}
resources
{
  "subscribe": false,
  "listChanged": true
}
extensions
{
  "io.modelcontextprotocol/ui": {}
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
gov_govuk_searchA

Search GOV.UK's 700k+ content items using the official Search API.

Returns a list of matching content items with title, description, link, format, owning organisation(s), and last updated timestamp.

Use filter_format to narrow to specific content types (e.g. 'transaction' for citizen-facing services, 'guide' for guidance, 'publication' for official documents). Use filter_organisations to restrict to a department.

gov_govuk_grep_contentA

Find body sections in a GOV.UK content item matching a pattern.

Returns a list of {anchor, heading, snippet, match} hits — small per-section snippets centred on the match — so the LLM can decide which full sections to read via govuk_get_section.

Use this when answering content-based questions ("what does this guide say about X?", "find the bit about eligibility") rather than navigating by section number.

Pattern is regex; if it doesn't compile, falls back to literal substring.

gov_govuk_list_organisationsA

List all UK government organisations registered on GOV.UK.

Returns a paginated list of organisations including their slug, acronym, type, and status. Use this to browse the full government structure or discover slugs for use with govuk_get_organisation or govuk_search filters.

gov_govuk_lookup_postcodeA

Look up a UK postcode to retrieve its local authority, region, constituency, and other administrative geography.

Useful for determining which council area, parliamentary constituency, or NHS region a postcode falls within. Commonly used to direct users to the correct local service on GOV.UK (e.g. council tax, planning, waste).

Uses the postcodes.io public API (no key required).

gov_govuk_get_contentA

Get metadata and navigable section index for a GOV.UK page.

Returns the page title, document type, publication dates, and a list of sections with their anchor IDs and headings. Use govuk_get_section to read the body of a specific section, or govuk_grep_content to search within the page body.

gov_govuk_get_sectionA

Get the HTML content of one named section of a GOV.UK page.

Use govuk_get_content first to get the list of available section anchors, then call this with the anchor of the section you want to read.

gov_govuk_get_organisationA

Get the profile of a UK government organisation by its slug.

Returns name, acronym, type, status, web URL, and parent/child organisations. Use govuk_list_organisations to browse all organisations and discover slugs.

law_judgment_get_headerA

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.

law_judgment_get_indexA

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.

law_judgment_get_paragraphA

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

law_case_law_searchA

USE THIS TOOL WHEN searching UK case law by party names, court, judge, date, or free-text query.

Returns paginated judgment summaries: neutral citation, court, dates, slug, stable TNA URI. AFTER calling: pass slug into judgment_get_header / judgment_get_index / judgment_get_paragraph (or the judgment:// resource family) for content; pass the neutral citation into citations_resolve to verify before constructing an OSCOLA citation; use case_law_grep_judgment to find text within a single judgment. When a party name returns several candidates, narrow with court + year filters before grep-iterating across full judgments — targeted filtering beats scanning every candidate.

Coverage: TNA Find Case Law indexes UK judgments from roughly the early 2000s onwards. For older authorities, search for a modern judgment that quotes them and read that paragraph.

Authoritative source for UK case law. Web search returns out-of-date or unstable URLs — do not supplement.

law_case_law_grep_judgmentA

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.

law_legislation_searchA

USE THIS TOOL WHEN searching UK Acts and Statutory Instruments by title, phrase, or full-text.

Returns ranked results: title, type, year, number, legislation.gov.uk URL, and next_steps hints (toc URI, section template). AFTER calling, chain to legislation_get_toc then legislation_get_section for structural drill-in.

Filter discipline: type and year are exact-match. Use only when you already know the value. For currency-driven searches ("the recent Renters' Rights Act"), query by phrase alone and read the year from the results — guessing a year and filtering by it zeroes results when wrong. For broader concept queries across content, set fulltext=True.

Authoritative source for UK primary and secondary legislation (legislation.gov.uk).

law_legislation_get_sectionA

USE THIS TOOL WHEN you have a known Act / SI and want the parsed text of a specific section, regulation, or article, with extent and in-force metadata.

Returns the provision's own text and its own heading — never a neighbouring or enclosing Part/Chapter's content. Also returns territorial extent, in-force status, and prospective flag. Content capped per max_chars (default 10,000, ~2,500 tokens) — raise for unusually long definition sections; check content_truncated in the response.

Works uniformly across Act sections ('section-N'), SI regulations ('regulation-N'), and SI articles ('article-N') — pass the bare number regardless of which the document uses; you don't need to know which noun applies. Raises a not_found error (rather than returning a plausible but wrong node) if the number doesn't exist in this document — check legislation_get_toc for valid numbers.

ALWAYS check extent — a section may apply to England & Wales but not Scotland or Northern Ireland. Reciting a section without checking extent is a recurring legal-research error.

Alternative: call read_resource(uri="legislation://{type}/{year}/{number}/ section/{section}") for raw CLML XML; use this tool when you want the parsed structured response instead.

law_legislation_get_tocA

USE THIS TOOL WHEN you have a known Act / SI and want the structural table of contents (parts, chapters, individual sections/regulations/articles).

Returns structural elements with XML id and title, in document order, e.g. 'section-47: Definitions' for an Act or 'regulation-4: Maximum weekly working time' for an SI. Individual provisions are listed alongside their enclosing Part/Chapter/crossheading headings — both levels matter: the heading entries give you the document's shape, the provision entries give you what to pass to legislation_get_section. A provision with no heading in the source (rare) is listed as a bare id with no title. AFTER calling, pass the numeric identifier (use '47', NOT 'section-47') into legislation_get_section for full text.

Large statutes (Companies Act 2006 has many hundreds of items) are paginated via offset/limit. Check has_more and total_items.

Alternative: call read_resource(uri="legislation://{type}/{year}/{number}/ toc") for the full TOC as a newline-separated id: title string (no pagination). Use this tool when you need the structured response with offset / limit / has_more for stepping through large statutes.

law_parliament_search_hansardA

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.

law_parliament_policy_position_summaryA

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.

law_parliament_find_memberA

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

law_parliament_member_debatesA

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.

law_parliament_member_interestsA

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.

law_parliament_search_petitionsA

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

law_parliament_get_debate_divisionsA

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.

law_parliament_get_debate_contributionsA

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.

law_parliament_lookup_by_columnA

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.

law_bills_search_billsA

USE THIS TOOL WHEN searching UK parliamentary bills by keyword, session, house, or legislative stage.

Returns a paginated page of bill summaries (title, originating and current house, current stage, whether it became an Act). AFTER calling, pass a bill_id into bills_get_bill for full detail (sponsors, long title, Royal Assent date).

Authoritative source for UK parliamentary bill status.

law_bills_get_billA

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.

law_votes_search_divisionsA

USE THIS TOOL WHEN searching Commons or Lords formal votes by topic, date, or member.

Returns one page of division summaries (title, date, vote counts, pass/fail) plus total, the source's count of all matching divisions. While has_more is true, re-call with offset=offset+returned. AFTER calling, pass division_id + house into votes_get_division for the full member-by-member voter lists.

Authoritative source for UK parliamentary vote records.

law_votes_get_divisionA

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

law_committees_search_committeesA

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.

law_committees_get_committeeA

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.

law_committees_search_evidenceA

USE THIS TOOL WHEN you have a committee_id and want the oral and written evidence submitted to it.

Returns ONE PAGE of evidence (default 20) plus total, the source's count of matching items. evidence_type='both' lists all oral evidence first, then all written evidence, each newest-published first as the source orders it. Free-text titles are capped per max_title_chars; witness lists are capped at 10 per item. An organisation witness (no named individual) is rendered as ' ()'; a null entry means the source gave no name for that witness at all. For committees with many submissions, re-call with offset=offset+returned while has_more is true.

Authoritative source for parliamentary committee evidence.

law_citations_parseA

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.

law_citations_resolveA

USE THIS TOOL BEFORE constructing an OSCOLA citation string from known fields, OR to confirm a citation points at a real document.

Parses + resolves a single citation (neutral citation, SI, legislation section, retained EU law) and returns parsed fields plus resolved_url. For neutral citations, performs a live TNA HEAD check — non-200 sets confidence to 0.0 (document absent). Do NOT format or quote a confidence-0.0 citation.

If the TNA HEAD check fails (timeout, connection error), raises ToolError with {"error_category": "transient", "is_retryable": true}. One retry is attempted — retry this call or proceed without TNA verification.

Formatting a citation from "known" fields without prior resolution is the most common fabrication route. If this tool raises or returns no resolved_url, do NOT manufacture a citation — surface the failure and ask the user for the source URL.

Authoritative source for UK legal-citation resolution.

law_citations_networkA

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.

law_citations_format_oscolaA

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

law_hmrc_get_vat_rateA

USE THIS TOOL WHEN you know the UK VAT category name for a good or service and want its VAT treatment.

Exact named-category lookup, not a free-text VAT classifier or tax advice. The query must equal a category name, ignoring only case, spacing, hyphens and apostrophe style. Extra qualifying words are never discarded: 'pet food' is its own category, and 'baby food' is not 'food'.

A match returns rate (standard, reduced, zero or exempt), rate_percentage (None for exempt), conditions in notes, the GOV.UK source_url, and that entry's verified_on date.

An unresolved query returns no rate: matched_category, rate, rate_percentage and verified_on are all null, never a default. Its notes list the category names. AFTER an unresolved result, retry with a listed name or call hmrc_search_guidance.

law_hmrc_check_mtd_statusA

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.

law_hmrc_search_guidanceA

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.

law_list_promptsA

List all available prompts.

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

law_get_promptA

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.

law_list_resourcesA

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

law_read_resourceA

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.

dd_company_searchA

Search the Companies House register by company name or keyword.

Returns a paginated list of matching companies with name, number, status, SIC codes, incorporation date, and registered address. Use company_profile for the full record once you have the company number. Re-call with start_index=start_index+items_per_page to fetch the next page.

dd_company_profileA

Fetch the full Companies House profile for a company number.

Returns status, registered address, SIC codes, filing compliance (overdue accounts and confirmation statement flags), and whether the company has outstanding charges. Use company_search first to find the company number.

dd_company_officersA

Fetch officers for a Companies House company number.

Returns directors, secretaries, and other officers with appointment dates, nationality, and country of residence. Resigned officers are excluded by default; set include_resigned=true for historical DD. Pagination is handled internally.

dd_company_pscA

Fetch Persons with Significant Control (beneficial ownership) for a company.

Returns PSC entries with natures of control, nationality, and country of residence. Flags overseas corporate PSC entries as a beneficial ownership risk signal. Returns an explanatory note for widely-held PLCs with no registrable PSC.

dd_officer_appointmentsA

Fetch a person's full company appointment history by officer ID.

Returns every appointment — current and historic — with each company's number, name, status, role, and appointment/resignation dates. Use company_officers first to find an officer_id, then this tool to discover other companies that person has been a director or secretary of, including dissolved or insolvent ones not mentioned anywhere else. Always returns full history; there is no current-only filter, since historical discovery is the point.

dd_company_chargesA

Fetch the complete Companies House charge history for a company.

Returns every registered charge (secured debt) — current and historic — with status, dates, secured parties, and what each charge covers (fixed/floating/negative-pledge flags and any free-text particulars). Satisfaction is represented as satisfied_on plus a charge-satisfaction filing entry, not a separate 'release' record. company_profile.has_charges is a True/False/unknown summary derived from this same data; use this tool when the specific charges matter, not just whether any exist.

dd_company_filing_historyA

Fetch one page of a company's Companies House filing chronology.

Returns the raw source facts for each filing — transaction ID, form type/category, dates, and the description_values CH uses to render its own text — as delivered upstream, not interpreted into DD conclusions. links.document_metadata on each filing is the identifier a future document-retrieval tool would need; no document content is fetched here.

Unlike company_officers/company_psc/company_charges, this does NOT auto-fetch every page — a long-lived company's filing history is unbounded in practice (a decades-old PLC can carry thousands of filings). total_count/returned/has_more are always reported truthfully for whatever page and category filter was requested; nothing is silently truncated. Narrow with category= for a specific slice (e.g. category='mortgage' for charge-related filings, category='insolvency' for administration/liquidation filings) — a note is included when an unfiltered history is large.

A company_number that doesn't resolve to any company returns a structured not_found error, distinct from a genuine zero-filing result — Companies House's filing-history endpoint alone cannot tell these apart, so existence is confirmed separately when the result would otherwise be empty.

dd_company_filing_documentA

Resolve a filing's document_metadata link to its authoritative source document.

Returns a resource_link (never embedded bytes, never base64) pointing at a company-document:// MCP resource — fetch it via resources/read to get the actual PDF. This tool only reads metadata (category, pages, available content types, byte size); it never downloads the document itself. Use company_filing_history first to find a filing's document_metadata URL.

Requires a resource-capable MCP client to retrieve the actual bytes — a tool-only client can see this result's metadata (company, category, page count, size) but cannot obtain the file through this tool call alone.

dd_charity_searchA

Search the Charity Commission register of England and Wales by name or keyword.

Returns matching charities with registration number, status, and registration date. Use charity_profile for full details once you have the charity number. The upstream searchCharityName endpoint returns the full list in one shot — pagination is applied client-side via offset/limit. A query that matches nothing is a successful empty result (charities: []), not an error — the upstream endpoint signals "no matches" with an HTTP 404, which is translated back into an empty result here rather than surfaced as a not-found failure.

dd_charity_profileA

Fetch the full Charity Commission profile for a charity number.

Returns trustees, latest income/expenditure, insolvency flags, governing document type, classifications, and countries of operation. Use charity_search first to find the charity number.

dd_disqualified_searchA

Check whether a named individual is banned from acting as a UK company director.

Use this tool when asked to check disqualified, banned, or barred directors. Query must be an individual's name (e.g. "Richard Howson") — NOT a company name, which always returns zero results.

Returns names, dates of birth, disqualification period snippets, and officer IDs that can be used with disqualified_profile for full details.

dd_disqualified_profileA

Fetch the full disqualification record for a director by officer ID.

Returns all disqualification orders: reason, Act/section cited, disqualification period, and associated company names. Use disqualified_search first to find the officer ID.

dd_land_title_searchA

Search HM Land Registry Price Paid Index by postcode or address.

Returns up to 10 recent sale transactions for the postcode: price, date, address, property type, and tenure (Freehold/Leasehold). Covers England and Wales only. Postcode gives the most reliable results — a full address is also accepted and the postcode is extracted automatically.

dd_gazette_noticeA

Fetch the full legal wording of a Gazette notice by numeric notice ID.

Returns the complete JSON-LD linked-data record for the notice: parties, legal basis, court, and full text. Use gazette_insolvency first to find notice_numeric_id values.

dd_gazette_insolvencyA

Search The Gazette's insolvency notice index by entity name.

Searches The Gazette's corporate-insolvency notice index using the authoritative Gazette notice-code taxonomy. Results are sorted by an internal DD severity score; the notice label itself remains a source fact.

Each result includes a notice_numeric_id. Read the full legal wording via the notice://{notice_numeric_id} resource.

The Gazette is the official UK public record. A notice here means the event has been formally published and is legally effective.

dd_sanctions_screenA

Screen a name against the UK (OFSI), US (OFAC), EU and UN consolidated sanctions lists.

Returns every list entry whose primary name or alias matches, with the regime, source reference and listing date. Use it to check whether a counterparty — or its officers / persons with significant control — appears on a sanctions list.

MATCHING is deterministic: normalised exact + alias match (case-, accent- and punctuation-insensitive). A company/entity legal name matches reliably; PERSON names with transliteration variants may not (e.g. 'Mohammed' vs 'Muhamad'). An empty result is therefore NOT a guarantee of clearance, and a hit on a common name may be a false positive to disambiguate. This is a screening aid, not a compliance determination.

lists_screened reports which of OFSI/OFAC/EU/UN were actually loaded — if any is missing the result is partial. as_at is when the lists were last refreshed on this server.

dd_searchA

Search across all UK due diligence registers simultaneously.

Searches Companies House, Charity Commission, disqualified directors, and Gazette insolvency notices in parallel. Returns a list of result IDs — use fetch with each ID to retrieve the full record.

dd_fetchA

Fetch the full record for an ID returned by search.

Routes by prefix to the appropriate register:

  • company:{number} → Companies House full profile

  • charity:{number} → Charity Commission full profile

  • disqualification:{officer_id} → Disqualified director full record

  • notice:{notice_id} → Gazette notice full legal text

prop_property_compsA

Comparable sales from Land Registry Price Paid Data.

Defaults return the standard residential set:

  • property_type=None means residential (F+D+S+T). Pass "F"/"D"/"S"/"T"/"O" for a single type, or "ALL" to disable type filtering (firehose).

  • transaction_category defaults to "A" (standard sales). Pass None to include category-B (bulk transfers, non-standard conveyances).

  • filter_outliers=False by default; set True for IQR-trimmed stats AND transaction list (1.5*IQR rule, needs >=4 prices).

limit caps returned transactions (max 200). enrich_epc attaches EPC floor area and price-per-sqft to each transaction — slower but richer.

prop_property_yieldA

Gross rental yield for a UK postcode.

Combines Land Registry sale comps (median sale price) with Rightmove rental listings (median monthly rent) to produce a gross yield percentage.

prop_rental_analysisB

Rental market analysis and achievable rent estimate.

auto_escalate widens the Rightmove search RADIUS when fewer than 5 listings are found (thin market). This is rental-radius escalation and is unaffected by the PPD geography containment: it does not change a postcode's outcode or sector, so it carries none of the limit-dependence that disabled PPD auto-widening. Response includes thin_market, escalated_from, escalated_to fields when escalation occurs.

prop_property_epcA

Energy Performance Certificate data for a UK property or postcode area.

With address: returns the matched EPC certificate for that specific property. Without address: returns the record count and, when the bounded response contains every matching summary, the rating distribution. Property-type breakdown and floor-area statistics are NOT available — the EPC service exposes them only on individual certificates.

Returns null only when no certificates are lodged for the postcode. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

prop_property_epc_searchA

DEPRECATED — use property_epc_summaries then epc_certificate.

This tool returned score, floor_area, property_type, habitable_rooms and inspection_date for every certificate at a postcode. The EPC service no longer exposes those fields in a search: they exist only on a full certificate. Reproducing the old response would require one upstream request per certificate, so this tool is unsupported rather than silently degraded or silently expensive.

prop_property_epc_summariesA

List EPC certificate summaries at a postcode — for candidate selection.

Returns one bounded page. Each entry contains only what the EPC search exposes: certificate_number, address, uprn (often absent), energy band, registration_date and schema_type. Energy score, floor area and property type are NOT available here — fetch a specific certificate for those.

Workflow when a Rightmove listing has no house number:

  1. property_epc_summaries(postcode) to list candidates.

  2. Narrow by address text and, where present, uprn.

  3. epc_certificate(lmk_key=) for the chosen one, then cross-check its floor_area against the listing.

  4. If several candidates remain equally plausible, present them all — do not guess. Selecting arbitrarily attaches another property's data.

complete is false when the postcode holds more records than this page returns. Upstream page traversal is not snapshot-stable, so a multi-page result is a bounded sample, not a guaranteed-complete set.

An empty results list means no certificates are lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

prop_epc_certificateA

Fetch a single EPC certificate by its GOV.UK certificate number.

Use after property_epc_summaries has listed the candidates and you have picked one — this is faster than property_epc(postcode, address) as it makes a direct lookup with no address matching or postcode re-fetch.

The parameter is named lmk_key as a compatibility alias; pass the certificate number, which is returned in every property_epc_summaries row. (property_epc_search is deprecated and raises — do not call it.)

Returns the full EPC certificate, or null only when no such certificate is lodged. A null result means no such certificate is lodged. If the EPC service cannot be reached the tool raises an error instead — never treat an error as evidence that a property has no certificate.

prop_stamp_dutyA

UK Stamp Duty Land Tax (SDLT) calculation with full breakdown.

prop_rightmove_searchC

Fetch Rightmove listings for a postcode.

listing_type: "sale" or "rent". sort_by: "newest", "most_reduced", "price_asc", "price_desc". Images are excluded from results.

prop_rightmove_listingA

Full detail for a single Rightmove listing.

property_id is the numeric Rightmove property ID (the digits at the end of a rightmove.co.uk/properties/... URL), max 12 digits. Full URLs are not accepted. include_images fetches and embeds photos and floorplans as MCP image content. max_images caps the number of property photos (default 3); floorplans always included.

prop_property_blocksB

Property block analysis — identify buildings with multiple flat sales (block-buy opportunities).

prop_company_searchB

Search Companies House for a company by name.

prop_planning_searchA

Find the council planning portal URL for a postcode.

prop_ppd_transactionsA

Land Registry Price Paid transactions for a postcode, most recent first.

Returns up to limit most recent transactions within snapshot coverage (coverage_from-coverage_to in the response's provenance). Unfiltered by default -- category-B bulk transfers and commercial sales are included. Pass property_type (F=flat, D=detached, S=semi, T=terraced, O=other) to restrict the result to a single type.

Not a complete property history. Check provenance.older_records_exist and provenance.sample_complete before saying anything about what a property has or has not sold for. An empty result means "no sales within the stated coverage" -- never "never sold". For clean residential comparable sales, use property_comps.

Prompts

Interactive templates invoked by user choice

NameDescription
law_legislation_summarise_actSummarise a UK Act of Parliament or Statutory Instrument. Produces a structured legal summary covering purpose, key definitions, operative provisions, territorial extent, and commencement status.
law_legislation_compare_legislationCompare two pieces of UK legislation on a specific topic. Useful for comparing original Act vs amending SI, or equivalent provisions across jurisdictions (e.g. England vs Scotland).
law_parliament_policy_reception_reviewReview how a policy topic is being received in Parliament, with citable evidence. Orchestrates the deterministic parliament_* tools and hansard:// resources. Does NOT label named members as 'supporters' or 'opponents' from short snippets — instead instructs the model to quote and cite directly.
law_parliament_member_record_on_topicAssemble the citable record of a parliamentarian's contributions on a topic. Returns their own words, in their own context, with citation metadata. Does not classify their position — that is the caller's interpretation to make.
prop_investment_analysisEvaluate a UK property as a buy-to-let investment. Calls comps + yield + EPC + stamp duty, then synthesises a yield + tax + risk summary. Defaults assume an investor (additional_property=true).
prop_area_comparisonCompare 2-3 UK postcodes side-by-side for area-level investment evaluation. Postcodes passed as a comma-separated string (e.g. "NG1 2NS, DE12 7DH").
prop_full_property_analysisComprehensive UK property analysis — composes comps, yield, EPC, asking prices, then synthesises. This is a workflow prompt, not a single API call. The LLM follows the instructions below to call the four primitive tools and synthesise the results explicitly, so every input is visible in the conversation.

Resources

Contextual data attached and managed by the client

NameDescription
About this serverProvenance, upstream APIs, and operational posture.
councils_list_resourceReturn the 99-council UK planning portal registry as JSON. Static reference data sourced from property_core/planning_councils.json. Lets callers read the full registry once instead of calling planning_search for individual lookups.
sdlt_bands_resourceReturn the current UK Stamp Duty Land Tax band schedule as JSON. Static reference data matching `property_core/stamp_duty.py` exactly. Lets an LLM cite the bands directly without calling the stamp_duty calculator.
epc_ratings_resourceReturn EPC band definitions and score ranges as JSON. Canonical reference for UK domestic Energy Performance Certificate bands (A best, G worst), with SAP score ranges and one-line meanings. Grounds LLM explanations of EPC results in published reference data rather than training-data recall.

TDQS

B3.2/5.0

Scored across 74 tools

Disambiguation2/5

Multiple tools overlap significantly within domains: prop_property_epc, prop_property_epc_summaries, prop_property_epc_search (deprecated but present) all handle EPC data, and gov_govuk_search vs gov_govuk_grep_content vs gov_govuk_get_section vs gov_govuk_get_content cover overlapping content retrieval. Several DD tools (dd_company_search vs prop_company_search, dd_search vs dd_fetch) duplicate functionality with unclear distinctions. The prefixes help, but within each cluster an agent will struggle to select the right tool.

Naming Consistency2/5

Naming is inconsistent across modules: some use domain prefixes with snake_case verbs (gov_govuk_search, law_judgment_get_header), others use short opaque prefixes with no clear pattern (dd_search, prop_company_search), and one uses a different hierarchy (prop_property_epc vs prop_epc_certificate). The `law_` prefix mixes legal and DD tools inconsistently, and deprecated tools remain visible. No uniform verb_noun or consistent prefix convention.

Tool Count1/5

74 tools is far beyond the well-scoped range, and the surface appears to bundle four independent domains (GOV.UK content, legal research, due diligence, property data) into one server. Many tools are near-duplicates (e.g., dd_company_search vs prop_company_search; prop_property_epc vs prop_property_epc_summaries), and the deprecated prop_property_epc_search should be removed. The count itself creates selection overhead that outweighs any benefit.

Completeness2/5

Each domain has notable gaps: GOV.UK lacks a tool to fetch full page content (only sections via govuk_get_section); property data has search and EPC tools but no explicit valuation or sale-date filtering beyond vague descriptions; law covers judgments/legislation/Hansard but lacks tools for court documents or lower-court records. The due-diligence domain is the most complete, but the overall surface has no cohesive workflow — it is four partial APIs stapled together. Deprecated tools and missing document retrieval (dd_company_filing_document requires a resource-capable client) create dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive