| name | miro-data-handling |
| description | Implement Miro REST API v2 data handling with PII detection in board content,
data export via API, retention policies, and GDPR/CCPA compliance patterns.
Trigger with phrases like "miro data", "miro PII",
"miro GDPR", "miro data export", "miro privacy", "miro compliance".
|
| allowed-tools | Read, Write, Edit |
| version | 1.7.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","miro","data-handling","privacy","compliance"] |
| compatibility | Designed for Claude Code |
Miro Data Handling
Overview
Handle sensitive data correctly when integrating with Miro REST API v2. Miro boards can contain PII in sticky notes, cards, and text items. This skill covers detecting PII in board content, exporting board data for DSAR requests, implementing retention policies, and ensuring GDPR/CCPA compliance.
Prerequisites
Before applying this guide, confirm you have a Miro app or workspace appropriate to the task, a dedicated non-production board where changes can be tested safely, and only the OAuth scopes or administrative access the procedure requires.
Data Classification for Miro Content
| Category | Examples in Miro | Handling |
|---|
| PII | Emails/names in sticky notes, assignee info in cards | Detect, redact in logs, export on DSAR request |
| Sensitive | OAuth tokens, API keys in text items | Never cache, alert on detection |
| Business | Board names, project plans, diagrams | Standard handling, respect board sharing policy |
| Public | Template content, product names | No special handling needed |
PII Detection in Board Items
Scan board content for personally identifiable information:
const PII_PATTERNS = [
{ type: 'email', regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g },
{ type: 'phone', regex: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g },
{ type: 'ssn', regex: /\b\d{3}-\d{2}-\d{4}\b/g },
{ type: 'credit_card', regex: /\b\d{4}[- ]?\d{4}[- ]?\d{4}[- ]?\d{4}\b/g },
{ type: 'ip_address', regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g },
];
interface {
: ;
: ;
: ;
: <{ : ; : ; : }>;
}
(): <[]> {
: [] = [];
itemTypes = [, , , ];
( itemTypes) {
items = (boardId, );
( item items) {
contentFields = (item);
: [] = [];
( [field, text] .(contentFields)) {
(!text) ;
( pattern ) {
matches = text.(pattern.);
(matches) {
findings.({ : pattern., field, : matches. });
}
}
}
(findings. > ) {
results.({ boardId, : item., : item., findings });
}
}
}
results;
}
(): <, > {
(item.) {
: { : item.?. };
: { : item.?., : item.?. };
: { : item.?. };
: { : item.?. };
: {};
}
}