Skip to main content
Glama
QQ Mail Read-only MCP

QQ Mail Read-only MCP

by chenxuan520

QQ Mail Read-only MCP

A remote MCP server on Cloudflare Workers that gives AI clients (tested target: ChatGPT custom MCP / Dots) read-only access to a QQ Mail mailbox over IMAP.

Forked from Xzese/email-mcp-for-cloudflare-workers (MIT) and cut down to a single responsibility: reading mail. Nothing else.

What this server cannot do

The read-only guarantee is enforced in the Worker itself, not by prompt wording:

  • All IMAP mailbox opens use EXAMINE (read-only mode); all body fetches use BODY.PEEK. Reading an unread message never marks it as seen.

  • There is no code path in this repository that issues IMAP SELECT (read-write), STORE, APPEND, MOVE, or EXPUNGE, and no SMTP client at all.

  • MCP tool surface contains no account-management or message-mutation tools.

  • Every tool is annotated readOnlyHint: true.

Concretely absent, by design: sending, drafts, replying/forwarding, moving, archiving, trash, permanent delete, read/unread or flag changes, and adding/removing accounts via MCP.

Related MCP server: postfach-mcp

Tools

All eleven tools are read-only:

  • email_list_accounts, email_test_connection

  • email_list_folders, email_get_mailbox_status, email_get_all_account_mailbox_statuses

  • email_search_messages, email_search_all_accounts, email_list_all_inbox_messages

  • email_get_message, email_get_message_thread, email_get_message_attachment

Every tool publishes an MCP output schema and returns validated structuredContent. A JSON text copy is returned for clients that do not consume structured output.

Full message fetches are capped at 25 MB per message; searches return at most 100 summaries per call.

Architecture

  • TypeScript on Cloudflare Workers, MCP over Streamable HTTP at /mcp.

  • Cloudflare Durable Objects (agents SDK McpAgent) back the MCP sessions.

  • QQ Mail IMAP over TLS (imap.qq.com:993) via Cloudflare outbound TCP sockets, logged in with the mailbox address and its QQ Mail IMAP authorization code.

  • Workers KV stores account configuration AES-256-GCM encrypted (CREDENTIAL_ENCRYPTION_KEY as a Worker secret), in its own EMAIL_KV namespace.

  • Self-hosted OAuth 2.1 via @cloudflare/workers-oauth-provider (its own OAUTH_KV namespace): RFC 8414 authorization-server metadata, RFC 9728 protected-resource metadata pointing at /.well-known/oauth-protected-resource/mcp, RFC 7591 dynamic client registration, authorization-code + PKCE (S256) with refresh-token rotation. This is what ChatGPT's custom-MCP "OAuth" option talks to — no third-party accounts and no Cloudflare Zero Trust needed.

  • One owner password (OWNER_PASSWORD Worker secret) is the only identity proof: it is required on the OAuth consent page (/authorize) and on the account management UI (/login). Failed attempts are rate-limited per IP.

  • The account management web UI (Worker root /) is the only way to add, edit, or remove mailbox credentials. The QQ authorization code never passes through an MCP client or language model.

  • The IMAP host is restricted to an allowlist (ALLOWED_IMAP_HOSTS, default imap.qq.com) so the account form cannot be turned into an SSRF probe; the global_fetch_strictly_public compatibility flag restricts outbound fetch.

Documentation

  • DEPLOYMENT.md — Cloudflare setup: KV namespaces, secrets, deploy.

  • CHATGPT.md — Connect ChatGPT (custom MCP app) and use from Dots.

  • SECURITY.md — Security model, boundaries, and revocation.

  • CASE-STUDY-CHATGPT-CIMD.md — Debugging write-up: CIMD fetch flakiness, a KV key //-collapse gotcha, and the pinned-client shim.

Local development

cp .dev.vars.example .dev.vars
# fill CREDENTIAL_ENCRYPTION_KEY with: openssl rand -base64 32
# pick any OWNER_PASSWORD for local testing (also update PUBLIC_ORIGIN to
# http://localhost:8787 if you want discovery URLs to match the dev origin)
npm install
npm run dev

MCP endpoint: http://localhost:8787/mcp. The management UI at / asks for the OWNER_PASSWORD; OAuth discovery, registration, authorize, and token endpoints work identically to production.

Verification

npm ci
npm test          # type-check + node tests
npm run lint
npm run format:check
npm run public-config:check
npm run build:check

License

MIT, same as the upstream project. See LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables read-only, provider-agnostic email access over IMAP, allowing users to list folders, search and read messages, and download attachments without ever marking messages as read.
      6
      19 PyPI
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to securely access IMAP mailboxes with read-focused tools for searching, reading, listing messages, and creating drafts, while deliberately preventing sending or deleting emails.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI clients to read, search, manage, and send QQ mailbox emails via IMAP/SMTP, including attachments, drafts, replies, and structured message context for models.
      45 npm
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables ChatGPT and Codex to securely inspect a QQ Mail mailbox through read-only tools for identity, connection status, unread messages, search, and message reading. Uses OAuth 2.1/PKCE and IMAP without sending, deleting, moving, or marking mail.
      5
      MIT