canlii-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@canlii-mcp search for Supreme Court case R v Oakes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
canlii-mcp
An MCP (Model Context Protocol) server for the CanLII Canadian legal information API. Gives AI assistants access to Canadian case law and legislation metadata across all federal, provincial, and territorial jurisdictions.
Note: The CanLII API provides metadata only — titles, citations, dates, keywords, and citation relationships. Full document text is not available through the API.
Tools
Tool | Description |
| List all courts and tribunals in the CanLII collection |
| Browse decisions from a specific court/tribunal database |
| Get metadata for a specific case (title, citation, date, keywords) |
| Get cases cited by a case, cases citing it, or legislation it references |
| List all statute and regulation databases |
| Browse statutes or regulations from a specific database |
| Get metadata for a specific piece of legislation |
Related MCP server: swiss-courts-mcp
Requirements
Node.js 22+
A CanLII API key — apply here
Usage
stdio via npx (quickest)
{
"mcpServers": {
"canlii": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@tomilashy/canlii-mcp"],
"env": {
"CANLII_API": "your_api_key"
}
}
}
}stdio (from source)
npm install
npm run build
node dist/index.jsAdd to your MCP config:
{
"mcpServers": {
"canlii": {
"command": "node",
"args": ["/path/to/canlii-mcp/dist/index.js"],
"env": {
"CANLII_API": "your_api_key"
}
}
}
}HTTP server
PORT=3000 CANLII_API=your_api_key node dist/index.js --transport httpThe MCP endpoint is available at http://localhost:3000/mcp. The server runs in stateless mode — each request is self-contained, no session ID or initialize handshake required. Clients can call tools directly:
curl -X POST http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_case_databases","arguments":{"language":"en"}}}'Docker
docker run -e CANLII_API=your_api_key -e MCP_AUTH_TOKEN=your_secret -p 3000:3000 ghcr.io/tomilashy/canlii-mcpOr with Docker Compose:
services:
canlii-mcp:
image: ghcr.io/tomilashy/canlii-mcp
environment:
CANLII_API: your_api_key
MCP_AUTH_TOKEN: your_secret # optional
ports:
- "3000:3000"Cloudflare Workers
The server includes a Workers-compatible entry point (src/worker.ts).
CLI deploy
npx wrangler secret put CANLII_API
npx wrangler secret put MCP_AUTH_TOKEN # optional
npx wrangler deployDashboard deploy (Connect to Git)
Go to Cloudflare Dashboard → Workers & Pages → Create → Connect to Git
Select your
tomilashy/canlii-mcprepositoryOn the Set up your application page:
Project name:
canlii-mcpBuild command:
npm install && npm run buildDeploy command:
npx wrangler deploy(pre-filled)
Expand Advanced settings:
Variable name:
CANLII_APIVariable value: your CanLII API key
Check Encrypt to store it as a secret
Click Deploy
The MCP endpoint will be at https://canlii-mcp.<your-subdomain>.workers.dev/mcp.
Configuration
Environment Variable | Required | Default | Description |
| Yes | — | Your CanLII API key |
| No |
| HTTP server port (HTTP mode only) |
| No | — | Bearer token for HTTP authentication. If set, all HTTP requests must include |
Rate Limits
The server enforces CanLII's API limits automatically:
1 request at a time
2 requests per second
5,000 requests per day
Requests that exceed the daily limit return an error rather than hitting the API.
Development
npm install
npm run build # compile TypeScript
npm run watch # watch modeRelease
This project uses Semantic Versioning via semantic-release. Commit messages follow the Conventional Commits spec:
Commit prefix | Release type |
| Patch ( |
| Minor ( |
| Major ( |
Pushing to main triggers the release workflow. If a release is cut, the Docker image is automatically built and published to ghcr.io.
License
MIT
Available Tools
7 toolsget_caseGet CaseARead-only
Get metadata for a specific case including title, citation, decision date, keywords, and URL.
Inputs: caseId (required), databaseId (required), language.
get_case_citationsGet Case CitationsARead-only
Get citation information for a case: what it cites, what cites it, or what legislation it references. Note: the CanLII API currently only supports English for this endpoint; French requests will fall back to English.
Inputs: caseId (required), databaseId (required), citationType (required), language.
get_legislationGet LegislationARead-only
Get metadata for a specific piece of legislation including title, citation, dates, and repeal status.
Inputs: databaseId (required), legislationId (required), language.
list_case_databasesList Case DatabasesARead-only
List all courts and tribunals in the CanLII collection with their database IDs.
Inputs: language.
list_casesList CasesBRead-only
List decisions from a specific caselaw database. Returns case titles, citations, and IDs.
Inputs: databaseId (required), offset, language, resultCount, +4 more.
list_legislationList LegislationARead-only
List statutes or regulations from a specific legislation database.
Inputs: databaseId (required), language.
list_legislation_databasesList Legislation DatabasesARead-only
List all legislation and regulation databases in the CanLII collection.
Inputs: language.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool targets a distinct action and resource: getting specific items (legislation, case, citations) versus listing collections (databases, legislation, cases). No overlap or ambiguity exists.
All tool names follow a consistent verb_noun pattern using lowercase with underscores, using either 'get_' for specific resources or 'list_' for collections. The convention is uniform and predictable.
Seven tools is well-scoped for a legal document retrieval server. Each tool covers an essential operation without redundancy or bloat.
The tool set covers metadata retrieval, database listings, and citation graphs, but lacks any search functionality for cases or legislation. This is a notable gap for a legal research API, though the core lookup workflows are complete.
Maintenance
Related MCP Connectors
MCP for CanLII: Canadian case law and legislation metadata (federal, provincial, territorial).
Canonical British Columbia Property Intelligence & Risk Screening MCP Server.
open.canada.ca MCP — Canada CKAN catalogue.
Hosted MCP server for finding authoritative primary data sources and official portals.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server providing AI assistants access to Canadian case law and legislation metadata from CanLII across all jurisdictions, supporting search and citation relationships.746 npm8MIT
- AlicenseAqualityAmaintenanceMCP server for searching Swiss court decisions from federal and cantonal courts via entscheidsuche.ch. Enables full-text search, law reference lookup, and filtering by canton, court level, and date without API keys.847 PyPI1MIT
- AlicenseAqualityBmaintenanceMCP server for searching and fetching metadata of Chilean laws, decrees, and resolutions via the BCN Linked Open Data SPARQL endpoint.336 PyPIApache 2.0
- AlicenseAqualityBmaintenanceMCP server for Swiss federal legislation metadata via Fedlex, enabling search and retrieval of act details with ELI URIs, SR numbers, and multilingual support.334 PyPIApache 2.0