⚙️ FEATURE-#88: Add optional MCP server and Claude Code plugin - #89
Merged
Merged
Conversation
FernandoCelmer
commented
Sep 11, 2026
Member
Author
There was a problem hiding this comment.
🔍 Code Review
Code issues found: 5
| # | Severity | Comment |
|---|---|---|
| 1 | [Blocking] | EMAIL_MCP_LIMIT never applied |
| 2 | [Blocking] | Unsynchronized IMAP session across threads |
| 3 | [Blocking] | save_attachment writes anywhere |
| 4 | [Blocking] | IMAP search string injection |
| 5 | [Blocking] | uid accepts sequence sets |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds an optional MCP server so any MCP client (Claude Code, Claude Desktop, Cursor) can read, search, organize and — when allowed — send email through the existing
EmailAPI, plus the manifests and skills that make the repository a Claude Code plugin.Library
pyproject.toml/poetry.lock—mcpextra (mcp>=2.0),email-profile-mcpconsole script, keywords. Core install gains no dependency.email_profile/mcp/server.py—build()assembles anMCPServeraround one lazyEmail; CLI with--allow-send,--allow-delete,--max-chars,--http/--host/--port.email_profile/mcp/config.py—SettingsfromEMAIL_MCP_*env (allow flags,max_chars,limit,default_mailbox,attachments_dir).email_profile/mcp/session.py— lazy, reconnectingEmailhandle;RLockserializes IMAP access across tool threads.email_profile/mcp/params.py—Uid(digits only, refuses IMAP sequence sets) andMailboxargument types.email_profile/mcp/results.py— typed result models (MessageSummary,MessageDetail,SearchPage,Outcome); bodies truncated, attachment bytes never returned.email_profile/mcp/annotations.py— read-only / reversible / sends / destructive tool hints.email_profile/mcp/tools/—mailbox.py(list, search with pagination),message.py(read, attachments, flags, move, delete;save_attachmentconfined toEMAIL_MCP_ATTACHMENTS_DIR),send.py(send, reply, forward — registered only with--allow-send).email_profile/mcp/prompts.py—triage_inbox,find_message,draft_reply,summarize_thread.email_profile/clients/imap/query.py— string clauses now escape"and\per RFC 3501 (search terms can come from untrusted email content).Plugin
.mcp.json,.app.json,server.json,.claude-plugin/,.codex-plugin/,.agents/plugins/— manifests.skills/— six skills: triage-inbox, find-message, read-message, draft-reply, send-email, organize-mailbox.scripts/check_skills.py+.github/workflows/plugin.yml— fail when skills and tools drift; validate manifests.CI / docs
.github/actions/setup-poetrygainsinstall-extras;test.ymlinstallsmcp.README.md(cover, centered header, contents, MCP section with safety model),docs/nav/advanced/mcp-server.md, docs index and install page,examples/,CHANGELOG.md,.env-example.Issue: 📌 ISSUE — Closes #88
Type of change
Checklist: