Gmail MCP server icon

Gmail

by Gmail

HIPAA CompliantSOC2 ReadyISO 27001 Ready
Communication30 tools

Search, read, send and organise Gmail — and manage Google Tasks — from your AI agent. 30 tools, Google OAuth sign-in, and a second endpoint so you can connect two accounts at once.

Agentman Certified

Built and operated by Agentman.

Connection checked by Agentman on .

Not listed in Anthropic’s Connectors Directory, which covers third-party connectors.

Connect Gmail via MCP

https://mcp.agentman.ai/gmail/mcp

Works in any MCP-compatible client. In Agentman Studio it is one click — no config file to edit.

Use in Agentman

Connect Gmail once and your agents call these tools on their own — on a schedule, in a workflow, with nobody at the keyboard.

Open in Agentman Studio

Gmail Tools & Capabilities (30)

gmail_get_profileRead-only

Get the authenticated user's Gmail profile information. Returns the user's email address and mailbox statistics. Useful for confirming which account is connected and getting basic stats. Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - email_address: The user's Gmail address - messages_total: Total number of messages in the mailbox - threads_total: Total number of threads - history_id: Current history ID for the mailbox Examples: - Get profile: {} Error Handling: - Returns AUTH_REQUIRED if not authenticated

gmail_search_emailsRead-only

Search and list emails from the user's Gmail inbox. Uses the same query syntax as the Gmail search box. Returns email summaries with IDs that can be used with gmail_read_email or gmail_read_thread to get full content. Args: - query (string): Gmail search query. Examples: 'from:alice@example.com', 'subject:invoice', 'is:unread', 'has:attachment', 'after:2024/01/01 before:2024/12/31', 'label:important'. Leave empty to list recent emails. - max_results (number): Maximum results to return, 1-100 (default: 20) - page_token (string): Pagination token from previous results (use next_page_token from response) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of email summaries with: - id: Message ID (use with gmail_read_email) - thread_id: Conversation thread ID (use with gmail_read_thread) - from: Sender - to: Recipients - subject: Email subject - date: Date sent - snippet: Preview text - labels: Gmail label IDs Plus pagination: - result_count: Number of results in this page - next_page_token: Token for next page (if more results exist) - has_more: Whether more results are available Examples: - Recent emails: {} - Unread emails: {"query": "is:unread"} - From specific sender: {"query": "from:boss@company.com"} - With attachment: {"query": "has:attachment subject:report"} - Next page: {"query": "is:unread", "page_token": "TOKEN_FROM_PREVIOUS"} Error Handling: - Returns empty list if no emails match - Returns AUTH_REQUIRED if not authenticated

gmail_read_emailRead-only

Read the full content of a specific email by its message ID. Returns the complete email including headers, body text, and attachment info. Use gmail_search_emails first to find message IDs. Use gmail_get_attachment with the returned attachment_id to download attachment content. Args: - message_id (string): The Gmail message ID (required, obtained from gmail_search_emails) - mark_as_read (boolean): If true, marks the email as read after fetching (default: false) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Full email details: - id: Message ID - thread_id: Thread ID (use with gmail_read_thread for full conversation) - from: Sender address - to: Recipient(s) - cc: CC recipients (if any) - subject: Subject line - date: Date sent - body: Full email body text - labels: Gmail labels - attachments: List with filename, mimeType, size, and attachment_id (use with gmail_get_attachment) Examples: - Read email: {"message_id": "18f1a2b3c4d5e6f7"} - Read and mark as read: {"message_id": "18f1a2b3c4d5e6f7", "mark_as_read": true} Error Handling: - Returns NOT_FOUND if message_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_batch_read_emailsRead-only

