Skip to main content
Glama
taylorwilsdon

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

search_drive_files

Search files and folders in Google Drive or shared drives using specific queries and parameters. Retrieve detailed results including ID, name, type, size, modified time, and link.

Instructions

Searches for files and folders within a user's Google Drive, including shared drives.

Args:
    user_google_email (str): The user's Google email address. Required.
    query (str): The search query string. Supports Google Drive search operators.
    page_size (int): The maximum number of files to return. Defaults to 10.
    drive_id (Optional[str]): ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
    include_items_from_all_drives (bool): Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.
    corpora (Optional[str]): Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').
                             If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.
                             Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency.

Returns:
    str: A formatted list of found files/folders with their details (ID, name, type, size, modified time, link).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
corporaNo
drive_idNo
include_items_from_all_drivesNo
page_sizeNo
queryYes
serviceYes
user_google_emailYes

Implementation Reference

  • Primary handler function for the 'search_drive_files' tool. Decorated for registration, error handling, and auth. Parses query (structured or free-text), builds API params via helper, executes Drive files.list(), formats results as readable text list.
    @server.tool()
    @handle_http_errors("search_drive_files", is_read_only=True, service_type="drive")
    @require_google_service("drive", "drive_read")
    async def search_drive_files(
        service,
        user_google_email: str,
        query: str,
        page_size: int = 10,
        drive_id: Optional[str] = None,
        include_items_from_all_drives: bool = True,
        corpora: Optional[str] = None,
    ) -> str:
        """
        Searches for files and folders within a user's Google Drive, including shared drives.
    
        Args:
            user_google_email (str): The user's Google email address. Required.
            query (str): The search query string. Supports Google Drive search operators.
            page_size (int): The maximum number of files to return. Defaults to 10.
            drive_id (Optional[str]): ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
            include_items_from_all_drives (bool): Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.
            corpora (Optional[str]): Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').
                                     If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.
                                     Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency.
    
        Returns:
            str: A formatted list of found files/folders with their details (ID, name, type, size, modified time, link).
        """
        logger.info(f"[search_drive_files] Invoked. Email: '{user_google_email}', Query: '{query}'")
    
        # Check if the query looks like a structured Drive query or free text
        # Look for Drive API operators and structured query patterns
        is_structured_query = any(pattern.search(query) for pattern in DRIVE_QUERY_PATTERNS)
    
        if is_structured_query:
            final_query = query
            logger.info(f"[search_drive_files] Using structured query as-is: '{final_query}'")
        else:
            # For free text queries, wrap in fullText contains
            escaped_query = query.replace("'", "\\'")
            final_query = f"fullText contains '{escaped_query}'"
            logger.info(f"[search_drive_files] Reformatting free text query '{query}' to '{final_query}'")
    
        list_params = build_drive_list_params(
            query=final_query,
            page_size=page_size,
            drive_id=drive_id,
            include_items_from_all_drives=include_items_from_all_drives,
            corpora=corpora,
        )
    
        results = await asyncio.to_thread(
            service.files().list(**list_params).execute
        )
        files = results.get('files', [])
        if not files:
            return f"No files found for '{query}'."
    
        formatted_files_text_parts = [f"Found {len(files)} files for {user_google_email} matching '{query}':"]
        for item in files:
            size_str = f", Size: {item.get('size', 'N/A')}" if 'size' in item else ""
            formatted_files_text_parts.append(
                f"- Name: \"{item['name']}\" (ID: {item['id']}, Type: {item['mimeType']}{size_str}, Modified: {item.get('modifiedTime', 'N/A')}) Link: {item.get('webViewLink', '#')}"
            )
        text_output = "\n".join(formatted_files_text_parts)
        return text_output
  • Docstring defining input parameters, types, defaults, and return format, serving as the tool schema for MCP.
    """
    Searches for files and folders within a user's Google Drive, including shared drives.
    
    Args:
        user_google_email (str): The user's Google email address. Required.
        query (str): The search query string. Supports Google Drive search operators.
        page_size (int): The maximum number of files to return. Defaults to 10.
        drive_id (Optional[str]): ID of the shared drive to search. If None, behavior depends on `corpora` and `include_items_from_all_drives`.
        include_items_from_all_drives (bool): Whether shared drive items should be included in results. Defaults to True. This is effective when not specifying a `drive_id`.
        corpora (Optional[str]): Bodies of items to query (e.g., 'user', 'domain', 'drive', 'allDrives').
                                 If 'drive_id' is specified and 'corpora' is None, it defaults to 'drive'.
                                 Otherwise, Drive API default behavior applies. Prefer 'user' or 'drive' over 'allDrives' for efficiency.
    
    Returns:
        str: A formatted list of found files/folders with their details (ID, name, type, size, modified time, link).
    """
  • Tool registration via @server.tool() decorator, plus error handler and auth requirement decorators specific to this tool.
    @server.tool()
    @handle_http_errors("search_drive_files", is_read_only=True, service_type="drive")
    @require_google_service("drive", "drive_read")
  • Helper constructs standardized parameters for Drive files.list() API calls, handling shared drives (driveId/corpora) and common fields.
    def build_drive_list_params(
        query: str,
        page_size: int,
        drive_id: Optional[str] = None,
        include_items_from_all_drives: bool = True,
        corpora: Optional[str] = None,
    ) -> Dict[str, Any]:
        """
        Helper function to build common list parameters for Drive API calls.
    
        Args:
            query: The search query string
            page_size: Maximum number of items to return
            drive_id: Optional shared drive ID
            include_items_from_all_drives: Whether to include items from all drives
            corpora: Optional corpus specification
    
        Returns:
            Dictionary of parameters for Drive API list calls
        """
        list_params = {
            "q": query,
            "pageSize": page_size,
            "fields": "nextPageToken, files(id, name, mimeType, webViewLink, iconLink, modifiedTime, size)",
            "supportsAllDrives": True,
            "includeItemsFromAllDrives": include_items_from_all_drives,
        }
    
        if drive_id:
            list_params["driveId"] = drive_id
            if corpora:
                list_params["corpora"] = corpora
            else:
                list_params["corpora"] = "drive"
        elif corpora:
            list_params["corpora"] = corpora
    
        return list_params
  • Regex patterns used to identify structured Drive search queries vs free-text, triggering query reformatting in handler.
    DRIVE_QUERY_PATTERNS = [
        re.compile(r'\b\w+\s*(=|!=|>|<)\s*[\'"].*?[\'"]', re.IGNORECASE),  # field = 'value'
        re.compile(r'\b\w+\s*(=|!=|>|<)\s*\d+', re.IGNORECASE),            # field = number
        re.compile(r'\bcontains\b', re.IGNORECASE),                         # contains operator
        re.compile(r'\bin\s+parents\b', re.IGNORECASE),                     # in parents
        re.compile(r'\bhas\s*\{', re.IGNORECASE),                          # has {properties}
        re.compile(r'\btrashed\s*=\s*(true|false)\b', re.IGNORECASE),      # trashed=true/false
        re.compile(r'\bstarred\s*=\s*(true|false)\b', re.IGNORECASE),      # starred=true/false
        re.compile(r'[\'"][^\'"]+[\'"]\s+in\s+parents', re.IGNORECASE),    # 'parentId' in parents
        re.compile(r'\bfullText\s+contains\b', re.IGNORECASE),             # fullText contains
        re.compile(r'\bname\s*(=|contains)\b', re.IGNORECASE),             # name = or name contains
        re.compile(r'\bmimeType\s*(=|!=)\b', re.IGNORECASE),               # mimeType operators
    ]
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It discloses some behavioral traits like default values, parameter interactions, and efficiency tips, but misses critical details: whether this is a read-only operation, authentication requirements, rate limits, pagination behavior beyond page_size, or what happens on errors. For a 7-parameter search tool with no annotation coverage, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (Args, Returns), front-loaded purpose statement, and efficient parameter explanations. Some sentences could be tighter (e.g., the corpora explanation is slightly verbose), but overall it's appropriately sized with minimal waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters, no annotations, and no output schema, the description does well on parameters but lacks completeness in other areas. It explains the return format but doesn't cover authentication, error handling, or pagination beyond page_size. For a complex search tool with rich parameter interactions, more behavioral context would be needed for full completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining all 7 parameters in detail. It clarifies required vs. optional parameters, default values, behavioral dependencies (e.g., 'If None, behavior depends on...'), and provides specific guidance like 'Supports Google Drive search operators' and efficiency recommendations for 'corpora'. This adds substantial meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches for files and folders within Google Drive, including shared drives. It specifies the verb 'searches' and resource 'files and folders', distinguishing it from siblings like list_docs_in_folder (which lists rather than searches) and get_drive_file_content (which retrieves content rather than searching).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through parameter explanations (e.g., 'If None, behavior depends on...'), but lacks explicit guidance on when to use this tool versus alternatives like search_docs or list_docs_in_folder. It provides some context about efficiency ('Prefer 'user' or 'drive' over 'allDrives' for efficiency'), but no clear when/when-not statements or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Related Tools

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