Skip to main content
Glama
ronantakizawa

Search History MCP Server

get_recent_history

Retrieve recent browsing history entries from browsers like Chrome, Firefox, Safari, or Edge to access past visited websites with titles, URLs, and timestamps.

Instructions

Get the most recent browsing history entries.

Args: limit: Maximum number of results to return (default: 50, max: 500) browser: Which browser to query ("brave", "safari", "chrome", "firefox", "edge", "arc", "opera", or "duckduckgo")

Returns: Formatted list of recent history entries with titles, URLs, and visit times

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNo
browserNobrave

Implementation Reference

  • Handler function for the 'get_recent_history' MCP tool. Decorated with @mcp.tool for registration. Queries browser history databases (supporting multiple browsers like Brave, Safari, Chrome, etc.) using specific SQL queries, processes timestamps appropriately for each browser, and returns a formatted string list of recent history entries with titles, URLs, visit counts, and last visit times.
    @mcp.tool
    def get_recent_history(limit: int = 50, browser: Literal["brave", "safari", "chrome", "firefox", "edge", "arc", "opera", "duckduckgo"] = "brave") -> str:
        """
        Get the most recent browsing history entries.
    
        Args:
            limit: Maximum number of results to return (default: 50, max: 500)
            browser: Which browser to query ("brave", "safari", "chrome", "firefox", "edge", "arc", "opera", or "duckduckgo")
    
        Returns:
            Formatted list of recent history entries with titles, URLs, and visit times
        """
        if limit > 500:
            limit = 500
    
        if browser == "duckduckgo":
            if is_duckduckgo_encrypted():
                # DuckDuckGo macOS - encrypted database schema
                query = """
                    SELECT
                        ZURLENCRYPTED,
                        ZTITLEENCRYPTED,
                        ZNUMBEROFTOTALVISITS,
                        ZNUMBEROFTRACKERSBLOCKED,
                        ZLASTVISIT
                    FROM ZHISTORYENTRYMANAGEDOBJECT
                    WHERE ZURLENCRYPTED IS NOT NULL
                    ORDER BY ZLASTVISIT DESC
                    LIMIT ?
                """
                results = query_duckduckgo_db(query, (limit,))
            else:
                # DuckDuckGo Windows - Chromium-based
                query = """
                SELECT url, title, visit_count, last_visit_time
                FROM urls
                WHERE url NOT LIKE 'https://static.ddg.local/%'
                ORDER BY last_visit_time DESC
                LIMIT ?
                """
                results = query_history_db(query, (limit,), browser)
    
        elif browser == "safari":
            # Safari database schema
            query = """
            SELECT
                history_items.url as url,
                history_visits.title as title,
                COUNT(history_visits.id) as visit_count,
                MAX(history_visits.visit_time) as last_visit_time
            FROM history_items
            JOIN history_visits ON history_items.id = history_visits.history_item
            GROUP BY history_items.url
            ORDER BY last_visit_time DESC
            LIMIT ?
            """
        elif browser == "firefox":
            # Firefox database schema (places.sqlite)
            query = """
            SELECT
                url, title, visit_count,
                last_visit_date as last_visit_time
            FROM moz_places
            WHERE hidden = 0
            ORDER BY last_visit_time DESC
            LIMIT ?
            """
        else:
            # Chromium-based browsers (Brave/Chrome/Edge/Arc/Opera) database schema
            query = """
            SELECT url, title, visit_count, last_visit_time
            FROM urls
            ORDER BY last_visit_time DESC
            LIMIT ?
            """
    
        # Query databases (DuckDuckGo already queried above)
        if browser != "duckduckgo":
            results = query_history_db(query, (limit,), browser)
    
        if not results:
            return f"No history entries found in {browser.capitalize()}"
    
        output = [f"Most recent {len(results)} {browser.capitalize()} browsing history entries:\n"]
    
        for i, entry in enumerate(results, 1):
            title = entry['title'] or "No title"
            url = entry['url']
            visit_count = entry['visit_count']
    
            if browser == "duckduckgo":
                if is_duckduckgo_encrypted():
                    # macOS encrypted version has trackers blocked
                    last_visit = cocoa_timestamp_to_datetime(entry['last_visit_time'])
                    trackers_blocked = entry.get('trackers_blocked', 0)
                    output.append(f"{i}. {title}")
                    output.append(f"   URL: {url}")
                    output.append(f"   Visits: {visit_count} | Trackers blocked: {trackers_blocked} | Last visited: {last_visit}")
                    output.append("")
                else:
                    # Windows Chromium version
                    last_visit = chrome_timestamp_to_datetime(entry['last_visit_time'])
                    output.append(f"{i}. {title}")
                    output.append(f"   URL: {url}")
                    output.append(f"   Visits: {visit_count} | Last visited: {last_visit}")
                    output.append("")
            elif browser == "safari":
                last_visit = safari_timestamp_to_datetime(entry['last_visit_time'])
                output.append(f"{i}. {title}")
                output.append(f"   URL: {url}")
                output.append(f"   Visits: {visit_count} | Last visited: {last_visit}")
                output.append("")
            elif browser == "firefox":
                last_visit = firefox_timestamp_to_datetime(entry['last_visit_time'])
                output.append(f"{i}. {title}")
                output.append(f"   URL: {url}")
                output.append(f"   Visits: {visit_count} | Last visited: {last_visit}")
                output.append("")
            else:
                last_visit = chrome_timestamp_to_datetime(entry['last_visit_time'])
                output.append(f"{i}. {title}")
                output.append(f"   URL: {url}")
                output.append(f"   Visits: {visit_count} | Last visited: {last_visit}")
                output.append("")
    
        return "\n".join(output)
  • mcp_server.py:609-609 (registration)
    The @mcp.tool decorator registers the get_recent_history function as an MCP tool.
    @mcp.tool
  • Type hints and docstring define the input schema (limit: int, browser: Literal[...]), output str, and description for the tool.
    def get_recent_history(limit: int = 50, browser: Literal["brave", "safari", "chrome", "firefox", "edge", "arc", "opera", "duckduckgo"] = "brave") -> str:
        """
        Get the most recent browsing history entries.
    
        Args:
            limit: Maximum number of results to return (default: 50, max: 500)
            browser: Which browser to query ("brave", "safari", "chrome", "firefox", "edge", "arc", "opera", or "duckduckgo")
    
        Returns:
            Formatted list of recent history entries with titles, URLs, and visit times
        """

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/ronantakizawa/search-history-mcp'

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