Skip to main content
Glama

Resolve A Hansard Column Citation

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.6/5.0
Behavior5/5

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

Annotations already cover read-only, idempotent, non-destructive. The description adds rich behavioral detail: resolution is not gated on publication state, empty matches typically mean volume_number is wrong or a Written Statement, and the warning not to interpret empty matches as fabrication. It also discloses the live verification that sitting date is not a substitute for volume. This exceeds 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.

Conciseness4/5

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

The description is lengthy but well-structured: it leads with the primary usage, gives an example, then covers match fields, troubleshooting, and an authoritative note. Every section earns its place, though it could be tightened. The front-loading of 'USE THIS TOOL WHEN' is effective.

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 output schema exists and annotations cover safety, the description is thorough: it explains match contents, source codes, failure modes, and how to proceed after a successful lookup. It also provides an alternative route to contributions, making it self-sufficient for an agent to call 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 coverage is 100%, so baseline is 3. The description adds value by explaining the string type for column_number (to handle suffixes like '1162W') and reinforcing that volume_number is mandatory and cannot be replaced by a date. It also links empty matches to likely incorrect volume_number, which aids parameter interpretation. This goes slightly beyond 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 opens with an explicit directive ('USE THIS TOOL WHEN you have an OSCOLA-style Hansard citation...') and a concrete example ('HL Deb 14 Oct 2025, vol 849, col 200'). It states the resource (Hansard column resolution) and the output (matches with contribution metadata), making the tool's purpose unambiguous and distinct from general search tools.

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?

It clearly specifies when to use this tool: when you have a column+volume+house citation. It also gives a follow-up path (read_resource or parliament_get_debate_contributions) and troubleshooting for empty matches. However, it does not explicitly state when NOT to use it or name alternative tools like parliament_search_hansard or citations_resolve as competing options, so it falls short of the full 5.

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.