| 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.6.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.
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 PiiFindings {
boardId: string;
itemId: string;
: ;
: <{ : ; : ; : }>;
}
(): <[]> {
: [] = [];
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.?. };
: {};
}
}