UK legal research covering case law, legislation, Hansard, bills, parliamentary votes, and HMRC guidance.
Do not connect
A critical issue was found. Do not connect this server as-is.
Scanned 1 month ago Due for re-check
A server can change after it's graded. Re-run the automated scan to refresh this report.
This grade is deterministic and reproducible: the same server surface always yields the same grade under a given algorithm version. It is a real automated assessment computed by the MCPGrade engine from what the probe actually observed — not a fabricated or opinion score. It is not a manual human pentest, so it can miss context-specific risks.
Every signal below was measured directly by the automated probe. The grade is derived only from evidence like this — nothing is assumed.
The uk-legal-mcp MCP server exposes 35 tools, focused primarily on developer, AI, and network capabilities. Its published description reads: "UK legal research covering case law, legislation, Hansard, bills, parliamentary votes, and HMRC guidance". It communicates over Streamable HTTP using the 2025-06-18 protocol revision, and does not require authorization to connect. MCPGrade currently rates uk-legal-mcp F — a critical issue was found and the server should not be connected as-is. Its most notable findings include "Hidden instructions in a tool description" and "Cross-tool shadowing". This report is a deterministic, reproducible automated assessment: the same observed surface always yields the same grade under a given algorithm version, and it is refreshed as new scans arrive and free to read — but it is not a substitute for a manual human security review. Always re-check uk-legal-mcp's advertised tools, transport security, and authorization posture before connecting an autonomous agent or sharing sensitive context with it.
Add uk-legal-mcp to an MCP client using the endpoint below. Review the grade and findings above before granting an autonomous agent access.
MCP endpoint
https://uk-legal-mcp.fly.dev/mcpStreamable HTTP transport. This is the MCP endpoint, not a website — paste it into your MCP client server list rather than a browser.
Captured passively during the read-only scan. Click any value to find servers that match it.
The tools this server advertises via tools/list — names, purposes, and the parameters each accepts, exactly as enumerated read-only.
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 di
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 fro
Sorted worst-first. Each finding shows its severity, what it means, its OWASP MCP Top-10 mapping, and a recommended fix — the check id links to the exact methodology row that produced it.
tool: hmrc_get_vat_rate
A tool description contains imperative text aimed at the model (e.g. "ignore previous", "before answering read …").
or exceptions. IMPORTANT: Uses a static lookup table current as of 22 NovRecommendationRemove model-directed instructions from tool descriptions.
tool: judgment_get_header
A tool description tries to alter the model’s use of another tool.
ER calling, use judgment_get_index to discover paragraphs, then judgment_get_paragRecommendationDescriptions must describe only their own tool.
tool: judgment_get_index
A tool description tries to alter the model’s use of another tool.
urned list into judgment_get_paragraph to read that paragraph's full text, or use caseRecommendationDescriptions must describe only their own tool.
tool: judgment_get_paragraph
A tool description tries to alter the model’s use of another tool.
ull text. Call judgment_get_index FIRST to discover available eIds (or use case_lRecommendationDescriptions must describe only their own tool.
tool: case_law_search
A tool description tries to alter the model’s use of another tool.
pass slug into judgment_get_header / judgment_get_index / judgment_get_paragraph (RecommendationDescriptions must describe only their own tool.
tool: case_law_grep_judgment
A tool description tries to alter the model’s use of another tool.
on by eId, call judgment_get_index instead. Pattern is regex; if it doesn't compiRecommendationDescriptions must describe only their own tool.
tool: legislation_search
A tool description tries to alter the model’s use of another tool.
on_get_toc then legislation_get_section for structural drill-in. Filter discipline: `tRecommendationDescriptions must describe only their own tool.
tool: legislation_get_section
A tool description tries to alter the model’s use of another tool.
ternative: call read_resource(uri="legislation://{type}/{year}/{number}/ sectRecommendationDescriptions must describe only their own tool.
tool: legislation_get_toc
A tool description tries to alter the model’s use of another tool.
ction-47') into legislation_get_section for full text. Large statutes (Companies Act 2RecommendationDescriptions must describe only their own tool.
tool: parliament_search_hansard
A tool description tries to alter the model’s use of another tool.
ss a topic, see parliament_policy_position_summary. Authoritative source for UK parliamentary debRecommendationDescriptions must describe only their own tool.
tool: parliament_policy_position_summary
A tool description tries to alter the model’s use of another tool.
index, or call parliament_member_debates for one named member. This is the authoritativRecommendationDescriptions must describe only their own tool.
tool: parliament_find_member
A tool description tries to alter the model’s use of another tool.
ed results (see parliament_search_hansard's anti-bypass note for the Pannick case).RecommendationDescriptions must describe only their own tool.
tool: parliament_find_member
The text tells the model WHEN to call this tool relative to others ("always call first", "before any other tool", "chain to X tool") — a toxic-flow injection that hijacks the agent’s orchestration rather than describing the tool.
rs). CALL THIS BEFORE any tool that filters by member_id — including parliamenRecommendationTool metadata must describe only the tool, never sequence the agent’s calls.
tool: parliament_member_debates
A tool description tries to alter the model’s use of another tool.
search). CALL parliament_find_member(name) FIRST to obtain the integer member_id. TRecommendationDescriptions must describe only their own tool.
tool: parliament_member_interests
A tool description tries to alter the model’s use of another tool.
, gifts). CALL parliament_find_member(name) FIRST to obtain the integer member_id. RRecommendationDescriptions must describe only their own tool.
tool: parliament_get_debate_divisions
A tool description tries to alter the model’s use of another tool.
vision_id` into votes_get_division for the full member-by-member voting recordRecommendationDescriptions must describe only their own tool.
tool: parliament_get_debate_contributions
A tool description tries to alter the model’s use of another tool.
member_debates, parliament_search_hansard) filter by contribution TEXT, dropping membersRecommendationDescriptions must describe only their own tool.
tool: parliament_lookup_by_column
A tool description tries to alter the model’s use of another tool.
ivalently, call parliament_get_debate_contributions(debate_ext_id) for the full list as a structureRecommendationDescriptions must describe only their own tool.
tool: bills_search_bills
A tool description tries to alter the model’s use of another tool.
a bill_id into bills_get_bill for full detail (sponsors, long title, Royal AsRecommendationDescriptions must describe only their own tool.
tool: bills_get_bill
A tool description tries to alter the model’s use of another tool.
ER calling, use parliament_search_hansard(query=bill_short_title) to find the bill's parlRecommendationDescriptions must describe only their own tool.
tool: votes_search_divisions
A tool description tries to alter the model’s use of another tool.
id + house into votes_get_division for the full member-by-member voter lists. AutRecommendationDescriptions must describe only their own tool.
tool: votes_get_division
A tool description tries to alter the model’s use of another tool.
ch_divisions or parliament_get_debate_divisions (which cross-resolves Hansard division refs intRecommendationDescriptions must describe only their own tool.
tool: committees_search_committees
A tool description tries to alter the model’s use of another tool.
mmittee_id into committees_get_committee for current membership, or into committees_searRecommendationDescriptions must describe only their own tool.
tool: committees_get_committee
A tool description tries to alter the model’s use of another tool.
mmittee_id into committees_search_evidence to see what evidence has been submitted to thisRecommendationDescriptions must describe only their own tool.
tool: citations_parse
A tool description tries to alter the model’s use of another tool.
itation through citations_resolve to verify it points at a real document before qRecommendationDescriptions must describe only their own tool.
tool: citations_network
A tool description tries to alter the model’s use of another tool.
itation through citations_resolve to confirm it resolves and to retrieve its canoRecommendationDescriptions must describe only their own tool.
tool: citations_format_oscola
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
parameter "report_series"RecommendationRemove side-channel parameters; constrain tool inputs.
tool: citations_format_oscola
A tool description tries to alter the model’s use of another tool.
THIS TOOL AFTER citations_resolve to produce the correctly formatted OSCOLA citatRecommendationDescriptions must describe only their own tool.
tool: hmrc_get_vat_rate
A tool description tries to alter the model’s use of another tool.
inst GOV.UK via hmrc_search_guidance.RecommendationDescriptions must describe only their own tool.
The server accepts tool enumeration (and likely invocation) with no authentication.
RecommendationRequire OAuth 2.1 authorization for any server exposing non-public tools.
tool: judgment_get_header
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: judgment_get_index
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: judgment_get_paragraph
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: case_law_search
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: case_law_grep_judgment
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: legislation_search
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: legislation_get_section
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: legislation_get_toc
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_search_hansard
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_policy_position_summary
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_find_member
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_member_debates
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_member_interests
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_search_petitions
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_get_debate_divisions
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_get_debate_contributions
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: parliament_lookup_by_column
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: bills_search_bills
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: bills_get_bill
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: votes_search_divisions
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: votes_get_division
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: committees_search_committees
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: committees_get_committee
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: committees_search_evidence
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: citations_resolve
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: citations_network
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: hmrc_check_mtd_status
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: hmrc_search_guidance
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: list_prompts
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: get_prompt
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: list_resources
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: read_resource
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
Vantaj uptime monitoring via MCP — manage monitors, heartbeats, incidents, and status pages.
Unified gateway to Algeria's TKAWEN ecosystem: commerce, certification, and AI tools.
Provides access to the Cohereon Doctrine AI safety framework with governance components, tiered access, and agent onboarding.
Agentic rails for complex workflows with receipts, fees, and MCP tool access.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.
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 para
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 calli
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
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,
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 pros
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: Defi
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, contribut
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.
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 s
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
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.
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. Filte
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, deba
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 —
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
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
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
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 vot
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 accu
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
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_evi
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 l
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 report
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, legislatio
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
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 ed
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 conditi
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 trad
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 o
List all available prompts. Returns JSON with prompt metadata including name, description, and optional arguments.
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.
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}
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 c