A Rust-based MCP server providing tools for Gmail/Google Workspace email management and Bitwarden password vault access
SMCP has 16 tools with explicit schemas and descriptions visible in source. Naming follows verb_noun convention (gmail_*, bitwarden_*) and is generally clear. However, descriptions are often generic (e.g., 'Check recent emails' lacks context on when to use vs alternatives). Parameter descriptions exist but lack constraints (enums, ranges, patterns). Output schemas are not documented, responses are JSON strings without declared structure. Error handling returns JSON but lacks recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Critical security issue: gmail_set_credentials and bitwarden_set_password accept secrets as parameters, violating secret-injection pattern. Composition is reasonable (separate tools per action), but some tools combine multiple concerns (gmail_bulk_manage_email does search+action in one call).
Create a new login item in Bitwarden vault
Generate a secure random password using Bitwarden CLI
Get Bitwarden password for a vault item by ID or name
Get Bitwarden TOTP code for a vault item by ID or name
List Bitwarden vault items with optional search filter
Set and save Bitwarden Master Password directly via MCP, testing unlock immediately
Secrets exposed as tool parameters: gmail_set_credentials and bitwarden_set_password accept passwords/app-passwords as input parameters. These will be logged in agent traces and prompt history, violating secret-injection pattern. Move to server-side environment variable or vault injection.
Output schemas not documented. Tools return JSON strings (e.g., gmail_check_emails returns array of email objects) but the response structure is not declared in tool definitions. LLMs cannot plan downstream calls without knowing what fields to expect.
Parameter constraints missing. 'limit' parameters lack min/max bounds (e.g., gmail_check_emails limit defaults to 10, max 30, but this is only in description, not schema). 'action' parameters accept free-form strings instead of enums (e.g., gmail_manage_email action should be enum: mark_read|mark_unread|star|unstar|trash).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Check Bitwarden status and sync status
Sync Bitwarden local cache with remote vault
Apply one action to multiple Gmail messages selected by search criteria
Send one email to multiple recipients
Check recent emails across mailboxes (INBOX, Spam, Trash, Sent, Starred) with permanent UIDs
Manage email (mark_read, mark_unread, star, unstar, trash) by UID
Read complete content, attachments metadata, and body of an email by permanent UID
Reply to an email by permanent UID with optional custom sender name
Send an email with optional attachments
Set and save Gmail credentials (email and App Password) directly via MCP, testing the connection immediately
Error handling lacks recovery guidance. Code returns JSON errors (e.g., {"error": "Failed to select mailbox"}) but does not suggest next steps. Per pattern:recovery-guide, errors should tell the LLM what to do: 'Mailbox not found. Try folder=inbox or call gmail_check_emails with folder=all to list available folders.'
No tool annotations. Tools lack readOnlyHint, destructiveHint, and idempotentHint metadata. This prevents agents from reasoning about side effects. gmail_send_email and gmail_reply_email should be marked destructiveHint=true; gmail_check_emails should be readOnlyHint=true.