An MCP server to interact with Microsoft OneNote, allowing LLMs to read, write, and edit notes.
The OneNote MCP server has 13 tools with clear action-verb naming and comprehensive input schemas. However, descriptions are inconsistent, some are adequate (e.g., searchPages: 117 chars), others are terse (e.g., authenticate: 70 chars, checkTokenScopes: 51 chars). Parameters are uniformly described with type and purpose, but output schemas are not explicitly documented in the visible code. Error handling exists but lacks recovery guidance. The server lacks tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite having clear READ_ONLY and WRITE categories. Overall: solid structure, but missing polish needed for production-grade agent integration.
Append content to the end of an existing page
Interactively authenticate with Microsoft Graph using device code flow
Check the scopes of the current access token
Create a new page in a specific section
Find and get a specific page by its title across all notebooks
Get the content of a specific page in different formats (text, HTML, or summary)
Missing output schema documentation. Tools declare input schemas but output structure is not explicitly documented in visible code. Agents cannot predict what fields to extract for downstream tool composition.
Insufficient description length on critical tools. 'authenticate' (70 chars), 'checkTokenScopes' (51 chars) fall below production guidance (target 50-200 chars). Descriptions lack context about WHEN to call these tools or what happens next.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). The schema correctly tags tools as READ_ONLY or WRITE in Risk field, but MCP tool annotations are not present. Agents cannot infer safety properties from the protocol definition alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
List all notebooks (personal and team notebooks if requested)
List all pages in a specific section
List all sections in a specific notebook
Search for pages containing specific text content
Search for pages across all notebooks by query, date range, or notebook name
Search for pages modified within the last N days
Update the content of an existing page
Error handling lacks recovery guidance. Code shows errorReporting=true, but visible error messages do not include actionable next steps (e.g., 'Try authenticate() first' or 'Use searchPages() to find the notebook').
Parameter descriptions lack format constraints. 'sectionId' and 'pageId' parameters accept strings but do not specify expected format (UUID, opaque token, etc.). 'format' enum on getPageContent is not explicitly described as restricted to 'text'|'html'|'summary'.
searchPages tool offers rich filtering (query, days, notebookName, orderBy, maxResults) but output structure is not documented. Agents cannot predict whether results include timestamps, modification dates, or notebook context needed for follow-up actions.