movahedi.ca Privacy Data
Canadian privacy enforcement, glossary, and Quebec Law 25 guidance for AI agents.
Should I use this
Quality & Safety
Findings (1)
- LOWin privacy_search_enforcement_actions
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"privacy": {
"url": "https://movahedi.ca/mcp"
}
}
}Remote endpoints
https://movahedi.ca/mcpstreamable-httpWhat it can do
Tool inventory
Tools (5)
🟢privacy_search_enforcement_actions(query, regulator, year, limit, offset)
Search verified Canadian privacy enforcement actions: CAI orders and decisions under Quebec Law 25 and OPC findings under PIPEDA. Use this when someone asks about privacy fines, enforcement cases against a company, what regulators decided, or investigations (for example 'Has the CAI fined anyone for facial recognition?' or 'TikTok privacy investigation Canada'). Returns matching cases with dates, plain-language summaries, penalties, and links to the official regulator source. Start here to find a case ID, then call privacy_get_enforcement_case for full details.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 120,
"description": "Free-text search over case titles and summaries.",
"examples": [
"facial recognition",
"TikTok"
]
},
"regulator": {
"type": "string",
"enum": [
"cai",
"opc"
],
"description": "Limit to one regulator: 'cai' (Quebec Commission d'acces a l'information, Law 25) or 'opc' (federal Office of the Privacy Commissioner, PIPEDA).",
"examples": [
"cai"
]
},
"year": {
"type": "integer",
"minimum": 2000,
"maximum": 1970,
"description": "Filter by decision year.",
"examples": [
2025
]
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10,
"description": "Maximum cases to return in this call."
},
"offset": {
"type": "integer",
"minimum": 0,
"maximum": 100000,
"default": 0,
"description": "Number of matching cases to skip. Use next_offset from the previous response to page forward."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"results": {
"type": "array",
"description": "Matching enforcement actions.",
"items": {
"type": "object",
"required": [
"id",
"title",
"regulator",
"date",
"summary",
"source_url"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"regulator": {
"type": "string"
},
"date": {
"type": "string"
},
"summary": {
"type": "string"
},
"penalty": {
"type": [
"number",
"null"
]
},
"source_url": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"total_count": {
"type": "integer",
"description": "Total number of matches across all pages."
},
"has_more": {
"type": "boolean",
"description": "True when more results exist beyond this page."
},
"next_offset": {
"type": [
"integer",
"null"
],
"description": "Pass as 'offset' in the next call to continue paging. Null when has_more is false."
},
"truncated": {
"type": "boolean",
"description": "True when results were shortened to fit the 50 KB output cap. Use the paginated REST API for the full set."
}
},
"required": [
"results",
"total_count",
"has_more",
"next_offset",
"truncated"
],
"additionalProperties": false
}🟢privacy_get_enforcement_case(id)
Get the full record of one privacy enforcement action by its ID, including the plain-language summary, outcome, penalty amount, and the official regulator source link. Use this after privacy_search_enforcement_actions when you need complete details on a specific case, or when a case ID (like 'cai-2026-05-06-openai') is already known.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9-]{1,64}$",
"description": "The case ID from a search result.",
"examples": [
"cai-2026-05-06-openai"
]
}
},
"required": [
"id"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"case": {
"type": "object",
"required": [
"id",
"title",
"regulator",
"date",
"summary",
"source_url"
],
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"regulator": {
"type": "string"
},
"date": {
"type": "string"
},
"summary": {
"type": "string"
},
"penalty": {
"type": [
"number",
"null"
]
},
"source_url": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"required": [
"case"
],
"additionalProperties": false
}🟢privacy_lookup_glossary_term(term)
Look up the plain-language definition of a privacy or data-protection term, from 'Law 25' and 'PIPEDA' to 'privacy officer', 'data breach', and AI governance concepts. Use this whenever someone asks what a term means, or when you need a precise definition before answering a Canadian privacy question. Terms are identified by slug (for example 'law-25'); use privacy_list_glossary_terms to discover slugs.
Input Schema
{
"type": "object",
"properties": {
"term": {
"type": "string",
"pattern": "^[a-z0-9-]{1,64}$",
"description": "The glossary slug.",
"examples": [
"law-25",
"pipeda"
]
}
},
"required": [
"term"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"term": {
"type": "object",
"required": [
"term",
"slug",
"definition"
],
"properties": {
"term": {
"type": "string"
},
"slug": {
"type": "string"
},
"definition": {
"type": "string"
},
"related": {
"type": "array",
"items": {
"type": "string"
}
},
"updated": {
"type": "string"
}
}
}
},
"required": [
"term"
],
"additionalProperties": false
}🟢privacy_list_glossary_terms(query, starts_with, limit, offset)
Browse the 260+ term Canadian privacy glossary with optional text search or first-letter filtering. Use this to explore which terms exist, find the right slug for privacy_lookup_glossary_term, or gather definitions on a topic. Results are paginated: follow next_offset while has_more is true.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"maxLength": 120,
"description": "Search term names and definitions.",
"examples": [
"consent"
]
},
"starts_with": {
"type": "string",
"pattern": "^[a-z]$",
"description": "Only terms whose slug starts with this letter.",
"examples": [
"p"
]
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20,
"description": "Maximum terms to return in this call."
},
"offset": {
"type": "integer",
"minimum": 0,
"maximum": 100000,
"default": 0,
"description": "Number of matching terms to skip. Use next_offset to page forward."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"terms": {
"type": "array",
"description": "Matching glossary terms.",
"items": {
"type": "object",
"required": [
"term",
"slug",
"definition"
],
"properties": {
"term": {
"type": "string"
},
"slug": {
"type": "string"
},
"definition": {
"type": "string"
},
"related": {
"type": "array",
"items": {
"type": "string"
}
},
"updated": {
"type": "string"
}
}
}
},
"total_count": {
"type": "integer",
"description": "Total number of matches across all pages."
},
"has_more": {
"type": "boolean",
"description": "True when more results exist beyond this page."
},
"next_offset": {
"type": [
"integer",
"null"
],
"description": "Pass as 'offset' in the next call to continue paging. Null when has_more is false."
},
"truncated": {
"type": "boolean",
"description": "True when results were shortened to fit the 50 KB output cap. Use the paginated REST API for the full set."
}
},
"required": [
"terms",
"total_count",
"has_more",
"next_offset",
"truncated"
],
"additionalProperties": false
}🟢privacy_law25_requirements(category)
Get the Quebec Law 25 compliance checklist: the concrete requirements organizations must meet, covering the privacy officer, purposes, consent, individual rights, retention, cross-border transfers, breach notification, minors' data, automated decisions, and complaint paths. Use this when someone asks what Law 25 requires, how to comply with Law 25, or for a gap-assessment checklist. Optionally filter to one category like 'Consent' or 'Incident response'.
Input Schema
{
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": [
"Governance",
"Transparency",
"Individual rights",
"Data lifecycle",
"Transfers",
"Consent",
"Incident response",
"Minors",
"Automated decisions",
"Oversight"
],
"description": "Only requirements in this category. Omit for the full checklist.",
"examples": [
"Consent"
]
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"requirements": {
"type": "array",
"description": "Law 25 requirements.",
"items": {
"type": "object",
"required": [
"id",
"category",
"title",
"requirement",
"guidance"
],
"properties": {
"id": {
"type": "string"
},
"category": {
"type": "string"
},
"title": {
"type": "string"
},
"requirement": {
"type": "string"
},
"guidance": {
"type": "string"
}
}
}
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "All available categories for the 'category' filter."
},
"total_count": {
"type": "integer",
"description": "Number of requirements returned."
}
},
"required": [
"requirements",
"categories",
"total_count"
],
"additionalProperties": false
}Community
Evidence