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. Dates show when Glama detected each change.

  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?

The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the bar is lower. The description adds meaningful behavioral context: resolution is not gated on publication state, empty matches typically indicate a volume-number issue or written statement rather than a fabricated citation, and the failure should be surfaced. This goes well beyond the annotations without contradicting them.

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

Conciseness4/5

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

The description is front-loaded and well-structured with clear sections, and most sentences earn their place. The closing 'Authoritative source' line is somewhat rhetorical and the 'Each match carries' section may duplicate output schema details, making it slightly longer than necessary while still being coherent.

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 and rich annotations, the description is complete: it tells the agent exactly when to invoke, how to interpret matches, what empty results mean, and what follow-up actions to take. It also differentiates itself from sibling tools well enough for correct selection.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by providing a concrete OSCOLA example, emphasizing that volume_number is required and a sitting date is not a substitute, and explaining that column_number is a string to accommodate suffixes like '1162W'. This goes beyond the schema's field-level 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 title and opening line clearly define the tool's purpose: resolving an OSCOLA-style Hansard citation to the corresponding debate. It explicitly distinguishes this from search-oriented siblings like parliament_search_hansard by naming the exact input form (column + volume + house).

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

Usage Guidelines4/5

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

The description clearly states when to use the tool ('USE THIS TOOL WHEN you have an OSCOLA-style Hansard citation') and provides specific follow-up alternatives (read_resource or parliament_get_debate_contributions). However, it does not explicitly enumerate when-not-to-use cases relative to sibling search tools, so it doesn't reach the maximum.

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.

TDQS

A4.4/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose, with detailed descriptions that prevent ambiguity. Tools covering similar domains (e.g., multiple parliament search tools) are carefully differentiated by their search approach and input requirements.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern (e.g., bills_get_bill, case_law_search, citations_resolve). Even generic tools adhere to this style. No mixing of conventions.

Tool Count4/5

With 35 tools, the count is on the higher side but appropriate for the wide-ranging domain of UK legal research. Each tool contributes to specific sub-domains (bills, case law, citations, committees, HMRC, legislation, parliament, votes) without unnecessary duplication.

Completeness5/5

The tool surface covers nearly all essential aspects of UK legal research: searching and retrieving bills, case law, and legislation; parsing and resolving citations; exploring committee evidence; accessing Hansard debates and member interests; and checking HMRC guidance and VAT rates. Gaps like full judgment text retrieval are mitigated by paragraph-level access and indexing.