mcp-template
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gmail_composer.save_draftC | Persist the current composer fields onto an existing Gmail draft. |
| gmail_composer.sendC | Persist composer fields then send the draft via Gmail. |
| gmail_composer.discardC | Delete the current draft. |
| gmail_composer.refreshB | Re-fetch the current draft (used by the composer to poll for agent edits). |
| gmail_composer.get_threadB | Fetch the full thread for display in the composer's thread panel. |
| gmail_composer.get_attachmentC | Fetch the raw base64 data for an attachment on a message. |
| gmail_inbox.refreshC | Re-run gmail_curate_inbox (called by the inbox reader app). |
| gmail_inbox.open_threadC | Fetch a single thread for the inbox reader app. |
| gmail_inbox.mark_readB | Mark a thread as read (removes the UNREAD label). |
| gmail_inbox.archiveC | Archive a thread (removes the INBOX label). |
| gmail_inbox.replyC | Create a reply draft on a thread (the composer app opens it next). |
| gmail_inbox.forwardC | Create a forward draft for a message in a thread. |
| gmail_inbox.mark_doneC | Mark a thread as done (applies MCP/Done label, hides from curated inbox). |
| gmail_inbox.unmark_doneC | Remove the done marker from a thread (undo mark-done). |
| gmail_inbox.set_focusC | Store which thread the user is currently viewing (called by inbox UI). |
| gmail_get_focused_emailB | Return the email thread the user is currently viewing in the inbox UI. Call this when the user asks about 'this email', 'the email I'm looking at', or references the currently open thread. |
| settings.getA | Fetch the current settings snapshot for the Settings app. |
| settings.subscribeC | Register a webhook endpoint (returns the one-time signing secret). |
| settings.rotate_secretC | Issue a new signing secret for a webhook subscription. |
| settings.unsubscribeC | Deactivate a webhook subscription. |
| gmail_connectC | Begin the Google OAuth flow to link a Gmail account |
| gmail_statusC | Return whether the user has a linked Gmail account |
| gmail_disconnectB | Revoke and remove the user's linked Gmail account |
| gmail_add_attachmentA | Attach one file to an existing Gmail draft and return the draft's full attachment list (each with attachment_id, filename, mime_type, size_bytes). Only the attachments change - body, subject, and recipients are preserved exactly. Pass the file as 'attachment' (filename + mime_type + base64 data_base64). |
| gmail_remove_attachmentA | Remove one file from a Gmail draft by its attachment_id and return the draft's remaining attachment list. Only the attachments change - body, subject, and recipients are preserved exactly. The attachment_id comes from any prior draft response or gmail_get_draft. |
| gmail_list_inboxA | List recent inbox messages, optionally filtered by a Gmail search query. When the user asks to find or open a specific email, ALWAYS follow up by calling gmail_get_thread with the thread_id to render the full conversation in an interactive UI. |
| gmail_get_threadA | Fetch a Gmail thread by id with full message bodies. By default attachment/inline-image bytes are omitted (each attachment still carries filename, mime_type, size, attachment_id) to keep the payload small - fetch a file on demand with gmail_get_attachment. Pass include_attachment_data=true to inline bytes, or strip_quoted_replies=true to drop repeated quoted history. When an interactive UI is rendered alongside the result, keep your text response brief since the user can browse the conversation in the UI. |
| gmail_get_attachmentA | Fetch the raw base64 bytes of a single attachment or inline image on a Gmail message, identified by the message_id + attachment_id echoed by gmail_get_thread. Use this to pull one file on demand instead of loading every attachment into the thread payload. data_base64 is raw encoded bytes, not a rendered image - you cannot read an image's contents from it; on vision-capable MCP hosts, image attachments are additionally rendered into context as a viewable image. |
| gmail_mark_thread_readB | Mark a Gmail thread as read by removing the UNREAD label |
| gmail_archive_threadC | Archive a Gmail thread by removing the INBOX label. Also marks the thread dismissed in the curation ledger. During a triage pass, continue on to the next uncurated or stale thread. |
| gmail_mark_thread_doneB | Mark a Gmail thread as done by applying the MCP/Done label (hides from curated inbox). Also marks the thread dismissed in the curation ledger. During a triage pass, continue on to the next uncurated or stale thread. |
| gmail_unmark_thread_doneB | Remove the MCP/Done label from a thread (undo mark-done) |
| gmail_curate_inboxA | Rank recent inbox threads by a deterministic heuristic score and render the inbox dashboard. This is a quick provisional view, NOT the assistant's own triage: for 'what's important / triage my inbox', prefer inbox_get_curation (banked LLM verdicts + coverage), going deeper with inbox_search + inbox_save_curation when coverage shows uncurated/stale threads. When an interactive UI is rendered alongside the result, keep your text response brief (a one-line summary) since the user can browse details in the UI. Only elaborate if the user asks. |
| gmail_list_draftsB | List the user's Gmail drafts |
| gmail_get_draftC | Fetch a single Gmail draft by id |
| gmail_update_draftA | Patch fields on an existing Gmail draft and open an interactive composer UI. Non-destructive by default: any field you OMIT is left unchanged on the draft, and a field set to null is CLEARED - this holds for to, cc, bcc, subject, body, and attachments. Omit 'attachments' to keep every existing file untouched (so you can edit the body repeatedly without re-uploading); pass null or [] to drop them all. 'attachments' may mix new uploads (filename + mime_type + data_base64) with references to existing files ({attachment_id}) taken from a prior response, letting you preserve specific files by id. To add or remove a single file without touching the body, prefer gmail_add_attachment / gmail_remove_attachment. The returned draft echoes the saved state (recipients, subject, body_preview, and the full attachment list with ids/filenames/sizes). ALWAYS call this tool to write or edit draft content - NEVER compose email text as plain chat text. Pass your composed text in the 'body' parameter. Keep your chat response to one brief sentence since the user can edit in the UI. |
| gmail_composeA | Create a new Gmail draft from the given fields and open an interactive composer UI. Returns the draft's actual saved state - draft_id, thread_id, recipients, subject, a body_preview, and the attachment list (each with attachment_id, filename, mime_type, size_bytes) - so you can verify what was saved without a follow-up gmail_get_draft. To edit it afterward use gmail_update_draft, which preserves omitted fields and keeps attachments unless you clear them. ALWAYS use this tool instead of composing email text in chat - it creates a real Gmail draft where the user can review, edit, and send. When an interactive UI is rendered alongside the result, keep your text response brief since the user can edit in the UI. |
| gmail_sendB | Send a previously-composed Gmail draft |
| gmail_discard_draftC | Delete a Gmail draft by id |
| gmail_reply_to_threadA | Create a reply draft on an existing Gmail thread. ALWAYS use this tool instead of composing reply text in chat - it creates a real Gmail draft and opens an interactive composer UI where the user can review, edit, and send. Pass your drafted reply in the 'body' parameter. Recipients are yours to control: pass 'to', 'cc', and/or 'bcc' (each a comma-separated address list) to set them explicitly. If you omit 'to', it defaults to the other party in the thread (never the account owner); omitted 'cc'/'bcc' are left unset. If every message in the thread is yours (no other participant to reply to), you must pass 'to' explicitly or the call errors. When an interactive UI is rendered alongside the result, keep your text response brief since the user can edit in the UI. |
| webhook_subscribeC | Register an HTTPS endpoint to receive signed webhook events |
| webhook_listB | List the caller's webhook subscriptions (secrets are never returned) |
| webhook_unsubscribeC | Deactivate a webhook subscription so it stops receiving events |
| webhook_rotate_secretB | Issue a new signing secret for a subscription (invalidates the old one) |
| gmail_watch_startC | Subscribe the user's Gmail inbox to push notifications |
| gmail_watch_stopC | Cancel the user's Gmail push-notification watch |
| inbox_get_curationA | Read banked inbox triage from the curation ledger. Cheap: no email bodies are fetched and no reasoning is run - it returns judgments the assistant already made (bucket, importance, summary, suggested action) plus a coverage count of curated / stale / uncurated threads in the inbox. Call this FIRST for any 'what's important / triage my inbox' request. If coverage shows many uncurated or stale threads and the user wants a thorough pass, go deeper with inbox_search + inbox_save_curation; otherwise answer directly from these banked verdicts. |
| inbox_searchA | Search recent inbox threads headlessly (no UI) when doing a thorough triage pass - use this to actually look at many emails. Returns thread summaries (subject, sender, snippet, recency) each annotated with its ledger status: 'uncurated' / 'stale' threads are the delta worth reasoning about; 'curated' threads are already banked and can be skipped. Uncurated threads also carry a provisional heuristic importance_prior. Pass since_history_id (from a prior result's current_history_id) to fetch only changed threads. After reasoning over the results, bank your verdicts with inbox_save_curation. |
| inbox_save_curationA | Bank your triage judgments for one or more threads into the curation ledger so they are not re-reasoned next time. Call this after reading and reasoning over threads (typically from inbox_search) - pass a batch of per-thread verdicts (bucket, importance, a short summary, suggested action, optional reasoning/confidence). Each write stamps the thread's current Gmail historyId so the verdict stays valid until the thread changes. This is what makes the next inbox_get_curation near-free. |
| webhook_settingsC | Open your settings: Gmail connection status and webhook subscriptions |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| gmail_composer app | |
| gmail_inbox app | |
| settings app |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Edison-Watch/Custom-MCPs'
If you have feedback or need assistance with the MCP directory API, please join our Discord server