| Version | Supported |
|---|---|
| 1.x.x | ✅ |
| < 1.0 | ❌ |
Do not open public GitHub issues for security vulnerabilities.
To report a vulnerability, please email the maintainer directly or use GitHub's private vulnerability reporting feature:
- Go to the repository's Security tab
- Click "Report a vulnerability"
- Provide details about the issue
You should receive a response within 48 hours. If the vulnerability is confirmed, a fix will be released as soon as possible, typically within 7 days for critical issues.
This project implements several security measures:
- OAuth 2.1 with PKCE for secure token exchange
- Tokens stored locally at
~/.miro/tokens.jsonwith restricted permissions (600) - Automatic token refresh before expiry (5-minute buffer)
- No tokens transmitted to third parties
- Audit log redaction: Sensitive fields (passwords, tokens, API keys) are automatically redacted
- No credentials logged in debug output
- Environment variables used for sensitive configuration
- Structured type validation for all API inputs
- Board/item ID validation before API calls
- Bulk operation limits enforced (max 20 items)
- Content size checks prevent oversized payloads
- HTTPS-only communication with Miro API
- HTTP server mode warns when binding to external interfaces
- Configurable timeouts prevent resource exhaustion
The miro_share_board and miro_update_board_member tools grant durable third-party access to a board. Both are marked Destructive: true so MCP clients prompt before invocation, and miro_share_board additionally enforces a server-side allowlist:
MIRO_SHARE_ALLOWED_DOMAINS(comma-separated) is the operator's allowlist of permitted recipient domains.- When unset, the server falls back to the domain of the authenticated user's own email.
- When neither is available, the server fails closed and rejects every share invitation with a descriptive error pointing back to this env var.
- The resolved allowlist is logged at startup so operators can confirm what the server is enforcing.
This is the SSH-key analogue of board sharing: a prompt-injected agent processing board content (for example, "invite attacker@evil.com as editor") cannot quietly exfiltrate access through the API. See CONFIG.md for the env-var reference.
- Minimal dependency footprint (3 direct dependencies)
- Dependabot enabled for automatic security updates
- Regular dependency audits via
go mod verify
- Never commit tokens to version control
- Use environment variables for
MIRO_ACCESS_TOKEN - Rotate tokens periodically via Miro's app settings
- Use OAuth for production deployments (auto-refresh, revocable)
- Review audit logs periodically if enabled