Skip to main content
Glama

gmail_list_unread

Retrieve unread emails from your Gmail inbox, with optional filtering by categories like financial, action_required, kids, or navy to organize messages.

Instructions

List unread emails from the inbox. Optionally filter by a pre-configured category such as navy, kids, financial, or action_required.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by category name. Must be one of: navy, kids, financial, action_required. Leave empty for all unread emails.
max_resultsNoMaximum number of emails to return. Default is 20.

Implementation Reference

  • Primary handler logic for the 'gmail_list_unread' tool. Parses input arguments, constructs a SearchQuery object with is_unread=True and optional category filter, invokes GmailClient.list_emails, formats the results using _format_email_list, and returns as TextContent.
    elif name == "gmail_list_unread": category = arguments.get("category") max_results = arguments.get("max_results", 20) search = SearchQuery( is_unread=True, category=category, max_results=max_results, ) results = await client.list_emails(search) return [TextContent(type="text", text=_format_email_list(results))]
  • JSON schema definition for the 'gmail_list_unread' tool inputs: optional 'category' (string enum) and 'max_results' (integer). Defines the tool interface for MCP clients.
    Tool( name="gmail_list_unread", description="List unread emails from the inbox. Optionally filter by a pre-configured category such as navy, kids, financial, or action_required.", inputSchema={ "type": "object", "properties": { "category": { "type": "string", "description": "Filter by category name. Must be one of: navy, kids, financial, action_required. Leave empty for all unread emails." }, "max_results": { "type": "integer", "description": "Maximum number of emails to return. Default is 20." } }, "required": [] }, ),
  • Registers all tools including 'gmail_list_unread' by returning the predefined GMAIL_TOOLS list from the list_tools handler decorated with @server.list_tools().
    @server.list_tools() async def list_tools() -> list[Tool]: return GMAIL_TOOLS
  • Core helper method implementing the email listing logic. Builds Gmail API search query (adds 'is:unread' if specified), fetches messages, parses into EmailSummary, applies category filtering post-fetch, handles API errors.
    async def list_emails(self, search: SearchQuery) -> list[EmailSummary]: """List emails matching search criteria.""" query = self._build_query(search) logger.info(f"Searching emails with query: {query}") try: results = ( self.service.users() .messages() .list(userId="me", q=query, maxResults=search.max_results) .execute() ) messages = results.get("messages", []) if not messages: return [] # Fetch each message's metadata summaries = [] for msg_ref in messages: msg = ( self.service.users() .messages() .get(userId="me", id=msg_ref["id"], format="metadata") .execute() ) email = self._parse_message(msg) # Filter by category if specified if search.category: if search.category not in email.categories: continue summaries.append(self._email_to_summary(email)) return summaries except HttpError as e: logger.error(f"Failed to list emails: {e}") raise
  • Pydantic model defining the SearchQuery used by the tool, including fields like category, is_unread, and max_results for structured query building and validation.
    class SearchQuery(BaseModel): """Search query parameters.""" query: Optional[str] = Field(default=None, description="Gmail search query") sender: Optional[str] = Field(default=None, description="Filter by sender") subject: Optional[str] = Field(default=None, description="Filter by subject") labels: list[str] = Field(default_factory=list, description="Filter by labels") category: Optional[str] = Field(default=None, description="Filter by our category") is_unread: Optional[bool] = Field(default=None, description="Filter by read status") has_attachment: Optional[bool] = Field(default=None) after_date: Optional[datetime] = Field(default=None) before_date: Optional[datetime] = Field(default=None) max_results: int = Field(default=20, ge=1, le=100)

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/murphy360/mcp_gmail'

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