Capes
An MCP server that lets AI assistants read, send, and manage Gmail and Discord, search X/Twitter, and enforce owner-defined limits.
Gmail: search, read threads/attachments, send/reply/forward, manage drafts, labels, archive, trash, spam, read/unread/star.
Discord: read guilds/channels/members/roles/threads/audit log; send/edit/delete/bulk-delete messages; pin, react, upload files, create polls, DMs; create/edit/delete channels/threads/roles; manage permissions, invites, webhooks, forum tags; moderate members (kick/ban/timeout).
X/Twitter: search tweets via Apify.
Controls: dashboard to test credentials, browse/try tools, disable services/tools, read-only mode, activity log, client config; credentials encrypted in your own Postgres/Vercel.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Capes Check my unread Gmail and Discord messages from the last hour."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Give Claude, Codex, Cursor and any MCP client hands: your Gmail, Discord and X, through one private server you own.
🎬 Demo

Fresh Vercel deploy, checking connectors, browsing all 68 tools, connecting a client, and asking Claude to use it.
Related MCP server: MailNet MCP Server
✨ What you get
AI assistants read, summarise and act well, but your real work lives in accounts they cannot reach. Capes is one private MCP server that you deploy to your own Vercel account. Connect it once and the same tools appear in every AI client you use.
What it does | |
📧 Gmail (17 tools) | Search with Gmail syntax, read, send, reply, forward, drafts, labels, archive, trash. No Google Cloud project, just an app password. |
💬 Discord (47 tools) | Read and post, edit, delete, react, threads, forums, polls, files, webhooks, channels, roles, permissions, moderation, audit log. |
🐦 X / Twitter (1 tool) | Search tweets through an Apify scraper. |
✈️ Telegram (3 tools) | Send messages, get chat info, poll recent updates. |
🖥️ Dashboard | Test each service's credentials, browse and try the tools, watch recent activity, copy ready-made client config. |
🛡️ Limits you control | Turn a service or a single tool off, or make the whole server read-only. Tools are labelled read, write or destructive. |
🔑 You own it | Your credentials live only in your Vercel project and your own Postgres database. No central service, no account with us. |
🎬 A day with Capes
Sam runs a small product and its Discord community, and answers customers from one Gmail inbox. Every morning Sam asks one question in Claude:
Sam: Give me a briefing. Unread customer emails from the last day, unanswered questions in #support, and what people are saying about our product on X.
The assistant, using tools from the same server:
gmail_searchforis:unread newer_than:1d, thengmail_get_messageon the ones that look like customers. It groups them: 3 billing questions, 1 bug report, 2 newsletters.discord_read_channelon #support, and finds 4 questions nobody answered.twitter_searchfor the product name, and summarizes the tone of 20 recent tweets.
Sam: Draft replies to the billing emails, and answer the two easy Discord questions. Show me everything before you send.
gmail_create_draftfor each reply (drafts, nothing sent yet).Shows Sam the drafts and the two Discord answers. Sam approves.
gmail_send_draft,discord_send_message, andgmail_modifyto label and archive the handled mail.
That is about five minutes instead of forty, and the assistant never had direct access to Sam's accounts: everything went through Sam's own server, with Sam's own limits. When Sam wants an assistant to only look, one switch in the dashboard hides every tool that sends or deletes.
This is an illustration of what the tools make possible, not a recording.
One setup for every client. The same server works in Claude Desktop, Claude Code, Cursor and Codex, not just one app.
You hold the credentials. They sit in your own Vercel project, not in a third-party platform.
You set the limits. Switch connectors and single tools off, or make the whole server read-only, and see what was called.
Free to run for personal use, and easy to extend with your own tools.
Other ways to solve this exist (hosted platforms like Composio, gateways like MetaMCP, single-service MCP servers). A short comparison is in What Capes is for.
🧭 How it works

