Canlii Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Canlii Mcp Server (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A local Model Context Protocol (MCP) server for macOS that lets Claude Desktop search the CanLII Canadian legal database and read the full text of matching documents.
Exposes a single MCP tool — search_canlii — that Claude can call to:
search_canlii(
query: str,
search_type: "text" | "name" = "text",
max_results: int = 5 # 1–10
)search_type | When to use |
|---|---|
"text" | Legal concepts, keywords, or phrases within judgment bodies |
"name" | Case name, document title, file number, author, or citation (e.g. R v Oakes, 2024 SCC 12) |
1. Clone the repository
git clone <repo-url>
cd canlii_mcp_server2. Install dependencies and Chromium
uv sync
uv run playwright install chromium3. Add the server to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"canlii": {
"command": "/path/to/uv",
"args": [
"run",
"--project",
"/path/to/canlii_mcp_server",
"canlii-mcp-server"
]
}
}
}Replace /path/to/uv with the output of which uv, and /path/to/canlii_mcp_server with the absolute path to this directory.
4. Restart Claude Desktop
Fully quit Claude Desktop (menu bar → Quit), then reopen it. The canlii server will appear under Settings → Developer.
In a Claude Desktop conversation:
"Search CanLII for cases about reasonable apprehension of bias."
"Find the case R v Oakes."
"What does CanLII say about the duty to accommodate in employment law?"
Claude will call search_canlii automatically with the appropriate search_type.
CanLII's website is a JavaScript single-page application — search results are rendered client-side and not available in raw HTML. This server uses Playwright (headless Chromium) to load pages as a real browser would, then extracts clean text with BeautifulSoup.
playwright-stealth is applied to each page load to reduce the likelihood of bot detection by CanLII's DataDome protection. Requests are rate-limited to 1.5 seconds between document fetches to avoid triggering blocks.
Note: CanLII's bot protection may occasionally flag automated requests. If Claude reports a "blocked" error, wait an hour and try again.
Run unit tests
uv run pytest tests/ --ignore=tests/test_smoke.py -vRun live integration tests (requires network access to canlii.org)
uv run pytest tests/test_smoke.py -v -sProject structure
src/canlii_mcp_server/
server.py — MCP server entry point, tool registration
search.py — URL builder, search results parser
fetch.py — document text extractor, Playwright browser manager
tests/
test_url_builder.py — URL building (5 tests)
test_search_parser.py — search results parsing (4 tests)
test_document_extractor.py — document text extraction (5 tests)
test_smoke.py — live integration tests (3 tests, manual)
fixtures/ — saved CanLII HTML used by unit tests
scripts/
recon.py — captures CanLII HTML structure for fixture updates
recon_document.py — captures a single document page slowlyindexLang=en).MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.