M365 Copilot Web Bridge
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., "@M365 Copilot Web BridgeAsk Copilot to summarize my recent emails"
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.
M365 Copilot Web Bridge
copilot-web-bridge exposes a user-authenticated Microsoft 365 Copilot Chat
browser session as a small stdio MCP server. It is designed for a Linux server
that keeps Chromium running and for MCP clients that connect through SSH.
This is browser automation, not an official Microsoft MCP integration. The Copilot website can change without notice. Use it only where browser automation is permitted by your Microsoft agreement and organization policy.
Choose a deployment
Deployment | Browser daemon | MCP client | Connection |
Local | Your workstation | The same workstation | Local stdio |
Remote | A Linux server | Your workstation | SSH stdio |
Use the local setup when the MCP client and Microsoft browser session can run on the same computer. Use the remote setup when Copilot should remain signed in and available on an always-on Linux server.
In both deployments, the MCP process is a small stdio adapter. It connects to a long-running browser daemon through a private Unix socket:
MCP client -> copilot-web-bridge mcp -> private Unix socket
-> browser daemon -> persistent browser profile
-> Microsoft 365 Copilot ChatMicrosoft credentials, cookies, and MFA remain in the browser profile on the machine running the daemon. They are never returned through MCP.
Related MCP server: agentify-desktop
Install the package
From npm after publication:
npm install --global copilot-web-bridgeFrom this checkout:
cd devspace/packages/copilot-web-bridge
npm install
npm run build
npm pack
npm install --global ./copilot-web-bridge-0.1.0.tgzFrom the DevSpace repository root, development checks can also be run with:
cd devspace
npm run copilot-web:typecheck
npm run copilot-web:test
npm run copilot-web:buildThe remaining steps depend on whether the bridge runs locally or remotely.
Local setup
This setup runs the browser daemon and MCP client on the same macOS, Windows, or desktop Linux computer.
1. Initialize and check the local runtime
copilot-web-bridge init
copilot-web-bridge doctorIf doctor reports a missing browser, install a Chromium-compatible browser or
set browserEngine/chromiumExecutable in:
~/.config/copilot-web-bridge/config.json2. Complete Microsoft sign-in
For the initial sign-in, set "headless": false in the config file and start
the daemon in one terminal:
copilot-web-bridge daemonIn another terminal, open the login page:
copilot-web-bridge loginComplete Microsoft sign-in, consent, CAPTCHA, and MFA yourself in the browser, then verify:
copilot-web-bridge statusThe expected status contains "loggedIn": true. You may then stop the daemon,
restore "headless": true, and start it again for normal use without a visible
browser window. Keep the daemon running while using the MCP server.
3. Add the local MCP server
For Codex CLI:
codex mcp add copilot-web -- copilot-web-bridge mcpFor an MCP client that accepts JSON configuration:
{
"mcpServers": {
"copilot-web": {
"command": "copilot-web-bridge",
"args": ["mcp"]
}
}
}Restart the MCP client after changing its configuration. If the globally
installed executable is not on the client's PATH, replace
copilot-web-bridge with its absolute path.
4. Verify local MCP use
Ask the MCP client to call copilot_status, then call copilot_chat with a
small test prompt. A ready installation reports loggedIn: true and returns a
Copilot response with mode metadata.
Remote setup
This setup runs the browser daemon on a Linux server. The local MCP client uses SSH to start the remote stdio adapter; no public MCP or browser-debugging port is required.
1. Prepare the Linux server
Node.js 22–26 and a Chromium-compatible browser are required. On Ubuntu or Debian:
sudo apt-get update
sudo apt-get install -y chromium xvfb x11vnc novnc websockifyPackage names vary by distribution. On a rootless headless server, the bridge
can use Xvnc instead of the Xvfb plus x11vnc pair. A user-local noVNC
checkout at ~/.local/share/novnc and ~/.local/bin/websockify is detected
automatically.
Install the package on the server, then run:
copilot-web-bridge init
copilot-web-bridge doctor
loginctl enable-linger "$USER"
copilot-web-bridge install-serviceloginctl enable-linger might require an administrator. It allows the systemd
user service to continue running after the SSH session ends. If Chromium is in
a nonstandard location, set chromiumExecutable in the bridge config.
2. Complete Microsoft sign-in through an SSH tunnel
For the initial login, set "headless": false in
~/.config/copilot-web-bridge/config.json, then restart the user service:
systemctl --user restart copilot-web-bridge.serviceOn the server, start login access:
copilot-web-bridge login user@serverThe command prints the exact tunnel command and noVNC URL. On your local computer, keep the printed tunnel open; it normally resembles:
ssh -L 6080:127.0.0.1:6080 user@serverOpen the printed URL locally, normally:
http://127.0.0.1:6080/vnc.html?autoconnect=1&resize=scaleComplete Microsoft sign-in, consent, CAPTCHA, and MFA yourself. Then check on the server:
copilot-web-bridge statusThe expected status contains "loggedIn": true. The noVNC endpoint binds only
to server loopback and stops automatically after the daemon observes a usable
Copilot prompt. After sign-in succeeds, restore "headless": true and restart
the service for normal operation without a visible browser session.
3. Confirm noninteractive SSH execution
From the local computer, this command must work without a password prompt:
ssh -o BatchMode=yes user@server copilot-web-bridge statusThe remote account needs copilot-web-bridge on its noninteractive PATH. If
it is missing, use the executable's absolute path in this command and in the MCP
configuration.
4. Add the remote MCP server
For Codex CLI:
codex mcp add copilot-web -- ssh -o BatchMode=yes user@server copilot-web-bridge mcpFor an MCP client that accepts JSON configuration:
{
"mcpServers": {
"copilot-web": {
"command": "ssh",
"args": [
"-o",
"BatchMode=yes",
"user@server",
"copilot-web-bridge",
"mcp"
]
}
}
}Restart the MCP client after changing its configuration, then call
copilot_status and copilot_chat to verify the complete path.
For tighter SSH access, use a dedicated Linux account and a key restricted in
~/.ssh/authorized_keys:
restrict,command="/absolute/path/to/copilot-web-bridge mcp" ssh-ed25519 AAAA...Use a separate key for login and service administration because a forced MCP key cannot create the noVNC tunnel.
Preferred reasoning mode
The bridge attempts Think Deeper before every copilot_chat and
copilot_ask request. This is a source-level policy, so it works consistently
after installing the bridge on another computer; browser profile preferences do
not need to be copied.
Each computer still requires its own Microsoft sign-in. If Think Deeper is
not available for an account or Microsoft changes the selector, the request
continues in Auto when possible and reports fallback metadata.
To prefer Auto explicitly, set either the config field:
{
"preferredMode": "auto"
}or the service environment variable:
COPILOT_WEB_BRIDGE_PREFERRED_MODE=autoMCP tools
copilot_statuscopilot_chat(recommended fast path; automatically reuses or creates a conversation)copilot_conversation_createcopilot_conversation_listcopilot_askcopilot_cancelcopilot_conversation_close
copilot_ask accepts an optional caller-generated request_id. Supply one if
you need to call copilot_cancel while the request is active.
Use copilot_chat for normal requests. It removes the separate
copilot_conversation_create round trip and keeps the most recently used
conversation warm. Use the lower-level conversation tools only when you need
multiple isolated threads.
Both request tools report the requested and verified effective mode. A fallback response includes metadata such as:
{
"requestedMode": "think_deeper",
"effectiveMode": "auto",
"fallbackUsed": true,
"modeWarning": "Unable to select Think Deeper; continuing with Auto when available."
}Triggering From Codex
After adding the MCP server to Codex, use an explicit phrase such as:
Use Copilot Web to review this implementation.
用 Copilot Web 問:這段程式有什麼風險?
請讓 Copilot Web 提供第二意見,只傳必要的程式碼片段。The project skill at
.agents/skills/use-copilot-web/SKILL.md maps these requests to
copilot_chat. Copilot output is untrusted advisory text; Codex should verify
it before changing code.
Latency
For the lowest latency:
Keep the browser daemon running as a user service.
Keep the Microsoft session signed in.
Prefer
copilot_chatso an existing conversation tab is reused.Send only the relevant code or error excerpt.
Keep
maxTabssmall unless parallel Copilot conversations are required.
Response polling reads only the newest Copilot message, so long reused conversations do not get progressively slower. The defaults favor faster completion detection:
{
"responsePollMs": 150,
"loginCheckIntervalMs": 2000,
"stableWindowMs": 800
}For a lower-latency local setup, responsePollMs can be reduced through
COPILOT_WEB_BRIDGE_RESPONSE_POLL_MS. If responses are occasionally truncated,
increase stableWindowMs.
The bridge defaults to three concurrent conversation tabs. Requests within the same conversation are serialized. Conversation metadata and URLs survive daemon restarts, but full prompts and responses are not copied into the local SQLite database.
Security behavior
Common tokens, authorization headers, JWTs, and
.envsecrets are redacted.Private keys, cloud credential files, and service-account credentials are rejected.
Prompt plus context is limited to 40,000 characters by default.
Browser profile, configuration, database, runtime socket, and logs use user-private permissions.
The audit log records method names, IDs, sizes, and outcomes, never complete prompts or responses.
Chromium debugging and MCP HTTP ports are not exposed.
Copilot output is returned as untrusted text and is never executed.
This protects against common accidental disclosures, not every possible secret. Send only the minimum code and error context needed for the question.
Operations
copilot-web-bridge status
copilot-web-bridge logout
copilot-web-bridge uninstall-servicelogout deletes the persistent browser profile and conversation mappings.
When Microsoft changes the Copilot page and prompts stop working, update the
central selector lists in src/browser.ts and run the test suite before
redeploying.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/luketou/m365-copilot-web-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server