{"slug": "how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note", "title": "How I Built a Local Apple Notes MCP Server to Give Claude Desktop Real Note Automation", "summary": "A developer built a local MCP server for Apple Notes that gives Claude Desktop 13 tools for note automation, including search, move, append, and delete capabilities beyond the official integration. The server uses AppleScript to connect Apple Notes to AI assistants via the Model Context Protocol, enabling natural language commands like \"summarize my notes from last week\" or \"add this to my shopping list.\" The project is open-source on GitHub.", "body_md": "I wanted to ask Claude about my notes the way I ask it about everything else: naturally, without copying and pasting between apps or manually organising information one note at a time.\n\nI wanted to say things like “summarize my notes from last week,” “find the idea I wrote about product onboarding,” or “add this to my shopping list,” and have the assistant actually do the work.\n\nThat sounds simple. In practice, it exposed a gap that many people do not think about until they hit it: AI assistants can be very good at reasoning, but they are only as useful as the tools they can reach.\n\nFor Apple Notes, that gap was real.\n\nThe official Apple Notes integration in Claude Desktop was useful, but it was also narrow. It let me read and create notes. That was enough to prove the concept, but not enough to build a real workflow around it. I could not search notes, move them between folders, append to an existing note, or delete them in a way that felt practical. It was a starting point, not a proper bridge.\n\nSo I built my own.\n\nNot a cloud service. Not a wrapper around a third-party API. Just a local MCP server that runs on my machine, talks to Apple Notes through AppleScript, and exposes the tools Claude needs to work with my notes in a more serious way.\n\nThe code is available on GitHub so other people can try it and extend it: [https://github.com/Manu-jemini/apple-notes-mcp](https://github.com/Manu-jemini/apple-notes-mcp)\n\nThat is what this project became: a small but meaningful piece of infrastructure that turns Apple Notes from a passive repository into something an AI assistant can actually operate.\n\nThe Model Context Protocol is one of those ideas that sounds abstract until you see it in action.\n\nAt a high level, MCP gives an AI assistant a structured way to call tools. Instead of forcing an LLM to “pretend” it can interact with an app, the protocol lets the application expose real capabilities: search, create, update, delete, move, and so on.\n\nIn other words, MCP is the missing layer between an AI model and the tools you use every day.\n\nThat is why it matters. Once an app exposes its functionality through MCP, the AI does not need to guess how to interact with it. It just calls the tool that exists.\n\nFor a personal productivity stack, that is huge. It means your notes, your tasks, your documents, your calendar, and your files can all become part of a larger reasoning loop.\n\nThe goal is not just “AI can read your notes.” The real goal is “AI can act on your notes.”\n\nI spend a lot of time writing ideas down. Some of them become projects. Some become blog posts. Some are just half-formed thoughts that I want to keep around until I have time to make sense of them.\n\nThe issue was that my notes lived in a system that was great for capture but not great for retrieval or automation. I wanted something closer to how I actually think:\n\nThat is where Apple Notes and Claude started to feel incomplete together.\n\nThe default integration gave me some basic read/write capabilities, but not enough to make the experience feel natural. I wanted a server that could do more than just “create a note.” I wanted a server that could support real note workflows.\n\nSo I built one with 13 tools.\n\nThe server is intentionally simple. It runs locally, uses AppleScript to talk to Apple Notes, and exposes a set of tools that Claude can call when needed.\n\nIt includes tools for:\n\nThat is the difference between a toy integration and a usable one. The first one proves the idea. The second one supports real work.\n\nThe structure is intentionally straightforward.\n\nThere is an entry point that starts the MCP server and connects it to stdio, which is the transport MCP uses. From there, the server registers a set of tool handlers. Each tool is implemented in its own file, which keeps the code easy to reason about and easy to extend.\n\nThe core pattern is very consistent:\n\nThat simplicity matters. It keeps the server predictable and makes it much easier to add new behaviors later.\n\nHere is the core entry point:\n\n``` js\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";import { createServer } from \"./server\";\njs\nconst server = createServer();\njs\nasync function main() {  const transport = new StdioServerTransport();  await server.connect(transport);}\nmain().catch(console.error);\n```\n\nThe server itself is just a registry of tools. That is the beauty of it. Once the transport is live, Claude can call the tools as if they were part of the assistant’s native skill set.\n\nOne of the reasons I liked this approach is that it avoids the usual AI-product trap: sending personal data to a third party just to make it usable.\n\nThe MCP server itself runs on my machine. It talks to Apple Notes through AppleScript, and it does not use a separate cloud note backend or a third-party note-sync service.\n\nThat means the note access and the tool execution are local to the machine where the server runs.\n\nHowever, there is an important distinction here: the server can keep your notes local, but the assistant that uses the tool may still send the tool output to Claude Desktop’s model service, depending on how your Claude setup is configured.\n\nSo this architecture reduces one layer of exposure by keeping the note integration local, but it does not change the broader inference path used by Claude Desktop.\n\nThat is not just a privacy preference. It is also a practical design decision.\n\nWhen you build tools that operate on personal data, the simplest and safest model is usually the one that keeps the data where it already lives.\n\nFor this kind of project, local-first is not a compromise. It is the right architecture.\n\nApple Notes does not expose a modern developer API that is friendly to this kind of integration. On macOS, AppleScript is still the most practical way to interact with the app.\n\nThat comes with tradeoffs. AppleScript is old, sometimes awkward, and not especially elegant. But it is direct. And for a local desktop environment, direct is often more valuable than polished.\n\nThe server uses AppleScript to do things like:\n\nIt is a simple bridge, but it is effective.\n\nOne of the most important pieces of the implementation is also one of the simplest: escaping user input before it is placed into AppleScript.\n\nIf you insert raw text into an AppleScript string, you can create injection issues. That is not a theoretical concern. It is a real risk when user content is mixed into a script.\n\nThe implementation uses a small helper to escape quotes safely before passing content into AppleScript strings. It is a tiny detail, but it matters a great deal when the system is supposed to be trustworthy.\n\nThat is the kind of hardening that makes a personal automation tool feel serious rather than experimental.\n\nThe interesting part is not just that the tool exists. It is that it changes how the assistant can behave.\n\nInstead of saying “here is a list of your notes,” Claude can now do things that feel much closer to real assistance.\n\nExamples:\n\nThat is the difference between passive access and real workflow integration.\n\nThe full project is hosted on GitHub so you can clone it, inspect it, and start from the same working example: [https://github.com/Manu-jemini/apple-notes-mcp](https://github.com/Manu-jemini/apple-notes-mcp)\n\nOnce the server is built, connecting it to Claude Desktop is straightforward.\n\nYou add the server to your Claude Desktop configuration:\n\n```\n{  \"mcpServers\": {    \"apple-notes\": {      \"command\": \"node\",      \"args\": [\"/absolute/path/to/apple-notes-mcp/dist/index.js\"]    }  }}\n```\n\nThen build the project:\n\n```\nnpm installnpm run build\n```\n\nRestart Claude Desktop, and the server appears as a connected MCP tool provider. From that point on, the assistant can use the tools it exposes.\n\nOne small caveat: if Claude Desktop cannot find Node, use the absolute path to your Node binary instead of just node.\n\nThere is a difference between building an AI feature and building a real AI workflow.\n\nA feature is something the model can technically do. A workflow is something the model can do repeatedly, reliably, and in a way that feels like part of a larger system.\n\nThat is what this server tries to enable.\n\nIt is not just another connector that can read notes. It is a way to make Apple Notes part of the same kind of loop that already exists for code, files, browser tools, and other productivity systems.\n\nThat is why I think this kind of project matters.\n\nIt shows that the real future of AI assistants is not just better chat. It is better integration with the tools we already use every day.\n\nThe process reinforced a few ideas that I think are worth keeping in mind.\n\nFirst, AI tools become much more useful when they are connected to real systems rather than just exposed as text. The moment an assistant can take action, the experience changes completely.\n\nSecond, the hardest part is rarely the core idea. It is usually the plumbing: handling errors, keeping the transport clean, making sure inputs are safe, and making the tool interface predictable.\n\nThird, a simple architecture tends to win. A server with a clear structure, a few well-defined tools, and direct local execution is easier to maintain and easier to extend than something more clever but more fragile.\n\nThat is what made this project satisfying. It was not about trying to over-engineer the problem. It was about building a useful bridge in a way that felt durable.\n\nThe most exciting part of all of this is not the Apple Notes integration itself. It is the pattern.\n\nOnce you can connect an AI assistant to a local system through MCP, the possibilities expand quickly. Notes become actionable. Documents become searchable. Personal knowledge becomes usable by the assistant in a more meaningful way.\n\nThis project is small, but the idea behind it is much larger:\n\nif your tools are accessible, your AI assistant becomes far more useful.\n\nAnd once that happens, the assistant stops feeling like a chatbot and starts feeling like a collaborator.\n\n[How I Built a Local Apple Notes MCP Server to Give Claude Desktop Real Note Automation](https://blog.devgenius.io/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note-automation-2e81753f9ba2) was originally published in [Dev Genius](https://blog.devgenius.io) on Medium, where people are continuing the conversation by highlighting and responding to this story.", "url": "https://wpnews.pro/news/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note", "canonical_source": "https://blog.devgenius.io/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note-automation-2e81753f9ba2?source=rss----4e2c1156667e---4", "published_at": "2026-07-14 09:45:57+00:00", "updated_at": "2026-07-14 10:25:33.813230+00:00", "lang": "en", "topics": ["ai-tools", "developer-tools", "ai-agents", "ai-infrastructure"], "entities": ["Apple Notes", "Claude Desktop", "Model Context Protocol", "GitHub", "Manu-jemini"], "alternates": {"html": "https://wpnews.pro/news/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note", "markdown": "https://wpnews.pro/news/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note.md", "text": "https://wpnews.pro/news/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note.txt", "jsonld": "https://wpnews.pro/news/how-i-built-a-local-apple-notes-mcp-server-to-give-claude-desktop-real-note.jsonld"}}