Skip to main content
Glama

UK Business Tools - Ledgerhall

Resolve A Hansard Column Citation

law_parliament_lookup_by_column
Read-onlyIdempotent

USE THIS TOOL WHEN you have an OSCOLA-style Hansard citation (column + volume + house) and need the debate.

Example input: 'HL Deb 14 Oct 2025, vol 849, col 200'. AFTER calling, read the contribution at the cited column via read_resource(uri="hansard://debate/{debate_ext_id}/header") — or, equivalently, call parliament_get_debate_contributions(debate_ext_id) for the full list as a structured tool response.

Each match carries:

  • contribution_count — real contribution count from the debate's 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.

Input Schema

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

Output Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / matches / items / properties / debate_id / description
      Previous value: -"Internal Hansard debate ID (DebateSectionId)"New value: +"Internal Hansard debate ID."
  2. Changed5 schema fields changed
    • addedInput schema / properties / column_number
      Added value: +{
      +  "description": "Hansard column number from an OSCOLA footnote, e.g. '200' for 'HL Deb 14 Oct 2025, vol 849, col 200'. String (not integer) to accommodate column suffixes like '1162W' for written answers.",
      +  "maxLength": 20,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / house
      Added value: +{
      +  "default": "both",
      +  "description": "Restrict to one House. Default 'both' searches across both Houses.",
      +  "enum": [
      +    "Commons",
      +    "Lords",
      +    "both"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / params
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "LookupByColumnInput with column_number, volume_number, house.",
      -  "properties": {
      -    "column_number": {
      -      "description": "Hansard column number from an OSCOLA footnote, e.g. '200' for 'HL Deb 14 Oct 2025, vol 849, col 200'. String (not integer) to accommodate column suffixes like '1162W' for written answers.",
      -      "maxLength": 20,
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "house": {
      -      "default": "both",
      -      "description": "Restrict to one House. Default 'both' searches across both Houses.",
      -      "enum": [
      -        "Commons",
      -        "Lords",
      -        "both"
      -      ],
      -      "type": "string"
      -    },
      -    "volume_number": {
      -      "description": "Hansard volume number (the 'vol 849' part of an OSCOLA citation). Required — the endpoint only resolves citations when given the volume; sitting date is NOT a substitute (verified live 2026-05-29).",
      -      "exclusiveMinimum": 0,
      -      "type": "integer"
      -    }
      -  },
      -  "required": [
      -    "column_number",
      -    "volume_number"
      -  ],
      -  "type": "object"
      -}
    • addedInput schema / properties / volume_number
      Added value: +{
      +  "description": "Hansard volume number (the 'vol 849' part of an OSCOLA citation). Required — the endpoint only resolves citations when given the volume; sitting date is NOT a substitute (verified live 2026-05-29).",
      +  "exclusiveMinimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "params"
      -]New value: +[
      +  "column_number",
      +  "volume_number"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / params / description
      Previous value: -"LookupByColumnInput with column_number (string), volume_number\n(int), and optional house. Date is NOT a valid lookup key — the\nendpoint requires the volume number."New value: +"LookupByColumnInput with column_number, volume_number, house."
  4. Changed3 schema fields changed
    • changedOutput schema / properties / matches / description
      Previous value: -"Debate sections containing the cited column, in upstream relevance order. Each element's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header. Empty when the citation does not resolve — typically because the column is from a Daily Part (not yet consolidated into a Bound Volume) or the volume number is wrong."New value: +"Debate sections containing the cited column, in upstream relevance order. Each element's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header, and carries `source`/`source_code` for the citation's publication state. Resolution is NOT gated on publication state — Daily Part, Bound Volume, and Historic columns all resolve. Empty matches typically mean the volume number is wrong (running-volume vs bound-volume number), the column is a Written Answer/Statement needing its suffix (e.g. '1162W'), or a very recent column not yet indexed upstream."
    • addedOutput schema / properties / matches / items / properties / source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Human-readable Hansard publication state (Swagger Source enum name). Tells a lawyer the citation's finality — RollingHansard/DailyHansard are pre-consolidation, BoundVolume/Historic are final bound volumes. Does NOT indicate whether the citation resolves: column lookup resolves across all four states."
      +}
    • addedOutput schema / properties / matches / items / properties / source_code
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Raw Hansard Overview.Source ordinal: 1=RollingHansard, 2=DailyHansard, 3=BoundVolume, 4=Historic. Populated only when the emitting tool fetches the debate payload (today: parliament_lookup_by_column); null otherwise."
      +}
  5. Changed8 schema fields changed
    • changedOutput schema / properties / matches / items / description
      Previous value: -"A top debate section by contribution volume in the sampled window."New value: +"A top debate section returned as a search/lookup preview or aggregate result."
    • addedOutput schema / properties / matches / items / properties / contribution_count / anyOf
      Added value: +[
      +  {
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / properties / matches / items / properties / contribution_count / default
      Added value: +null
    • changedOutput schema / properties / matches / items / properties / contribution_count / description
      Previous value: -"Number of contributions in this debate matching the topic"New value: +"Number of contributions in this debate. Populated only when the emitting tool fetches the debate's full Items list (today: parliament_lookup_by_column). Null on preview arrays where the secondary fetch is too costly."
    • removedOutput schema / properties / matches / items / properties / contribution_count / minimum
      Removed value: -0
    • removedOutput schema / properties / matches / items / properties / contribution_count / type
      Removed value: -"integer"
    • addedOutput schema / properties / matches / items / properties / relevance_rank
      Added value: +{
      +  "anyOf": [
      +    {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Upstream Hansard relevance score for this debate against the search query (0–100). Populated for relevance-scored searches (parliament_search_hansard, parliament_policy_position_summary). Null for column-lookup matches — the column-search endpoint does not rank."
      +}
    • changedOutput schema / properties / matches / items / required
      Previous value: -[
      -  "debate_id",
      -  "debate_ext_id",
      -  "debate_title",
      -  "date",
      -  "house",
      -  "contribution_count"
      -]New value: +[
      +  "debate_id",
      +  "debate_ext_id",
      +  "debate_title",
      +  "date",
      +  "house"
      +]
  6. Added

TDQS

A4.9/5.0
Behavior5/5

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

The description adds important behavioral details beyond annotations: resolution is not gated on publication state, empty matches mean a likely incorrect volume or written statement (not fabrication), and the tool surfaces failures as instructed. This complements the readOnlyHint and idempotentHint by explaining edge-case behavior.

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

Conciseness5/5

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

The description is front-loaded with the usage trigger, includes a concrete example, and is logically organized: usage, follow-up instructions, match fields, failure modes, and authoritative source. Every sentence contributes distinct value—no redundant or filler text.

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

Completeness5/5

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

Despite having a rich schema and annotations, the description additionally covers output fields, next-step tool usage, interpretation of empty results, and the tool's authority. This makes the description complete and self-contained for an agent to invoke and act on the result reliably.

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

Parameters4/5

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

The schema already documents all three parameters thoroughly (100% coverage), so the baseline is 3. The description goes further by noting that column_number is a string to accommodate suffixes like 'W', and that volume_number was 'verified live 2026-05-29', plus explains how incorrect volume numbers cause empty matches. This adds interpretive value beyond the schema.

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

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: resolving OSCOLA Hansard column citations. It gives an explicit example input and distinguishes itself from sibling tools by directing the user to read_resource or parliament_get_debate_contributions as follow-up steps, making the tool's role very specific.

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

Usage Guidelines5/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' and specifies the exact citation format required. It also explains when not to worry about empty matches (wrong volume or written statement) and suggests alternative actions, providing strong contextual guidance for tool selection and next steps.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources