Connecting Your Joplin Notes to Claude: Building an MCP Server in Go
TLDR: Complete project at https://github.com/rpfilomeno/joplin-mcp-go

How I built a Windows system tray app that lets AI assistants seamlessly interact with my note-taking workflow
If you’re like me, you’ve been using Joplin for years to manage your notes, ideas, and knowledge base. And if you’re also like me, you’ve been amazed by Claude’s capabilities and wondered: “What if Claude could access and help me organize my notes?”
Well, wonder no more. I built a solution, and I’m going to show you exactly how it works.
The Problem: Two Powerful Tools, Zero Integration
Joplin is an incredible open-source note-taking application. It’s private, powerful, and packed with features. Claude, on the other hand, is an AI assistant that can help with research, writing, coding, and analysis. Both tools are fantastic individually, but they live in separate worlds.
I found myself constantly:
- Copying notes from Joplin to paste into Claude
- Manually creating new notes based on Claude’s suggestions
- Searching through thousands of notes when I needed context for a conversation
- Wishing Claude could just “see” my notes
There had to be a better way.
Enter the Model Context Protocol (MCP)
Anthropic recently introduced the Model Context Protocol—a standardized way for AI assistants to connect to external data sources and tools. Think of it as a universal adapter that lets Claude plug into your applications.
The beauty of MCP is its simplicity: you define “tools” that Claude can use, and Claude figures out when and how to use them. No complex prompting, no manual copying—just natural conversation.
The Solution: A Go-Based MCP Server for Joplin
I decided to build a lightweight Windows application that:
- Runs in your system tray - No clutter, just a simple icon
- Connects to Joplin’s REST API - Uses Joplin’s built-in Web Clipper service
- Implements the MCP protocol - Exposes 8 powerful tools to Claude
- Requires minimal configuration - Just a simple JSON file
What Can It Do?
The MCP server provides eight tools that give Claude complete access to your notes:
Reading & Discovery:
list_notes- Browse all your notes or filter by notebookget_note- Retrieve any note by IDsearch_notes- Use Joplin’s powerful search syntaxlist_folders- See all your notebookslist_tags- View your tag system
Creation & Management:
create_note- Create new notes from conversationsupdate_note- Modify existing notesdelete_note- Clean up old notes
Real-World Use Cases
Here’s where it gets exciting. With this setup, you can have conversations like:
“Claude, what notes do I have about the Q4 project?” Claude searches your notes and summarizes what you’ve written.
“Create a new note summarizing our discussion about the API redesign” Claude creates a well-structured note in your chosen notebook.
“Update my meeting notes from yesterday with the action items we just discussed” Claude adds to existing notes without you lifting a finger.
“Search my notes for anything related to Python asyncio” Claude finds relevant notes across your entire knowledge base.
The Technical Architecture
Let me walk you through how this works under the hood.
The Stack
- Language: Go (fast, compiled, perfect for system tray apps)
- Protocol: MCP over HTTP JSON-RPC
- Joplin Integration: REST API via Web Clipper
- UI: Windows system tray using
getlantern/systray
Key Components
1. Joplin Client
type JoplinClient struct {
baseURL string
token string
client *http.Client
}
This handles all communication with Joplin. It authenticates using your API token, makes HTTP requests, and parses responses. Simple, clean, efficient.
2. MCP Server
type MCPServer struct {
joplin *JoplinClient
config *Config
}
This implements the MCP protocol. It receives JSON-RPC requests from Claude, routes them to the appropriate tool, calls the Joplin API, and formats responses.
3. System Tray Integration
The app runs quietly in your system tray. Right-click the icon to check status or quit. No visible windows, no distractions—just seamless functionality.
The MCP Protocol in Action
When Claude wants to search your notes, here’s what happens:
- Claude sends a request:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "search_notes",
"arguments": {"query": "machine learning"}
}
}
- The MCP server processes it:
- Validates the request
- Extracts the tool name and arguments
- Calls the Joplin API
- Formats the response
- Joplin returns the data:
{
"items": [
{
"id": "abc123",
"title": "ML Model Training Notes",
"body": "..."
}
]
}
- Claude receives and understands it: The response is formatted as MCP-compliant JSON, which Claude interprets naturally in the conversation.
Setting It Up: Easier Than You Think
Prerequisites
- Joplin Desktop with Web Clipper enabled
- Go 1.21+ (if building from source)
- Windows 10+
Installation (5 Minutes)
Step 1: Get Your Joplin API Token
- Open Joplin → Tools → Options → Web Clipper
- Enable the service
- Copy your authorization token
Step 2: Configure the Server Create config.json:
{
"joplin_port": 41184,
"joplin_token": "your_token_here",
"mcp_port": 3000
}
Step 3: Run the Server
./joplin-mcp-server.exe
Step 4: Connect Claude Desktop Add to claude_desktop_config.json:
{
"mcpServers": {
"joplin": {
"url": "http://localhost:3000",
"transport": "http"
}
}
}
Step 5: Restart Claude That’s it. You’re done.
My Experience Using It
I’ve been using this setup for the past few weeks, and it’s transformed how I interact with my notes.
What I Love
Natural Conversations: I don’t think about “tools” or “commands.” I just ask Claude to help me with my notes, and it works.
Context Awareness: Claude can search through thousands of notes instantly, pulling relevant information into our conversation.
Automated Organization: After a brainstorming session, Claude creates structured notes automatically. No more manual cleanup.
Seamless Workflow: The system tray app is invisible. It just works in the background.
Performance & Resource Usage
Go is perfect for this application:
- Startup time: ~100ms
- Memory usage: ~15MB
- CPU usage: Negligible when idle
- Network: Only active during API calls
The compiled executable is just 8MB. No runtime dependencies, no bloat.
Security Considerations
Local Only: The server runs on localhost only. No external access.
Token-Based Auth: Uses Joplin’s built-in token authentication.
No Data Storage: The server is stateless. All data stays in Joplin.
Open Source: You can review every line of code.
Future Enhancements
I’m planning to add:
- Attachment support - Let Claude see images and PDFs in notes
- Configuration UI - A simple dialog for settings
- Auto-detection - Automatically find Joplin’s port
- Cross-platform support - Linux and macOS versions
- Batch operations - Work with multiple notes at once
- Tag management - Better tag organization tools
Lessons Learned
What Worked Well
Go’s Simplicity: The entire server is ~500 lines of clean, readable code. Go’s standard library had everything I needed.
MCP Design: The protocol is well-designed. The JSON-RPC format is familiar, and the tool-based approach is intuitive.
Joplin’s API: Comprehensive and well-documented. Everything I needed was available through REST endpoints.
Challenges
System Tray Quirks: Windows system tray development has some odd behaviors. The getlantern/systray library helped, but there were edge cases.
Error Handling: Needed robust error handling for network issues, invalid tokens, and malformed requests.
MCP Testing: Testing MCP integrations requires a full Claude Desktop setup. Would love better developer tooling here.
Why Go?
You might wonder why I chose Go instead of Python or Node.js.
Speed: Go compiles to native code. Startup is instant, resource usage is minimal.
Simplicity: No runtime to install, no dependency management issues. One executable, that’s it! Hell ya!
Concurrency: Go’s goroutines make it trivial to handle multiple requests without blocking.
System Integration: Great support for Windows system tray and low-level OS features.
Type Safety: Catching errors at compile time saved hours of debugging.
The Open Source Aspect
The full source code is available on GitHub (MIT License). Why open source?
- Transparency: You should know exactly what runs on your machine
- Security: Open code is auditable code
- Community: Others can improve it, add features, fix bugs
- Learning: If you want to build your own MCP server, this is a working example
Getting Started
Ready to try it yourself?
- Download the latest release from GitHub
- Configure with your Joplin token
- Run the executable
- Connect Claude Desktop
- Start talking to your notes
The entire setup takes less than 5 minutes.
Conclusion
Building this MCP server has fundamentally changed how I use both Joplin and Claude. They’re no longer separate tools—they’re a unified system for knowledge management and AI assistance.
The combination of Joplin’s privacy-focused note-taking with Claude’s intelligence creates something greater than the sum of its parts. I can brainstorm with Claude, have it search my knowledge base, create structured notes, and maintain everything in my own private Joplin database.
And because it’s built with Go, it runs efficiently in the background without interrupting my workflow.
If you use Joplin and Claude, I highly recommend giving this a try. The productivity boost is real, and the setup is surprisingly simple.
Resources
- GitHub Repository: https://github.com/rpfilomeno/joplin-mcp-go
- Joplin REST API Docs: https://joplinapp.org/api/references/rest_api/
- MCP Specification: https://spec.modelcontextprotocol.io/
- Go Systray Library: https://github.com/getlantern/systray
Questions?
Have questions about the implementation? Want to contribute? Found a bug? Open an issue on GitHub or reach out. I’m excited to see what the community builds with this foundation.
Happy note-taking! 📝🤖
This project is open source under the MIT License. Feel free to use, modify, and distribute as you see fit.
