get_legislation_databases
List all available Canadian legislation databases on CanLII, returning database IDs (e.g., ons, onr, cas) for browsing statutes and regulations by jurisdiction.
Instructions
List all available legislation databases in Canada. Returns database IDs for browsing statutes and regulations. Key databases: ons (Ontario Statutes), onr (Ontario Regulations), cas (Canada Statutes), car (Canada Regulations), bcs (BC Statutes), abs (Alberta Statutes).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language: 'en' for English (default), 'fr' for French | en |
| publishedBefore | No | Date first published on CanLII (YYYY-MM-DD) | |
| publishedAfter | No | Date first published on CanLII (YYYY-MM-DD) | |
| modifiedBefore | No | Date content last modified on CanLII (YYYY-MM-DD) | |
| modifiedAfter | No | Date content last modified on CanLII (YYYY-MM-DD) | |
| changedBefore | No | Date metadata or content last changed on CanLII (YYYY-MM-DD) | |
| changedAfter | No | Date metadata or content last changed on CanLII (YYYY-MM-DD) | |
| decisionDateBefore | No | Decision date upper bound (YYYY-MM-DD) | |
| decisionDateAfter | No | Decision date lower bound (YYYY-MM-DD) |
Implementation Reference
- src/index.ts:399-432 (handler)The handler for the get_legislation_databases MCP tool. Fetches legislation databases from the CanLII API (v1/legislationBrowse) with optional language and date parameters, returns the parsed LegislationResponseSchema data.
server.tool( "get_legislation_databases", "List all available legislation databases in Canada. Returns database IDs for browsing statutes and regulations. " + "Key databases: ons (Ontario Statutes), onr (Ontario Regulations), cas (Canada Statutes), car (Canada Regulations), " + "bcs (BC Statutes), abs (Alberta Statutes).", { language: z.enum(["en", "fr"]).default("en") .describe("Language: 'en' for English (default), 'fr' for French"), ...dateParametersSchema, }, async (params) => { try { const { language, ...dateParams } = params; const urlParams = new URLSearchParams({ api_key: apiKey }); buildDateParams(urlParams, dateParams); const response = await apiFetch( `https://api.canlii.org/v1/legislationBrowse/${language}/?${urlParams.toString()}` ); if (!response.ok) { return errorResponse(`Error: Failed to fetch legislation databases (${response.status})`); } const data = await response.json(); const parsed = LegislationResponseSchema.parse(data); return jsonResponse(parsed); } catch (error) { return errorResponse( `Error: ${error instanceof Error ? error.message : "Unknown error"}` ); } } ); - src/schema.ts:69-78 (schema)Zod schema for legislation database items and the response shape (legislationDatabases array). Used to validate the API response.
export const LegislationSchema = z.object({ databaseId: z.string(), type: z.string(), jurisdiction: z.string(), name: z.string(), }).passthrough(); export const LegislationResponseSchema = z.object({ legislationDatabases: z.array(LegislationSchema), }).passthrough(); - src/index.ts:399-432 (registration)Registration of the tool via server.tool() with name 'get_legislation_databases' on the MCP server instance.
server.tool( "get_legislation_databases", "List all available legislation databases in Canada. Returns database IDs for browsing statutes and regulations. " + "Key databases: ons (Ontario Statutes), onr (Ontario Regulations), cas (Canada Statutes), car (Canada Regulations), " + "bcs (BC Statutes), abs (Alberta Statutes).", { language: z.enum(["en", "fr"]).default("en") .describe("Language: 'en' for English (default), 'fr' for French"), ...dateParametersSchema, }, async (params) => { try { const { language, ...dateParams } = params; const urlParams = new URLSearchParams({ api_key: apiKey }); buildDateParams(urlParams, dateParams); const response = await apiFetch( `https://api.canlii.org/v1/legislationBrowse/${language}/?${urlParams.toString()}` ); if (!response.ok) { return errorResponse(`Error: Failed to fetch legislation databases (${response.status})`); } const data = await response.json(); const parsed = LegislationResponseSchema.parse(data); return jsonResponse(parsed); } catch (error) { return errorResponse( `Error: ${error instanceof Error ? error.message : "Unknown error"}` ); } } ); - src/index.ts:105-114 (helper)Shared date parameters schema, spread into the tool's schema definition.
const dateParametersSchema = { publishedBefore: dateSchema.describe("Date first published on CanLII (YYYY-MM-DD)"), publishedAfter: dateSchema.describe("Date first published on CanLII (YYYY-MM-DD)"), modifiedBefore: dateSchema.describe("Date content last modified on CanLII (YYYY-MM-DD)"), modifiedAfter: dateSchema.describe("Date content last modified on CanLII (YYYY-MM-DD)"), changedBefore: dateSchema.describe("Date metadata or content last changed on CanLII (YYYY-MM-DD)"), changedAfter: dateSchema.describe("Date metadata or content last changed on CanLII (YYYY-MM-DD)"), decisionDateBefore: dateSchema.describe("Decision date upper bound (YYYY-MM-DD)"), decisionDateAfter: dateSchema.describe("Decision date lower bound (YYYY-MM-DD)"), }; - src/index.ts:69-87 (helper)Utility function used by the handler to append date filter parameters to the API request URL.
function buildDateParams(params: URLSearchParams, options: { publishedBefore?: string; publishedAfter?: string; modifiedBefore?: string; modifiedAfter?: string; changedBefore?: string; changedAfter?: string; decisionDateBefore?: string; decisionDateAfter?: string; }) { if (options.publishedBefore) params.append('publishedBefore', options.publishedBefore); if (options.publishedAfter) params.append('publishedAfter', options.publishedAfter); if (options.modifiedBefore) params.append('modifiedBefore', options.modifiedBefore); if (options.modifiedAfter) params.append('modifiedAfter', options.modifiedAfter); if (options.changedBefore) params.append('changedBefore', options.changedBefore); if (options.changedAfter) params.append('changedAfter', options.changedAfter); if (options.decisionDateBefore) params.append('decisionDateBefore', options.decisionDateBefore); if (options.decisionDateAfter) params.append('decisionDateAfter', options.decisionDateAfter); }