Skip to main content
Glama
Inkdrop MCP Server

Inkdrop MCP Server

Official
by inkdropapp

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

  1. 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 _id in the note docs. It always starts with note:.

    • Optional inputs:

      • includeTemplate: When true and the note has a sourceTemplateId, 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.

  2. 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 with note:.

    • 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.

  3. 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-note to get full content.

    • Supports advanced search qualifiers like book:, tag:, status:, title:, etc.

  4. 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, or title). Default: updatedAt.

      • descending: Reverse the order of output. Default: true.

    • Note: Results include truncated note bodies (200 characters). Use read-note to get full content.

  5. 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-note to get full content.

  6. 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:'.

  7. 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:'.

  8. patch-note: Update the body of an existing note by performing one or more exact string replacements in a single call. More efficient than update-note for small edits to large notes as it saves tokens. You must first read the note with read-note to 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 replace old_string with. Use an empty string to delete the matched text.

  9. list-notebooks: Retrieve a list of all notebooks.

  10. read-book: Retrieve a single notebook by its ID.

    • Required inputs:

      • bookId: The notebook ID. Must start with 'book:'.

  11. 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.

  12. 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. Pass null to move the notebook to the root level.

  13. list-tags: Retrieve a list of all tags.

  14. read-tag: Retrieve a single tag by its ID.

    • Required inputs:

      • tagId: The tag ID. Must start with 'tag:'.

  15. 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.

  16. 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.

  17. 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 a data: URI prefix.

    • Optional inputs:

      • name: The file name. Defaults to the file name of filePath, or image.<ext> when data is given.

      • contentType: The MIME type (image/png, image/jpeg, image/jpg, image/svg+xml, image/gif, image/heic, image/heif). Inferred from the filePath extension when omitted, so it is required with data.

      • publicIn: An array of note IDs where the attachment is included. Each must start with 'note:'.

    • Note: Attachments are limited to 10MB.

  18. 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 to false to 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.log

Available Tools

18 tools
create-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-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:Issue

Find notes that contain the word 'Typescript,' have the 'Contribution' tag, and the 'Completed' status

Typescript tag:Contribution status:Completed

Search for text with spaces

To find the text that includes spaces, put the text into the double quotation marks ("):

"database associations"

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

    A3.5/5.0

    Scored across 18 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count4/5

    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.

    Completeness3/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers