Microsoft OneNote Model Context Protocol (MCP) Server
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation, output schema clarity, and error handling guidance. Tool names lack clear verb-noun structure ('onenote-read' vs 'read_onenote'). Parameter descriptions exist but are minimal (avg ~30 chars, well below 72-char baseline). No output schema documented. No error recovery guidance. No tool annotations (readOnlyHint, destructiveHint). Schemas present but incomplete, many conditional parameters lack clear dependency documentation.
Create OneNote content (notebooks, sections, pages)
Read OneNote content (notebooks, sections, pages)
Tool names do not follow verb_noun convention. 'onenote-read' and 'onenote-create' use hyphens and noun-first ordering. Should be 'read_onenote' and 'create_onenote' or more specifically 'list_notebooks', 'read_page_content', 'create_page'. LLMs parse intent from name structure, current names are ambiguous.
Parameter descriptions are minimal (10-30 chars). E.g., 'Notebook ID (required for list_sections)' lacks context on format, where to obtain it, or what happens if wrong. Baseline is 72 chars. LLMs cannot infer parameter semantics from bare names.
No output schema documented. Callers cannot know what fields to expect from read operations or what IDs are returned from create operations. This breaks tool chaining, agent cannot pass returned IDs to downstream calls without guessing field names.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | <=2025-11-25 | v2 |
No error recovery guidance. Code catches Graph API errors and logs them, but tool responses do not guide LLM on retry strategy, user-fixable vs fatal errors, or alternative actions. E.g., 'Authentication failed' gives no hint to call getAccessToken or check AZURE_CLIENT_ID.
Conditional parameter dependencies not documented. E.g., 'notebookId' is 'required for list_sections' but the schema does not enforce this, LLM could call list_sections without notebookId and get a confusing error. Schema should use conditional 'required' or description should be explicit: 'Required if type=list_sections; omit for list_notebooks.'