Skill 42 · Reading Mailcatcher API
Subchapter 42.1
references/email-patterns.mdMarkdown4 KBView on GitHub
Each section gives the subject, recipient, and link format for a Bitwarden email, followed by the sanctioned read_mailcatcher.py invocation that extracts its link. Run the co-located script; curl and direct API calls are not sanctioned transports here (see , which exists for debugging the script itself).
manual-api-walkthrough.mdSubject: Verify Your Email
Recipient: The new account email address
Link format: https://localhost:8080/#/finish-signup?token=BwRegistrationEmailVerificationToken&email=<encoded>
Extraction:
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/read_mailcatcher.py \
--recipient <new-account-email> --pattern "Verify" --link-filter 'finish-signup'Subject: [Admin] Continue Logging In or Continue Logging In
Recipient: The Bitwarden dev admin address. Get it with the co-located helper, which reads only adminSettings.admins from your bitwarden/server checkout’s dev/secrets.json and prints nothing else. It reads server/dev/secrets.json relative to the current working directory (run from the workspace root that holds your bitwarden/server checkout, or pass --secrets-file <path>, which must resolve to a dev/secrets.json file or the helper exits 2 without reading it), and exits 3 if that file is missing or has no usable adminSettings.admins value. By default it prints only the first configured admin address (the Admin Portal login address); pass --all to list every configured admin, one per line.
Link format: http://localhost:62911/login/confirm?email=<admin>&token=<token>&returnUrl=/
Extraction: run these as two separate Bash calls. Do not wrap the helper in $(...) command substitution: Claude Code’s Bash matcher flags any $(...) or backtick command as possible injection and will not auto-approve it against the grant, so it always prompts.
# 1. Print the admin address:
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/get_admin_email.py# 2. Pass that printed address literally as --recipient (replace <admin-address>):
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/read_mailcatcher.py \
--recipient <admin-address> --pattern "Logging In" --link-filter 'login/confirm'Subject: Varies — check for trial, start, activate
Recipient: Trial initiator email
Link format: https://localhost:8080/#/...?trialLength=...&token=...
Extraction: the subject varies, so omit --pattern and let the link filter select:
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/read_mailcatcher.py \
--recipient <trial-initiator-email> --link-filter 'trial|token'Subject: Join <OrgName> on Bitwarden
Recipient: Invited user email
Link format: https://localhost:8080/#/accept-organization?orgId=...&orgUserId=...&token=...
Extraction:
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/read_mailcatcher.py \
--recipient <invited-user-email> --pattern "Join" --link-filter 'accept-organization'Subject: Emergency Access Request
Recipient: Grantee email
Link format: https://localhost:8080/#/accept-emergency?id=...&token=...
Extraction:
${CLAUDE_PLUGIN_ROOT}/skills/reading-mailcatcher-api/scripts/read_mailcatcher.py \
--recipient <grantee-email> --pattern "Emergency" --link-filter 'accept-emergency'Subject: Welcome to Bitwarden!
Purpose: Confirmation only — no link extraction needed
Verification: Confirm receipt to validate registration completed