neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
simplenote-mcp-server는 Claude Desktop과 연동되는 Simplenote용 MCP 서버이다
MCP Server for Simplenote integration with Claude Desktop
개발 도구Python · ShellGitHub @docdyhr직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
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 EncryptionREADME 전문 보기 ↗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 [email protected] \
-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 -e HTTP_HOST=0.0.0.0 -p 8080:8080
(Docker's -p mapping forwards to the container's network interface, not its
loopback, so HTTP_HOST must be 0.0.0.0 for the published port to actually
reach it — the 127.0.0.1 default only works if you're calling these
endpoints from another process inside the same container):
http://localhost:8080/healthhttp://localhost:8080/readyhttp://localhost:8080/metrics (Prometheus format)The server refuses to start if HTTP_HOST is non-loopback and no
HTTP_ENDPOINT_AUTH_TOKEN is set, since these endpoints would otherwise be
reachable by anyone who can reach the port. Set a bearer token (checked via
Authorization: Bearer <token>, same mechanism as MCP_HTTP_AUTH_TOKEN
above) if you need a non-loopback bind — loopback callers are always
trusted regardless, so this never breaks a local health check. Prefer
keeping it loopback-only and publishing with -p 127.0.0.1:8080:8080
instead of -p 8080:8080 when you can.
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 [email protected]
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 [email protected] \
-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.18.4 - 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 [email protected] \
-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="[email protected]" \
--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_HOST | No | 127.0.0.1 | Bind host for the monitoring endpoint above |
HTTP_PORT | No | 8080 | Port for the monitoring endpoint above |
HTTP_ENDPOINT_AUTH_TOKEN | Conditional | - | Bearer token; required if is non-loopback |
Add to your claude_desktop_config.json:
{
"mcpServers": {
"simplenote": {
"description": "Access and manage your Simplenote notes",
"command": "simplenote-mcp-server",
"env": {
"SIMPLENOTE_EMAIL": "[email protected]",
"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 |
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!
HTTP_HOST| 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) |