Your server exposes POST /mcp, protected by a secret key you create (MCP_API_KEY), and a dashboard at /dashboard that you sign in to with the same key, or with a separate username/password if you set DASHBOARD_USER/DASHBOARD_PASSWORD (no third-party accounts either way). Every call passes a guard that checks the key, validates the arguments and applies your limits before a tool runs. Service credentials (Gmail app password, Discord bot token, Apify token) live as Vercel environment variables or, encrypted, in your own Postgres database -- never anywhere else.
Interactive diagrams (pan, zoom, search, trace a path): architecture, life of a tool call and how a change reaches main. GitHub shows an HTML file as source, so click the link, choose Download raw file (the download icon), and open the file in your browser. It is self-contained and works offline.
🚀 Quick start
About 20 minutes, most of it creating credentials. Skip any service you do not need.
# | Step | Where | Time |
1 | Create a free Vercel account and your | 3 min | |
2 | Get credentials for the services you want | 3 to 10 min each | |
3 | Deploy on Vercel and paste your key and credentials | 3 min | |
4 | Open | your browser | 3 min |
5 | Connect your AI client and ask "List my Discord channels" | Claude, Codex, Cursor | 2 min |
🔌 Services and credentials
Click a guide for the exact steps, permissions and limits of each service.
Service | What it unlocks | What you need | Where to get it | Setup guide |
Vercel (required) | Hosts your server and dashboard (free Hobby plan) | A Vercel account, two keys you invent ( | ||
Postgres (required) | Stores connector credentials and extra API keys, managed from the dashboard |
| Free: Supabase | |
Gmail | Read, send and organize email (free, no Google Cloud project) |
| ||
Discord | Read and manage servers, channels, messages, roles | Bot token | ||
Apify (for X/Twitter) | Search tweets | API token | ||
Telegram | Send messages, read chats, poll updates | Bot token | ||
Redis | Not needed. Only for flipping dashboard switches without redeploying. | (Advanced, optional: a free Redis via |
MCP_API_KEY, ENCRYPTION_KEY, DATABASE_URL, DASHBOARD_USER and DASHBOARD_PASSWORD are required. Discord/Gmail/Apify/Telegram are all optional -- a tool whose credentials are missing returns a clear message instead of failing.
☁️ Deploy
Option A: deploy on Vercel (recommended)
No install, no terminal.
Click the button and sign in to Vercel. It copies the repository into your GitHub account.
Paste
MCP_API_KEYandENCRYPTION_KEY(how to make them, two different random strings), aDASHBOARD_USER/DASHBOARD_PASSWORDyou pick (same section), andDATABASE_URL(get a free one from Supabase). These five are required. If you already have credentials for Discord, Gmail, Apify or Telegram, click Add More on the same screen and add them now. Otherwise, deploy first and add them later, either one at a time in Settings > Environment Variables, or all at once from a clone of the repo:node scripts/capes.mjs env --name <your-project-name>It asks for each service credential once, sets them all and redeploys — never touches
MCP_API_KEYor a client you've already connected.Click Deploy, then open
https://<project>.vercel.app/dashboardand sign in with yourDASHBOARD_USER/DASHBOARD_PASSWORD.
The button works for anyone once the repository is public. Before that, or from a fork, use Vercel > Add New > Project > Import Git Repository, choose the repo and add the same variables. Details, Deployment Protection and key rotation: Vercel guide.
Option B: one command from your computer
Needs Node.js 18+ and a Postgres DATABASE_URL (free: supabase.com). It logs you in to Vercel, generates strong keys, asks for your database URL, dashboard username/password, and service credentials (Enter skips optional ones), deploys, connects your AI clients and prints your Discord invite link:
git clone https://github.com/Dipeshpal/capes.git
cd capes
node scripts/capes.mjs installYour address, key and encryption key are saved to .capes.local.json (git-ignored). Non-interactive: node scripts/capes.mjs install --name my-capes --database postgres://... --dashboard-user admin --dashboard-password your8pluscharpassword --discord TOKEN --apify TOKEN --gmail you@gmail.com --gmail-password APP_PASSWORD --clients desktop,cursor.
Option C: Vercel CLI by hand
Step by step in the Vercel guide.
Updating an existing deployment
When new features land, pull them into your own deployment: node scripts/capes.mjs update from a clone (fetches upstream, merges, redeploys). Details: Vercel guide.
🖥️ The dashboard
Open https://<project>.vercel.app/dashboard and sign in with your DASHBOARD_USER/DASHBOARD_PASSWORD (or MCP_API_KEY, if you didn't set those).
Overview, Connectors, Tools: what is connected and which tools clients can see.
Test connection: a read-only check of each service's credentials.
Limits: turn a service or a single tool off, or hide everything that changes data. Set
PULSE_READ_ONLY,PULSE_DISABLED_CONNECTORSorPULSE_DISABLED_TOOLSon Vercel (an optional free Redis, separate from your Postgres database, lets you flip these on the dashboard without redeploying).Try: run read-only tools with a form.
Connect a client: copy-ready config for Claude, Cursor and Codex.
Full walkthrough and security details: Dashboard guide.
🤖 Connect your AI client
Every client needs your address https://<project>.vercel.app/mcp and your MCP_API_KEY as Authorization: Bearer <key>. The dashboard's Connect a client tab shows the exact config. Or, from a clone of the repo:
node scripts/capes.mjs connect # configures Claude Desktop, Claude Code, Cursor, CodexBy hand, per client (client guide):
Client | How it connects | Guide |
Claude Desktop |
| |
Claude Code |
| |
Cursor |
| |
Codex |
| |
Anything else | Streamable HTTP with the Bearer header |
Restart the client after connecting so it loads the tools.
💬 Using it
Once connected, just talk to your assistant and it picks the tools:
"How many unread emails do I have? Summarize the five newest."
"Draft a reply to the last email from Sam. Show me before sending."
"Read the last 50 messages in #support and list the open questions."
"Post the release notes in #announcements and pin them."
"Search X for people talking about MCP servers."
Sending mail and messages cannot be undone, so ask for a draft first when it matters. Using Capes has more examples and safety habits.
🧰 Tools
68 tools. The lists below are the quick view; docs/usage/tools.md is the generated reference with every tool's description, kind and arguments.
gmail_search, gmail_get_message, gmail_get_thread, gmail_get_attachment, gmail_list_labels, gmail_send_email (HTML, cc/bcc, attachments), gmail_reply (reply-all, quoted original), gmail_forward, gmail_create_draft, gmail_list_drafts, gmail_send_draft, gmail_delete_draft, gmail_modify (read/unread, star, archive, labels), gmail_trash, gmail_mark_spam, gmail_create_label, gmail_delete_label
Read: discord_list_guilds, discord_get_guild, discord_list_channels, discord_get_channel (with permission overwrites), discord_read_channel, discord_get_message, discord_list_pins, discord_list_reactions, discord_list_members (search too), discord_list_roles, discord_list_emojis, discord_list_scheduled_events, discord_list_threads, discord_list_invites, discord_get_audit_log, discord_read_dm
Messages: discord_send_message (text, embeds, replies), discord_send_dm, discord_send_file (base64 upload), discord_create_poll, discord_edit_message, discord_delete_message, discord_bulk_delete_messages, discord_pin_message, discord_add_reaction, discord_remove_reaction
Channels and threads: discord_create_channel (text, voice, category, announcement, stage, forum, private), discord_edit_channel (also renames, archives and locks threads), discord_delete_channel, discord_set_channel_permission, discord_delete_channel_permission, discord_create_invite, discord_delete_invite, discord_create_thread (from a message, standalone, private, or forum post with tags), discord_thread_member
Forums and webhooks: discord_list_forum_tags, discord_manage_forum_tag, discord_list_webhooks, discord_create_webhook, discord_send_webhook_message (the webhook token never leaves the server), discord_delete_webhook
Roles and moderation: discord_create_role, discord_edit_role, discord_delete_role, discord_member_role, discord_set_nickname, discord_moderate_member (kick, ban, unban, timeout)
twitter_search
telegram_send_message, telegram_get_chat, telegram_get_updates
Tools are flagged read, write or destructive so clients can ask before risky calls, and you can switch any of them off in the dashboard. Discord channel and thread IDs are interchangeable wherever a channel_id is asked for.
✅ Check that it works
Open
/dashboard, sign in, and click Test connection on each connector.Or
curl https://<project>.vercel.app/healthreturns"status":"online".In your AI client, ask "List my Discord channels" (Discord), "How many unread emails do I have?" (Gmail) or "Search X for MCP servers" (Apify).
Something wrong? Troubleshooting maps every common error to its fix.
🏁 What's built
68 tools across four services: Gmail (17), Discord (47), X search (1) and Telegram (3). The Discord toolkit covers messages, DMs, files, polls, threads, forums, webhooks, channels, roles, permissions, moderation, invites and the audit log.
Owner dashboard: sign in with your key, test each connector, browse the tools, try read-only ones, watch activity, copy client config, and generate your Discord invite link in one click.
One-click deploy to your own Vercel (Deploy button or one installer command). Needs a free Postgres database (e.g. Supabase) for credentials and API keys.
Works in Claude Desktop, Claude Code, Cursor and Codex (and any client that speaks MCP over HTTP).
Limits you control: switch a service or a single tool off, or make the whole server read-only. Every tool is labelled read, write or destructive.
Built to be safe: arguments validated against each tool's schema, secrets redacted from errors and logs, signed dashboard sessions with CSRF protection, rate-limited sign-in, fail-closed settings.
Tested without credentials: a fake IMAP server and a fake Discord API server exercise the tools in CI. Most Discord tools were also run against a real test server; one of 33 checks failed on the first run, and it was a real bug (pinning needs the separate Pin Messages permission), which is fixed. The maintainer has since tested it on a real community server too.
Open-source ready: MIT license, contributor guard against unreviewed changes to CI and assistant settings, protected
main(pull request, code-owner review and green checks), secret scanning, docs with diagrams.Bring-your-own Postgres for credentials and API keys: connector tokens encrypted in your own database, multiple labelled/expiring MCP API keys managed from the dashboard's Settings tab, all optional for existing deployments (#38, #39). New deploys (Deploy button and installer) now provision it by default (#40), plus a separate dashboard username/password login (#41, #42).
node scripts/capes.mjs update: pull new capes releases into your own deployed fork and redeploy in one command, database migrations run automatically (#43).
🗺️ What's next
Ideas, not promises. What you ask for moves up the list, so tell us what you need.
Discord: scheduled events, emoji listing, nicknames. Community-contributed (#25, #26) plus
discord_set_nickname. Still open: application commands, stickers.A second connector: Telegram. Send messages, read chat info, poll updates (#33). More services welcome — claim one.
A short demo video of an assistant using the tools, linked at the top of this README.
A fresh-account walkthrough of the README and Deploy button. Found and fixed a real bug: the button listed optional service credentials as required, contradicting "leave them empty" (#31).
v1.0.0 tagged release, with release notes.
Per-client keys and scopes, so one assistant can be read-only while another is not. Design posted for discussion in #24; implementation not started.
Verify the optional Redis settings on a real Upstash database (today they are tested against a fake server) — in progress.
Multiple accounts per service (for example two mailboxes).
More connectors: calendar, chat and notes tools are natural next candidates.
The design notes and known limits are in What Capes is for.
📬 Request a feature or a new MCP connector
Want your assistant to reach another service, or a tool that is missing?
Open a feature request and tell us:
what you want to be able to ask your assistant to do,
for a new service: its API docs, how a user gets credentials (token, app password, OAuth), whether it is free for personal use, and whether it works over plain HTTP from a short-lived serverless function,
the tools you would like (name, what it does, read, write or destructive),
whether you plan to build it yourself.
Want to build it? A new tool is one Python function; a whole service is a small module. Start with Contributing. Found a bug instead? Report it. Security problems go to SECURITY.md, not a public issue.
☕ Support the project
Capes is free and open source, built and maintained in spare time. If it saves you time, a coffee helps keep it going.
Starring the repo, sharing it, fixing a typo or sending a pull request helps just as much.
🛡️ Security
Capes holds real credentials, so it is built to be strict by default.
Guarantee | How |
One key guards everything |
|
Credentials stay in your Vercel project | Never commit |
Strict by default | Arguments are validated before any call, dashboard sessions are signed cookies with CSRF protection, and Redis outages fail closed into read-only mode. |
Contributors cannot slip in behaviour changes unnoticed | CI blocks hooks, wildcard permissions, hidden text, unapproved dependencies and risky workflows, hash-pins every executable file under |
If a token leaks | Rotate it at the provider (Discord: Reset Token; Apify: regenerate; Google: delete the app password) and update Vercel. |
Details in SECURITY.md and the security model.
🤝 Contributing
Anyone can contribute: fix a bug, sharpen a guide, add a tool, or improve the dashboard. Only the maintainer merges. Nobody pushes to main; every change goes through a pull request that passes the checks and gets a code-owner review (Governance).

Read What Capes is for and Contributing.
Fork, branch (
feat/...,fix/...,docs/...), make one focused change.Run the checks (no credentials needed; the full list is in Contributing):
uv run --with fastapi --with aiohttp --with python-dotenv --with httpx python tests/protocol.py uv run --with fastapi --with aiohttp --with python-dotenv --with httpx python tests/dashboard.py uv run --with fastapi --with aiohttp --with python-dotenv python tests/gmail_offline.py python tests/claude_config.py uvx ruff check . && uvx ruff format --check .Open a pull request using the template. Say what you tested and what you could not. CI runs the same checks, a guard for assistant/CI configuration, and a secret scan.
Adding a tool takes one Python function:
# pulse/hello.py (then import it in api/index.py)
from .registry import tool
@tool("hello", "Say hello", {"name": {"type": "string"}}, ["name"], hint="read")
async def hello(args: dict):
return {"message": f"Hello {args['name']}"}Changes to .claude/, .github/, scripts/, authentication code, vercel.json or dependencies always need the maintainer's review (see Security).
A contributor's assistant knows the project from the first prompt:
Path | What it gives you |
Overview, commands, conventions, gotchas and security rules, loaded in every session | |
Focused rules that load when you touch matching files (tools, dashboard, Discord, Gmail, installer, docs, GitHub) plus always-on security rules | |
Slash commands: | |
A reviewer subagent for tool changes, with shared memory in | |
Shared permissions: safe commands allowed; reading secret files and force pushes denied |
With Claude Code: run claude in the repo, then for example /add-tool slack slack_send_message, /run-tests, and ask @tool-reviewer to review your diff. What each file does is in docs/project/contributing.md.
📚 Documentation
Everything is indexed in docs/README.md.
🚀 Setup | Vercel · Discord · Gmail · Apify · Connect your client |
📖 Use | |
🤝 Understand and contribute | What Capes is for · Contributing · Governance: who can merge · Security policy · Release checklist |
📄 License
MIT. Use it, change it and share it; keep the copyright notice. It comes with no warranty, so you are responsible for what your AI assistants do with your mailbox and servers.
🔗 References
Model Context Protocol: introduction and connecting Claude Code to MCP servers
Claude Code directory layout, which the
.claude/folder followsGmail IMAP extensions (search syntax, labels, threads) and Google app passwords
Apify Tweet Scraper, the default actor behind
twitter_searchInspiration: kebab-mcp showed how useful a dashboard on a personal Vercel MCP server can be. Capes's dashboard is an independent implementation written from scratch. The README layout draws on the structure of other well-presented open-source READMEs; the wording and content here are our own.
Available Tools
62 toolsdiscord_add_reactionA
React to a message. emoji is a unicode emoji (👍) or a custom emoji as name:id.
Inputs: emoji (required), channel_id (required), message_id (required).
discord_bulk_delete_messagesADestructive
Delete 2-100 messages at once (must be newer than 14 days). Needs Manage Messages.
Inputs: channel_id (required), message_ids (required), reason.
discord_create_channelB
Create a channel in a server. Needs Manage Channels.
Inputs: name (required), guild_id (required), nsfw, type, +4 more.
discord_create_inviteC
Create an invite link for a channel.
Inputs: channel_id (required), max_uses, temporary, max_age_seconds.
discord_create_pollB
Post a native Discord poll (2 to 10 answers) in a channel.
Inputs: answers (required), question (required), channel_id (required), duration_hours, +1 more.
discord_create_roleA
Create a role. Needs Manage Roles; the bot can only grant permissions it has itself.
Inputs: name (required), guild_id (required), color, hoist, +2 more.
discord_create_threadA
Create a thread: from an existing message (message_id), as a standalone thread, or as a forum post (content). Edit/archive/delete threads with discord_edit_channel / discord_delete_channel.
Inputs: name (required), channel_id (required), content, private, +3 more.
discord_create_webhookA
Create a webhook in a channel. Returns its ID only; use discord_send_webhook_message to post through it. Needs Manage Webhooks.
Inputs: name (required), channel_id (required).
discord_delete_channelADestructive
Permanently delete a channel or thread. This cannot be undone.
Inputs: channel_id (required), reason.
discord_delete_channel_permissionBDestructive
Remove a role's or member's permission overwrite from a channel.
Inputs: target_id (required), channel_id (required).
discord_delete_inviteADestructive
Revoke an invite link. Needs Manage Server (or Manage Channels for that channel).
Inputs: code (required), reason.
discord_delete_messageADestructive
Delete a message. Needs Manage Messages to delete other people's messages.
Inputs: channel_id (required), message_id (required), reason.
discord_delete_roleBDestructive
Delete a role permanently.
Inputs: role_id (required), guild_id (required), reason.
discord_delete_webhookADestructive
Delete a webhook permanently. Needs Manage Webhooks.
Inputs: webhook_id (required), reason.
discord_edit_channelA
Edit a channel or a thread (rename, topic, move, slowmode; for threads also archive/lock). Needs Manage Channels (Manage Threads for threads).
Inputs: channel_id (required), name, nsfw, topic, +6 more.
discord_edit_messageA
Edit a message. Discord only lets the bot edit its own messages.
Inputs: channel_id (required), message_id (required), embed, content, +1 more.
discord_edit_roleA
Edit a role. Passing permissions replaces the role's whole permission set.
Inputs: role_id (required), guild_id (required), name, color, +3 more.
discord_get_audit_logARead-only
Read a server's audit log (who changed what, newest first). Needs View Audit Log.
Inputs: guild_id (required), limit, user_id, action_type.
discord_get_channelBRead-only
Get a channel or thread, including its permission overwrites (translated to permission names).
Inputs: channel_id (required).
discord_get_guildCRead-only
Get details about a Discord server.
Inputs: guild_id (required).
discord_get_messageCRead-only
Read one message by ID.
Inputs: channel_id (required), message_id (required).
discord_list_channelsARead-only
List channels (all types, including categories, voice and forums). Omit guild_id to list every server the bot is in.
Inputs: guild_id.
discord_list_forum_tagsCRead-only
List the tags of a forum channel.
Inputs: channel_id (required).
discord_list_guildsARead-only
List the Discord servers the bot is in.
Inputs: no named parameters.
discord_list_invitesARead-only
List a server's active invites. Needs Manage Server.
Inputs: guild_id (required).
discord_list_membersARead-only
List server members, or search by name with query. Needs the 'Server Members Intent' enabled in the Discord Developer Portal (Bot tab).
Inputs: guild_id (required), limit, query.
discord_list_pinsCRead-only
List pinned messages in a channel.
Inputs: channel_id (required).
discord_list_reactionsBRead-only
List the users who reacted to a message with one emoji (unicode or name:id).
Inputs: emoji (required), channel_id (required), message_id (required), limit.
discord_list_rolesBRead-only
List a server's roles with their permissions.
Inputs: guild_id (required).
discord_list_threadsARead-only
List active threads in a server, or archived public threads of one channel when channel_id is given.
Inputs: guild_id, channel_id.
discord_list_webhooksARead-only
List webhooks of a channel or of a whole server. Tokens are never shown. Needs Manage Webhooks.
Inputs: guild_id, channel_id.
discord_manage_forum_tagADestructive
Add, rename or remove a tag on a forum channel. Needs Manage Channels. Removing a tag removes it from posts that use it.
Inputs: action (required), channel_id (required), name, emoji, +2 more.
discord_member_roleA
Give a role to a member, or take it away. The role must be below the bot's highest role.
Inputs: action (required), role_id (required), user_id (required), guild_id (required).
discord_moderate_memberADestructive
Moderate a member: kick, ban, unban, timeout (mute for N minutes) or untimeout. Needs Kick/Ban/Moderate Members. Destructive: confirm with the user first.
Inputs: action (required), user_id (required), guild_id (required), reason, +2 more.
discord_pin_messageA
Pin (default) or unpin a message. Needs the Pin Messages permission (Discord split it from Manage Messages).
Inputs: channel_id (required), message_id (required), unpin.
discord_read_channelARead-only
Read recent messages from a channel or thread (newest first).
Inputs: channel_id (required), limit, before.
discord_read_dmBRead-only
Read recent direct messages between the bot and a user (newest first).
Inputs: user_id (required), limit.
discord_remove_reactionADestructive
Remove the bot's reaction, another user's reaction (user_id), or all reactions on the message (clear_all). Removing others' reactions needs Manage Messages.
Inputs: channel_id (required), message_id (required), emoji, user_id, +1 more.
discord_send_dmA
Send a direct message to a user. They must share a server with the bot and allow DMs from server members. Never pings anyone.
Inputs: user_id (required), embed, content.
discord_send_fileA
Upload a file (base64, up to 3 MB) to a channel or thread, with an optional message.
Inputs: filename (required), channel_id (required), content_base64 (required), content, +1 more.
discord_send_messageB
Send a message to a channel or thread. Provide content and/or an embed.
Inputs: channel_id (required), embed, content, mentions, +1 more.
discord_send_webhook_messageA
Post a message through a webhook, optionally under a custom display name. The server looks up the webhook token itself.
Inputs: webhook_id (required), embed, content, username.
discord_set_channel_permissionA
Set (replace) the permission overwrite for a role or member on a channel. Permissions in neither allow nor deny inherit. Needs Manage Roles.
Inputs: target_id (required), channel_id (required), target_type (required), deny, +1 more.
discord_thread_memberA
Manage thread membership: join/leave (the bot), add/remove a user, or list members.
Inputs: action (required), thread_id (required), user_id.
gmail_create_draftA
Save a draft in Gmail (does not send). It shows up in Gmail's Drafts.
Inputs: body (required), subject (required), cc, to, +3 more.
gmail_create_labelA
Create a label. Use '/' for nested labels (Work/Invoices).
Inputs: name (required).
gmail_delete_draftBDestructive
Permanently delete a draft.
Inputs: id (required).
gmail_delete_labelBDestructive
Delete a label. Messages that had it are kept.
Inputs: name (required).
gmail_forwardA
Forward an email (the original is attached as .eml). Sends immediately.
Inputs: id (required), to (required), cc, note.
gmail_get_attachmentBRead-only
Download one attachment as base64 (max about 2 MB).
Inputs: id (required), filename (required).
gmail_get_messageARead-only
Read one email: headers, text body and attachment list. Does not mark it as read unless mark_read is true.
Inputs: id (required), mark_read, max_chars.
gmail_get_threadARead-only
Read a whole conversation (oldest first). Bodies are truncated to 4000 characters each; up to 30 messages.
Inputs: thread_id (required).
gmail_list_draftsBRead-only
List drafts, newest first.
Inputs: limit.
gmail_list_labelsARead-only
List Gmail labels/folders and the unread count of the inbox.
Inputs: no named parameters.
gmail_mark_spamCDestructive
Move messages to Spam.
Inputs: ids (required).
gmail_modifyA
Change messages: mark read/unread, star/unstar, archive (remove from inbox), add or remove labels. New labels are created automatically.
Inputs: ids (required), read, archive, starred, +2 more.
gmail_replyA
Reply to an email in its thread (sends immediately). reply_all also replies to everyone on To/Cc. The original text is quoted below your reply.
Inputs: id (required), body (required), html, reply_all, +2 more.
gmail_searchARead-only
Search email with Gmail search syntax (from:, to:, subject:, is:unread, has:attachment, label:, newer_than:2d, after:2026/01/01...). Covers All Mail (not Trash/Spam). Newest first.
Inputs: limit, query, before_id.
gmail_send_draftA
Send an existing draft, then remove it from Drafts. Sends immediately.
Inputs: id (required).
gmail_send_emailA
Send an email immediately from the connected account. It cannot be unsent; use gmail_create_draft to let the user review first.
Inputs: to (required), body (required), subject (required), cc, +3 more.
gmail_trashADestructive
Move messages to Trash (Gmail deletes them after 30 days; recover them in Gmail).
Inputs: ids (required).
twitter_searchARead-only
Search tweets on X/Twitter via Apify (needs APIFY_TOKEN).
Inputs: query (required), limit.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 62 tools
Tools are mostly cleanly separated by service and resource+action, e.g. Discord message/channel/role operations and Gmail message/draft/label operations. A few boundaries blur—discord_edit_channel/delete_channel also handle threads while thread creation is separate, and gmail_modify overlaps with trash/spam/archive—but descriptions clearly differentiate them.
Strong service_action naming with snake_case throughout (discord_*, gmail_*, twitter_search). Most names follow verb_noun, but a handful are noun-only or vague (discord_member_role, discord_thread_member, gmail_modify, gmail_trash), which is a minor deviation rather than chaos.
62 tools is far beyond the 3–15 well-scoped range and sits in the rubric's 50+ extreme-mismatch band. Even split across Discord, Gmail, and Twitter, the surface is very large and likely to burden tool selection.
Discord coverage is deep across messages, channels, roles, members, threads, invites, webhooks, moderation, and audit logs; Gmail covers search, read, send, reply, forward, labels, drafts, and message state. Minor gaps remain (e.g., Twitter is search-only, and there is no direct Discord message search or Gmail draft retrieval), but core lifecycle workflows are covered.
Maintenance
Related MCP Connectors
Email inboxes for AI agents: send, receive, search, drafts with owner approval, and webhooks.
Email for AI agents: read, search and send from your Gmail, Outlook, Yahoo, iCloud or IMAP inbox.
Email, calendar and contacts for AI agents: Gmail, Microsoft 365 and IMAP accounts behind one API.
Authenticated email gateway for AI agents — per-agent inboxes, HITL approval, SPF/DKIM verified.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage multiple email accounts with secure credentials, local full-text search, thread-aware replies, and automation.4 npmMIT
- FlicenseNot gradedqualityCmaintenanceUnified email orchestration server for Gmail and Outlook with agentic tools for sending, reading, searching, and managing emails, enabling assistant-driven email workflows.2-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to securely read, search, and send email across IMAP and Microsoft Graph accounts, with scoped tokens, approval flows, and an audit trail.1MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to read, search, send, manage, schedule, and analyze mail across multiple IMAP/SMTP accounts, with real-time inbox watching, verification-code capture, calendar extraction, and provider-aware labeling. It also exposes drafts, templates, bulk operations, analytics, and OAuth2 support over stdio or Streamable HTTP.28 npmISC