内容
# msloop-mcp
[](https://www.npmjs.com/package/msloop-mcp)
[](https://www.npmjs.com/package/msloop-mcp)
[](https://www.npmjs.com/package/msloop-mcp)
[](./LICENSE)
微软Loop的MCP服务器,无需应用注册。
给予任何MCP客户端(Claude、Cursor、Devin等)读取您微软Loop工作区和页面的权限。它通过重用现有的Loop网页会话来工作,与[msteams-mcp](https://github.com/shayanline/msteams-mcp)和[msoutlook-mcp](https://github.com/shayanline/msoutlook-mcp)重用Teams和Outlook网页会话的方式相同:您在浏览器中登录一次,然后令牌被缓存并自动刷新。
## 为什么
微软没有发布Loop的公共API。该服务器重用Loop网页应用的自己的第一方客户端ID,因此您的访问权限与您的帐户已经拥有的权限相同,无需Azure应用注册,无需管理员同意,也无需客户端密钥。没有任何内容离开您的机器。
## 它能和不能做什么
Loop与Teams或Outlook的构建方式不同。页面不是REST资源,它们是[Fluid Framework](https://fluidframework.com)文档,存储在SharePoint嵌入式容器中,并且没有公共内容写入API。因此,该服务器是一个读取和发现工具,而不是读写工具:
- **支持:** 列出工作区,列出工作区中的页面,以Markdown(或原始HTML)读取页面的内容,跨您的Loop文件搜索,以及实验性的工作区创建。
- **不支持:** 创建或编辑页面内容,实时协作。这些需要浏览器中的Fluid运行时,并且没有HTTP API。
页面内容通过要求SharePoint将Fluid文档渲染为HTML(`?format=html`导出)来读取,然后将其转换为Markdown。丰富的交互式组件(表格,投票,提及)可能会近似渲染。
## 它是如何工作的
Loop网页应用(`loop.cloud.microsoft`)使用MSAL在浏览器中存储OAuth令牌。该服务器:
1. 通过Playwright打开浏览器,访问`loop.cloud.microsoft`。
2. 使用Loop的自己的第一方客户端ID(`a187e399-0c36-4b98-8f04-1edc167a0996`)从本地存储和会话存储中提取MSAL令牌。它保留三个令牌:一个基板令牌(工作区和页面元数据),一个SharePoint令牌(页面内容),和一个Graph令牌(搜索)。
3. 在`~/.msloop-mcp-server/`中缓存访问令牌,刷新令牌和会话状态(使用AES-256-GCM加密)。
4. 使用刷新令牌(HTTP,无浏览器)或无头浏览器作为回退,自动刷新令牌。
## 快速入门
```json
{
"mcpServers": {
"loop": {
"command": "npx",
"args": ["-y", "msloop-mcp@latest"]
}
}
}
```
然后从您的MCP客户端运行`loop_login`。在第一次使用时,浏览器会打开,以便您登录;之后,登录是静默的,不会出现浏览器。请勿手动关闭窗口,它会在您登录后自动关闭。
## 工具
### 身份验证
| 工具 | 描述 |
|------|-------------|
| `loop_login` | 登录到Loop(如果可能则静默,否则仅浏览器) |
| `loop_status` | 检查身份验证状态和令牌有效性 |
| `loop_logout` | 清除保存的会话和令牌 |
### 工作区和页面
| 工具 | 描述 |
|------|-------------|
| `loop_list_workspaces` | 列出您可以访问的所有Loop工作区,包括您的个人“My workspace” |
| `loop_list_pages` | 列出工作区中的页面(传递工作区ID) |
| `loop_get_page` | 读取页面的内容为Markdown(或`html`)通过页面ID |
| `loop_search` | 跨您的Loop页面和组件按关键字搜索(通过Microsoft Graph) |
| `loop_create_workspace` | **实验性。** 创建新的共享工作区。无法通过API创建内容 |
## 会话存储
会话文件以加密形式存储在`~/.msloop-mcp-server/`:
- `session-state.json`:Playwright浏览器会话(cookie + localStorage)
- `token-cache.json`:提取和缓存的令牌
- `browser-profile/`:用于无头刷新的持久浏览器配置文件
如果您的会话过期,请再次运行`loop_login`。
## 令牌刷新
令牌会自动刷新:
1. **HTTP刷新** (快速,无浏览器):使用缓存的刷新令牌和Loop的客户端ID,每个资源(基板,SharePoint,Graph)调用一次。
2. **无头浏览器刷新**:如果HTTP刷新失败,则使用保存的配置文件打开无头浏览器以静默获取令牌。
## 要求
- Node.js 20+
- 基于Chromium的浏览器:Edge或Chrome(自动从系统默认检测)
- 具有访问Microsoft Loop权限的Microsoft 365工作或学校帐户
## 环境变量
| 变量 | 描述 |
|----------|-------------|
| `MSLOOP_DEBUG=true` | 启用调试日志记录到stderr |
| `MSLOOP_BROWSER=chrome` | 强制使用特定浏览器:`chrome`或`msedge`。如果未设置,则使用macOS系统默认;如果在macOS / Linux上回退到Chrome,在Windows上回退到Edge |
| `MSLOOP_CHROME_PROFILE` | 固定特定的Chrome配置文件目录用于cookie导入(例如`Profile 1`)。默认为`Default` |
| `MSLOOP_EDGE_PROFILE` | 固定特定的Edge配置文件目录用于cookie导入(例如`Profile 1`)。默认为`Default` |
| `MSLOOP_SKIP_COOKIE_IMPORT=true` | 跳过从您的真实浏览器导入SSO cookie(避免一次性Keychain / keyring提示)。您手动登录一次;然后持久性配置文件记住会话 |
## 安全说明
- 使用与Loop网页客户端相同的身份验证,因此您的访问权限仅限于您的帐户可以执行的操作。
- 令牌在静止状态下加密(使用机器派生的密钥进行AES-256-GCM加密)。
- 使用未记录的内部API,微软可能会在未经通知的情况下更改这些API。
## 致谢
Loop端点映射(基板发现,SharePoint多部分“通过POST获取”约定和HTML导出路由)由[exec-astraea/loop-migration](https://github.com/exec-astraea/loop-migration)和[Nico De Cleyre的“Microsoft Loop内部”](https://www.nicodecleyre.com/blog/2023-04-03-microsoft-loop-under-the-hood/)提供。
## 许可证
MIT。参见[LICENSE](./LICENSE)。