movahedi.ca Privacy Data

Canadian privacy enforcement, glossary, and Quebec Law 25 guidance for AI agents.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
94%
Naming quality
76%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'privacy_search_enforcement_actions' name length outside 3-30 rangein privacy_search_enforcement_actions

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,911Tokens (tool definitions)
~3.2 KBTypical response size
Moderate attention impact (1.49% of 128k context)

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-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools