v1.2.4 · Updated Mar 23, 2026
Install the Chrome extension, start the MCP server, and your AI agent gets full access to M365 — emails, files, Teams chats, calendar events, and people directory. No API keys, no app registrations. Tokens are captured passively from the browser.
Five tools exposed to any MCP client:
| Tool | Description |
|---|---|
search | Search across emails, files, Teams chats, calendar events, and external connectors |
open | Read best-effort content for a search result (via opaque read handle) |
whoami | Query current signed-in user profile via Microsoft Graph /me |
find_people | Find directory people with multi-field filters |
count_people | Count directory people matching filters |
The MCP server runs as a long-lived process. The browser extension connects to it over WebSocket and handles all M365 API calls using tokens passively captured from the browser.
| Layer | Details |
|---|---|
| Extension | Chrome/Edge Manifest V3, captures Substrate + Graph tokens |
| MCP Server | Node.js, Streamable HTTP transport on port 52366 |
| IPC | WebSocket on port 52365 (localhost only) |
| Auth | Passive token capture from browser sessions — no app registration needed |
| APIs | Microsoft Substrate + Microsoft Graph |
Install from the Chrome Web Store:
Chrome Web Store → M365 Connector
Works on Chrome and Edge. After installing, the extension automatically captures auth tokens from your M365 session. Click the extension icon to verify — Substrate should show Valid.
Run with npx (no install needed):
npx m365connector
Or install globally:
npm install -g m365connector && m365connector
You should see:
[m365connector/ws] listening on ws://127.0.0.1:52365
[m365connector] MCP HTTP listening on http://127.0.0.1:52366/mcp
Add to your MCP config (e.g. ~/.claude/mcp.json):
{
"mcpServers": {
"m365-connector": {
"type": "http",
"url": "http://127.0.0.1:52366/mcp"
}
}
}
Restart your MCP client to pick up the config.
Once connected, ask your AI agent to search M365 naturally:
> Search my email for messages about the quarterly review
> Find files related to Project Alpha
> Look up John in the company directory
> Search Teams chats about the deployment issue
> What meetings do I have tomorrow?
The agent uses search to find results, then open with a result's _readHandle to fetch full content. It can also call whoami, find_people, and count_people for directory and profile lookups.
Search across M365 data sources.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | yes | Search query | |
conversation_id | string | yes | Identifier for grouping related requests | |
source | string | no | all | all, email, files, chat, events, external |
connector | string | no | External connector name (when source=external) | |
size | integer | no | 10 | Results per page (1–25) |
from | integer | no | 0 | Pagination offset |
Read the content of a search result.
| Parameter | Type | Required | Description |
|---|---|---|---|
read_handle | string | yes | Opaque handle from a search result's _readHandle field |
conversation_id | string | yes | Same conversation ID used in the originating search |
Returns content with a completeness field: full, partial, or snippet.
Get the current signed-in user's basic profile from Graph.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
conversation_id | string | yes | Conversation identifier | |
direct_reports_size | integer | no | 30 | Max direct reports to return (1–100) |
Returns display name, alias, email/UPN, title, department, office, phones, and best-effort manager and directReports info when directory scopes are available.
Find people via Graph directory query.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
conversation_id | string | yes | Conversation identifier | |
query | string | no | Free-text query across person fields | |
alias | string | no | Filter by alias (mailNickname) | |
principalName | string | no | Filter by user principal name | |
displayName | string | no | Filter by display name | |
department | string | no | Filter by department (prefix match) | |
office | string | no | Filter by office location (prefix match) | |
title | string | no | Filter by job title (prefix match) | |
size | integer | no | 20 | Max people to return (1–50) |
include_direct_reports | boolean | no | false | Include direct reports for each result |
direct_reports_size | integer | no | 30 | Max direct reports per result (1–100) |
At least one filter parameter is required. Returns { filters, results, total }.
Count people matching directory filters without returning full results.
| Parameter | Type | Required | Description |
|---|---|---|---|
conversation_id | string | yes | Conversation identifier |
query | string | no | Free-text query across person fields |
alias | string | no | Filter by alias |
principalName | string | no | Filter by user principal name |
displayName | string | no | Filter by display name |
department | string | no | Filter by department (prefix match) |
office | string | no | Filter by office location (prefix match) |
title | string | no | Filter by job title (prefix match) |
Returns { filters, count }.
M365 Connector ships with a Research skill that combines M365 search with web search (Lumina) to answer questions comprehensively. The skill gives Claude full knowledge of all 5 MCP tools plus a parallel dual-backend search strategy.
/plugin marketplace add ttthree/m365connector-docs
/plugin install research@m365connector-docs
Or manually download SKILL.md:
mkdir -p .claude/skills/research
curl -fsSL https://raw.githubusercontent.com/ttthree/m365connector-docs/main/skills/research/SKILL.md \
-o .claude/skills/research/SKILL.md
> What emails did I get from my manager today?
> Summarize what's been happening on Project Alpha
> Who is Alice Smith? What team is she on?
> Find files related to the quarterly report
--high for exhaustive research mode.| Variable | Default | Description |
|---|---|---|
M365C_MCP_PORT | 52366 | HTTP port for MCP clients |
M365C_WS_PORT | 52365 | WebSocket port for extension IPC |
127.0.0.1 only — not accessible from the networkchrome-extension:// originsChat.Read scope).| Issue | Fix |
|---|---|
| Extension shows "No token" | Open any M365 page (e.g. outlook.office.com) and wait a few seconds for the extension to capture tokens |
| MCP server won't start | Check that port 52366 is available: lsof -i :52366 |
| Claude Code can't connect | Verify MCP config in ~/.claude/mcp.json and restart Claude Code |
| Search returns no results | Ensure the extension shows valid tokens — click the extension icon to check |
| WebSocket connection refused | Make sure the MCP server is running (npx m365connector) |