MCP server for interacting with Notion pages, blocks, and content via markdown
NotionBae has 7 tools with basic naming and descriptions, but significant gaps in schema completeness, parameter documentation, and error handling. Tool names follow verb_noun convention (nb_update_block, nb_delete_blocks, nb_create_page), which is good. However, input schemas are inferred from method signatures rather than explicitly visible in JSON Schema format. Descriptions exist but are often generic or incomplete (e.g., nb_update_page_content: 'Updates the notion page content' is only 31 chars, below the 50-char baseline). Parameter descriptions are sparse, many parameters lack type hints or constraints. Error handling returns raw exception messages instead of actionable recovery guidance. No output schemas documented. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels (WRITE, DESTRUCTIVE, READ_ONLY). The codebase shows input validation via Guard clauses, but no structured error classification or user-fixable guidance.
Creates a new Notion page with the given title, description, and content.
Deletes a Notion block with the specified Ids. Before using this tool, make sure you have re-ran nb_get_page_content. When deleting sections send a list of blockIds for better efficiency.
Retrieves a Notion page with its metadata and full content in markdown format. BlockId is in the comment after the Markdown element. A comment looks like this: `[//]: # (BlockId: 12345678-1234-1234-1234-123456789012)`
Searches Notion pages and returns their titles and public URLs.
Updates a Notion block with markdown content.
Updates an existing Notion page with new title and/or content.
Input schemas not explicitly visible in JSON Schema format. Tool definitions inferred from C# method signatures (blockId: string, content: string) rather than declared as structured JSON Schema objects with type, description, and constraints.
Parameter descriptions missing or incomplete. 'blockId' has no description in nb_update_block. 'content' in nb_update_page_content lacks format/length constraints. 'parentId' in nb_create_page is undescribed. LLMs cannot infer parameter meaning from names alone.
Tool descriptions too short or generic. nb_update_page_content: 'Updates the notion page content' (31 chars, below 50-char baseline). nb_update_page: 'Updates an existing Notion page with new title and/or content' lacks WHEN to use it vs nb_update_page_content. Ambiguous distinction forces LLM guessing.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | <=2025-11-25 | v2 |
Updates the notion page content.
No output schemas documented. Tools return plain strings (e.g., 'Block updated successfully!\nID: {blockId}'). LLMs cannot parse structured results or extract IDs for chaining. No documented return types violates pattern:tool baseline (100% of A+ tools have documented return types).
Error handling returns raw exception messages ('Exception occurred while updating Notion block: {ex.Message}') instead of actionable recovery guidance. No error classification (retryable vs user-fixable vs fatal). Violates pattern:recovery-guide and pattern:error-classification.