OneNote笔记服务

一个通过Microsoft Graph连接OneNote的服务,提供列出笔记和读取笔记内容的功能,支持Streamable HTTP和SSE传输。

  • by benamaraissam
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 benamaraissam/onenote-mcp

使用说明

OneNote MCP服务器

连接到的MCP服务器(SSE和流式HTTP) OneNote 通过Microsoft Graph并将工具公开给 列出你的笔记 和 阅读每个笔记的内容与官方共同建造 模型上下文协议(MCP)Python SDK 以及干净、分层的架构。

特性

  • 运输: 流式HTTP (默认)和 上海证券交易所 (服务器发送的事件)
  • 工具:
    • list_notes --列出所有OneNote笔记本
    • list_note_sections --列出笔记本中的分区
    • list_note_pages --列表页面(部分或全部)
    • read_note_content --获取页面的HTML内容
  • 认证:通过Azure身份的Microsoft Graph(委托或应用程序)

建筑

src/onenote_mcp/
├── domain/           # Models and ports (interfaces)
│   ├── models.py     # Notebook, Section, Page
│   └── ports.py      # OneNoteGateway
├── application/      # Use cases
│   └── use_cases.py  # list_notebooks, list_sections, list_pages, get_note_content
├── infrastructure/   # Microsoft Graph
│   └── graph_client.py  # GraphOneNoteGateway
├── server.py        # MCP FastMCP app + tools
└── main.py          # Entrypoint (SSE / Streamable HTTP)
  • 领域:实体和网关接口;没有框架或图形细节。
  • 应用:调用网关的用例。
  • 基础设施:图形化网关的API实现。
  • 服务器:使用用例和生命周期注入网关的MCP(FastMCP)工具。

需求

  • Python≥3.10
  • Azure应用程序注册 笔记。阅读 (委托)或 笔记。读。全部 (应用程序)

设置

1.克隆并安装

cd onenote
python3 -m venv .venv
source .venv/bin/activate   # or .venv\Scripts\activate on Windows
pip install -e .

这将以可编辑模式安装软件包,因此 onenote_mcp 就在你的路上。或者:

pip install -r requirements.txt
pip install -e .

或与 紫外线:

uv sync

2.Azure应用程序注册

  1. 在 Azure门户 → 应用程序注册 → 新注册 (例如“OneNote MCP”)。
  2. API权限 → 添加权限→ 微软图形 → 委派:
    • Notes.Read (或 Notes.ReadWrite)
    • User.Read
  3. 认证 → 添加平台 → 移动和桌面应用程序 →添加重定向类型(例如。 http://localhost:8400;必须匹配 AZURE_REDIRECT_URI 在 .env) → Save.然后设置 允许公共客户端流 = 是.
  4. 在 .env:set AZURE_CLIENT_ID;可选 AZURE_TENANT_ID 和 AZURE_REDIRECT_URI (默认值 http://localhost:8400).
  5. 对于 应用 (仅限应用程序)改为身份验证:添加 应用 许可 Notes.Read.All,创建客户端密钥,并设置 ONENOTE_USER_ID.

企业:管理员同意

在 工作或学校(组织) 租户,您的IT管理员可能需要 同意书 在访问OneNote之前,请先访问应用程序。如果你看到一个错误,比如 “需要管理员批准” 或 “需要访问组织中只有管理员才能授予的资源的权限”:

  1. 询问管理员 授予应用程序的同意(您的应用程序的 应用程序(客户端)ID 来自Azure)。
  2. 管理步骤 (Azure门户): 应用程序注册 → 选择应用程序→ API权限 → click 为<您的组织>授予管理员同意.
  3. 或者,管理员可以使用 企业应用程序 → 选择应用程序→ 权限 → 授予管理员同意.

在获得管理员同意后,再次登录(或再次运行MCP服务器);然后,该应用程序将有权代表您组织中的用户访问OneNote。

3.环境

cp .env.example .env
  • 委托(浏览器登录):set AZURE_CLIENT_ID (以及可选 AZURE_TENANT_ID)从步骤2开始注册您的应用程序。首次运行将打开浏览器进行登录。
  • 应用程序(仅限应用程序):set AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET,以及 ONENOTE_USER_ID.

运行服务器

如果你得到 ModuleNotFoundError: No module named 'onenote_mcp',请先安装软件包: pip install -e .

SSE和流式HTTP 在同一服务器上运行(无需选择配置):

python -m onenote_mcp.main
# or after pip install -e .
onenote-mcp

自定义主机/端口:

PORT=3000 python -m onenote_mcp.main
HOST=0.0.0.0 PORT=8000 python -m onenote_mcp.main

连接客户端

这两种传输方式都可以在同一台服务器上使用。使用您的客户支持的任何一种。

流式HTTP --单个URL:

  • http://localhost:8000/mcp (或你的 HOST/PORT)
{
  "mcpServers": {
    "onenote": {
      "type": "streamable-http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

上海证券交易所 --连接到SSE端点;服务器将告诉客户端在哪里POST消息:

  • 上海证券交易所 GET http://localhost:8000/sse
  • 信息: POST http://localhost:8000/messages/ (与 ?session_id=... 从第一次SSE活动开始)
{
  "mcpServers": {
    "onenote": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

工具参考

工具 说明
list_notes 列出所有OneNote笔记本。可选: user_id (仅适用于应用程序)。
list_note_sections 列出笔记本中的分区。必修的: notebook_id.可选: user_id.
list_note_pages 列表页面;可选的 section_id 限制在一个部分。可选: user_id.
read_note_content 获取页面的HTML内容。必修的: page_id.可选: user_id.

使用来自的ID list_notes / list_note_sections / list_note_pages 作为下一个工具的输入。

测试

安装开发依赖项并运行测试(模拟OneNote网关,无Azure凭据):

pip install -e ".[dev]"
# or
pip install -r requirements-dev.txt
pytest tests/ -v

测试使用模拟网关并脱机运行。它们包括:

  • 用例: list_notebooks, list_sections, list_pages, get_note_content 使用模拟数据
  • 工具输出格式:工具响应的markdown/HTML形状
  • 应用结构:组合应用程序挂载 /sse 和 /mcp 路线

许可证

MIT。