Read the full content of multiple emails by their message IDs in a single call. Returns complete email details for up to 50 messages at once. Much faster than calling gmail_read_email one at a time. Use gmail_search_emails first to find message IDs. Args: - message_ids (string[]): Array of Gmail message IDs to read (required, max 50) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - result_count: Number of emails included in this response - emails: Array of full email objects, each with: - id: Message ID - thread_id: Thread ID - from: Sender address - to: Recipient(s) - cc: CC recipients (if any) - subject: Subject line - date: Date sent - body: Full email body text - snippet: Preview text - labels: Gmail labels - attachments: List with filename, mimeType, size, and attachment_id - truncated: true if response was too large and some emails were omitted - remaining_ids: IDs of emails that were fetched but omitted due to size (call again with these) - total_fetched: Total emails successfully fetched before truncation - errors: Array of {id, error, status} for message IDs that failed to load (if any) Examples: - Read 3 emails: {"message_ids": ["18f1a2b3c4d5e6f7", "18f1a2b3c4d5e6f8", "18f1a2b3c4d5e6f9"]} Error Handling: - Individual email failures are reported in the errors array without failing the entire batch - Returns AUTH_REQUIRED if not authenticated

gmail_read_threadRead-only

Read all messages in a Gmail conversation thread. Returns the full thread with all messages in chronological order. For long threads, older messages show snippets while the most recent messages show full body text to stay within size limits. Args: - thread_id (string): The Gmail thread ID (required, obtained from gmail_search_emails or gmail_read_email) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Thread details: - thread_id: Thread ID - subject: Thread subject - message_count: Number of messages in thread - messages: Array of messages in chronological order, each with: - id: Message ID - from: Sender - to: Recipients - date: Date sent - snippet: Preview text (always included) - body: Full body text (included for the 3 most recent messages) - labels: Label IDs Examples: - Read thread: {"thread_id": "18f1a2b3c4d5e6f7"} Error Handling: - Returns NOT_FOUND if thread_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_send_emailActs

