canada-parliament-mcp-server
Server Details
Track Canadian federal bills, MPs, House votes, and Hansard speeches.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/canada-parliament-mcp-server
- GitHub Stars
- 1
- Server Listing
- canada-parliament-mcp-server
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: get_* for fetching single entities, search_* for finding collections, and list_reference for vocabulary. The boundaries between get_bill vs search_bills, get_member vs search_members, and get_vote vs search_votes are explicitly clarified in the descriptions.
All tools follow a consistent canparl_ prefix plus verb_noun pattern (get_bill, search_bills, list_reference). Snake_case is used uniformly with no deviations.
Eight tools are well-scoped for a parliamentary data server, covering bills, members, votes, speeches, and reference vocabulary without redundancy. Each tool earns its place in the lifecycle.
The surface covers House bills, members, votes, speeches, and reference data well, but notable gaps exist for a 'parliament' server: no Senate member lookup (despite bills covering both chambers) and no committee tools. These omissions could cause dead ends for agents needing upper-chamber or committee information.
Available Tools
8 toolscanparl_get_billCanparl Get BillARead-onlyIdempotentInspect
Read one House or Senate bill's official dossier. Large dossiers return an outline; re-call with one section and follow pagination.nextOffset for collections. Stages preserve nested records whole. Obtain billCode and session from canparl_search_bills; omitted session means the verified current official session.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum whole records per selected collection page, 1–100 per call; larger values up to 10000 return 100 with a notice, and the byte budget may reduce it. | |
| offset | No | Zero-based whole-record offset within the selected collection. | |
| section | No | One section from the returned outline; omit for full dossier or overflow outline. | |
| session | No | Parliamentary session; omitted means current. | |
| billCode | Yes | Bill code from canparl_search_bills, including a split-bill suffix letter such as C-15A; accepts bill s321, S321, S 321, or S-321. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bill | No | Official bill summary. |
| kind | No | Absent for full dossier; outline lists sections; section returns one selection. |
| error | No | Present when the call failed. Absent on success. |
| notes | No | Official dossier notes; notes.en and notes.fr sections each return one language. |
| notice | No | Limit clamp or source coverage guidance when applicable. |
| stages | No | All official stage containers. |
| sponsor | No | Official sponsor fields. |
| statute | No | Enacted statute when both year and chapter exist; otherwise null. |
| summary | No | Library of Parliament legislative summary; summary.en and summary.fr sections each return one language. |
| sections | No | Available section selectors. |
| divisions | No | House divisions, or null if unavailable. |
| disclosure | No | Overflow, empty, unavailable, past-end, or response-budget-stop guidance. |
| milestones | No | Reading milestones as UTC instants ending in Z (YYYY-MM-DDTHH:MM:SS[.fraction]Z); a value in another shape is relayed as published. Royal assent is bill.royalAssentDate. |
| pagination | No | Whole-record selection continuation. |
| provenance | No | Original retrieval metadata for every source request. |
| totalCount | No | Selected collection total, or null for unavailable or scalar sections. |
| publications | No | Publications, or null if unavailable. |
| webReferences | No | Related documents, press releases, and costing notes, or null if unavailable. |
| appliedFilters | No | Normalized requested bill identity. |
| senateVoteDetails | No | Complete variable Senate vote records; not House divisions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent, so safety is covered; the description adds the non-obvious behavior that large dossiers degrade to an outline with a continuation offset, and that nested records within stages are preserved intact. It does not mention permission scope or whether the outline call is itself counted against limits, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core action front-loaded and no filler. "Stages preserve nested records whole" is compressed to the point of being slightly cryptic for a first-time caller.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the overflow/outline workflow is the main thing an agent must know before calling. The remaining gap is how section names are shaped and what the notice on oversized limits looks like, but overall it is sufficient to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining that an omitted session means the verified current official session and that section must come from the returned outline. billCode provenance from canparl_search_bills is also reinforced, though the limit/offset semantics stay with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read one House or Senate bill's official dossier"), bounded to a single bill, which cleanly separates it from canparl_search_bills and the other retrieval siblings. An agent knows immediately what this tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit procedural routing: obtain billCode and session from canparl_search_bills, and when the dossier is large, re-call with a single section from the outline and follow pagination.nextOffset. The conditional path for oversized results is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_get_memberCanparl Get MemberARead-onlyIdempotentInspect
Read one House MP by a returned OpenParliament slug or official current personId. Pass exactly one identifier from canparl_search_members detailLookup. Official profiles survive unavailable OpenParliament enrichment. Recent ballots come newest first from the official House member-votes feed when the member has one official personId, filterable by votesSession (default: the member's latest session) and votesBillCode; otherwise from OpenParliament. Sponsored bills and recent ballots are independently pageable; set their limits to zero for profile-only lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | Returned OpenParliament slug, politician path, or HTTPS OpenParliament profile URL; never a guessed name. A digit-only value equal to a current official personId, or its /politicians/<digits>/ path or profile URL, is read as that personId. | |
| personId | No | Decimal official current person ID; distinct from an OpenParliament slug. | |
| billsOffset | No | Zero-based sponsored bill page offset. | |
| recentVotes | No | Ballot rows to return, 0–10 per call; zero disables, and larger values up to 10000 return 10 with a notice. | |
| votesOffset | No | Zero-based ballot page offset. | |
| votesSession | No | Official ballot session such as 44-1; omitted means the member's latest session in the feed. Needs one official personId. | |
| votesBillCode | No | Keep official ballots on this bill, including a split-bill suffix such as C-15A; accepts c15, C 15, or bill C-15. Needs one official personId. | |
| sponsoredBills | No | Sponsored bill rows to hydrate, 0–5 per call; zero disables, and larger values up to 10000 hydrate 5 with a notice. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Bounded workloads after the per-call caps. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Returned activity counts. |
| member | No | Public member profile. |
| notice | No | Workload clamp, coverage, and recovery guidance. |
| truncated | No | Independent source continuations. |
| provenance | No | All successful source retrieval metadata. |
| memberships | No | Source membership history, or null if unavailable. |
| recentVotes | No | Independently pageable activity section. |
| unavailable | No | Explicit unavailable enrichment outcomes. |
| appliedFilters | No | Normalized lookup and independent activity controls. |
| openParliament | No | OpenParliament identity outcome. |
| sponsoredBills | No | Independently pageable activity section. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and openWorldHint, but the description adds substantial behavioral context beyond them: official profiles survive unavailable enrichment, ballots come newest first, votesSession defaults to the member's latest session, and oversized limits cap with a notice. These details materially affect how an agent should invoke and interpret the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well front-loaded: the core read operation and identifier source come first, followed by fallback behavior and paging controls. Every sentence carries operational information, and none is redundant against the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With rich annotations, full schema coverage, and an output schema, the remaining burden is behavioral guidance. The description covers identifier selection, enrichment fallback, ballot-source behavior, session defaults, paging, and limit caps, leaving no material gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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, and the schema already documents parameters thoroughly. The description still adds useful cross-parameter guidance: pass exactly one identifier, use zero limits for profile-only lookup, and remember votesSession and votesBillCode require an official personId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read one House MP' identified by slug or official personId. It also distinguishes the tool from sibling search tools by naming canparl_search_members.detailLookup as the source of identifiers, so an agent can tell what this tool is for without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to pass exactly one identifier from canparl_search_members detailLookup, explains the fallback between official House data and OpenParliament enrichment, and describes when recent ballots come from each source. It also tells the agent how to get profile-only results by zeroing out the bill and ballot limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_get_voteCanparl Get VoteARead-onlyIdempotentInspect
Read a recorded House division, its full official tally, party totals, and a page of individual ballots. Ballot, personId, party, and province filters affect the ballot page only; nonvoters are absent. Omitted session means the verified current official session. Follow nextOffset with identical filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum returned ballots, 1–400 per call, default 30; larger values up to 10000 clamp to 400 with a notice. A page ends early at the 24000-byte response budget; follow nextOffset. | |
| party | No | Canonical official caucus or certain Bloc/Green alias; historical observed caucuses are accepted. | |
| ballot | No | Recorded ballot Yea, Nay, or Paired, case-insensitive; Yes and No are accepted as Yea and Nay. | |
| number | Yes | Division number returned by canparl_search_votes or canparl_get_bill. | |
| offset | No | Zero-based offset in the selected ordering. | |
| session | No | Parliamentary session; omitted means current. | |
| personId | No | Decimal official person ID from canparl_search_members detailLookup or a ballot row; matches this division's recorded participants, including members no longer seated. | |
| province | No | English province/territory name or one of the 13 postal codes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective ballot page limit after the per-call cap. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Returned ballot count. |
| tally | No | Official counts independent of local filters. |
| notice | No | Limit clamp, nonvoter, mismatch, empty, past-end, or response-budget guidance. |
| ballots | No | Matching ballots ordered by caucus, surname, given name, then personId. |
| byParty | No | Complete unfiltered participant aggregation by source caucus. |
| division | No | Verified full-session division metadata. |
| truncated | No | Whether more matching ballots remain, including after a response-budget stop. |
| pagination | No | Continuation within matching ballots; nextOffset is offset plus ballots returned. |
| provenance | No | Retrieval metadata for every source request. |
| totalCount | No | Matching ballot count before pagination. |
| ballotsTotal | No | Complete recorded participant count. |
| appliedFilters | No | Normalized ballot filters and division identity. |
| ballotsMatched | No | Exact matching count before pagination. |
| tallyMatchesBallots | No | Whether all three official counts match participants; null if any count is absent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, openWorld, so the safety profile is covered. The description adds genuinely non-obvious behavior: ballot/personId/party/province filters apply only to the ballot page, nonvoters are omitted from results, and pagination must continue with identical filters + nextOffset. It does not restate the safety annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with what is returned, then filter scoping, then the session default, then the pagination instruction. Nothing is redundant and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, a fully documented 8-parameter schema, and readOnly/idempotent annotations, the remaining burden is behavioral nuance — filter scope, nonvoter absence, and nextOffset continuation — all of which the description covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline 3 would be defensible, but the description adds meaning the schema doesn't: it clarifies that four of the filters scope only the ballot page (not the tally), and that an omitted session resolves to the verified current session. This is real semantic lift beyond the field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource set (a recorded House division, official tally, party totals, and a page of individual ballots), which is enough to distinguish it from canparl_search_votes by scope. It stops short of naming the sibling, so an agent must infer the search-then-fetch relationship (which only the schema's `number` description supplies).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains behavioral scoping clearly (filters affect only the ballot page; nonvoters are absent) and the session default, which implies when the tool is appropriate. However, it never states when to choose this over canparl_search_votes or how to obtain the required division number; that routing information lives only in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_list_referenceCanparl List ReferenceARead-onlyIdempotentInspect
List canonical session coverage and bill, division, and caucus vocabulary. Use source-specific terms when constructing filters. Omitted session means the verified current session for vocabulary. For topic sessions omit session; the entire global index is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Reference topic used to construct source-specific filters. | |
| session | No | Parliamentary session; omitted means current. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Complete reference entry count; no display cap is imposed. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | All returned reference entries. |
| topic | No | Reference topic used to construct source-specific filters. |
| notice | No | Catalog-only or historical coverage guidance. |
| entries | No | Complete bounded reference vocabulary or real session union. |
| session | No | Selected session, or null for the global session index. |
| truncated | No | Always false: the entire vocabulary is returned. |
| provenance | No | Source retrieval metadata. |
| totalCount | No | Exact number of reference entries. |
| appliedFilters | No | Resolved reference scope. |
| currentSession | No | Current session verified from the official default bill feed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered. The description adds genuine behavioral context beyond that: the omitted-session default resolves to the 'verified current session', and for topic=sessions the entire global index is returned when session is omitted — a non-obvious behavior worth disclosing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and followed by the two behavioral rules; little waste. Minor noise from the loose 'bill, division, and caucus' enumeration that doesn't match the enum verbatim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and 100% schema descriptions, the description only needs to carry defaults and special cases — which it does. It stops short of saying whether the returned vocabulary is exhaustive or how often session coverage changes, but nothing critical to invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes slightly beyond it by stating a cross-parameter rule not encoded anywhere in the schema: topic=sessions requires omitting session to get the global index, and it labels the default session as 'verified current'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'List' plus the objects (session coverage, bill/division/caucus vocabulary) make it clear this is a reference/vocabulary lookup rather than a data retrieval tool, which implicitly separates it from the get_/search_ siblings. The phrasing 'bill, division, and caucus vocabulary' only loosely maps to the actual enum values (bill_statuses, vote_results, vote_document_types, parties), so the exact scope needs a schema peek.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use source-specific terms when constructing filters' implies this should be consulted before building queries against the search tools, and the topic=sessions rule is stated. However, it never names an alternative tool or says explicitly 'call this before canparl_search_bills', leaving the routing inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_search_billsCanparl Search BillsARead-onlyIdempotentInspect
Find House and Senate bills in one session by title, number, type, chamber, status, or indexed MP sponsor. Sponsor results are the OpenParliament-indexed subset; fetch a bill for its sponsor, stages, divisions, and statute citation. Omitted session means the verified current official session. Follow nextOffset with identical filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows, default 25, effective cap 100; values through 10000 are accepted and clamp with a notice. Whole records may end the page early at the 24000-byte response budget; follow nextOffset. | |
| offset | No | Zero-based offset in the selected ordering. | |
| status | No | Official bill status from canparl_list_reference topic bill_statuses. | |
| session | No | Parliamentary session; omitted means current. | |
| sponsor | No | MP OpenParliament slug or politician path/HTTPS URL (member.slug from canparl_get_member, or an includeFormer canparl_search_members row), or a current MP's official personId; Senators are not indexed. A digit-only value equal to a current personId, or its /politicians/<digits>/ path or profile URL, is read as that personId. | |
| billCode | No | Exact bill code, including a split-bill suffix letter such as C-15A; accepts bill s321, S321, S 321, or S-321. | |
| billType | No | Official bill type from canparl_list_reference topic bill_types. | |
| titleContains | No | Literal case-insensitive substring of any English or French long or short title. | |
| originatingChamber | No | House, House of Commons, or Senate; case-insensitive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective page limit after the per-call cap. |
| bills | No | Matching official bills ordered by chamber prefix, number, then split-bill suffix letter. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of bills in this page. |
| total | No | Exact matching count after all filters and before pagination. |
| notice | No | Limit clamp, coverage, empty-result, past-end, or response-budget guidance. |
| session | No | Verified official parliament-session token. |
| truncated | No | Whether more matching bills remain after this page. |
| pagination | No | Local continuation in the filtered ordering, including a response-budget stop. |
| provenance | No | Original retrieval metadata from all source requests. |
| totalCount | No | Exact matching count before slicing. |
| appliedFilters | No | Normalized filters applied together with AND. |
| sponsorCoverage | No | Whether the result is restricted to the third-party sponsor index. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the bar is lower; the description still adds real behavior: sponsor results are only the OpenParliament-indexed subset, an omitted session resolves to the 'verified current official session', and pagination must reuse identical filters. It does not discuss the response-size/byte-budget truncation behavior, though that is covered by the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the primary capability, followed by scope caveat, default, and pagination rule. No sentence is redundant or restates the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering the safety profile, and full param documentation in the schema, the description supplies exactly the missing connective guidance: sibling routing, sponsor-coverage limitation, session default, and pagination continuation. Nothing needed to invoke it correctly appears absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 earns a point by summarizing which fields act as combinable filters and by flagging the sponsor-indexing caveat and session defaulting in agent-facing terms. It adds no syntax detail beyond the schema (slug formats, billCode variants, status reference topics are schema-only).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Find') plus the resource ('House and Senate bills') and enumerates the filterable dimensions (title, number, type, chamber, status, indexed MP sponsor). It also explicitly distinguishes itself from the sibling read tool by saying a bill must be fetched for sponsor, stages, divisions, and statute citation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative path — 'fetch a bill for its sponsor, stages, divisions, and statute citation' — which routes the agent to canparl_get_bill when detail is needed rather than search. It also states the default when session is omitted and the pagination contract ('follow nextOffset with identical filters'), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_search_membersCanparl Search MembersARead-onlyIdempotentInspect
Find current House MPs by name, riding, province, or caucus. Set includeFormer for OpenParliament's historical name index; historical rows may contain only a name and slug. Follow nextOffset with identical filters and use detailLookup with canparl_get_member.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Current: literal name substring. Historical: one token is surname lookup; multiple tokens are full recorded name lookup, not substring search. | |
| limit | No | Maximum rows, default 25, effective cap 100; values through 10000 are accepted and clamp with a notice. Whole records may end the page early at the 24000-byte response budget; follow nextOffset. | |
| party | No | Official caucus name; Bloc and Green aliases accepted; current roster only. | |
| offset | No | Zero-based offset in the selected ordering. | |
| riding | No | Literal riding substring; current roster only. | |
| province | No | Province postal code or full English name; current roster only. | |
| includeFormer | No | Use the sparse historical name index instead of the complete current official roster. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective page limit after the per-call cap. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Returned row count. |
| total | No | Exact filtered current count; null for historical index. |
| notice | No | Limit clamp, empty page, historical coverage, or response-budget guidance. |
| members | No | Returned member identities. |
| truncated | No | More queried rows remain. |
| pagination | No | Continuation in the selected source ordering. |
| provenance | No | Original source retrieval metadata. |
| totalCount | No | Exact filtered current roster count; absent for historical searches. |
| appliedFilters | No | Normalized AND filters and name semantics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, open-world behavior. The description adds non-obvious operational behavior: historical rows may contain only a name and slug, and pagination requires repeating the same filters via nextOffset. It also clarifies that includeFormer switches to a sparse historical index rather than the complete current roster.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is three sentences, front-loaded with core purpose, then historical caveat, then pagination and detail-routing instructions. Every sentence carries useful information with no wasted framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema is present, so the description need not explain return structure. It still covers scope, historical sparsity, pagination continuation, and the route to canparl_get_member for detail, which is sufficient for this read-only search tool with complete schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters, including name lookup modes, limit clamping, and province formats. The description adds little parameter-specific syntax beyond explaining the effect of includeFormer and the sparsity of historical rows, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Find'), resource ('current House MPs'), and filter axes (name, riding, province, caucus). It also distinguishes the historical mode via includeFormer and points detailed lookups to canparl_get_member, so an agent can separate it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states that the default is current MPs, instructs the agent to set includeFormer for the historical name index, tells it to follow nextOffset with identical filters, and directs detail lookups to canparl_get_member. This provides clear when-to-use guidance and an explicit sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_search_speechesCanparl Search SpeechesARead-onlyIdempotentInspect
Find indexed House Hansard speeches by speaker, bill debated or mentioned, or date. contains scans at most 100 candidate speeches per call; follow nextOffset without changing filters until exhausted before drawing a negative conclusion.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum returned matches, 1–10 per call; larger values up to 10000 clamp to 10 with a notice. A page ends early at the 24000-byte response budget, returning at least one match whole. Candidate pages contain 20 rows. | |
| dateTo | No | Inclusive Ottawa civil date upper bound, YYYY-MM-DD; independently optional. | |
| offset | No | Raw candidate offset; keep every filter identical when continuing. | |
| contains | No | Local case-insensitive Unicode-normalized literal English text substring; cannot be the only scope. | |
| dateFrom | No | Inclusive Ottawa civil date lower bound, YYYY-MM-DD; independently optional. | |
| politician | No | Speaker OpenParliament slug or exact politician path/HTTPS URL (member.slug from canparl_get_member, or an includeFormer canparl_search_members row), or a current MP's official personId. A digit-only value equal to a current personId, or its /politicians/<digits>/ path or profile URL, is read as that personId. | |
| billDebated | No | Bill debated; combined with all other scopes using AND. | |
| mentionedBill | No | Bill mentioned; combined with all other scopes using AND. | |
| substantiveOnly | No | Exclude procedural remarks when true; false includes substantive and procedural remarks. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective maximum returned matches after the per-call cap. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of returned matching speeches. |
| notice | No | Limit clamp, coverage, continuation, procedural-filter, unavailable affiliation, and response-budget guidance. |
| scanned | No | Raw candidates visited, including excluded committee records; at most 100. A response-budget stop ends it before the first match not returned. |
| speeches | No | Matching House speeches in source order with complete English prose. |
| exhausted | No | True only after visiting every row of a source-terminal page. |
| truncated | No | Whether raw candidates remain to be scanned; not an exact count of further matches. |
| nextOffset | No | First unvisited raw candidate offset, or null when exhausted; after a response-budget stop, the first match not returned. |
| provenance | No | Original retrieval metadata for scope validation, candidate pages fetched before the page ended, and memberships of returned speeches. |
| appliedFilters | No | All normalized filters applied with AND; bill relationships rely on the source endpoint. |
| excludedCommittees | No | Visited candidates excluded because they were not House debate documents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuinely useful context beyond the annotations: the 100-candidate cap per call and the warning against drawing a negative conclusion before exhausting pagination. With readOnlyHint/idempotentHint already covering the safety profile, this is exactly the kind of extra operational context that earns credit. Its only flaw is the "nextOffset" naming, which blurs whether it refers to a response field or the offset input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose before the operational caveat; no filler. The second sentence is dense but each clause carries a distinct instruction (cap, pagination continuity, negative-conclusion warning). The only nit is the inconsistent "nextOffset" term.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and annotations already cover read-only/idempotent/open-world semantics, so the description needs only purpose and pagination guidance; it provides both. The 100-candidate cap and the 'exhaust before concluding absence' rule are the key non-obvious facts for a search tool. The remaining gap is the offset/nextOffset terminology mismatch.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters such as limit, dateFrom/dateTo, contains, and billDebated/mentionedBill are already fully documented, including the clamp behavior. The description only restates the filter dimensions (speaker, bill, date) without adding syntax or edge-case meaning beyond what the schema provides, so it sits at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific verb+resource ("Find indexed House Hansard speeches") and enumerates the three scope dimensions: speaker, bill debated/mentioned, and date. The resource is unambiguously distinct from siblings like canparl_search_bills, canparl_search_votes, and canparl_get_member, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains pagination behavior: it returns up to 100 candidate speeches, and the agent should follow nextOffset with unchanged filters until exhausted before concluding a negative. However, it never states when to choose this tool over siblings such as canparl_get_bill for bill details, and the reference to "nextOffset" does not match the input parameter name "offset", which could momentarily confuse an agent about whether it should pass offset or nextOffset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canparl_search_votesCanparl Search VotesARead-onlyIdempotentInspect
Find recorded House divisions in one session by bill, result, document type, date, or subject. Return newest first and pass session plus number to canparl_get_vote. Omitted session resolves from the current official bill feed. Follow nextOffset with identical filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows, default 25, effective cap 100; values through 10000 are accepted and clamp with a notice. Whole records may end the page early at the 24000-byte response budget; follow nextOffset. | |
| dateTo | No | Inclusive Ottawa civil date YYYY-MM-DD; independently optional. | |
| offset | No | Zero-based offset in the selected ordering. | |
| result | No | Official result from vote_results; Passed and Failed are accepted aliases. | |
| session | No | Parliamentary session; omitted means current. | |
| billCode | No | Exact bill code, including a split-bill suffix letter such as C-15A; accepts bill s321, S321, S 321, or S-321. | |
| dateFrom | No | Inclusive Ottawa civil date YYYY-MM-DD; independently optional. | |
| documentType | No | Official category from canparl_list_reference topic vote_document_types. | |
| subjectContains | No | Literal Unicode-normalized case-insensitive subject substring. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective page limit after the per-call cap. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Returned division count. |
| total | No | Exact matching count before pagination. |
| notice | No | Limit clamp, empty-result, past-end, or response-budget guidance. |
| session | No | Resolved official session. |
| divisions | No | Matching divisions, date-time descending then number descending. |
| truncated | No | Whether more matches remain. |
| pagination | No | Continuation within the filtered ordering. |
| provenance | No | Source retrieval metadata. |
| totalCount | No | Exact matching count. |
| appliedFilters | No | Normalized AND filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds genuine behavior beyond them. It discloses result ordering ('newest first'), the default session fallback, and the pagination contract (follow nextOffset with identical filters) — the latter not derivable from the input schema since nextOffset is returned, not passed. Minor gap: it doesn't mention paging can end early before limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the core action and filter list front-loaded, followed by the result-ordering and pagination protocol. No filler. The second sentence compresses two distinct instructions ('newest first' and 'pass to canparl_get_vote'), which slightly blurs structure but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter, all-optional search tool with a live output schema, the description covers the essentials: what is searched, default ordering, session defaulting, and how to page and hand off to canparl_get_vote. With rich annotations and full schema coverage, the remaining omissions (page-size clamping behavior) are already documented in the limit parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already self-documenting (limit caps, date formats, billCode aliases, result aliases). The description adds only the omitted-session resolution rule, which the schema also states, plus the 'identical filters' constraint for offset continuation. Baseline 3 is appropriate given the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find recorded House divisions') plus the exact filter dimensions (bill, result, document type, date, subject) and a scope limit ('in one session'). It also clarifies the boundary against canparl_get_vote by naming the handoff, so an agent can distinguish this search tool from its detail-fetch sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational guidance: search here, then pass 'session plus number to canparl_get_vote', and follow nextOffset with identical filters. It explains session omission ('resolves from the current official bill feed'), which is a real decision point. It stops short of explicit exclusions (e.g. use canparl_search_bills for bill text), so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- First observed
canparl_get_bill - First observed
canparl_get_member - First observed
canparl_get_vote - First observed
canparl_list_reference - First observed
canparl_search_bills - First observed
canparl_search_members - First observed
canparl_search_speeches - First observed
canparl_search_votes
Related MCP Connectors
U.S. federal policy data — bills, Congress members, voting records, and civic info.
Search MPs and Lords, fetch profiles, synopses, and Westminster constituencies
OpenParliament.ca MCP — civic-tech mirror of the Parliament of Canada
Access U.S. congressional data (bills, votes, members, committees) via MCP.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceProvides access to Canadian federal parliamentary data (debates, bills, MPs, votes, Hansard transcripts) and legal information (case law and legislation through CanLII) for research and analysis.3MIT
- AlicenseNot gradedqualityBmaintenanceProvides access to Canadian parliamentary data including debates, bills, votes, politicians, and committees via the OpenParliament.ca civic-tech mirror.11 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying UK Parliament data including MPs, Lords, bills, Hansard debates, and divisions.6 npmMIT
- AlicenseAqualityCmaintenanceSearch Canadian case law, browse legislation, and check citations via the CanLII API.919 npm6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.