Inkdrop MCP Server
OfficialThis MCP server lets you browse, search, create, edit, and organize Inkdrop notes, notebooks, tags, and image attachments through Inkdrop’s local HTTP API.
Read full notes by ID, optionally embedding source template content.
Find backlinks to a note.
Search notes with keyword/qualifiers and list notes by notebook/tag/keyword/sort.
List note templates, including custom and official templates.
Create, update, and patch notes, including template notes, statuses, and tags.
List, read, create, and update notebooks, including nested notebooks.
List, read, create, and update tags with colors.
Create image attachment files from local paths or base64 data and read attachments by ID.
Use truncated list/search results and then fetch full content with read-note.
Provides tools for interacting with the Inkdrop note-taking application, enabling searching notes, reading note contents, creating new notes, updating existing notes, and listing notebooks.
Supports working with Markdown content through Inkdrop, allowing creation and modification of notes with Markdown formatting.
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., "@Inkdrop MCP Server search for notes about meeting minutes from last week"
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.
Inkdrop MCP Server
A Model Context Protocol server for the Inkdrop Local HTTP Server API.
Related MCP server: Simplenote MCP Server
Installation
Read the docs here.
Components
Tools
read-note: Retrieve the complete contents of the note by its ID from the database.Required inputs:
noteId: The ID of the note to retrieve. It can be found as_idin the note docs. It always starts withnote:.
Optional inputs:
includeTemplate: Whentrueand the note has asourceTemplateId, also fetch that template and embed its body (fill-out instructions and examples) as an extra text block. Default:false.
Note: If the note was created from a template, the response includes a resource link to its source template, whose body holds the fill-out instructions and examples.
read-backlinks: Retrieve backlinks for a note — the notes that link to it.Required inputs:
noteId: The ID of the note to find backlinks for. It always starts withnote:.
Note: Each result is returned as a resource link (
inkdrop://note/<id>) pointing to the referring note. Backlinks are found by searching all note bodies for the note's link URI.
search-notes: List all notes that contain a given keyword.Required inputs:
keyword: Keyword to search for.
Note: Results include truncated note bodies (200 characters). Use
read-noteto get full content.Supports advanced search qualifiers like
book:,tag:,status:,title:, etc.
list-notes: List all notes with specified conditions.Required inputs:
bookId: The notebook ID. It always starts with 'book:'.
Optional inputs:
tagIds: An array of tag IDs to filter. Each starts with 'tag:'.keyword: Keyword to filter notes.sort: Sort field (updatedAt,createdAt, ortitle). Default:updatedAt.descending: Reverse the order of output. Default:true.
Note: Results include truncated note bodies (200 characters). Use
read-noteto get full content.
list-templates: List note templates — your custom templates, followed by the official ones bundled with Inkdrop.Optional inputs:
keyword: Filter templates by fuzzy-matching their titles.
Note: Results include truncated template bodies (200 characters). Use
read-noteto get full content.
create-note: Create a new note in the database.Required inputs:
bookId: The notebook ID. Must start with 'book:' or be 'trash' or 'template'. Specify 'template' to create a custom note template.title: The note title.body: The content of the note in Markdown.
Optional inputs:
status: The note status (none,active,onHold,completed,dropped).tags: An array of tag IDs to assign to the note. Each must start with 'tag:'.
update-note: Update an existing note in the database. Only the fields you provide will be updated; omitted fields remain unchanged.Required inputs:
_id: The note ID. Must start with 'note:'._rev: The revision ID (CouchDB MVCC-token).
Optional inputs:
bookId: The notebook ID. Must start with 'book:' or be 'trash' or 'template'.title: The note title.body: The content of the note in Markdown.status: The note status (none,active,onHold,completed,dropped).tags: An array of tag IDs to assign to the note. Each must start with 'tag:'.
patch-note: Update the body of an existing note by performing one or more exact string replacements in a single call. More efficient thanupdate-notefor small edits to large notes as it saves tokens. You must first read the note withread-noteto get the current body.Required inputs:
_id: The note ID. Must start with 'note:'._rev: The revision ID (CouchDB MVCC-token).old_string: The exact text to find in the note body. Must match exactly one occurrence. Include enough surrounding context to ensure a unique match.new_string: The text to replaceold_stringwith. Use an empty string to delete the matched text.
list-notebooks: Retrieve a list of all notebooks.read-book: Retrieve a single notebook by its ID.Required inputs:
bookId: The notebook ID. Must start with 'book:'.
create-book: Create a new notebook in the database.Required inputs:
name: The notebook name.
Optional inputs:
parentBookId: The ID of the parent notebook. Must start with 'book:'. Omit it to create the notebook at the root level.
update-book: Update an existing notebook in the database. Only the fields you provide will be updated; omitted fields remain unchanged, so you don't need to read the notebook first.Required inputs:
_id: The notebook ID. Must start with 'book:'.
Optional inputs:
_rev: The revision ID (CouchDB MVCC-token). Only needed as an optimistic-concurrency guard — pass it to make the update fail on a conflicting concurrent edit.name: The notebook name.parentBookId: The ID of the parent notebook. Passnullto move the notebook to the root level.
list-tags: Retrieve a list of all tags.read-tag: Retrieve a single tag by its ID.Required inputs:
tagId: The tag ID. Must start with 'tag:'.
create-tag: Create a new tag in the database.Required inputs:
name: The name of the tag.
Optional inputs:
color: The color type of the tag (default,red,orange,yellow,olive,green,teal,blue,violet,purple,pink,brown,grey,black). Default:default.
update-tag: Update an existing tag in the database. Only the fields you provide will be updated; omitted fields remain unchanged, so you don't need to read the tag first.Required inputs:
_id: The tag ID. Must start with 'tag:'.
Optional inputs:
_rev: The revision ID (CouchDB MVCC-token). Only needed as an optimistic-concurrency guard — pass it to make the update fail on a conflicting concurrent edit.name: The name of the tag.color: The color type of the tag. Omit it to keep the tag's current color.
create-file: Create a new attachment file in the database from a local image file or from base64 image data. Returns the Markdown to embed the attachment in a note body.Required inputs: exactly one of
filePath: Absolute path to a local image file to attach. Preferred — it keeps the image bytes out of the conversation.data: Base64-encoded image data, without adata:URI prefix.
Optional inputs:
name: The file name. Defaults to the file name offilePath, orimage.<ext>whendatais given.contentType: The MIME type (image/png,image/jpeg,image/jpg,image/svg+xml,image/gif,image/heic,image/heif). Inferred from thefilePathextension when omitted, so it is required withdata.publicIn: An array of note IDs where the attachment is included. Each must start with 'note:'.
Note: Attachments are limited to 10MB.
read-file: Retrieve an attachment file by its ID. Returns the file metadata, and the image itself when it is a PNG, JPEG or GIF.Required inputs:
fileId: The attachment ID. Must start with 'file:'.
Optional inputs:
outputPath: Absolute path to write the attachment to. When given, the file is saved there and its bytes are not returned inline. Required to get at SVG, HEIC and HEIF attachments, which cannot be displayed inline.includeImage: Whether to return the image alongside the metadata. Default:true. Set tofalseto fetch only the metadata of a large attachment.
Debugging
Since MCP servers run over stdio, debugging can be challenging. For the best debugging experience, we strongly recommend using the MCP Inspector.
You can launch the MCP Inspector via npm with this command:
npx @modelcontextprotocol/inspector "./dist/index.js"Be sure that environment variables are properly configured.
Upon launching, the Inspector will display a URL that you can access in your browser to begin debugging.
You can also watch the server logs with this command:
tail -n 20 -f ~/Library/Logs/Claude/mcp-server-inkdrop.logAvailable Tools
18 toolscreate-bookA
Create a new notebook in the database. To create a nested notebook, pass the parent notebook ID as parentBookId. Call list-notebooks first to find it.
Inputs: name (required), parentBookId.
create-fileA
Create a new attachment file in the database from a local image file or from base64 image data. Returns the Markdown to embed the attachment in a note body. Prefer filePath over data: it keeps the image bytes out of the conversation.
Inputs: data, name, filePath, contentType.
create-noteC
Create a new note in the database
Inputs: body (required), title (required), bookId (required), tags, +1 more.
create-tagB
Create a new tag in the database
Inputs: name (required), color.
list-notebooksA
Retrieve a list of all notebooks
Inputs: no named parameters.
list-notesA
List all notes with specified conditions.
The result does not include entire note bodies as they are truncated in 200 characters.
You have to retrieve the full note content by calling read-note.
Inputs: sort, limit, bookId, tagIds, +2 more.
list-tagsA
Retrieve a list of all tags
Inputs: no named parameters.
list-templatesA
List note templates: your custom templates, followed by the official ones bundled with Inkdrop.
Templates are notes whose bookId is template. Official templates are read-only.
The result does not include entire template bodies as they are truncated in 200 characters.
You have to retrieve the full template content by calling read-note.
Inputs: keyword.
patch-noteA
Update the body of the existing note by performing one or more exact string replacements. Use this tool to make partial updates to the note body without replacing the entire content. You must first read the note with read-note to get the current body, then specify the exact substrings to replace. Edits are applied in order, each against the result of the previous one, and the note is only saved if all of them succeed.
Inputs: _id (required), _rev (required), edits (required).
read-backlinksA
Retrieve backlinks for a note — the notes that link to it.
Each result is returned as a resource link (inkdrop://note/<id>) pointing to the referring note.
Backlinks are found by searching all note bodies for the note's link URI.
Inputs: noteId (required).
read-bookB
Retrieve a single book
Inputs: bookId (required).
read-fileA
Retrieve an attachment file by its ID. Returns the file metadata, and the image itself when it is a PNG, JPEG or GIF. Pass outputPath to write the attachment to disk instead — required to get at SVG, HEIC and HEIF attachments, which cannot be displayed inline.
Inputs: fileId (required), outputPath, includeImage.
read-noteA
Retrieve the complete contents of the note by its ID from the database. A note created from a template has a sourceTemplateId; when present, the response includes a resource link to that source template, whose body holds the fill-out instructions and examples. Read the template (or pass includeTemplate: true) before completing the note.
Inputs: noteId (required), includeTemplate.
read-tagC
Retrieve a single tag
Inputs: tagId (required).
search-notesA
List all notes that contain a given keyword.
The result does not include entire note bodies as they are truncated in 200 characters.
You have to retrieve the full note content by calling read-note.
Here are tips to specify keywords effectively:
Use special qualifiers to narrow down results
You can use special qualifiers to get more accurate results. See the qualifiers and their usage examples:
book
book:Blog: Searches for notes in the 'Blog' notebook.book:"Desktop App": Searches for notes in the 'Desktop App' notebook.book:kGlLniaV: Searches for notes in the notebook with the ID 'book:kGlLniaV'.tag
tag:JavaScript: Searches for all notes having the 'JavaScript' tag. Read more about tags.tag:pQ7xYt2R: Searches for all notes having the tag with the ID 'tag:pQ7xYt2R'.status
status:onHold: Searches for all notes with the 'On hold' status. Read more about statuses.title
title:"JavaScript setTimeout": Searches for the note with the specified title.body
body:KEYWORD: Searches for a specific word in all notes. Equivalent to a global search.
Combine qualifiers
You can combine the filter qualifiers to refine data even more.
Find notes that contain the word 'Hello' and have the 'Issue' tag.
Hello tag:IssueFind notes that contain the word 'Typescript,' have the 'Contribution' tag, and the 'Completed' status
Typescript tag:Contribution status:CompletedSearch for text with spaces
To find the text that includes spaces, put the text into the double quotation marks ("):
"database associations"Exclude text from search
To exclude text from the search results or ignore a specific qualifier, put the minus sign (-) before it. You can also combine the exclusions. See the examples:
-book:Backend "closure functions": Ignores the 'Backend' notebook while searching for the 'closure functions' phrase.-tag:JavaScript: Ignores all notes having the 'JavaScript' tag.-book:Typescript tag:work "Data types": Ignores the 'Typescript' notebook and the 'work' tag while searching for the 'Data types' phrase.-status:dropped title:"Sprint 10.0" debounce: Ignores notes with the 'Dropped' status while searching for the 'debounce' word in the note with the 'Sprint 10.0' title.-"Phrase to ignore" "in the rest of a sentence": Ignores the 'Phrase to ignore' part while searching for 'in the rest of a sentence'.
Note that you can't specify excluding modifiers only without including conditions.
WARNING: Make sure to enter a text to search for after the exclusion modifier.
✅ Will work
-book:Backend "closure functions"⛔️ Won't work
-book:Backend. There's no query. Inkdrop doesn't understand what to search for.
Inputs: keyword (required).
update-bookA
Update the existing notebook in the database. Only the fields you provide will be updated; omitted fields remain unchanged, so you do not need to read the notebook first. Call list-notebooks or read-book to find the notebook ID.
Inputs: _id (required), _rev, name, parentBookId.
update-noteA
Update the existing note in the database. Only the fields you provide will be updated; omitted fields remain unchanged.
Inputs: _id (required), _rev (required), body, tags, +3 more.
update-tagA
Update the existing tag in the database. Only the fields you provide will be updated; omitted fields remain unchanged, so you do not need to read the tag first. Call list-tags or read-tag to find the tag ID.
Inputs: _id (required), _rev, name, color.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 18 tools
Most tools map cleanly to a resource+action (notes, tags, notebooks, files, templates, backlinks). The main overlaps are list-notes vs search-notes (both list notes, one with qualifier syntax) and update-note vs patch-note (both modify a note, though patch-note is clearly scoped to exact string replacements). Minor confusion also from 'book' vs 'notebook' referring to the same entity.
Predominantly consistent verb_noun hyphenated pattern (read-note, create-tag, list-notebooks, update-book) with minor deviations like read-backlinks and list-templates. The main inconsistency is terminology: notebook tools use both 'book' (read-book, update-book, create-book) and 'notebook' (list-notebooks), which weakens predictability.
18 tools is reasonable for a note app covering notes, tags, notebooks, files, templates, and backlinks. Each tool has a fairly clear role, though the set is slightly heavy and a few (patch-note vs update-note) could arguably merge.
Read/list/create/update exist across notes, tags, notebooks, and files, but no delete operations exist anywhere—removing notes, tags, or notebooks is impossible, a notable gap. Templates also lack create/update, and files lack update/delete, creating lifecycle dead ends.
Maintenance
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Notes and actions in one app. Let Claude or ChatGPT read and update them.
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Search, read, create and edit your Memol notes from Claude. Team note-taking with AI search.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables structured note-taking with markdown support, dynamic tagging system, advanced search capabilities, and markdown export functionality through natural language conversations in Claude Desktop.3GPL 3.0
- AlicenseAqualityBmaintenanceIntegrates Simplenote with Claude Desktop, allowing AI assistants to read, create, update, search, and manage your Simplenote notes as a memory backend or content source.921MIT
- AlicenseBqualityDmaintenanceEnables Claude to translate, search, and manage Obsidian notes directly through the Model Context Protocol. It features automatic backups, CRUD operations, and protects metadata and code blocks during the translation process.66,148 npm1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceConnects Claude.ai to your local Obsidian vault for full CRUD access, search, and daily note creation via the Model Context Protocol.67 npm14MIT