Send a new email from the user's Gmail account. Composes and sends an email. Supports plain text, HTML, and reply threading. The sender will be the authenticated user's Gmail address. Args: - to (string): Recipient email address, or comma-separated for multiple recipients (required) - subject (string): Email subject line (required, max 998 chars) - body (string): Plain text email body (required) - html_body (string): Optional HTML email body. When provided, sends as multipart with both text and HTML versions. - in_reply_to (string): Optional message ID to reply to. Adds threading headers to keep the reply in the same conversation thread. - cc (string): CC recipients, comma-separated (optional) - bcc (string): BCC recipients, comma-separated (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Confirmation with: - id: Sent message ID - thread_id: Thread ID - to: Recipient(s) - subject: Subject line Examples: - Simple email: {"to": "alice@example.com", "subject": "Hello", "body": "Hi Alice, how are you?"} - With CC: {"to": "bob@example.com", "subject": "Update", "body": "Here is the update.", "cc": "manager@company.com"} - HTML email: {"to": "alice@example.com", "subject": "Report", "body": "See report below.", "html_body": "<h1>Report</h1><p>Details...</p>"} - Reply: {"to": "alice@example.com", "subject": "Re: Hello", "body": "I'm doing well!", "in_reply_to": "MESSAGE_ID"} Error Handling: - Returns INVALID_PARAMS if to, subject, or body is empty - Returns API_ERROR if sending fails (invalid address, etc.) - Returns AUTH_REQUIRED if not authenticated

gmail_reply_to_emailActs

Reply to an email, maintaining the conversation thread. Sends a reply to the sender of the specified message. The reply is automatically threaded with the original conversation using proper email headers (In-Reply-To, References). Args: - message_id (string): The message ID to reply to (required) - body (string): Plain text reply body (required) - cc (string): Additional CC recipients, comma-separated (optional) - bcc (string): BCC recipients, comma-separated (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Confirmation with: - id: Sent reply message ID - thread_id: Thread ID (same as original) - to: Who the reply was sent to - subject: Reply subject line Examples: - Simple reply: {"message_id": "18f1a2b3c4d5e6f7", "body": "Thanks for the update!"} - Reply with CC: {"message_id": "18f1a2b3c4d5e6f7", "body": "Looping in the team.", "cc": "team@company.com"} Error Handling: - Returns NOT_FOUND if the original message_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_create_draftActs

Create a draft email in the user's Gmail account. Creates a draft that can be reviewed and sent later from Gmail. Supports reply drafts when in_reply_to is specified. Args: - to (string): Recipient email address, or comma-separated for multiple recipients (required) - subject (string): Email subject line (required, max 998 chars) - body (string): Plain text email body (required) - cc (string): CC recipients, comma-separated (optional) - bcc (string): BCC recipients, comma-separated (optional) - in_reply_to (string): Message ID to reply to. Draft will be threaded with the original conversation. (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - draft_id: The draft ID - message_id: The underlying message ID - thread_id: Thread ID Examples: - New draft: {"to": "alice@example.com", "subject": "Proposal", "body": "Here is my proposal..."} - Reply draft: {"to": "bob@example.com", "subject": "Re: Question", "body": "Let me think about it.", "in_reply_to": "MSG_ID"} Error Handling: - Returns AUTH_REQUIRED if not authenticated - Returns API_ERROR if draft creation fails

gmail_modify_emailActs

Modify an email's labels to archive, star, mark as read/unread, trash, or apply custom labels. Works by adding or removing Gmail label IDs. Common operations: - Archive: remove_labels: ["INBOX"] - Mark as read: remove_labels: ["UNREAD"] - Mark as unread: add_labels: ["UNREAD"] - Star: add_labels: ["STARRED"] - Unstar: remove_labels: ["STARRED"] - Move to trash: add_labels: ["TRASH"] - Mark important: add_labels: ["IMPORTANT"] Args: - message_id (string): The Gmail message ID to modify (required) - add_labels (string[]): Label IDs to add (optional) - remove_labels (string[]): Label IDs to remove (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: Message ID - labels: Updated label IDs on the message Examples: - Archive: {"message_id": "MSG_ID", "remove_labels": ["INBOX"]} - Mark as read: {"message_id": "MSG_ID", "remove_labels": ["UNREAD"]} - Star and mark important: {"message_id": "MSG_ID", "add_labels": ["STARRED", "IMPORTANT"]} - Trash: {"message_id": "MSG_ID", "add_labels": ["TRASH"]} Error Handling: - Returns INVALID_PARAMS if neither add_labels nor remove_labels is provided - Returns NOT_FOUND if message_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_batch_modify_emailsActs

Modify labels on multiple emails at once. Applies the same label changes to up to 100 emails in a single operation. Useful for bulk actions like archiving, marking as read, or applying labels. Args: - message_ids (string[]): Array of Gmail message IDs to modify (required, max 100) - add_labels (string[]): Label IDs to add to all messages (optional) - remove_labels (string[]): Label IDs to remove from all messages (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - modified_count: Number of messages modified - message_ids: Array of modified message IDs Examples: - Archive multiple: {"message_ids": ["ID1", "ID2", "ID3"], "remove_labels": ["INBOX"]} - Mark all as read: {"message_ids": ["ID1", "ID2"], "remove_labels": ["UNREAD"]} - Add label to batch: {"message_ids": ["ID1", "ID2"], "add_labels": ["Label_123"]} Error Handling: - Returns INVALID_PARAMS if neither add_labels nor remove_labels is provided - Returns AUTH_REQUIRED if not authenticated

gmail_list_labelsRead-only

List all labels in the user's Gmail account. Returns system labels (INBOX, SENT, TRASH, etc.) and user-created labels with message counts. Useful for finding label IDs to use with gmail_search_emails or gmail_modify_email. Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - total: Total number of labels - labels: Array of labels, each with: - id: Label ID (use in search queries or modify operations) - name: Display name - type: 'system' or 'user' - messages_total: Total messages with this label - messages_unread: Unread messages with this label Examples: - List labels: {} Error Handling: - Returns AUTH_REQUIRED if not authenticated

gmail_get_attachmentRead-only

Download an email attachment and return it for viewing or analysis. Retrieves attachment content from Gmail. Images are returned inline so Claude can see them directly. Other files (PDFs, documents, etc.) are uploaded to Agentman file storage and a download URL is returned. Use gmail_read_email first to get the attachment_id for each attachment. Args: - message_id (string): The Gmail message ID containing the attachment (required) - attachment_id (string): The attachment ID from gmail_read_email (required) Returns: - For images: Inline image that Claude can view and analyze directly - For text files: Decoded text content - For PDFs/documents: Download URL from Agentman file storage (expires in 1 hour) Examples: - Get attachment: {"message_id": "18f1a2b3c4d5e6f7", "attachment_id": "ANGjdJ_abc123"} Error Handling: - Returns NOT_FOUND if message or attachment doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_archive_emailsActs

Archive one or more emails by removing them from the Inbox. Archived emails are not deleted — they remain searchable and accessible in "All Mail". This is the same as swiping to archive in the Gmail app. Args: - message_ids (string[]): Array of Gmail message IDs to archive (required, max 100) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - archived_count: Number of emails archived - message_ids: Array of archived message IDs Examples: - Archive one: {"message_ids": ["18f1a2b3c4d5e6f7"]} - Archive several: {"message_ids": ["ID1", "ID2", "ID3"]} Error Handling: - Returns AUTH_REQUIRED if not authenticated - Returns API_ERROR if the operation fails

gmail_mark_as_spamActs

Report one or more emails as spam. Moves the emails to the Spam folder and removes them from the Inbox. Gmail uses this signal to improve its spam filter for the user. This is the same as clicking "Report spam" in Gmail. Args: - message_ids (string[]): Array of Gmail message IDs to mark as spam (required, max 100) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - spam_count: Number of emails marked as spam - message_ids: Array of affected message IDs Examples: - Mark one as spam: {"message_ids": ["18f1a2b3c4d5e6f7"]} - Mark several as spam: {"message_ids": ["ID1", "ID2", "ID3"]} Error Handling: - Returns AUTH_REQUIRED if not authenticated - Returns API_ERROR if the operation fails

gmail_unsubscribeActs

Unsubscribe from a mailing list based on an email's List-Unsubscribe header. Reads the email headers to find RFC 2369 List-Unsubscribe information, then attempts to unsubscribe. Supports: - RFC 8058 One-Click Unsubscribe (HTTP POST with List-Unsubscribe-Post header) - HTTP/HTTPS unsubscribe URLs (GET request) - mailto: unsubscribe links (reported back for manual action) If no List-Unsubscribe header is found, the tool reports that the email does not support automated unsubscription. Args: - message_id (string): The Gmail message ID from the mailing list email (required) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - unsubscribed: Whether the unsubscribe request was successfully sent - method: The method used ('one-click', 'http', 'mailto', or 'none') - detail: Human-readable explanation of what happened - mailto_address: If method is 'mailto', the address to email for manual unsubscribe Examples: - Unsubscribe: {"message_id": "18f1a2b3c4d5e6f7"} Error Handling: - Returns NOT_FOUND if message_id doesn't exist - Returns AUTH_REQUIRED if not authenticated - Returns graceful message if email has no unsubscribe header

gtasks_list_tasklistsRead-only

List all task lists for the authenticated user. Returns all Google Tasks lists. Every Google account has at least one task list (the default "My Tasks" list). Args: - max_results (number): Maximum task lists to return, 1-100 (default: 20) - page_token (string): Pagination token from previous results - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - total: Number of task lists in this page - tasklists: Array of task lists, each with: - id: Task list ID (use with other gtasks_ tools) - title: Task list name - updated: Last modification timestamp - has_more: Whether more results are available - next_page_token: Token for next page (if has_more is true) Examples: - List all: {} - Paginate: {"page_token": "TOKEN_FROM_PREVIOUS"} Error Handling: - Returns AUTH_REQUIRED if not authenticated

gtasks_create_tasklistActs

Create a new task list. Creates a new Google Tasks list. The user can then add tasks to it using gtasks_create_task. Args: - title (string): Name for the new task list (required, max 1024 chars) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: The new task list's ID - title: The task list name - updated: Creation timestamp Examples: - Create list: {"title": "Shopping List"} - Create project list: {"title": "Q1 Goals"} Error Handling: - Returns AUTH_REQUIRED if not authenticated - Returns API_ERROR if creation fails

gtasks_update_tasklistActs

Rename or update a task list. Updates the specified task list. Currently only the title can be updated. Args: - tasklist_id (string): The task list ID to update (required) - title (string): New name for the task list (required, max 1024 chars) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: Task list ID - title: Updated task list name - updated: Modification timestamp Examples: - Rename: {"tasklist_id": "MTIzNDU2Nzg5MA", "title": "Groceries"} Error Handling: - Returns NOT_FOUND if tasklist_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_delete_tasklistDestructive

Delete a task list and all its tasks. Permanently deletes the specified task list and ALL tasks within it. This action cannot be undone. Args: - tasklist_id (string): The task list ID to delete (required) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - success: Whether the deletion succeeded - deleted_tasklist_id: The ID of the deleted task list Examples: - Delete: {"tasklist_id": "MTIzNDU2Nzg5MA"} Error Handling: - Returns NOT_FOUND if tasklist_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_list_tasksRead-only

List tasks in a task list with optional filters. Returns tasks from the specified task list. Supports filtering by completion status, due dates, and update times. Use gtasks_list_tasklists first to get task list IDs. Args: - tasklist_id (string): The task list ID to get tasks from (required) - max_results (number): Maximum tasks to return, 1-100 (default: 20) - page_token (string): Pagination token from previous results - show_completed (boolean): Include completed tasks (default: true) - show_deleted (boolean): Include deleted tasks (default: false) - show_hidden (boolean): Include hidden tasks (default: false) - due_min (string): Filter tasks due on or after this date (RFC 3339, e.g. "2025-01-01T00:00:00Z") - due_max (string): Filter tasks due on or before this date (RFC 3339) - completed_min (string): Filter tasks completed on or after this date (RFC 3339) - completed_max (string): Filter tasks completed on or before this date (RFC 3339) - updated_min (string): Filter tasks updated after this date (RFC 3339) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - total: Number of tasks in this page - tasks: Array of tasks, each with: - id: Task ID - title: Task title - notes: Task notes/description (if any) - status: 'needsAction' or 'completed' - due: Due date (if set) - completed: Completion date (if completed) - parent: Parent task ID (if subtask) - position: Sort position - updated: Last modification timestamp - has_more: Whether more results are available - next_page_token: Token for next page (if has_more is true) Examples: - All tasks: {"tasklist_id": "MTIzNDU2Nzg5MA"} - Incomplete only: {"tasklist_id": "MTIzNDU2Nzg5MA", "show_completed": false} - Due this week: {"tasklist_id": "MTIzNDU2Nzg5MA", "due_min": "2025-01-20T00:00:00Z", "due_max": "2025-01-27T00:00:00Z"} Error Handling: - Returns NOT_FOUND if tasklist_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_get_taskRead-only

Get a single task by ID with full details. Returns the complete details of a specific task. Args: - tasklist_id (string): The task list ID containing the task (required) - task_id (string): The task ID to retrieve (required) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: Task ID - title: Task title - notes: Task notes/description (if any) - status: 'needsAction' or 'completed' - due: Due date (if set) - completed: Completion date (if completed) - parent: Parent task ID (if subtask) - position: Sort position - updated: Last modification timestamp - links: Associated links (if any) Examples: - Get task: {"tasklist_id": "MTIzNDU2Nzg5MA", "task_id": "abc123"} Error Handling: - Returns NOT_FOUND if tasklist_id or task_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_create_taskActs

Create a new task in a task list. Creates a new task. Can be a top-level task or a subtask (by specifying parent). Use the 'previous' parameter to control ordering. Args: - tasklist_id (string): The task list ID to add the task to (required) - title (string): Task title (required, max 1024 chars) - notes (string): Task notes/description (optional, max 8192 chars) - due (string): Due date in RFC 3339 format, e.g. "2025-03-15T00:00:00Z" (optional) - status ('needsAction' | 'completed'): Task status (optional, default: 'needsAction') - parent (string): Parent task ID to create this as a subtask (optional) - previous (string): Previous sibling task ID for ordering (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: The new task's ID - title: Task title - status: Task status - due: Due date (if set) - updated: Creation timestamp Examples: - Simple task: {"tasklist_id": "MTIzNDU2Nzg5MA", "title": "Buy groceries"} - Task with details: {"tasklist_id": "MTIzNDU2Nzg5MA", "title": "Write report", "notes": "Q1 financial summary", "due": "2025-03-15T00:00:00Z"} - Subtask: {"tasklist_id": "MTIzNDU2Nzg5MA", "title": "Buy milk", "parent": "PARENT_TASK_ID"} Error Handling: - Returns NOT_FOUND if tasklist_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_update_taskActs

Update a task's title, notes, due date, or status. Updates the specified task. Only the provided fields are changed. To mark a task as complete, set status to 'completed'. To mark it incomplete, set status to 'needsAction'. Args: - tasklist_id (string): The task list ID containing the task (required) - task_id (string): The task ID to update (required) - title (string): New task title (optional, max 1024 chars) - notes (string): New task notes/description (optional, max 8192 chars) - due (string): New due date in RFC 3339 format (optional) - status ('needsAction' | 'completed'): New task status (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: Task ID - title: Updated task title - status: Updated task status - due: Due date (if set) - notes: Notes (if set) - updated: Modification timestamp Examples: - Mark complete: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "status": "completed"} - Update title: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "title": "Updated title"} - Set due date: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "due": "2025-04-01T00:00:00Z"} Error Handling: - Returns NOT_FOUND if tasklist_id or task_id doesn't exist - Returns INVALID_PARAMS if no fields to update are provided - Returns AUTH_REQUIRED if not authenticated

gtasks_delete_taskDestructive

Delete a task from a task list. Permanently deletes the specified task. This action cannot be undone. Args: - tasklist_id (string): The task list ID containing the task (required) - task_id (string): The task ID to delete (required) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - success: Whether the deletion succeeded - deleted_task_id: The ID of the deleted task Examples: - Delete: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID"} Error Handling: - Returns NOT_FOUND if tasklist_id or task_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_move_taskActs

Move a task to a different position, parent, or task list. Repositions a task within its list, makes it a subtask of another task, or moves it to a different task list entirely. All parameters are optional — omit 'parent' to move to the top level, omit 'previous' to move to the top. Args: - tasklist_id (string): The current task list ID containing the task (required) - task_id (string): The task ID to move (required) - parent (string): New parent task ID to make this a subtask (optional, omit to move to top level) - previous (string): Previous sibling task ID for ordering (optional, omit to move to top of list/parent) - destination_tasklist (string): Destination task list ID to move the task to a different list (optional) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - id: Task ID - title: Task title - parent: New parent task ID (if subtask) - position: New sort position Examples: - Move to top of list: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID"} - Make subtask: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "parent": "PARENT_ID"} - Reorder after sibling: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "previous": "SIBLING_ID"} - Move to another list: {"tasklist_id": "LIST_ID", "task_id": "TASK_ID", "destination_tasklist": "OTHER_LIST_ID"} Error Handling: - Returns NOT_FOUND if any ID doesn't exist - Returns AUTH_REQUIRED if not authenticated

gtasks_clear_completedDestructive

Clear all completed tasks from a task list. Permanently removes all tasks with status 'completed' from the specified task list. Incomplete tasks are not affected. This action cannot be undone. Args: - tasklist_id (string): The task list ID to clear completed tasks from (required) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - success: Whether the operation succeeded - tasklist_id: The task list that was cleared Examples: - Clear completed: {"tasklist_id": "MTIzNDU2Nzg5MA"} Error Handling: - Returns NOT_FOUND if tasklist_id doesn't exist - Returns AUTH_REQUIRED if not authenticated

gmail_compose_draftsRead-only

Open an interactive Draft Composer UI for the user to review, edit, and send email drafts. WHEN TO USE THIS TOOL — call gmail_compose_drafts whenever the user: - Asks to compose, write, draft, or send any email (single or multiple) - Asks to reply to one or more emails - Asks to follow up on conversations - Says "email them", "write back", "respond to this", "send a message", etc. DO NOT use gmail_send_email or gmail_create_draft directly. ALWAYS use this tool instead so the user can review and edit before sending. CRITICAL — BATCH ALL EMAILS IN ONE CALL: When composing multiple emails (e.g., "reply to all 5 emails"), you MUST include ALL emails in a single call using the emails[] array. Do NOT call this tool separately for each email — that creates multiple UIs. One call = one UI with a draft navigator. HOW TO USE: 1. For each email, generate 2-3 variants with different tones (e.g., Professional, Friendly, Concise) 2. Put all emails in the emails[] array in a single call 3. Set reply_to_message_id per email when replying to an existing thread 4. Include context per email to explain why it is being composed The Draft Composer UI lets the user: - Navigate between emails using Prev/Next buttons (when multiple emails) - Switch between tone variants within each email - Edit subject, body, and recipients (To/CC/BCC) - Send, save as draft, or discard each email independently REPLY EMAILS: When the user asks to reply to emails, you MUST: 1. First call gmail_read_email for each email to get the content and message ID 2. Then call gmail_compose_drafts ONCE with all replies in the emails[] array 3. Set reply_to_message_id, "to" (original sender), and "Re: <subject>" per email

gmail_save_draftActs

Save the composed email as a Gmail draft for later sending.

gmail_send_draftActs

Send the composed email immediately.

gmail_discard_draftDestructive

Delete a previously saved Gmail draft.

Read from the server on 2026-09-07, including each tool's own safety annotations.

Frequently asked questions

Yes. That is what the second endpoint is for. Add https://mcp.agentman.ai/gmail/mcp as one connector and https://mcp.agentman.ai/gmail2/mcp as another. Each is a separate connector with its own Google sign-in, so one can hold your work account and the other your personal account, and both are available in the same conversation. The two endpoints serve the same 30 tools.

Yes. Eleven of the thirty tools are Google Tasks tools, covering task lists and individual tasks: create, list, update, move, delete and clear completed. The OAuth consent screen requests the Google Tasks scope alongside the three Gmail scopes, so both surfaces are authorised together in a single sign-in rather than as separate connections.

Four scopes, published by the server itself at its RFC 9728 protected-resource descriptor and observed on 7 September 2026: gmail.readonly, gmail.send, gmail.modify and tasks. Together these allow reading and searching mail, sending and replying, changing labels including archive and trash, and full access to Google Tasks. The server requests no Drive, Calendar or Contacts scope.

No. The write tools move messages between labels rather than erasing them. gmail_modify_email and gmail_archive_emails change labels, including moving a message to Trash, and Gmail empties Trash on its own schedule. There is no tool that performs an immediate permanent delete, so a mistaken action stays recoverable from Trash.

Not when the Draft Composer is used. The server publishes an interactive Draft Composer resource that renders a draft for review and editing before anything leaves the account, with separate tools to save, send or discard it. gmail_send_email does send directly when an agent calls it, so review behaviour depends on which tool your prompt asks for.

Sources

  • Live tools/list handshake against https://mcp.agentman.ai/gmail/mcp — 30 tools, 7 September 2026
  • Live resources/list handshake — one resource, ui://draft-composer/draft-composer.html, 7 September 2026
  • Live prompts/list probe — -32601 method not found, 7 September 2026
  • The server's own RFC 9728 descriptor at /.well-known/oauth-protected-resource — four scopes, 7 September 2026

Server Info

Category
Communication
Developer
Gmail
Tools
30
Domain
mcp.agentman.ai

Using Claude Desktop or another MCP client? Setup docs — the connection URL above works anywhere.

Ready to connect Gmail?

Connect Gmail once and your agents call these tools on their own — on a schedule, in a workflow, with nobody at the keyboard.