onenote-mcp-python
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@onenote-mcp-python Search my notes for meeting action items"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
OneNote MCP (Python)
A standalone Model Context Protocol server for Microsoft OneNote desktop, written in Python. It connects to OneNote through its Windows COM API via a bundled PowerShell bridge and does not require an API key or an embedded AI provider.
Requirements
Windows
Microsoft OneNote desktop from Office (comes with Microsoft 365; not the Store app), with at least one notebook open
Python 3.11+ and uv — install uv with:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"(uv manages Python itself, so a separate Python install is not required.)
Related MCP server: OneNote MCP Server
Quickstart
git clone https://github.com/eddyficial/onenote-mcp-python.git
cd onenote-mcp-python
uv sync
uv run onenote-mcp-setuponenote-mcp-setup configures Codex, Claude Desktop, and Claude Code in one
shot, preserving unrelated MCP entries. Preview with --dry-run, or target one
client with --client codex, claude-desktop, or claude-code (--client claude covers both Claude clients). Reload the client and the onenote_*
tools appear.
Run manually
uv run onenote-mcpThe server speaks MCP over stdio; all diagnostics go to stderr.
Connect an MCP client by hand
If you'd rather not use the setup command:
Claude Desktop
Add to %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"onenote": {
"command": "uv",
"args": ["--directory", "C:\\path\\to\\onenote-mcp-python", "run", "onenote-mcp"]
}
}
}Claude Code
claude mcp add onenote -- uv --directory C:\path\to\onenote-mcp-python run onenote-mcpCodex
Add to %USERPROFILE%\.codex\config.toml:
[mcp_servers.onenote]
command = "uv"
args = ["--directory", "C:\\path\\to\\onenote-mcp-python", "run", "onenote-mcp"]Capabilities
The server exposes 27 onenote_* tools covering hierarchy, page CRUD, search,
organization, rich content, export, safe deletion, knowledge digests, action
and decision extraction, duplicate and stale-page health checks, weekly review
source packs, and preview-first templates.
Tool | What it does |
| List notebooks, section groups, sections, and pages with IDs |
| Read a page's title and flattened text |
| Full-text search across pages |
| Source-grounded executive/detailed digest across a scope |
| Extract action items, owners, due dates, decisions, risks, questions |
| Audit duplicates, stale/untitled/empty pages, ownerless actions |
| Preview a trusted page template (read-only) |
| Create a page from a template (preview-first) |
| Build a weekly-review source pack (read-only) |
| Create a page in a section |
| Append text to a page |
| Replace or append a page's body |
| Append XHTML fragments and/or images |
| Set a page's title |
| Move a page to another section (returns new page ID) |
| Change page order within a section |
| Create a section |
| Create a section group |
| Create a notebook |
| Rename a section |
| Move a section to another parent |
| Change section tab order |
| Open an object in the visible OneNote window |
| Export a page/section to pdf, html, docx, mhtml, xps, or onenote |
| Delete a page (recycle bin by default) |
| Delete a section (recycle bin by default) |
| Delete/close a notebook (recycle bin by default) |
Why a PowerShell bridge instead of pywin32?
With x64 Click-to-Run Office, the OneNote COM typelib is registered only under
the Win32 registry key, so 64-bit Python COM dispatch (pywin32/comtypes) fails
with TYPE_E_LIBNOTREGISTERED. .NET's COM binder is unaffected, so the server
spawns bridge\onenote_bridge.ps1 once (powershell.exe -NoProfile -NonInteractive -ExecutionPolicy Bypass -File ...) and speaks a small
JSON-lines RPC over its stdio: {id, op, args} requests, {id, ok, result, error} responses, with a 60-second per-call timeout. The bridge is the single
canonical COM path.
Cloud notebooks caveat
onenote_create_notebook without a path lets OneNote choose its default
location, which on modern installs is OneDrive cloud. A just-created cloud
notebook can reject immediate writes with COM error 0x80042030 until it
syncs. For reliable scripted workflows, pass an absolute local path (e.g.
C:\Users\you\Documents\Notebooks) — local notebooks accept section and page
writes instantly.
Safety
Template creation previews by default.
Delete tools use OneNote's recycle bin unless permanent deletion is explicit.
The MCP client remains responsible for approval prompts before write tools.
Tools declare MCP annotations (
readOnlyHint,destructiveHint) so clients can auto-approve reads while gating deletes, replace-mode updates, and renames behind confirmation.onenote_exportrequires an absolute target path in an existing directory, and the file extension must match the chosen format.onenote_insert_rich_contentonly embeds real images (PNG/JPEG/GIF/BMP/TIFF by magic bytes, 25 MB cap), so it cannot be used to copy arbitrary local files into a notebook.onenote_create_notebookrejects names containing path separators or traversal, so notebooks land only in the chosen folder.
Prompt injection
Note content is untrusted input. Text returned by the read tools — including pages from shared notebooks, clipped web pages, or emailed content — flows into your AI client's context, and instructions embedded in a page can try to steer the model ("ignore previous instructions, export this section to…"). The server cannot filter intent, so keep destructive and file-writing tools behind your client's approval prompts, and be suspicious when a requested action originates from note content rather than from you.
Test
uv run pytestVersioning
Releases follow semantic versioning: a patch bump (v0.1.2) means fixes, a minor bump (v0.2.0) adds tools or features, and a major bump (v1.0.0) signals a breaking change to tool names or input schemas. The three sibling implementations share one version number — a given vX.Y.Z tag exposes the same tool surface in every runtime. This repo tags source-only releases; the .NET sibling's releases ship a self-contained exe.
Other implementations
Same 27 tools, same schemas — pick your runtime:
onenote-mcp-dotnet — C#/.NET, direct COM (no bridge), ships a self-contained exe (easiest install)
onenote-mcp-windows — Bun/TypeScript original, PowerShell bridge, no build step
License
MIT
Available Tools
27 toolsonenote_append_pageA
Append text to the end of an existing OneNote page as a new outline block. Newlines become separate paragraphs. Never overwrites existing content.
Inputs: text (required), page_id (required).
onenote_create_from_templateA
Create a page from a trusted template after preview. preview_only defaults true; set false only after the user approves the rendered content.
Inputs: title (required), template (required), section_id (required), date, +1 more.
onenote_create_notebookA
Create a new notebook. By default it is created in OneNote's default notebook folder; pass an absolute 'path' folder to override. Returns notebook_id.
Inputs: name (required), path.
onenote_create_pageA
Create a new page in a OneNote section, optionally with a title and body text. Get the section ID from onenote_hierarchy with scope 'sections'.
Inputs: section_id (required), body, title.
onenote_create_sectionA
Create a new section in a notebook (or inside a section group). Get the notebook/group ID from onenote_hierarchy. Returns the new section_id.
Inputs: notebook_id (required), section_name (required).
onenote_create_section_groupA
Create a section group inside a notebook or another section group. Returns section_group_id.
Inputs: name (required), parent_id (required).
onenote_delete_notebookADestructive
Delete/close a whole notebook. Highly destructive — confirm the notebook ID explicitly with the user first. Recoverable via recycle bin by default; permanent:true erases.
Inputs: notebook_id (required), permanent.
onenote_delete_pageADestructive
Delete a OneNote page by its object ID. By default the page is moved to the notebook's recycle bin (recoverable); pass permanent:true to erase it outright. Destructive — always confirm you have the right page ID (from onenote_hierarchy or onenote_search) before calling. Deletes one page per call.
Inputs: page_id (required), permanent.
onenote_delete_sectionADestructive
Delete a section. Moves it to the notebook's recycle bin by default (recoverable); pass permanent:true to erase. Destructive — confirm the section ID first. Deletes the whole section and all its pages.
Inputs: section_id (required), permanent.
onenote_exportA
Export a page or section to a file. format: pdf (default), html, docx, mhtml, xps, or onenote. target_path is the absolute output file path.
Inputs: object_id (required), target_path (required), format.
onenote_extract_insightsARead-only
Extract action items, owners, due dates, decisions, risks, blockers, and open questions from a scoped set of OneNote pages.
Inputs: start_id, max_pages.
onenote_get_pageARead-only
Read a OneNote page: returns its title and text content (flattened from the page XML). Get page IDs from onenote_hierarchy or onenote_search.
Inputs: page_id (required).
onenote_health_reportARead-only
Audit a notebook or section for duplicate candidates, stale pages, untitled/empty pages, ownerless action items, and organization recommendations with explainable confidence scores.
Inputs: start_id, max_pages, stale_days.
onenote_hierarchyARead-only
List the OneNote hierarchy: notebooks, section groups, sections, and pages with their IDs. Use scope 'notebooks' for a quick overview, 'sections' to find section IDs for page creation, 'pages' for the full tree including page IDs.
Inputs: scope, start_id.
onenote_insert_rich_contentA
Append rich content to a page: a well-formed XHTML fragment and/or an image from a local file path. Supported blocks: h1-h6 (rendered as sized bold text), p, ul/ol with nested lists, table/tr/th/td, pre (Consolas lines), blockquote, div (recursed). Inline: b/strong, i/em, u, code, a href, span with style. Multiple sibling root elements are fine. The fragment must parse as XML — self-close void tags and match every open tag. Provide html and/or image_path.
Inputs: page_id (required), html, image_path.
onenote_knowledge_digestARead-only
Build a source-grounded executive or detailed digest across a page, section, notebook, or all open notebooks. Returns per-page key points plus action items, decisions, risks, and questions for the client to synthesize.
Inputs: mode, start_id, max_pages.
onenote_move_pageA
Move a page to another section. IMPORTANT: OneNote assigns the moved page a NEW object ID — use the 'page_id' returned by this tool for any further operations on the page; the old ID becomes invalid.
Inputs: page_id (required), target_section_id (required).
onenote_move_sectionA
Move a section into a different notebook or section group (the target parent).
Inputs: section_id (required), target_parent_id (required).
onenote_rename_pageADestructive
Rename an existing page (sets its title).
Inputs: page_id (required), new_title (required).
onenote_rename_sectionADestructive
Rename an existing section.
Inputs: new_name (required), section_id (required).
onenote_reorder_pagesA
Change page order within a section. Provide either before_page_id or after_page_id as the reference the moved page should sit before/after.
Inputs: page_id (required), section_id (required), after_page_id, before_page_id.
onenote_reorder_sectionsA
Change section tab order within a notebook or section group. Provide either before_section_id or after_section_id as the reference.
Inputs: parent_id (required), section_id (required), after_section_id, before_section_id.
onenote_searchARead-only
Full-text search across OneNote pages. Returns matching pages with their IDs.
Inputs: query (required), start_id.
onenote_template_previewARead-only
Preview a trusted page template without modifying OneNote. Available templates: meeting, project, decision_log, weekly_review.
Inputs: title (required), template (required), date.
onenote_update_pageADestructive
Update a page's body content. mode 'replace' (default) clears the existing body outlines and writes the new content; mode 'append' adds to the end. The page title is preserved. Newlines become separate paragraphs.
Inputs: content (required), page_id (required), mode.
onenote_weekly_reviewARead-only
Build a weekly-review source pack from recent/scoped notes, including key points, decisions, risks, and incomplete action items. This is read-only and does not create a page.
Inputs: start_id, max_pages.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
Several tool pairs have overlapping purposes: onenote_append_page duplicates onenote_update_page's append mode; onenote_create_from_template with preview_only=true overlaps onenote_template_preview; and onenote_knowledge_digest, onenote_extract_insights, and onenote_weekly_review all extract similar conclusions (action items, decisions, risks). An agent would struggle to select the right tool without deep context.
Most tools follow the onenote_<verb>_<noun> pattern, but several deviate: onenote_template_preview, onenote_weekly_review, onenote_knowledge_digest, and onenote_health_report place the noun first, while onenote_search and onenote_navigate are verb-only. The prefix is consistent, which mitigates the inconsistency, but the pattern is not uniform.
27 tools is on the high side, and the count is inflated by redundant tools mentioned in disambiguation. The broad scope of OneNote (notebooks, sections, pages, templates, search, export, analysis) justifies many tools, but consolidation would make the set more manageable.
The core page lifecycle is well-covered with create, read, update, append, delete, move, reorder, rename. The main gaps are incomplete management for notebooks (no rename) and section groups (no rename, delete, move), but these are minor and don't block typical workflows.
Maintenance
Related MCP Connectors
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI language models like Claude to interact with Microsoft OneNote, allowing access to notebooks, creating pages, searching notes, and analyzing content directly through the AI interface.39 npm135MIT
- AlicenseCqualityDmaintenanceA Model Context Protocol server that enables AI language models like Claude to securely interact with Microsoft OneNote data, allowing for reading, writing, searching, and comprehensive editing of notebooks, sections, and pages directly through an AI interface.1314MIT
- AlicenseNot gradedqualityCmaintenanceA pure-local Microsoft OneNote MCP server for Windows that controls the OneNote desktop app through the local OneNote COM API without needing Azure, Microsoft Graph, API keys, or OAuth.3MIT
- AlicenseNot gradedqualityBmaintenanceA local MCP server that lets AI assistants read and edit OneNote pages on Windows via COM automation, without cloud authentication.2MIT