edge-history-mcp
This server exposes Microsoft Edge browsing history to MCP clients in a read-only manner. You can:
List Edge profiles (
list_profiles): Retrieve all available Edge browsing profiles, including each profile's friendly name, on-disk directory ID, and whether it is the default profile.Fetch browsing history (
get_history): Get paginated history entries for a specific profile on a given day (YYYY-MM-DD), ordered by visit time. Each entry includes:Visit timestamp (local ISO-8601)
URL and page title
Visit count and typed count
Transition type (e.g.,
link,typed,reload)Internal
url_idandvisit_ididentifiers
Flexible querying: Narrow results with an intra-day time window (
start_time,end_time), and paginate usinglimit(default 10,000, max 50,000) andoffsetparameters.Works while Edge is running: Safely copies the locked history database to a temporary location before reading.
Read-only: The server never modifies Edge's data, though it does expose full browsing history of all profiles to the MCP client.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@edge-history-mcpshow my browsing history from yesterday for the default profile"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
edge-history-mcp
A stdio Model Context Protocol (MCP) server that exposes Microsoft Edge browsing history across multiple profiles.
It lets an MCP client:
List Edge profiles by their friendly names.
Fetch history for a given day for a given profile, returning one entry per page visit with timestamp, URL, title, and other metadata.
Summarize a day's browsing hour by hour as domains only, without exposing full URLs.
The server only reads Edge data and never modifies it. Because Edge keeps the
live History database locked while running, the server copies it (together with
any rollback-journal/WAL sidecar files) to a private temporary directory and
reads the copy — so it works even while Edge is open, and SQLite can recover a
consistent snapshot if the copy was taken mid-write.
Quick start (GitHub Copilot CLI)
You don't need to clone this repo. With uv
installed, register the server in your user config with a single command —
uvx builds and runs it on demand straight from GitHub:
copilot mcp add edge-history -- uvx --from git+https://github.com/adrianba/edge-browser-mcp edge-history-mcpThen, from any directory:
copilot mcp list # edge-history should appear under User servers
copilot # start a session and ask it to use the edge-history toolsThe source/repo is
edge-browser-mcpand the command/package isedge-history-mcp— both appear in the command above (--from …edge-browser-mcpis the source, the trailingedge-history-mcpis the command to run).
To pin to a released version (recommended for stability), append a tag:
copilot mcp add edge-history -- uvx --from git+https://github.com/adrianba/edge-browser-mcp@v0.2.1 edge-history-mcpRelated MCP server: Chrome Debug MCP Server
Requirements
Windows with Microsoft Edge installed.
uv (Python is managed by uv; no manual venv needed).
Tools
list_profiles()
Lists available Edge browsing profiles. Returns a list of objects:
Field | Description |
| Friendly profile name (from Edge |
| On-disk profile directory id (e.g. |
|
|
Use name (or directory) as the profile argument to get_history.
get_history(profile, date, start_time=None, end_time=None, limit=10000, offset=0)
Returns a page of per-visit history entries for a profile on a single day. A busy day can hold thousands of visits, so the result is paginated and can be narrowed to an intra-day time window.
profile— friendly name fromlist_profiles, or a directory id.date—YYYY-MM-DD. Day boundaries are interpreted in the local machine timezone (DST-aware). The server determines the local timezone from the OS (viatzlocal) rather than relying on Python's process-local timezone, which can be incorrect in some Windows/Scout environments. Override with theEDGE_HISTORY_TIMEZONEenvironment variable (IANA name, e.g.America/Los_Angeles).start_time— optional lower bound within the day,HH:MM(24-hour, local). Defaults to the start of the day.end_time— optional upper bound within the day,HH:MM(local, exclusive). Defaults to the end of the day. Must be later thanstart_time.limit— optional maximum number of entries to return per page (default10000, capped at50000; non-positive values fall back to the default).offset— optional number of entries to skip from the start of the window, for paging through large results (default0).
The result is an object:
Field | Description |
| List of visit entries (see below), ordered ascending by time. |
| The offset that was applied. |
| The page size that was applied. |
|
|
| Offset to request the next page, or |
Each entry in entries contains:
Field | Description |
| Visit time as a local ISO-8601 timestamp. |
| Visited URL. |
| Page title (may be empty). |
| Total number of visits to this URL. |
| Number of times the URL was typed. |
| Page-transition type ( |
| Internal |
| Internal |
Fetching part of a day. Pass start_time/end_time to pull a narrow window
instead of the whole day, e.g. get_history("Work", "2024-03-15", start_time="09:00", end_time="10:00").
Paging through a large day. Start with offset=0; if the result has
has_more=true, call again with offset=next_offset until has_more is false.
Privacy note.
get_historyreturns URLs verbatim, and URLs can embed auth tokens, session ids, password-reset links or pre-signed URLs. For questions like "what did I browse today?", preferget_history_summarybelow and only reach forget_historywhen specific URLs or titles are needed.
get_history_summary(profile, date, start_time=None, end_time=None, group_by="hour", limit=10000, offset=0, include_titles=True, max_titles_per_site=3)
Returns an aggregated, privacy-preserving view of the same window as
get_history: visits grouped into local-time hour buckets with domains only,
plus a small sample of page titles per domain for context.
It intentionally returns no full URLs, query strings or fragments — only
normalized domains (e.g. www.github.com -> github.com) and bounded page-title
samples. Only http/https visits are aggregated; file:, edge:, chrome:,
extension and other non-web URLs are excluded (and counted so clients can explain
the omission). Full per-visit URLs are available only through get_history, and
may contain sensitive data.
profile,date,start_time,end_time,limit,offset— identical semantics toget_history(same profile resolution, DST-aware local day/window boundaries, limit cap and pagination;limit/offsetpage over the underlying visit rows).group_by— bucket granularity. Currently only"hour"is supported.include_titles— includesample_titlesfor each domain (defaulttrue). Set tofalsefor domains and counts only.max_titles_per_site— maximum sample titles per domain per bucket (default3, capped at10). Values<= 0return empty title lists.
The result is an object:
Field | Description |
| Resolved profile friendly name. |
| The requested date. |
| The bucket granularity applied ( |
| IANA timezone used for bucketing. |
| Visit rows examined in this page. |
| Rows counted in the buckets. |
| Rows skipped because they were not |
| Hour buckets, ordered ascending (see below). |
| The paging window that was applied. |
|
|
| Offset for the next page, or |
Each bucket contains:
Field | Description |
| Local ISO-8601 timestamp of the start of the hour. |
| Friendly hour label, e.g. |
| Number of web visits in the bucket. |
|
|
sample_titles holds up to max_titles_per_site page titles seen for that domain
in that bucket: deduplicated, in first-seen order, whitespace-trimmed, empty titles
skipped, and truncated to 160 characters. Titles are page text only — never URLs.
Example:
{
"profile": "Profile 2",
"date": "2026-08-05",
"group_by": "hour",
"timezone": "America/Los_Angeles",
"entries_considered": 206,
"web_entries": 206,
"non_web_entries_skipped": 0,
"buckets": [
{
"hour": "2026-08-05T08:00:00-07:00",
"label": "8 AM",
"total_web_visits": 48,
"sites": [
{
"domain": "map.pscleanair.org",
"visits": 47,
"sample_titles": ["Puget Sound Clean Air Agency Map"]
},
{
"domain": "inciweb.nwcg.gov",
"visits": 1,
"sample_titles": ["InciWeb - Incident Information System"]
}
]
}
],
"offset": 0,
"limit": 10000,
"has_more": false,
"next_offset": null
}MCP client configuration
For MCP clients that read a JSON config (mcpServers), the recommended entry runs
the published server from GitHub with uvx — no clone required:
{
"mcpServers": {
"edge-history": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/adrianba/edge-browser-mcp",
"edge-history-mcp"
]
}
}
}If you have the repo checked out and prefer running from source, use uv with a
cwd pointing at the repo instead:
{
"mcpServers": {
"edge-history": {
"command": "uv",
"args": ["run", "edge-history-mcp"],
"cwd": "C:\\path\\to\\edge-browser-mcp"
}
}
}GitHub Copilot CLI
The recommended setup is the one-line user-config install shown in Quick start:
copilot mcp add edge-history -- uvx --from git+https://github.com/adrianba/edge-browser-mcp edge-history-mcpThis works from any directory and uses "type": "local" (a stdio server Copilot
launches as a subprocess). Verify with copilot mcp list (it appears under
User servers) and inspect it with copilot mcp get edge-history.
Copilot CLI loads MCP definitions from several locations:
Source | Location |
Workspace |
|
User |
|
Plugin | installed plugins that bundle MCP servers |
Workspace .mcp.json (local development only)
This repo ships a workspace .mcp.json that runs the server from source
(uv run edge-history-mcp). It auto-loads only when you start copilot from the
repo directory, so it's meant for developing/testing this project — not for
everyday use. End users should prefer the uvx-from-git command above.
{
"mcpServers": {
"edge-history": {
"type": "local",
"command": "uv",
"args": ["run", "edge-history-mcp"],
"tools": ["*"]
}
}
}Testing this project in a Copilot CLI session (from source)
Pre-flight in a normal shell:
cd C:\Repos\edge-browser-mcp uv sync # install dependencies uv run edge-history-mcp # optional: confirm it starts on stdio (Ctrl+C to exit) copilot mcp list # expect: Workspace servers: edge-history (local)Launch Copilot CLI from the repo directory so
.mcp.jsonis loaded, and trust the folder when prompted:copilotInside the session, confirm the server and tools are available:
/mcp # MCP UI — edge-history should be listed/enabled /env # shows loaded MCP servers and toolsExercise the tools with natural-language prompts (approve the first tool use):
List my Edge browser profiles using the edge-history MCP server. Using edge-history, get my browsing history for profile "Profile 1" on 2026-06-20. Get the first 5 history entries for the "Google Drive" profile on 2026-06-20.Check error handling:
Using edge-history, get history for a profile called "DoesNotExist" on 2026-06-20. Get history for "Profile 1" on 06/20/2026. (wrong format -> clean error)
To isolate the test from your real Copilot config, point Copilot at a throwaway
home first: $env:COPILOT_HOME = "C:\Temp\copilot-test". The workspace
.mcp.json still loads by working directory.
Privacy & security
Browsing history is sensitive personal data. Be aware:
The server exposes the full history of every profile to whichever MCP client launches it. Only enable it with clients you trust.
get_historyreturns URLs verbatim; they may embed secrets (auth/session tokens, password-reset links, pre-signed URLs). Treat tool output as sensitive and only request full URLs when they are actually needed.get_history_summaryis the lower-risk default: it deliberately returns domains only, dropping paths, query strings and fragments, and skips non-web (file:,edge:,chrome:, extension) URLs entirely. It adds a small sample of page titles per domain for context; titles can still be descriptive, so useinclude_titles=Falseif even that is too much. Full per-visit URLs are only ever returned byget_history.A plaintext copy of the
Historydatabase is written to a temporary directory for the duration of each query and then deleted.Reads are strictly read-only; Edge's own data is never modified.
Notes
By default the server reads Edge data from
%LOCALAPPDATA%\Microsoft\Edge\User Data. Override with theEDGE_USER_DATA_DIRenvironment variable (useful for testing).Guest ProfileandSystem Profileare excluded fromlist_profiles.Chromium stores timestamps as microseconds since 1601-01-01 UTC; the server converts these to local time using the OS timezone (determined via
tzlocal, not Python's process-local timezone). Override withEDGE_HISTORY_TIMEZONE.The MCP SDK dependency is pinned to
mcp[cli]>=1.2.0,<2.0.0because the server uses the MCP 1.xFastMCPAPI (mcp.server.fastmcp). MCP 2.x removed this module; do not upgrade until the server is migrated to the 2.x API.
Development
Clone the repo and use uv:
uv sync # create .venv and install deps (incl. dev)
uv run edge-history-mcp # run the server on stdio (Ctrl+C to exit)
uv run pytest # run the test suite
uv build # build sdist + wheel into dist/uv run edge-history-mcp starts the server on stdio; it is normally launched
by an MCP client rather than run directly.
Tests build a synthetic Edge-shaped SQLite database in a temp directory, so they
do not touch your real Edge installation. CI runs them on every push/PR (see
.github/workflows/ci.yml).
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityAmaintenanceA Model Context Protocol server that enables LLMs to interact with AdsPower browser LocalAPI, allowing for operations like creating, opening, updating, and managing browser profiles with custom fingerprints.27358126MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that connects to Chrome debugging ports, enabling browser automation with persistent login sessions.102610MIT
- Alicense-qualityDmaintenanceA Model Context Protocol server implementation that enables browser automation through standardized MCP clients, supporting features like navigation, element interaction, and screenshots across Chrome, Firefox, and Edge browsers.993MIT
- Flicense-quality-maintenanceA Model Context Protocol server that provides AI-grounded Bing search capabilities using the Azure AI Project Client. It enables intelligent web searches with automated citation tracking and URL extraction for seamless AI integration.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/adrianba/edge-browser-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server