内容
# 问询 M365 Copilot 聊天 MCP
[](LICENSE)
[](https://www.python.org)
[](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
一个本地桥接器,将 Microsoft 365 Copilot 聊天功能暴露为 OpenAI 兼容的 API 端点和 MCP 工具。适用于将提示(例如代码片段)以编程方式输入 M365 Copilot 聊天,避免在应用程序之间手动复制粘贴。
## 工作原理
该项目有三个组件,形成一个管道:
```
API 客户端 / MCP 工具
|
v
本地 FastAPI 服务器(localhost:8000)
| WebSocket
v
浏览器扩展(Edge/Chrome)
| DOM 自动化 + MutationObserver
v
M365 Copilot 聊天 UI
```
1. **`server.py`** -- 一个 FastAPI 后端,接受 OpenAI 格式的聊天完成请求,并将响应作为服务器发送事件(SSE)流式返回。通过持久的 WebSocket 与浏览器通信,使用单读取器/队列模式避免争用。
2. **`extension/`** -- 一个 Manifest V3 浏览器扩展,将 Copilot Chat 页面连接到本地桥接器。内容脚本通过 WebSocket 接收提示,将它们粘贴到 Copilot Lexical 编辑器中,通过 Enter 键提交,并使用 MutationObserver 捕获流式响应。扩展是纯 JavaScript,无需构建步骤。
3. **`mcp_server.py`** -- 一个 MCP(模型上下文协议)服务器,暴露一个 `AskM365Copilot` 工具。在标准输入/输出上运行,并作为一个薄的 HTTP 客户端到本地桥接器。设计用于与 Claude Code 或任何 MCP 兼容的客户端一起使用。
**新手?** 请参阅 [快速入门指南](QUICKSTART.md),了解带有常见陷阱的逐步设置。
## 先决条件
- Python 3.10+
- Microsoft Edge 或 Google Chrome
- 具有 Copilot Chat 访问权限的 M365 帐户
## 设置
### 1. 安装依赖项
```bash
python -m venv .venv
.venv/Scripts/activate # Windows
# source .venv/bin/activate # macOS/Linux
pip install -r requirements.txt
```
### 2. 加载浏览器扩展
1. 打开 `edge://extensions` 或 `chrome://extensions`
2. 启用 **开发者模式**
3. 点击 **加载解包** 并选择 `extension/` 文件夹
4. 导航到 M365 Copilot Chat -- 控制台应确认 WebSocket 连接
### 3. 启动桥接服务器
```bash
python -m server
```
服务器在本地端口 8000 上监听。
## 用法
**直接 API 调用** -- 向 OpenAI 聊天完成格式的 `/v1/chat/completions` 端点发送 POST 请求,并设置 `stream: true`。任何支持自定义 OpenAI 基地址的工具或库都可以指向本地服务器。
**MCP 工具** -- 在客户端(例如 Claude Code)中注册 MCP 服务器:
```bash
claude mcp add m365copilot -- python mcp_server.py
```
然后,`AskM365Copilot` 工具在您的会话中可用。
## 架构说明
- **单个 WebSocket 读取器** -- 一个协程将所有传入的浏览器消息读取到 `asyncio.Queue` 中,消除竞争读取器的竞争条件。
- **请求序列化** -- `asyncio.Lock` 确保一次只有一个提示流经桥接器(如果忙碌,则返回 HTTP 429)。
- **观察器生命周期** -- MutationObserver 包括内容接收保护(防止过早完成)、500ms 防抖和 90 秒安全超时。
- **解耦 MCP 层** -- MCP 服务器通过 HTTP 独家与桥接器通信,使其独立于 WebSocket 内部实现。
## 项目结构
```
server.py FastAPI 桥接服务器(WebSocket + HTTP)
mcp_server.py MCP 标准输入/输出服务器(AskM365Copilot 工具)
requirements.txt Python 依赖项
QUICKSTART.md 带有常见陷阱的逐步设置指南
CONTRIBUTING.md 贡献指南
CODE_OF_CONDUCT.md 社区标准
extension/
manifest.json Manifest V3 扩展配置
rules.json 声明式网络请求头规则
content.js 内容脚本(提示自动化 + 响应捕获)
.github/
pull_request_template.md
```
## 故障排除
**扩展程序显示“已断开连接。每 5 秒重试一次。”** -- 桥接服务器未运行。使用 `python -m server` 启动它,扩展程序将自动重新连接。
**服务器启动但浏览器无法连接** -- 确保扩展程序已加载并且您正在使用 M365 Copilot Chat 页面。在浏览器控制台中检查连接错误。
**发送提示但响应为空** -- 如果 Microsoft 更新了 Copilot Chat UI,则 DOM 选择器可能会更改。打开浏览器控制台并检查 `content.js` 的错误。
**MCP 工具返回“无法连接到桥接服务器”** -- 桥接服务器必须在 MCP 工具可用之前运行。首先启动 `server.py`。
## 限制
- 一次一个请求(串行,非并行)
- 如果 Microsoft 更改 Copilot Chat UI,则 DOM 选择器可能会中断
- 响应文本保真度取决于 MutationObserver 计时 -- 快速流上偶尔会出现字符丢失
- 桥接服务器和浏览器必须在同一台机器上
## 免责声明
此工具在本地自动验证您自己的 M365 Copilot 会话。它不会访问任何 Microsoft API 或服务,而是超出您的浏览器会话已经可以访问的范围。请按照组织策略和 Microsoft 服务条款使用它。该项目不受 Microsoft 认可或支持。
## 许可证
Apache 2.0 -- 请参阅 [LICENSE](LICENSE)。