by docdyhr
Provides full Simplenote note management via MCP, allowing Claude Desktop and other MCP clients to read, create, update, delete, search, and optionally encrypt notes on the fly.
Simplenote MCP Server exposes Simplenote’s note API through the Model Context Protocol, turning a personal Simplenote account into a programmable memory backend. Claude Desktop can call MCP tools to retrieve notes, append text, run advanced searches, and even store encrypted content client‑side.
claude_desktop_config.json that points to the executable and passes the same environment variables.create_note, search_notes, add_text, etc., using the MCP spec.# Example Docker launch (recommended)
docker run -d \
-e SIMPLENOTE_EMAIL=your.email@example.com \
-e SIMPLENOTE_PASSWORD=your-password \
-e MCP_TRANSPORT=http \
-e MCP_HTTP_HOST=0.0.0.0 \
-e MCP_HTTP_AUTH_TOKEN=super‑secret-token \
-p 8000:8000 \
docdyhr/simplenote-mcp-server:latest
Q: Do I need a Simplenote account? A: Yes. The server authenticates with your Simplenote email and password.
Q: Is my data encrypted at rest? A: Simplenote does not encrypt notes at rest, but the server offers optional Vault encryption that encrypts note bodies before they are sent to Simplenote.
Q: Can I run the server without Docker?
A: Absolutely. Clone the repo, install with pip install -e ., and run simplenote-mcp-server.
Q: What ports are used?
A: The MCP protocol defaults to the port you expose (e.g., 8000). Optional health/metrics endpoints run on HTTP_PORT (default 8080) when ENABLE_HTTP_ENDPOINT=true.
Q: How is authentication handled for HTTP transport?
A: A bearer token (MCP_HTTP_AUTH_TOKEN) is required when binding to a non‑loopback address. The token is compared in constant time.
Q: How do I enable tag‑based search?
A: Use the search_notes tool with tag:<tag> syntax, e.g., project AND tag:work.
Q: What if I want to delete all trashed notes?
A: Call empty_trash – it defaults to a dry‑run preview; set dry_run=false and confirm=true to execute.
Q: Where can I find the full list of tools? A: See the "Available Tools" table in the README; every tool follows the MCP spec with clearly documented parameters.

