Anchor MCP
Anchor MCP
Implementierungsplan für einen kleinen MCP-Sidecar, der sichere Anchor-Notes-Tools über einen Tunnel-Client, der im selben Docker-Compose-Stack wie Anchor läuft, für ChatGPT bereitstellt.
Forschungsbasis: Upstream-Repository ZhFahim/anchor von Anchor, Standard-Branch main, geprüft am 20.08.2026. Anchor ist ein Nest.js-Backend mit authentifizierten REST-Endpunkten unter /api/*.
Ziel
Einen MCP-Server neben Anchor betreiben, damit externe Assistenten Anchor-Notizen auflisten, durchsuchen, lesen, erstellen, aktualisieren, importieren und Dateien anhängen können, ohne die Anchor-Datenbank oder die private API direkt offenzulegen.
Related MCP server: NotesBridge
Aktueller Stand
Der erste Meilenstein ist umgesetzt:
Streambarer HTTP-MCP-Endpunkt unter
POST /mcp.Health-Endpunkt unter
GET /healthz.Schreibgeschützte Anchor-Tools:
anchor_list_notes,anchor_search_notes,anchor_get_note,anchor_list_tags,anchor_list_attachments.Optionaler MCP-Bearer-Schutz mit
ANCHOR_MCP_TOKEN.Anchor-API-Aufrufe verwenden
ANCHOR_TOKENundANCHOR_BASE_URL.Dockerfile ist enthalten.
Schreib-Tools sind bewusst noch nicht implementiert.
Entwicklung
Unter NixOS nix-shell für Node/npm-Befehle verwenden:
nix-shell -p nodejs --run 'npm install'
nix-shell -p nodejs --run 'npm run typecheck'
nix-shell -p nodejs --run 'npm run build'Lokal ausführen:
ANCHOR_BASE_URL=https://anchor.cri.su \
ANCHOR_TOKEN=... \
ANCHOR_MCP_TOKEN=... \
nix-shell -p nodejs --run 'npm run dev'Der MCP-Endpunkt ist http://localhost:8000/mcp. Wenn ANCHOR_MCP_TOKEN gesetzt ist, müssen Aufrufer Authorization: Bearer <token> senden.
Bereitstellungsmodell
Der vorgesehene Stack umfasst drei Dienste:
services:
anchor:
# Existing Anchor service.
anchor-mcp:
build: /path/to/anchor-mcp
environment:
ANCHOR_BASE_URL: http://anchor:3000
ANCHOR_TOKEN: ${ANCHOR_TOKEN}
ANCHOR_MCP_TOKEN: ${ANCHOR_MCP_TOKEN}
expose:
- "8000"
depends_on:
- anchor
chatgpt-tunnel-client:
# Outbound tunnel client.
environment:
MCP_TARGET_URL: http://anchor-mcp:8000/mcp
MCP_TARGET_TOKEN: ${ANCHOR_MCP_TOKEN}
depends_on:
- anchor-mcpDer MCP-Server sollte nur im Docker-Netzwerk erreichbar sein. Der Tunnel-Client ist die einzige externe Brücke.
Bestätigte Anchor-API-Oberfläche
Alle unten aufgeführten Endpunkte sind durch den AuthGuard von Anchor geschützt und erwarten Authorization: Bearer <token>. Der Guard akzeptiert Anchor-Tokens, die zu einem aktiven Benutzer aufgelöst werden.
Notizen:
POST /api/notesGET /api/notes?search=<query>&tagId=<tagId>&limit=<limit>GET /api/notes/:idPATCH /api/notes/:idDELETE /api/notes/:idDELETE /api/notes/:id/permanentPATCH /api/notes/:id/restoreGET /api/notes/trashGET /api/notes/archivePOST /api/notes/bulk/deletePOST /api/notes/bulk/archivePOST /api/notes/bulk/pinPOST /api/notes/bulk/tags
Tags:
POST /api/tagsGET /api/tagsGET /api/tags/:idGET /api/tags/:id/notesPATCH /api/tags/:idDELETE /api/tags/:id
Anhänge:
POST /api/notes/:noteId/attachmentsGET /api/notes/:noteId/attachmentsGET /api/notes/:noteId/attachments/:idDELETE /api/notes/:noteId/attachments/:idPATCH /api/notes/:noteId/attachments/reorder
Import/Export:
POST /api/import/notesPOST /api/import/notes/:noteId/attachmentsGET /api/export
Sync-API:
POST /api/syncGET /api/sync/eventsals Server-Sent Events
Freigabe:
POST /api/notes/:id/sharesGET /api/notes/:id/sharesPATCH /api/notes/:id/shares/:shareIdDELETE /api/notes/:id/shares/:shareId
Der MCP-Server sollte mit den normalen Notizen-/Tags-/Anhänge-/Import-Endpunkten starten. Die Sync-API ist für konfliktbewusste Offline-Clients nützlich, aber ein MCP-Sidecar kann sie zunächst auslassen.
Datenstrukturen
Body zum Erstellen einer Notiz:
{
"title": "string",
"content": "optional string",
"isPinned": false,
"isArchived": false,
"background": "optional string",
"tagIds": ["tag-id"]
}Der Body zum Aktualisieren einer Notiz ist ein partieller Create-Body plus optionaler optimistischer Sperre:
{
"title": "optional string",
"content": "optional string",
"isPinned": false,
"isArchived": false,
"background": "optional string",
"tagIds": ["tag-id"],
"baseVersion": 1
}Anchor gibt transformierte Notizen mit diesen wichtigen Feldern zurück:
{
"id": "uuid",
"title": "string",
"content": "string or null",
"version": 1,
"isPinned": false,
"isArchived": false,
"background": null,
"state": "active",
"createdAt": "iso timestamp",
"updatedAt": "iso timestamp",
"userId": "uuid",
"tagIds": ["tag-id"],
"permission": "owner",
"attachmentCount": 0,
"imagePreviewIds": []
}Body zum Importieren von Notizen:
{
"notes": [
{
"ref": "external stable reference, max 256 chars",
"id": "optional uuid",
"title": "string",
"content": "stringified Quill Delta JSON",
"isPinned": false,
"isArchived": false,
"isTrashed": false,
"background": "optional background id",
"tagNames": ["tag name"],
"createdAt": "iso timestamp",
"updatedAt": "iso timestamp"
}
],
"tags": [{ "name": "tag", "color": "#8B5CF6" }],
"skipExisting": true
}Struktur des Importergebnisses:
{
"results": [
{
"ref": "external reference",
"status": "created | skipped | remapped | failed",
"noteId": "uuid",
"warning": "optional string",
"error": "optional string"
}
],
"tags": { "created": 0, "reused": 0 }
}Strukturen für Anhänge-Uploads:
Normaler Notiz-Upload: Multipart-Feld
fileanPOST /api/notes/:noteId/attachments.Import-Anhänge-Upload: Multipart-Feld
fileplus FormularfeldpositionanPOST /api/import/notes/:noteId/attachments.Die Anhänge-Antwort enthält
id,noteId,type,originalFilename,mimeType,fileSize,position,uploadedByUserIdundcreatedAt.
Grenzen und Validierung
Grenze für Notizliste:
GET /api/notesbegrenztlimitauf1..200.
Bulk-Grenzen:
noteIds: maximal 200.tagIds: maximal 50.
Import-Grenzen:
Notizen pro Batch: 50.
Länge des stringifizierten Delta-Inhalts: 1.000.000 Bytes/Zeichen.
Titellänge: 1000.
Tags pro Notiz: 50.
Tags pro Import-Batch: 500.
Tag-Namenslänge: 100.
Anhänge-Grenzen:
Maximale Dateigröße: 50 MB.
Erlaubte Bilder:
image/jpeg,image/png,image/webp,image/gif.Erlaubte Audiodateien:
audio/mpeg,audio/wav,audio/mp4,audio/x-m4a,audio/ogg,audio/aac,audio/webm.PDFs, JSON, ZIP und generisches
application/octet-streamwerden von der aktuellen Quelle abgelehnt.
Von Import erlaubte Hintergrund-IDs:
color_red,color_orange,color_yellow,color_green,color_teal,color_blue,color_dark_blue,color_purple,color_pink,color_brown.pattern_dots,pattern_grid,pattern_lines,pattern_waves,pattern_groceries,pattern_music,pattern_travel,pattern_code.
Inhaltsformat
Anchor speichert den Notiz-content als String. Vorhandene Importarbeit bestätigt, dass dies für Rich-Text-Import stringifiziertes Quill-Delta-JSON sein sollte.
Der MCP-Server sollte Markdown-freundliche Tools bereitstellen und Markdown intern in Quill Delta konvertieren. Er kann später auch native Delta-Tools im Expertenmodus bereitstellen.
Empfohlene Konvertierungsrichtlinie:
anchor_create_noteakzeptiert Markdown, konvertiert in Delta und ruftPOST /api/notesauf.anchor_update_noteakzeptiert Markdown, konvertiert in Delta und ruftPATCH /api/notes/:idmit optionalembaseVersionauf.anchor_import_notesakzeptiert Markdown oder natives Delta und verarbeitet Batches überPOST /api/import/notes.anchor_get_notegibt Rohinhalt plus eine Best-Effort-Text-/Markdown-Projektion für die LLM-Lesbarkeit zurück.
Authentifizierungsmodell
Die Anchor-Quelle verwendet die Extraktion von Bearer-Tokens aus Authorization: Bearer <token>. Der MCP-Sidecar sollte daher zwei Authentifizierungsebenen pflegen:
ANCHOR_TOKEN: Token, dasanchor-mcpbeim Aufruf von Anchor verwendet.ANCHOR_MCP_TOKEN: Token, das vom Tunnel-Client erwartet wird, bevor eine MCP-Anfrage bedient wird.
Der MCP-Server sollte niemals beliebige Aufrufer-Tokens an Anchor weiterleiten.
Quellreferenzen
Primär geprüfte Dateien im Upstream:
server/src/notes/controllers/notes.controller.tsserver/src/notes/controllers/note-attachments.controller.tsserver/src/notes/controllers/note-shares.controller.tsserver/src/tags/tags.controller.tsserver/src/import-export/import.controller.tsserver/src/import-export/export.controller.tsserver/src/sync/sync.controller.tsserver/src/sync/sync-events.controller.tsserver/src/notes/dto/create-note.dto.tsserver/src/notes/dto/update-note.dto.tsserver/src/import-export/dto/import-notes.dto.tsserver/src/import-export/dto/import-attachment.dto.tsserver/src/notes/constants/notes.constants.tsserver/src/import-export/constants/import.constants.tsserver/src/notes/utils/note-transformer.util.tsserver/src/notes/utils/attachment-storage.util.ts
MCP-Tools
Phase-1-Lesetools:
anchor_list_notes(limit, offset)anchor_search_notes(query, limit)anchor_get_note(note_id)anchor_list_tags()anchor_list_attachments(note_id)
Details zu implementierten Tools:
anchor_list_notesunterstütztlimit,offset,include_contentundtag_id. Da Anchor nur limit-basierte Auflistung bereitstellt, mussoffset + limithöchstens 200 betragen.anchor_search_notesunterstütztquery,limit,include_contentundtag_id.anchor_get_noteunterstütztnote_idundinclude_content.anchor_list_tagsnimmt keine Eingaben entgegen.anchor_list_attachmentsgibt nur Metadaten zurück und lädt keine Anhänge-Bytes herunter.
Phase-2-Schreibtools:
anchor_create_note(title, markdown)anchor_update_note(note_id, markdown, base_version)anchor_import_notes(notes)anchor_create_tag(name, color)anchor_upload_attachment(note_id, file, filename, mime_type)
Phase-3-Verwaltungstools:
anchor_archive_notes(note_ids)anchor_pin_notes(note_ids, is_pinned)anchor_add_tags(note_ids, tag_ids)anchor_export(), wenn der Tunnel-Client ein gestreamtes Archiv verarbeiten kann.
Destruktive Tools vermeiden oder absichern:
anchor_delete_note(note_id, confirm)bildet Soft Delete ab und sollteconfirm=trueerfordern.anchor_permanent_delete_note(note_id, confirm)sollte zunächst weggelassen werden.anchor_delete_tag(tag_id, confirm)sollte zunächst weggelassen werden.Kein rohes, beliebiges HTTP-Proxy-Tool bereitstellen.
Sicherheit
ANCHOR_TOKENnur in der Docker-Stack-Umgebung oder.envspeichern; nicht in das Image einbrennen.Ein separates
ANCHOR_MCP_TOKENfür Aufrufe vom Tunnel-Client ananchor-mcphinzufügen.Den MCP-Server nur an das Container-Netzwerk binden; keine Traefik-Labels hinzufügen, außer es ist eine absichtliche Freigabe gewünscht.
Tools eng und typisiert halten. Aufrufern nicht erlauben, beliebige Anchor-API-Pfade zu wählen.
Anfrage-Metadaten protokollieren, nicht Notizinhalt oder Tokens.
Standardmäßig schreibgeschützte Tools verwenden, bis der Tunnel-Authentifizierungspfad verifiziert ist.
Explizites
confirm=truefür Soft-Delete und destruktive Bulk-Aktionen erfordern.Dauerhaftes Löschen verweigern, es sei denn, eine separate Einstellung
ENABLE_DANGEROUS_TOOLS=trueist vorhanden.
Implementierungsphasen
Einen minimalen TypeScript-MCP-HTTP-Server erstellen.
Konfiguration aus der Umgebung hinzufügen:
ANCHOR_BASE_URL,ANCHOR_TOKEN,ANCHOR_MCP_TOKEN, Host/Port binden./healthzfür Docker- und Tunnel-Diagnose implementieren.Einen kleinen Anchor-API-Client mit typisierten Methoden und ohne beliebigen Pfad-Escape-Hatch implementieren.
anchor_list_notes,anchor_search_notes,anchor_get_noteundanchor_list_tagsimplementieren.Antwort-Formung hinzufügen, die schwere Felder entfernt, sofern nicht explizit angefordert.
Hilfsfunktionen und Tests für die Markdown-zu-Delta-Konvertierung implementieren.
Erstellen/Aktualisieren mit optionaler optimistischer Sperre über
baseVersionimplementieren.Import-Batching mit den bekannten Import-Grenzen implementieren.
Anhänge-Upload nur für erlaubte Bilder/Audiodateien implementieren.
Dockerfile und Compose-Beispiel inklusive Tunnel-Client-Platzhalter hinzufügen.
Tests mit gemockten Anchor-Antworten und Validierungsfehlern hinzufügen.
Betriebsdokumentation für Token-Rotation und Anbindung des ChatGPT-Tunnel-Clients hinzufügen.
Offene Fragen
Genaues Tunnel-Client-Image, Umgebungsvariablen und Auth-Header-Format.
Ob Anchor konfiguriert oder gepatcht werden kann, um PDFs und andere Dateitypen zuzulassen.
Ob Notizinhalt als Markdown akzeptiert und in Quill Delta konvertiert werden soll, oder ob der MCP Anchors natives Inhaltsformat direkt bereitstellen soll.
Ob der Tunnel-Client binäre Nutzlasten gut genug für Anhänge-Upload und Export-Download durchreichen kann.
Ob
offsetclientseitig simuliert werden sollte, daGET /api/notesnurlimit, aber keine Offset-Paginierung bereitstellt.
Empfohlener erster Meilenstein
Einen schreibgeschützten MCP-Server mit anchor_list_notes, anchor_search_notes, anchor_get_note und anchor_list_tags erstellen. Privat im Anchor-Stack hinter dem Tunnel-Client bereitstellen. Erstellen/Aktualisieren/Import erst hinzufügen, nachdem der Lesepfad und das Authentifizierungsmodell verifiziert sind.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.01MIT
- AlicenseNot gradedqualityAmaintenanceMCP server enabling ChatGPT to search, read, and write Apple Notes via a local Mac agent with a privacy-preserving relay.MIT
- AlicenseNot gradedqualityAmaintenanceA secure multi-tenant MCP proxy that exposes 81 tools for full CRUD, search, chat, podcast, and command management on the OpenNotebook API, enabling natural language interaction with notebooks, notes, sources, and more.GPL 3.0
- AlicenseNot gradedqualityBmaintenanceSelf-hosted MCP server for private Obsidian vaults on GitHub, exposing tools to search, read, write, and analyze Markdown notes and their link graph.MIT
Related MCP Connectors
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/llego/anchor-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server