mcp-apple-notes
This server allows you to manage Apple Notes on macOS through an LLM agent, enabling CRUD operations and search. Here's what you can do:
List notes: Retrieve note IDs, titles, and modification dates (no body), with an optional limit (default 50, max 200). Excludes Recently Deleted.
Read a note: Fetch full content by ID, returned in Markdown.
Create a note: Create a new note from Markdown, where the first line becomes the title. Optionally specify a folder (defaults to "Notes").
Update a note: Replace all content of an existing note by ID with new Markdown; the first line becomes the new title.
Delete a note: Move a note to Recently Deleted by ID, recoverable for ~30 days.
Search notes: Case-insensitive substring search across titles and content, with an optional limit (default 50, max 200). Excludes Recently Deleted.
Provides tools to list, read, create, update, delete, and search notes in Apple Notes on macOS, with Markdown content conversion and support for folders and iCloud accounts.
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., "@mcp-apple-notessearch my notes for meeting notes"
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.
mcp-apple-notes
An MCP (Model Context Protocol) server that exposes Notes.app on macOS as tools for LLM agents — list, read, create, update, delete, and search notes.
Requirements
macOS (uses JXA/
osascriptto automate Notes.app — there's no other public API for Notes)Node.js 18+
A single iCloud account in Notes.app (multi-account is not supported)
Related MCP server: mcp-apple-notes
Install
npm install
npm run buildTools
Tool | Description |
| List notes ( |
| Read a note's full content (Markdown) by |
| Create a note from Markdown |
| Replace a note's entire |
| Delete a note by |
| Case-insensitive substring search over title + content. Optional |
Notes:
Content is exchanged as Markdown, not HTML. Notes.app stores bodies as HTML internally; this server converts both ways.
Images embedded in a note's body are replaced with a
[imagen adjunta]placeholder instead of being inlined as base64 — attachments are out of scope."Recently Deleted" is excluded from
list_notes/search_notesresults.
Running it from Claude Desktop
Add it to your Claude Desktop MCP config with a local path (this package isn't published to npm):
{
"mcpServers": {
"apple-notes": {
"command": "node",
"args": ["/absolute/path/to/mcp-apple-notes/dist/index.js"]
}
}
}The first call that touches Notes.app triggers a macOS Automation permission prompt. If it's denied or the process runs non-interactively, grant access manually in System Settings → Privacy & Security → Automation, then retry.
Development
npm run build # compile TypeScript (tsc) to dist/
npm test # run unit tests (node --test) against dist/**/*.test.js
npm start # run the compiled server directly (stdio transport)Only pure logic (Markdown↔HTML conversion, error formatting) has automated tests. Anything that touches Notes.app itself is verified manually, since it requires real macOS automation and mutates real data.
See CLAUDE.md for architecture notes.
License
GNU AGPLv3 — see LICENSE for details.
Available Tools
6 toolscreate_noteA
Crea una nueva nota en Notes.app. El contenido es Markdown; la primera línea se convierte en el título de la nota (así es como Notes.app deriva el título del cuerpo).
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Contenido en Markdown. La primera línea será el título. | |
| folder | No | Carpeta destino dentro de la cuenta iCloud (default: "Notes"). Debe existir. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains the creation and title derivation but does not disclose permissions, side effects, or error handling. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, front-loaded with the action, no unnecessary words. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 params and no output schema, the description covers core behavior and a key nuance (title from first line). It misses mention of return value or multi-account handling, but is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description's parameter info (Markdown, title derivation) largely repeats the schema, adding no new value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a new note in a specific app (Notes.app) and explains how the title is derived from the first line of content, distinguishing it from sibling tools like update_note or delete_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use vs alternatives, but the creation action is self-explanatory among siblings like list, read, update, delete, search. Implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_noteA
Elimina una nota de Notes.app. Igual que borrar desde la UI: la nota se mueve a 'Recently Deleted' y es recuperable ahí por ~30 días, no se borra instantáneamente.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id de la nota a eliminar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses the non-instantaneous deletion behavior—soft delete to 'Recently Deleted' with a ~30-day recovery window. This is critical behavioral context that the agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the action, then briefly explaining the consequence. No wasted words, efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one required parameter and no output schema, the description provides complete context: what the tool does, the soft-delete behavior, and recovery window. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description for the single 'id' parameter. The description adds no extra meaning beyond the schema, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Elimina una nota de Notes.app' (deletes a note from Notes.app). It uses a specific verb and resource, and is distinct from sibling tools (create, list, read, search, update).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the deletion mimics UI behavior: note moves to 'Recently Deleted' with ~30-day recovery. This provides context for the tool's effect, helping the agent decide when to use it, though no explicit alternatives or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_notesA
Lista las notas de Notes.app (id, título y fecha de modificación), sin el contenido completo. No incluye notas en Recently Deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Cantidad máxima de notas a devolver (default 50, máximo 200). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return format (id, title, modification date), excludes full content, and excludes deleted notes. This provides key behavioral context beyond the schema, but lacks details on auth, rate limits, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, concise and front-loaded with the main purpose. Every sentence adds value: first states what it does and the output fields, second clarifies what is excluded. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description is complete. It clearly outlines the output scope and important exclusions (no full content, no deleted notes). No additional information is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'limit' is fully documented in the input schema (type, range, default, max). The description does not add any additional semantic meaning beyond what the schema provides. Baseline 3 is appropriate as schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list', the resource 'notes', and specifies the returned fields (id, title, modification date) while excluding full content and Recently Deleted notes. This distinguishes it from siblings like read_note (full content) and search_notes (filtered results).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by stating what is returned and excluded, but does not explicitly state when to use this tool versus alternatives. Sibling names (read_note, search_notes) provide implicit guidance. A clear 'use this when you need a summary list' would improve it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_noteA
Lee el contenido completo de una nota de Notes.app por su id, en formato Markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id de la nota, obtenido de list_notes o search_notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It accurately describes a non-destructive read operation and specifies the output format. It could mention error behavior or idempotency, but the simplicity of the tool makes this sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that contains all necessary information with no extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, no output schema), the description fully covers what the tool does and what it returns. It is complete for an agent to understand and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description does not add extra meaning beyond what the schema already provides for the 'id' parameter. The baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action as reading the full content of a note by its id and specifies the output format (Markdown). It distinguishes from siblings like list_notes and search_notes by focusing on retrieval of a single note's complete content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use when the user has the note's id and needs the full content. However, it does not explicitly state when not to use it (e.g., for listing all notes) or provide comparison with alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_notesA
Busca notas por texto (case-insensitive, substring) en título y contenido. No incluye notas en Recently Deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Texto a buscar. | |
| limit | No | Cantidad máxima de resultados (default 50, máximo 200). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility. It discloses key behaviors: case-insensitive substring search, scope (title and content), and exclusion of Recently Deleted. Missing details like ordering or pagination are minor gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the core action, and contains no unnecessary words. It efficiently conveys purpose and key constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers basic purpose and behavioral traits but lacks details expected in search tools (e.g., result ordering, pagination, return format). Given no output schema, it leaves some ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are documented in the schema. The description adds no new semantic information beyond the schema; it reiterates the search text and limit. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches notes by text with case-insensitive substring matching in title and content, and excludes Recently Deleted. This distinguishes it from siblings like list_notes (which lists all) and read_note (single note).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for text search but does not explicitly state when to use this tool versus alternatives (e.g., list_notes, read_note). No guidance on when not to use or prerequisites is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_noteA
Reemplaza el contenido completo de una nota existente. El contenido es Markdown; la primera línea se convierte en el título.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Id de la nota a actualizar. | |
| content | Yes | Nuevo contenido completo en Markdown, reemplaza el anterior. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must convey behavioral traits. It adds one key detail (first line of content becomes title) but does not disclose other aspects like whether the update is reversible, permissions needed, or side effects. The replacement nature is implied but not explicitly labeled as destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no redundant information, efficient delivery of core purpose and key behavior. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple update tool with no output schema and two well-described parameters, the description provides necessary context (Markdown, title extraction). It lacks mention of success/error responses or idempotency, but is sufficient for basic use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying that content is Markdown and explaining the first-line-to-title behavior, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('reemplazar el contenido completo') and the resource ('nota existente'), and distinguishes itself from sibling tools (create, delete, read, list, search) by focusing on replacement of existing content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives, no when-not-to-use conditions, and no mention of prerequisites or context. The sibling tools are listed but not compared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
create_note - First observed
delete_note - First observed
list_notes - First observed
read_note - First observed
search_notes - First observed
update_note
TDQS
Scored across 6 tools
Each tool has a clear and distinct purpose: create, delete, list, read, search, and update notes. No overlapping functionalities.
All tool names follow a consistent verb_noun pattern (e.g., create_note, list_notes), with only a minor variation in pluralization (list_notes vs others singular).
6 tools is well-scoped for a note-taking server, covering basic CRUD operations plus search without unnecessary redundancy.
Covers all core note operations (create, read, update, delete, list, search). Missing a tool to restore from 'Recently Deleted' or manage folders, but not critical for basic usage.
Maintenance
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI assistants like Claude to access and manipulate Apple Notes on macOS, allowing for retrieving, creating, and managing notes through natural language interactions.82MIT
- AlicenseAqualityCmaintenanceMCP server for Apple Notes with semantic search (on-device embeddings via all-MiniLM-L6-v2), full-text search, complete CRUD operations, folder management, and fuzzy title matching. 10 tools. Runs fully locally on macOS — no API keys required.101312MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server for Apple Notes that enables semantic search and full CRUD operations through natural language.257MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for macOS that enables creating, reading, and searching Apple Notes programmatically through tools like find, get by title or ID, and create.1,440MIT