内容
# OneNoteMcp
一个 [Model Context Protocol](https://modelcontextprotocol.io) 服务器,暴露 Microsoft OneNote(桌面版)给 MCP 客户端,如 Claude Code。它通过 **早期绑定** 的 OneNote COM 自动化 API 在 Windows 上驱动 OneNote,因此 OneNote 桌面应用程序必须已安装并能够运行。
> **状态:** v1 工具表面完成 — 21 个工具,涵盖诊断、层次结构发现、页面读写、文件提取、笔记本/章节/页面 CRUD,以及 PDF/`.one`/`.onepkg` 导出和格式检测及转换。
## 架构
服务器是一个 .NET 8 通用主机。它通过 **stdio** (stdout 保留用于协议;所有日志都输出到 stderr)与 MCP 通信。工具是普通的静态方法,通过属性发现并自动注册。每个与 COM 交互的调用都通过一个单独的 `OneNoteSession`,它序列化对 OneNote 的访问、重试瞬时 RPC 失败,并在 OneNote 关闭时重新创建连接。
```mermaid
flowchart LR
Client["MCP 客户端<br/>(Claude Code)"] -- "stdio (JSON-RPC)" --> Host["服务器主机<br/>(.NET 8 通用主机)"]
Host --> Tools["工具类<br/>[McpServerToolType]"]
Tools --> Session["OneNoteSession<br/>(早期绑定 COM,<br/>单个信号量 + 重试)"]
Tools --> Mapper["ComErrorMapper<br/>(HRESULT → 人类文本)"]
Session -- "IApplication (早期绑定 COM)" --> OneNote["OneNote 桌面<br/>(OneNote.Application)"]
Session -. "COMException" .-> Mapper
```
一个页面往返编辑(读取 → 修改 → 写入)的流程如下:
```mermaid
sequenceDiagram
participant C as MCP 客户端
participant T as 工具
participant S as OneNoteSession
participant O as OneNote
C->>T: onenote_get_page(pageId, "all")
T->>S: GetPageContent(pageId)
S->>O: GetPageContent (早期绑定 COM)
O-->>S: 页面 XML
S-->>T: 页面 XML
T-->>C: 页面 XML
Note over C: 修改 XML
C->>T: onenote_update_page(pageXml)
T->>S: UpdatePageContent(pageXml)
S->>O: UpdatePageContent
O-->>S: ok
S-->>T: ok
T-->>C: {"updated": true}
```
## 要求
- 安装了 OneNote **桌面** 应用程序的 Windows(经典 Win32 `OneNote.Application` COM 服务器 - 不是商店/UWP 的“适用于 Windows 10 的 OneNote”)。
- .NET 8 SDK(或能够针对 `net8.0-windows` 的较新 SDK)。项目使用 `<RollForward>Major</RollForward>`,因此在较新运行时启动的 OneNote 侧 COM 服务器也有效。
## 多版本支持
可以并行安装多个 OneNote 桌面版本(例如 OneNote **2007** 和 OneNote **2016/2019/365**),它们的 COM `IApplication` 接口并不相同 - 2007(v12)服务器缺少后来版本中添加的六个方法。为了保持路由明确,**每个工具都采用所需的 `version` 令牌作为其第一个参数**。没有默认值,也没有隐含的“当前版本”回退:空或未知令牌返回结构化错误而不是猜测。
> **为什么没有默认值?** 安装 OneNote 2007 会重新指向版本无关的 `OneNote.Application` ProgID(其 `CurVer`)到 2007 服务器。因此,依赖注册的默认值将无声地路由到最后一个获得该注册表项的版本。传递显式的 `version` 消除了这种模糊性。
调用 **`onenote_list_versions`** (唯一一个不需要 `version` 参数的工具)以发现已安装的内容 - 它报告每个版本的显示名称、CLSID、exe 路径和支持的功能。
接受的令牌:年份(`2007`、`2010`、`2013`、`2016`),Office 主要版本(`12`、`14`、`16`)或原始 CLSID。
```mermaid
flowchart LR
T["版本令牌<br/>(2007 / 16 / CLSID)"] --> R["VersionResolver.Resolve"]
R --> C["规范 CLSID"]
C --> F["OneNoteSession.For(clsid)"]
F --> A{"适配器按主版本"}
A -->|"12"| L["旧适配器<br/>(OneNote 2007)"]
A -->|"14 / 15 / 16"| M["现代适配器<br/>(2010 / 2013 / 2016)"]
L --> G["功能门"]
M --> G
G -->|"支持"| COM["OneNote COM 调用"]
G -->|"不支持"| E["结构化错误<br/>(COM 永远不会被调用)"]
```
### 功能矩阵
每个主要版本支持的包装 `IApplication` 方法。2007(v12)缺少六个 `IApplication2`–`IApplication4` 新增功能;2010/2013/2016 支持所有 23 个。此表已针对 `OneNoteCapabilities` 由自动化漂移防护测试验证。
| 方法 | 2007 | 2010 | 2013 | 2016 |
| --- | --- | --- | --- | --- |
| GetHierarchy | ✓ | ✓ | ✓ | ✓ |
| FindPages | ✓ | ✓ | ✓ | ✓ |
| GetPageContent | ✓ | ✓ | ✓ | ✓ |
| UpdatePageContent | ✓ | ✓ | ✓ | ✓ |
| OpenHierarchy | ✓ | ✓ | ✓ | ✓ |
| Publish | ✓ | ✓ | ✓ | ✓ |
| CreateNewPage | ✓ | ✓ | ✓ | ✓ |
| CloseNotebook | ✓ | ✓ | ✓ | ✓ |
| DeleteHierarchy | ✓ | ✓ | ✓ | ✓ |
| UpdateHierarchy | ✓ | ✓ | ✓ | ✓ |
| GetBinaryPageContent | ✓ | ✓ | ✓ | ✓ |
| DeletePageContent | ✓ | ✓ | ✓ | ✓ |
| GetHierarchyParent | ✓ | ✓ | ✓ | ✓ |
| GetSpecialLocation | ✓ | ✓ | ✓ | ✓ |
| NavigateTo | ✓ | ✓ | ✓ | ✓ |
| GetHyperlinkToObject | ✓ | ✓ | ✓ | ✓ |
| FindMeta | ✓ | ✓ | ✓ | ✓ |
| NavigateToUrl | ✗ | ✓ | ✓ | ✓ |
| GetWebHyperlinkToObject | ✗ | ✓ | ✓ | ✓ |
| MergeFiles | ✗ | ✓ | ✓ | ✓ |
| MergeSections | ✗ | ✓ | ✓ | ✓ |
| SyncHierarchy | ✗ | ✓ | ✓ | ✓ |
| SetFilingLocation | ✗ | ✓ | ✓ | ✓ |
在 2007 上调用 `✗` 方法会返回结构化错误“不支持 OneNote 2007:'<method>'在此版本中不可用。” - 能力门在进行任何 COM 调用之前拒绝它。
## 构建和测试
```powershell
dotnet build OneNoteMcp.sln
dotnet test OneNoteMcp.sln
```
集成测试通过 COM 在 `%TEMP%` 中构建夹具笔记本,并在每次运行后将其拆除。要需要实时 COM(如果 OneNote 不可用,则失败而不是跳过),请在 `dotnet test` 之前设置 `ONENOTE_COM_REQUIRED=1`。
## 从 GitHub 版本安装(无需 .NET)
最快捷的方式:下载自包含的 Windows 构建并指向 Claude。无需 .NET SDK,无需源代码检出,无需容器。
> 此服务器通过 **COM** 驱动 OneNote,因此它必须在安装 OneNote 的同一 Windows 桌面上作为本地进程运行。因此,它作为可下载的 `.exe` 发布,而不是 `docker run ghcr.io/...` 样式的镜像 - 容器无法访问主机的 OneNote COM 服务器。
**步骤 1 - 下载构建。** 从 [最新版本](../../releases/latest) 中获取 `OneNoteMcp-v1.0.0-win-x64.zip` 并将其解压到任意位置,例如 `C:\Tools\onenote-mcp\`。注意 `OneNoteMcp.exe` 的完整路径。
**步骤 2 - 在 Claude Code 中注册它,限定在您的用户。** 在终端(PowerShell 或 cmd)中运行此命令。 `--scope user` (` -s user`)标志使服务器在您打开的 Claude Code 的 **每个** 项目中可用,而不仅仅是当前文件夹:
```powershell
claude mcp add onenote --scope user -- "C:\Tools\onenote-mcp\OneNoteMcp.exe"
```
**步骤 3 - 验证。** 确认它已注册并且可达:
```powershell
claude mcp list # 应该列出"onenote"
claude mcp get onenote # 显示命令、作用域(用户)和连接状态
```
就这样 - 启动 Claude Code 和 `onenote_*` 工具在任何项目中都可用。
### 选择范围
`claude mcp add` 根据 `--scope` 将服务器配置写入三个位置之一:
| 范围 | 标志 | 存储在 | 用途 |
| --- | --- | --- | --- |
| **用户**(推荐) | `--scope user` / `-s user` | 您的 Claude 用户配置(`~/.claude.json`) | 您希望 OneNote 在 **所有** 您在此计算机上的项目中可用 |
| **本地**(默认) | *(省略,或 `-s local`)* | 项目本地,仅限于您 | 您只想在 **当前** 项目中使用它 |
| **项目** | `--scope project` / `-s project` | `.mcp.json` 提交到存储库 | 您想与克隆存储库的每个人 **共享** 它(他们仍然需要 exe 本地) |
因为此服务器需要每个机器上的 `OneNoteMcp.exe` 存在, **`--scope user` 是个人使用的正确选择** - 注册一次,在任何地方使用。
### 管理或删除它
```powershell
claude mcp remove onenote --scope user # 注销
claude mcp add onenote --scope user -- "C:\NewPath\OneNoteMcp.exe" # 移动 exe 后重新指向
```
## 从源代码注册到 Claude Code
将以下内容添加到项目的 `.mcp.json`(调整到结点的路径):
```json
{
"mcpServers": {
"onenote": {
"command": "dotnet",
"args": ["run", "--project", "src/OneNoteMcp/OneNoteMcp.csproj"]
}
}
```
或者从 CLI 注册它(添加 `--scope user` 使其在每个项目中可用,如上面的发布安装):
```powershell
claude mcp add onenote --scope user -- dotnet run --project src/OneNoteMcp/OneNoteMcp.csproj
```
要运行发布的二进制文件而不是 `dotnet run`:
```json
{
"mcpServers": {
"onenote": {
"command": "path\\to\\OneNoteMcp.exe"
}
}
}
```
## 工具目录
所有对象 ID 都是从层次结构工具获得的 OneNote 对象 ID。所有文件输出都是绝对路径。工具返回字符串(对于变异的小 JSON 文字,对于导出 JSON 数组的路径,对于读取原始 OneNote XML)。COM 失败作为人类可读文本返回到工具结果中(参见 [故障排除](#troubleshooting)),永远不会跨协议抛出。
### 诊断
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_diagnostics` | *(无)* | 服务器版本、检测到的 OneNote 版本、运行状态、打开的笔记本数量、最后错误。 |
### 层次结构 / 发现
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_list_notebooks` | *(无)* | 打开笔记本的 JSON:`id`、`name`、`path`、标志。 |
| `onenote_get_hierarchy` | `nodeId`(默认为根),`scope`(`notebooks`\|`sections`\|`pages`) | 原始 OneNote 层次结构 XML。 |
| `onenote_find_pages` | `query` | 匹配的页面:`id`、`title`、`sectionId`。 |
### 页面读取
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_get_page` | `pageId`、`detail`(`basic`\|`selection`\|`binaryData`\|`fileType`\|`all`) | 请求详细级别的原始 OneNote 页面 XML。 |
| `onenote_get_page_info` | `pageId` | 摘要元数据:`id`、`title`、时间戳、作者、级别。 |
### 提取
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_extract_page_files` | `pageId`、`filter`(`images`\|`files`\|`ink`\|`all`)、`outputDir?` | 已写入文件路径的 JSON 数组(每个文件都有 `type`、几何形状和 `recognizedText` 用于墨水)。省略 `outputDir` 以写入临时目录。 |
| `onenote_embed_file` | `pageId`、`filePath`、`preferredName?`、`x?`、`y?` | 读取本地文件并将其追加到页面:图像内联为 base64,其他文件通过 `one:InsertedFile` 附加。提供 `x`+`y` 以放置新轮廓。JSON `{kind, format, filePath}`。 |
### 页面内容对象
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_get_binary_page_content` | `pageId`、`callbackId`、`outputDir?` | 解码回调支持的二进制到磁盘;JSON `{path, bytes}`。省略 `outputDir` 以写入临时目录。 |
| `onenote_delete_page_content` | `pageId`、`objectId` | 从页面中删除单个内容对象。 |
### 笔记本 / 章节 CRUD
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_open_notebook` | `path`(笔记本文件夹) | 打开笔记本的 `{id}`。 |
| `onenote_create_notebook` | `path`(新文件夹) | 创建笔记本的 `{id}`。 |
| `onenote_close_notebook` | `notebookId` | 关闭笔记本(文件保留在磁盘上)。 |
| `onenote_create_section` | `parentId`、`name` | 新章节的 `{id}`(如果缺少 `.one` 追加)。| `onenote_rename_node` | `id`、`newName` | 重命名章节、章节组或笔记本。 |
| `onenote_delete_node` | `id` | 删除章节、章节组或笔记本。 **无确认防护措施。** |
### 页面 CRUD
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_create_page` | `sectionId`、`title?` | 新页面的 `{id}`。 |
| `onenote_update_page` | `pageXml`(带有页面 ID 的完整 `<one:Page>`) | 整个页面替换;XML 在 COM 调用前验证。 |
| `onenote_delete_page` | `pageId` | 删除页面。 |
### 导出 / 转换
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_export_pdf` | `nodeId`、`outputPath`、`mode`(`single`\|`perPage`)、`interPublishDelayMs=2000` | 生成的 PDF 路径的 JSON 数组。 |
| `onenote_export_one` | `sectionId`、`outputPath` | 带有生成的 `.one` 路径(当前 2010+ 格式)的 JSON 数组。 |
| `onenote_export_onepkg` | `notebookId`、`outputPath` | 带有生成的 `.onepkg` 路径(当前 2010+ 格式)的 JSON 数组。 |
| `onenote_detect_format` | `pathOrNodeId`(文件路径或对象 ID) | JSON 报告:当前 2010+ vs 旧版 2007(标头嗅探,只读)。 |
| `onenote_convert_section` | `sectionId`、`outputPath` | JSON 报告;尽力而为地发布到当前 `.one` 格式。 |
### 导航和超链接
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_navigate_to` | `hierarchyObjectId`、`objectId?`、`newWindow?` | 导航 OneNote UI 到一个节点/对象。 |
| `onenote_navigate_to_url` | `url`、`newWindow?` | 导航 OneNote UI 到 `onenote:` URL。 |
| `onenote_get_hyperlink_to_object` | `hierarchyId`、`pageContentObjectId?` | 到节点/对象的 `onenote:` 超链接。 |
| `onenote_get_web_hyperlink_to_object` | `hierarchyId`、`pageContentObjectId?` | 到节点/对象的 web(https)超链接。 |
### 层次结构维护和归档
| 工具 | 参数 | 返回 |
| --- | --- | --- |
| `onenote_get_hierarchy_parent` | `objectId` | 节点的父对象 ID。 |
| `onenote_get_special_location` | `location`(`backup`\|`unfiledNotes`\|`defaultNotebook`) | 特殊位置的文件系统路径。 |
| `onenote_find_meta` | `searchName`、`startNodeId?` | 匹配元数据的页面 XML。 |
| `onenote_merge_files` | `baseFile`、`clientFile`、`serverFile`、`targetFile` | 将 OneNote 文件的三项合并到目标。 |
| `onenote_merge_sections` | `sourceId`、`destId` | 将源章节的页面合并到目标。 |
| `onenote_sync_hierarchy` | `hierarchyId` | 强制同步节点。 |
| `onenote_set_filing_location` | `location`(`email`\|`contacts`\|`tasks`\|`meetings`\|`webContent`\|`printOuts`)、`locationType`(`namedSectionNewPage`\|`currentSectionNewPage`\|`currentPage`\|`namedPage`)、`sectionId` | 设置 Outlook 项目归档章节。 |
> **未公开:** `QuickFiling`(显示交互式模态对话框,无无头自动化界面)和 OneNote 更改事件(`OnNavigate` / `OnHierarchyChange`,在托管代码中不受支持)被故意省略。
## OneNote 页面 XML 架构
此服务器 **不** 定义或捆绑自己的架构(仓库中没有 `.xsd`)。它直接使用 OneNote 自己的 COM API 生成和接受的 XML - OneNote 是语法事实上的源。
- **读取** (`onenote_get_page`、`onenote_get_hierarchy`、…) 返回 **原始 OneNote XML**,与 OneNote 发出的内容完全相同。 此处的解析是 namespace-agnostic(元素仅按本地名称 `Page`、`Outline`、`T`、`Image` 匹配),因此它容忍任何 OneNote 架构生成。
- **写入** (`onenote_update_page`) 采用 **完整的 `<one:Page>` 文档** - 完整的页面替换,而不是补丁。 在 COM 调用之前,轻量级防护措施(`PageXmlValidator`)仅检查有效载荷是否格式良好,根植于 `<Page>` 元素,并且带有 `ID` 属性(因此更新会定位到正确的页面,而不是无声地创建新页面)。 它 **不** 使用完整的 XSD 验证正文 - OneNote 会执行此操作。
- 架构 **版本** 通过 OneNote 理解的整数在一项调用中选择(`Xs2007=0`、`Xs2010=1`、`Xs2013=2`);每个工具都使用 `Xs2013`。
### 规范架构
OneNote 的 `OneNoteApplication` XML 架构(`http://schemas.microsoft.com/office/onenote/2013/onenote` 命名空间),记录在此:
- OneNote XML 架构参考: <https://learn.microsoft.com/office/client-developer/onenote/onenote-xml-schemas>
- `IApplication` COM 接口(驱动这些工具的 API): <https://learn.microsoft.com/office/client-developer/onenote/application-interface-onenote>
查看给定元素的确切形状的最可靠方法是创建 OneNote 中的内容并调用 `onenote_get_page` - 返回的 XML 是一个现成的模板,您可以修改并传回 `onenote_update_page`。
### 最小有效写入有效载荷
`onenote_update_page` 接受的完整 `<one:Page>` - 标题加一个正文文本运行。`ID` 必须是您正在更新的页面的对象 ID(从 `onenote_create_page` 或层次结构工具中获取):
```xml
<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2013/onenote"
ID="{OBJECT-ID-OF-THE-PAGE}">
<one:Title>
<one:OE>
<one:T><![CDATA[我的页面标题]]></one:T>
</one:OE>
</one:Title>
<one:Outline>
<one:OEChildren>
<one:OE>
<one:T><![CDATA[正文文本在此。]]></one:T>
</one:OE>
</one:OEChildren>
</one:Outline>
</one:Page>
```
文本被包装在 `<![CDATA[...]]>` 中,因此不解释标记字符。推荐的工作流程:`onenote_get_page` → 修改返回的 XML → 将整个文档发送回 `onenote_update_page`。
### 内嵌二进制数据和墨水
在 `detail: binaryData` 或 `all` 处,OneNote **内嵌** 每个二进制对象为
base64,放在 `<one:Data>` 子元素中 — 图片、插入的文件和 **墨水**。对于
墨水,OneNote 特别发出 ISF(Ink 序列化格式)笔画字节
内嵌,而 `<one:CallbackID>` 消失,因此不需要额外的 COM 调用来检索笔画。
`onenote_extract_page_files` 解码这些数据到磁盘,对每个文件进行类型标注,以便
`filter` 参数可以选择一个类别:
| 载体元素 | `type` | 编写为 | 备注 |
| --- | --- | --- | --- |
| `one:Image` | `image` | 推测的文件扩展名(`.png`/`.jpg`/…) | `width`/`height` 来自 `one:Size` 子元素 |
| 内联文件载体 | `file` | 推测的文件扩展名,否则 `.bin` | 任何其他具有内联 `one:Data` 的元素 |
| `one:InkDrawing` / `one:InkWord` / `one:InkParagraph` | `ink` | `.isf` | ISF 没有幻数,因此墨水始终为 `.isf`;`recognizedText` 被捕获(InkWord),并在没有 `one:Size` 子元素时从载体自身的 `width`/`height` 属性中读取几何形状 |
`filter` 值:`images`、`files`(**排除** 墨水 — 它是自己的类别),
`ink` 或 `all`。
```mermaid
flowchart LR
XML["页面 XML<br/>(detail=all)"] --> EX["二进制提取器"]
EX --> IMG["type=image → .png/.jpg"]
EX --> FILE["type=file → .bin/…"]
EX --> INK["type=ink → .isf<br/>+ recognizedText"]
IMG --> F{"过滤器"}
FILE --> F
INK --> F
F -->|images| IMG
F -->|files| FILE
F -->|ink| INK
F -->|all| ALL["所有内容"]
```
### 嵌入文件(反向)
`onenote_embed_file` 获取一个 **本地文件路径**,在服务器端读取它,并
将其附加到页面 — 调用者从不构建 base64 或页面 XML。它根据类型自动路由:
光栅图像(`png`/`jpg`/`gif`/`bmp`,由扩展名或幻数决定)内嵌为
`one:Image` 中的 base64;其他文件通过 `one:InsertedFile` 原生附加,
它引用磁盘上的文件 **路径**(无 base64)。提供 `x`+`y` 来放置附加的大纲;省略两者,让 OneNote 选择。在 OneNote 2007(主版本号 12)上,将发出 2007 命名空间/架构。
```mermaid
flowchart LR
P["文件路径"] --> R["读取字节"]
R --> T{"图像幻数/扩展名?"}
T -->|png/jpg/gif/bmp| I["one:Image + base64 one:Data"]
T -->|其他| A["one:InsertedFile pathCache"]
I --> W["包装在 one:Outline + 页面 ID 中"]
A --> W
W --> U["更新页面内容(附加)"]
```
## 导出和格式功能
- **PDF** — 一个页面/章节的单个文件(`mode: single`),或每个页面
的一个 PDF(`mode: perPage`)到一个目录。`perPage` 在每次发布之间等待
`interPublishDelayMs`,因为 OneNote 在发布被连续请求时可能会卡住。
- **`.one`** — 将一个章节导出到当前的(2010+)OneNote 章节格式。
- **`.onepkg`** — 将整个笔记本导出到一个 Windows 文件柜包。发布是
异步的:服务器等待文件完全写入并解锁后再返回路径。
- **格式检测** — 读取文件头来将 `.one`/`.onetoc2`
文件分类为当前 2010+ 或旧版 2007,而不修改它。
### 2007 格式限制
OneNote 2007(`FFV27`)文件在 **尽力而为、仅 COM** 的基础上处理:
- `onenote_detect_format` 可靠地从头报告旧版 2007 格式。
- `onenote_convert_section` 尝试通过发布 API 升级 *仅当安装的 OneNote 可以打开该章节*,并按章节报告失败,而不是崩溃。
- 此仓库中 **没有二进制 `.one` 解析器**。如果您的 OneNote 安装
无法打开旧版章节,此服务器无法转换它 — 直接在 OneNote 中升级它。
## 故障排除
错误在工具结果中返回,通过一个中央
`ComErrorMapper` 以以下形式转换为人类可读的文本
`OneNote 错误 0x{HRESULT}: {message} 建议的操作: {action}`。
| 症状 | 原因 | 修复 |
| --- | --- | --- |
| `0x80042030` — OneNote 显示对话框 | 模态窗口(通常是首次运行/登录屏幕)阻止自动化。 | 取消 OneNote 对话框,然后重试。 |
| `0x80080005` — OneNote 无法启动 | COM 无法启动 OneNote(通常是首次运行屏幕)。 | 手动打开 OneNote,完成首次运行/登录一次,然后重试。 |
| `0x80042014` / `0x80042004` / `0x80042005` — 对象/章节/页面不存在 | ID 已过期(ID 在同步后更改)。 | 通过 `onenote_list_notebooks` 或 `onenote_get_hierarchy` 刷新 ID。 |
| `0x80042010` — 页面自上次读取后已更改 | 其他人(或同步)编辑了页面。 | 使用 `onenote_get_page` 重新读取,重新应用您的编辑,然后再次更新。 |
| `0x8004201E` — 旧版 2007 章节 | 章节为 OneNote 2007 格式。 | 在编辑前使用 `onenote_convert_section` 升级。 |
| `0x8004201b` — 章节加密并锁定 | 章节受密码保护。 | 在 OneNote 中解锁,然后重试。 |
| `0x800706BA` — OneNote 进程不可用 | OneNote 在调用过程中关闭或重新启动。 | 会话自动重新连接;重试调用。 |
| `0x80010001` / `0x8001010A` — 忙/稍后重试 | OneNote 忙。 | 稍后重试(会话已经重试瞬时故障)。 |
如果 **所有** 集成测试都因构造函数中的夹具而失败,返回
`0x80080005`/`0x80042014`,则 OneNote 卡在首次运行模态窗口上 — 这是
环境问题,而不是代码错误。完成 OneNote 的首次运行/登录一次。
## 许可证
[MIT](LICENSE)
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器