# io.github.cyanheads/canada-parliament-mcp-server

> Track Canadian federal bills, MPs, House votes, and Hansard speeches.

- name: io.github.cyanheads/canada-parliament-mcp-server
- version: 0.2.1
- connection class: R0 (autonomous)
- trust: 94/100
- quality: 87/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.cyanheads%2Fcanada-parliament-mcp-server
- tools: https://api.protogrid.dev/v1/servers/io.github.cyanheads%2Fcanada-parliament-mcp-server/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "canada-parliament-mcp-server": {
      "type": "http",
      "url": "https://canada-parliament.caseyjhand.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 100
- provenance: 80
- drivers: +repository +namespace-matches-repo +reachable +uptime-100% +updated-7d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 87/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 86 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 8 of 8 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: canparl_search_bills (destructiveHint); canparl_get_member (destructiveHint); canparl_get_vote (destructiveHint); …
- pass `tools.token_cost`: about 5,427 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 75 (weight 15)

- warn `stability.changes`: 8 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: 100 (weight 15)

- pass `deps.known_vulns`: no known advisory in 130 resolved packages
- pass `deps.mcp_sdk_version`: @modelcontextprotocol/core 2.4.0, no known advisory
- pass `deps.resolvable`: @cyanheads/canada-parliament-mcp-server@0.2.1, @cyanheads/canada-parliament-mcp-server@0.2.1 resolved: 130 packages

- tools: 8, about 5,427 tokens to load them all
- tool set hash: bb8a0eb11c551aa10695d555ad716000
- tools last changed: 2026-11-01T02:06:50.676Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.cyanheads/canada-parliament-mcp-server.svg)](https://protogrid.dev/servers/io.github.cyanheads/canada-parliament-mcp-server)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-11-01 `canparl_list_reference` changed (description, inputSchema, outputSchema)
  - before: 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.
  - after: 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. Topic parties covers the current session only: its entries come from the current House roster, so a past division's caucuses come from canparl_get_vote byParty.
- 2026-11-01 `canparl_search_speeches` changed (inputSchema, outputSchema)
- 2026-11-01 `canparl_get_vote` changed (inputSchema, outputSchema)
- 2026-11-01 `canparl_search_votes` changed (inputSchema, outputSchema)
- 2026-11-01 `canparl_get_member` changed (description, inputSchema, outputSchema)
  - before: 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.
  - after: Read one House MP by a returned OpenParliament slug or official personId, current or former (36th Parliament onward). 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.
- 2026-11-01 `canparl_search_members` changed (description, inputSchema, outputSchema)
  - before: 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.
  - after: Find House MPs by name, riding, province, or caucus in the complete current official roster, or set parliament to search everyone who sat in that Parliament (36th onward) with official personIds and membership dates. Set includeFormer for OpenParliament's historical name index; its rows may contain only a name and slug. Follow nextOffset with identical filters and use detailLookup with canparl_get_member.
- 2026-11-01 `canparl_get_bill` changed (inputSchema, outputSchema)
- 2026-11-01 `canparl_search_bills` changed (inputSchema, outputSchema)

Full history: https://api.protogrid.dev/v1/servers/io.github.cyanheads%2Fcanada-parliament-mcp-server/changes

## Dependencies

- npm @cyanheads/canada-parliament-mcp-server@0.2.1: resolved, 64 dependencies, MCP SDK @modelcontextprotocol/core 2.4.0
- npm @cyanheads/canada-parliament-mcp-server@0.2.1: resolved, 64 dependencies, MCP SDK @modelcontextprotocol/core 2.4.0

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0.

## Remotes

- https://canada-parliament.caseyjhand.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

- npm @cyanheads/canada-parliament-mcp-server@0.2.1
- npm @cyanheads/canada-parliament-mcp-server@0.2.1

## Tools (8)

- `canparl_get_bill`: 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.
- `canparl_get_member`: Read one House MP by a returned OpenParliament slug or official personId, current or former (36th Parliament onward). 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.
- `canparl_get_vote`: 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.
- `canparl_list_reference`: 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. Topic parties covers the current session only: its entries come from the current House roster, so a past division's caucuses come from canparl_get_vote byParty.
- `canparl_search_bills`: 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.
- `canparl_search_members`: Find House MPs by name, riding, province, or caucus in the complete current official roster, or set parliament to search everyone who sat in that Parliament (36th onward) with official personIds and membership dates. Set includeFormer for OpenParliament's historical name index; its rows may contain only a name and slug. Follow nextOffset with identical filters and use detailLookup with canparl_get_member.
- `canparl_search_speeches`: 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.
- `canparl_search_votes`: 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.