A lightweight MCP server that integrates Simplenote with Claude Desktop using the MCP Python SDK.
This allows Claude Desktop to interact with your Simplenote notes as a memory backend or content source.
30 Tools — Full Bear Parity + Simplenote Differentiators + Claude Companion Tools + Vault Encryption
Vault — opt-in client-side note encryption: Simplenote has no encryption at rest. create_note/update_note now accept encrypt: true, and encrypt_note/decrypt_note convert existing notes — bodies become AES-256-GCM ciphertext before they ever reach Simplenote's API. See docs/security/encryption-design.md.
MCP Resources and Prompts hardened for the working-memory companion use case:
list_resources/read_resource were silently dropping tag/date/pagination metadata via non-schema fields — now attached through the MCP spec's _meta extension field, the correct mechanism.session-handoff MCP Prompt: scaffolds the Session Continuity workflow (get_or_create_note + add_text with a Status:/Next:/Blockers: format) for cross-session context handoff.Irreversible-deletion tools with mandatory safety guards:
permanent_delete_note: Permanently destroy a single note; requires confirm=true; dry-run preview by defaultempty_trash: Permanently delete all trashed notes; defaults to dry_run=true (preview); requires dry_run=false AND confirm=trueSee the CHANGELOG and ROADMAP.md for complete details.
search_notes async fix: Boolean AND queries no longer hang the server; search now runs in a thread-pool executor with a 30 s timeoutpublish_note: Publish a note to a public URL — unique to Simplenote MCP; returns public_urlunpublish_note: Remove a note from public access; no-op if already unpublishedSee the CHANGELOG for complete details.
The fastest way to get started is using our pre-built Docker image:
# Pull and run the latest image
docker run -d \
--name simplenote-mcp \
-e SIMPLENOTE_EMAIL=your.email@example.com \
-e SIMPLENOTE_PASSWORD=your-password \
-e MCP_TRANSPORT=http \
-e MCP_HTTP_HOST=0.0.0.0 \
-e MCP_HTTP_AUTH_TOKEN=your-random-secret-token \
-p 8000:8000 \
docdyhr/simplenote-mcp-server:latest
MCP_HTTP_AUTH_TOKEN is required whenever MCP_HTTP_HOST is anything other
than 127.0.0.1/localhost — the server refuses to start otherwise (see the
Security section below). Without MCP_TRANSPORT=http, the server runs over
stdio by default and nothing listens on the published port at all.
Docker Health Checks: health monitoring is a separate HTTP endpoint
from the MCP protocol port above — it's off by default and must be enabled
explicitly with -e ENABLE_HTTP_ENDPOINT=true -p 8080:8080:
http://localhost:8080/healthhttp://localhost:8080/readyhttp://localhost:8080/metrics (Prometheus format)Or use Docker Compose:
# Clone the repository for docker-compose.yml
git clone https://github.com/docdyhr/simplenote-mcp-server.git
cd simplenote-mcp-server
# Set environment variables
export SIMPLENOTE_EMAIL=your.email@example.com
export SIMPLENOTE_PASSWORD=your-password
# Run with Docker Compose
docker-compose up -d
Install automatically via Smithery:
npx -y @smithery/cli install @docdyhr/simplenote-mcp-server --client claude
This method automatically configures Claude Desktop with the MCP server.
git clone https://github.com/docdyhr/simplenote-mcp-server.git
cd simplenote-mcp-server
pip install -e .
simplenote-mcp-server
docs/DOCUMENTATION_GUIDE.md for a curated tour of user, developer, and operations docs plus maintenance checklists.docs/archive/2025/, keeping the repository root focused on active roadmaps and guides.rg "<topic>" docs/ or jump to docs/index.md for the MkDocs-style table of contents.The easiest way to use the server is with our pre-built Docker images:
# Pull the latest image
docker pull docdyhr/simplenote-mcp-server:latest
# Run with Docker (see Quick Start above for the required MCP_HTTP_* env vars)
docker run -d \
-e SIMPLENOTE_EMAIL=your.email@example.com \
-e SIMPLENOTE_PASSWORD=your-password \
-e MCP_TRANSPORT=http \
-e MCP_HTTP_HOST=0.0.0.0 \
-e MCP_HTTP_AUTH_TOKEN=your-random-secret-token \
-p 8000:8000 \
docdyhr/simplenote-mcp-server:latest
# Or use Docker Compose (set MCP_HTTP_AUTH_TOKEN in your environment/.env first)
docker-compose up -d
Available tags:
latest - Latest stable releasev1.17.0 - Specific versionmain - Latest development build# Build and run the production container
docker-compose up -d
# Or build manually
docker build -t simplenote-mcp-server .
docker run -d \
-e SIMPLENOTE_EMAIL=your.email@example.com \
-e SIMPLENOTE_PASSWORD=your-password \
-e MCP_TRANSPORT=http \
-e MCP_HTTP_HOST=0.0.0.0 \
-e MCP_HTTP_AUTH_TOKEN=your-random-secret-token \
-p 8000:8000 \
simplenote-mcp-server
# Use the development compose file for live code mounting
docker-compose -f docker-compose.dev.yml up
linux/amd64 and linux/arm64Deploy to Kubernetes with our production-ready Helm chart:
# Install from local chart
helm install my-simplenote ./helm/simplenote-mcp-server \
--set simplenote.email="your-email@example.com" \
--set simplenote.password="your-password"
# Or with external secrets (recommended for production)
helm install my-simplenote ./helm/simplenote-mcp-server \
--set externalSecrets.enabled=true \
--set externalSecrets.secretStore.name="vault-backend"
# values.yaml for production
replicaCount: 3
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 500m
memory: 256Mi
| Variable | Required | Default | Description |
|---|---|---|---|
SIMPLENOTE_EMAIL |
Yes | - | Your Simplenote account email |
SIMPLENOTE_PASSWORD |
Yes | - | Your Simplenote account password |
SYNC_INTERVAL_SECONDS |
No | 120 | Cache synchronization interval in seconds |
CACHE_MAX_SIZE |
No | 10000 | Max notes held in memory — set ≥ your total note count |
LOG_LEVEL |
No | INFO | Logging level (DEBUG, INFO, WARNING, ERROR) |
SIMPLENOTE_OFFLINE_MODE |
No | false | Skip API calls; used for testing without credentials |
MCP_TRANSPORT |
No | stdio | stdio or http — the MCP protocol transport |
MCP_HTTP_HOST |
No | 127.0.0.1 | Bind host when MCP_TRANSPORT=http |
MCP_HTTP_AUTH_TOKEN |
Conditional | - | Bearer token; required if MCP_HTTP_HOST is non-loopback |
MCP_HTTP_ALLOWED_HOSTS |
No | - | Comma-separated allowlist for DNS-rebinding protection |
MCP_HTTP_ALLOWED_ORIGINS |
No | - | Comma-separated Origin allowlist (used with the above) |
ENABLE_HTTP_ENDPOINT |
No | false | Enable the separate /health, /ready, /metrics server |
HTTP_PORT |
No | 8080 | Port for the monitoring endpoint above |
Add to your claude_desktop_config.json:
{
"mcpServers": {
"simplenote": {
"description": "Access and manage your Simplenote notes",
"command": "simplenote-mcp-server",
"env": {
"SIMPLENOTE_EMAIL": "your.email@example.com",
"SIMPLENOTE_PASSWORD": "your-password",
"CACHE_MAX_SIZE": "10000"
}
}
}
}
Powerful search with boolean logic and filters:
# Boolean operators
project AND meeting AND NOT cancelled
# Phrase matching
"action items" AND project
# Tag filtering
meeting tag:work tag:important
# Date ranges
project from:2023-01-01 to:2023-12-31
# Combined query
"status update" AND project tag:work from:2023-01-01 NOT cancelled
| Tool | Description | Parameters |
|---|---|---|
create_note |
Create a new note | content, tags (optional) |
update_note |
Replace full note content (destructive) | note_id, content, tags (optional) |
delete_note |
Soft-delete: move note to Trash | note_id |
restore_note |
Untrash a note — move it back from Trash | note_id |
permanent_delete_note |
Irreversibly destroy a single note (requires confirm=true) |
note_id, confirm |
empty_trash |
Permanently delete all trashed notes (dry-run by default) | dry_run (default true), confirm (default false) |
get_note |
Get a note by ID with full content and metadata | note_id |
add_text |
Append or prepend text without overwriting | note_id, text, position ("end" | "beginning") |
search_notes |
Full-text search with filters and pagination | query, limit, offset, tags, from_date, to_date, created_after, modified_after, pinned, fuzzy, sort_by |
add_tags |
Add tags to a note | note_id, tags |
remove_tags |
Remove specific tags from a note | note_id, tags |
replace_tags |
Replace all tags on a note | note_id, tags |
list_tags |
List all tags with note counts | sort_by ("alpha" | "count") |
rename_tag |
Rename a tag across all notes atomically | old_tag, new_tag, dry_run (optional) |
get_note_versions |
List version history for a note | note_id |
restore_version |
Roll back a note to a previous version | note_id, version_number |
get_or_create_note |
Atomic find-or-create by title | title, tags (optional), default_content (optional) |
append_to_daily_note |
Append a timestamped entry to today's note | text, tags (optional) |
replace_section |
Replace one Markdown section without touching others | note_id, header, content |
find_untagged_notes |
Find notes with no tags | limit (optional) |
bulk_tag |
Apply tags to multiple notes in one call | note_ids, tags |
export_notes |
Export notes to Markdown or JSON | format, tags (optional), query (optional) |
find_and_merge_duplicates |
Detect and merge duplicate notes | dry_run (optional), similarity_threshold (optional) |
get_server_info |
Server version, author, and runtime debug info | (no parameters) |
Critical Bug Fix:
anyio.BrokenResourceError during shutdownCode Refactoring - Phase 1 Complete:
REFACTORING_PHASE1_COMPLETE.md for detailsDocumentation Enhancements:
CHANGELOG.md with complete version historyTESTING_CLAUDE_DESKTOP.md for user testing guidecheck_complexity.py)Quality Tools:
Test Suite Stabilization:
CI/CD Pipeline Optimization:
Code Quality Improvements:
Improved Testing:
Enhanced Documentation:
Container Improvements:
/health, /ready, /metrics)Status: ✅ WORKING - Complete mcp-evals integration with TypeScript wrapper!
This project includes comprehensive evaluations using mcp-evals to ensure reliability and performance:
# Setup evaluation environment
npm install
npm run validate:evals
# Run evaluation suites
npm run eval:smoke # Quick smoke tests (2-3 minutes) ✅ VERIFIED
npm run eval:basic # Standard evaluations (5-10 minutes)
npm run eval:comprehensive # Full evaluation suite (15-30 minutes)
Latest Test Results: 4/5 tests passing excellently (avg 4.1/5):
Evaluations run automatically on:
The evaluations use OpenAI's GPT models to assess:
📁 See evals/README.md for detailed evaluation documentation.
# Python unit tests
pytest
# Code quality checks
ruff check .
mypy simplenote_mcp
MCP_TRANSPORT=http
refuses to start on any non-loopback MCP_HTTP_HOST unless
MCP_HTTP_AUTH_TOKEN is set (a shared bearer secret, checked via
constant-time comparison). Loopback binds (127.0.0.1/localhost) work
without a token, matching stdio's local-process trust level. Set
MCP_HTTP_ALLOWED_HOSTS/MCP_HTTP_ALLOWED_ORIGINS (comma-separated) to
enable DNS-rebinding protection for non-loopback binds. This is intended
for private networks (behind a VPN/Tailscale/SSH tunnel) — a static
shared token has none of OAuth's revocation/audit/expiry properties, so
avoid exposing it directly to the public internet even with a token set.Authentication Problems:
SIMPLENOTE_EMAIL and SIMPLENOTE_PASSWORD are set correctlyDocker Issues:
# Check container logs
docker-compose logs
# Restart services
docker-compose restart
# Rebuild if needed
docker-compose up --build
Claude Desktop Connection:
# Verify tools are available
./simplenote_mcp/scripts/verify_tools.sh
# Monitor logs
./simplenote_mcp/scripts/watch_logs.sh
# Test connectivity
python simplenote_mcp/tests/test_mcp_client.py
# Check server status
./simplenote_mcp/scripts/check_server_pid.sh
# Clean up and restart
./simplenote_mcp/scripts/cleanup_servers.sh
# One-command setup including evaluations
./setup-dev-env-with-evals.sh
# Or manual setup
git clone https://github.com/docdyhr/simplenote-mcp-server.git
cd simplenote-mcp-server
pip install -e ".[dev,test]"
npm install # For mcp-evals
# Run the server
python simplenote_mcp_server.py
# Run Python tests
pytest
# Run mcp-evals
npm run eval:smoke # Quick validation
npm run eval:basic # Standard tests
npm run eval:all # Full test suite
# Code quality
ruff check .
ruff format .
mypy simplenote_mcp
The setup script creates:
Due to potential permission issues with tsx, we recommend running MCP evaluations in Docker:
# Run smoke tests
./scripts/run-evals-docker.sh smoke
# Run basic evaluations
./scripts/run-evals-docker.sh basic
# Run comprehensive evaluations
./scripts/run-evals-docker.sh comprehensive
# Run all evaluations
./scripts/run-evals-docker.sh all
npm run eval:smoke
npm run eval:basic
npm run eval:comprehensive
npm run eval:all
# Development with live code reload
docker-compose -f docker-compose.dev.yml up
# Build and test
docker build -t simplenote-mcp-server:test .
docker run --rm simplenote-mcp-server:test --help
Contributions are welcome! Please read CONTRIBUTING.md for guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
If you find this project helpful, please consider giving it a star on GitHub! Your support helps:
⭐ Star this repository — it takes just one click and means a lot!
Please log in to share your review and rating for this MCP.
Explore related MCPs that share similar capabilities and solve comparable challenges
by modelcontextprotocol
A basic implementation of persistent memory using a local knowledge graph. This lets Claude remember information about the user across chats.
by topoteretes
Provides dynamic memory for AI agents through modular ECL (Extract, Cognify, Load) pipelines, enabling seamless integration with graph and vector stores using minimal code.
by basicmachines-co
Enables persistent, local‑first knowledge management by allowing LLMs to read and write Markdown files during natural conversations, building a traversable knowledge graph that stays under the user’s control.
by agentset-ai
Provides an open‑source platform to build, evaluate, and ship production‑ready retrieval‑augmented generation (RAG) and agentic applications, offering end‑to‑end tooling from ingestion to hosting.
by smithery-ai
Provides read and search capabilities for Markdown notes in an Obsidian vault for Claude Desktop and other MCP clients.
by chatmcp
Summarize chat messages by querying a local chat database and returning concise overviews.
by dmayboroda
Provides on‑premises conversational retrieval‑augmented generation (RAG) with configurable Docker containers, supporting fully local execution, ChatGPT‑based custom GPTs, and Anthropic Claude integration.
by qdrant
Provides a Model Context Protocol server that stores and retrieves semantic memories using Qdrant vector search, acting as a semantic memory layer.
by doobidoo
Provides a universal memory service with semantic search, intelligent memory triggers, OAuth‑enabled team collaboration, and multi‑client support for Claude Desktop, Claude Code, VS Code, Cursor and over a dozen AI applications.
{
"mcpServers": {
"simplenote": {
"command": "npx",
"args": [
"-y",
"simplenote-mcp-server"
],
"env": {
"SIMPLENOTE_EMAIL": "<YOUR_EMAIL>",
"SIMPLENOTE_PASSWORD": "<YOUR_PASSWORD>",
"MCP_TRANSPORT": "http",
"MCP_HTTP_HOST": "0.0.0.0",
"MCP_HTTP_AUTH_TOKEN": "<YOUR_AUTH_TOKEN>"
}
}
}
}claude mcp add simplenote npx -y simplenote-mcp-server