Skip to main content
Glama
taylorwilsdon

Google Workspace MCP Server - Control Gmail, Calendar, Docs, Sheets, Slides, Chat, Forms & Drive

modify_gmail_message_labels

Add or remove Gmail message labels to organize emails efficiently. Specify email address and message ID to update labels dynamically.

Instructions

Adds or removes labels from a Gmail message. Args: user_google_email (str): The user's Google email address. Required. message_id (str): The ID of the message to modify. add_label_ids (Optional[List[str]]): List of label IDs to add to the message. remove_label_ids (Optional[List[str]]): List of label IDs to remove from the message. Returns: str: Confirmation message of the label changes applied to the message.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
add_label_idsNo
message_idYes
remove_label_idsNo
serviceYes
user_google_emailYes

Implementation Reference

  • The primary handler function that implements the modify_gmail_message_labels tool. It uses the Gmail API to add or remove labels from a specific message.
    @handle_http_errors("modify_gmail_message_labels", service_type="gmail") @require_google_service("gmail", GMAIL_MODIFY_SCOPE) async def modify_gmail_message_labels( service, user_google_email: str, message_id: str, add_label_ids: List[str] = Field(default=[], description="Label IDs to add to the message."), remove_label_ids: List[str] = Field(default=[], description="Label IDs to remove from the message."), ) -> str: """ Adds or removes labels from a Gmail message. To archive an email, remove the INBOX label. To delete an email, add the TRASH label. Args: user_google_email (str): The user's Google email address. Required. message_id (str): The ID of the message to modify. add_label_ids (Optional[List[str]]): List of label IDs to add to the message. remove_label_ids (Optional[List[str]]): List of label IDs to remove from the message. Returns: str: Confirmation message of the label changes applied to the message. """ logger.info( f"[modify_gmail_message_labels] Invoked. Email: '{user_google_email}', Message ID: '{message_id}'" ) if not add_label_ids and not remove_label_ids: raise Exception( "At least one of add_label_ids or remove_label_ids must be provided." ) body = {} if add_label_ids: body["addLabelIds"] = add_label_ids if remove_label_ids: body["removeLabelIds"] = remove_label_ids await asyncio.to_thread( service.users().messages().modify(userId="me", id=message_id, body=body).execute ) actions = [] if add_label_ids: actions.append(f"Added labels: {', '.join(add_label_ids)}") if remove_label_ids: actions.append(f"Removed labels: {', '.join(remove_label_ids)}") return f"Message labels updated successfully!\nMessage ID: {message_id}\n{'; '.join(actions)}"
  • Pydantic schema definition for the tool's input parameters using Field for validation and descriptions.
    add_label_ids: List[str] = Field(default=[], description="Label IDs to add to the message."), remove_label_ids: List[str] = Field(default=[], description="Label IDs to remove from the message."), ) -> str:
  • Decorators that register the function as an MCP tool and apply necessary error handling and authentication scopes.
    @handle_http_errors("modify_gmail_message_labels", service_type="gmail")
  • Helper tool to list all Gmail labels, useful for obtaining label IDs needed for modify_gmail_message_labels.
    @handle_http_errors("list_gmail_labels", is_read_only=True, service_type="gmail") @require_google_service("gmail", "gmail_read") async def list_gmail_labels(service, user_google_email: str) -> str: """ Lists all labels in the user's Gmail account. Args: user_google_email (str): The user's Google email address. Required. Returns: str: A formatted list of all labels with their IDs, names, and types. """ logger.info(f"[list_gmail_labels] Invoked. Email: '{user_google_email}'") response = await asyncio.to_thread( service.users().labels().list(userId="me").execute ) labels = response.get("labels", []) if not labels: return "No labels found." lines = [f"Found {len(labels)} labels:", ""] system_labels = [] user_labels = [] for label in labels: if label.get("type") == "system": system_labels.append(label) else: user_labels.append(label) if system_labels: lines.append("📂 SYSTEM LABELS:") for label in system_labels: lines.append(f" • {label['name']} (ID: {label['id']})") lines.append("") if user_labels: lines.append("🏷️ USER LABELS:") for label in user_labels: lines.append(f" • {label['name']} (ID: {label['id']})") return "\n".join(lines)
  • Helper tool to create, update, or delete Gmail labels, supporting label management workflow.
    @handle_http_errors("manage_gmail_label", service_type="gmail") @require_google_service("gmail", GMAIL_LABELS_SCOPE) async def manage_gmail_label( service, user_google_email: str, action: Literal["create", "update", "delete"], name: Optional[str] = None, label_id: Optional[str] = None, label_list_visibility: Literal["labelShow", "labelHide"] = "labelShow", message_list_visibility: Literal["show", "hide"] = "show", ) -> str: """ Manages Gmail labels: create, update, or delete labels. Args: user_google_email (str): The user's Google email address. Required. action (Literal["create", "update", "delete"]): Action to perform on the label. name (Optional[str]): Label name. Required for create, optional for update. label_id (Optional[str]): Label ID. Required for update and delete operations. label_list_visibility (Literal["labelShow", "labelHide"]): Whether the label is shown in the label list. message_list_visibility (Literal["show", "hide"]): Whether the label is shown in the message list. Returns: str: Confirmation message of the label operation. """ logger.info( f"[manage_gmail_label] Invoked. Email: '{user_google_email}', Action: '{action}'" ) if action == "create" and not name: raise Exception("Label name is required for create action.") if action in ["update", "delete"] and not label_id: raise Exception("Label ID is required for update and delete actions.") if action == "create": label_object = { "name": name, "labelListVisibility": label_list_visibility, "messageListVisibility": message_list_visibility, } created_label = await asyncio.to_thread( service.users().labels().create(userId="me", body=label_object).execute ) return f"Label created successfully!\nName: {created_label['name']}\nID: {created_label['id']}" elif action == "update": current_label = await asyncio.to_thread( service.users().labels().get(userId="me", id=label_id).execute ) label_object = { "id": label_id, "name": name if name is not None else current_label["name"], "labelListVisibility": label_list_visibility, "messageListVisibility": message_list_visibility, } updated_label = await asyncio.to_thread( service.users() .labels() .update(userId="me", id=label_id, body=label_object) .execute ) return f"Label updated successfully!\nName: {updated_label['name']}\nID: {updated_label['id']}" elif action == "delete": label = await asyncio.to_thread( service.users().labels().get(userId="me", id=label_id).execute ) label_name = label["name"] await asyncio.to_thread( service.users().labels().delete(userId="me", id=label_id).execute ) return f"Label '{label_name}' (ID: {label_id}) deleted successfully!"

Latest Blog Posts

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/taylorwilsdon/google_workspace_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server