GoodNotes MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GOODNOTES_DB_DIR | No | Path to GoodNotes SQLite databases | ~/Library/Containers/com.goodnotesapp.x/Data/Library/Databases |
| GOODNOTES_TRACKING_FILE | No | Path to processing state file | ~/.goodnotes-mcp/processed.json |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_notebooksA | List all GoodNotes notebooks with their names, IDs, page counts, and last modified dates. Filters out templates (documents with epoch-zero timestamps). Returns a formatted list of user notebooks sorted by last modified date. |
| read_notebookA | Read OCR text from a GoodNotes notebook. Returns the handwriting-recognized text for each page, with multiple word candidates separated by | so Claude can pick the best word from context. Args: notebook_id: The document UUID from list_notebooks page_start: First page to read (1-indexed, default: 1) page_end: Last page to read (0 = all pages, default: 0) |
| read_pageA | Read OCR text from a single page of a GoodNotes notebook. Args: notebook_id: The document UUID page_number: Page number (1-indexed) |
| search_notesA | Search across all handwritten notes using case-insensitive text search. Splits multi-word queries so each word is matched independently — necessary because GoodNotes OCR stores words in separate groups delimited by special chars. Args: query: Search term (each word matched independently, case-insensitive) |
| get_unprocessedA | Get notebooks and pages that haven't been processed yet or changed since last processing. Compares the tracking file against current FTS index to find new/changed content. |
| mark_processedA | Mark pages as processed after they've been written to Obsidian. Args: notebook_id: The document UUID page_ids: Comma-separated page UUIDs to mark as processed |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/withsivram/goodnotes-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server