Waggle-mcp
Warum waggle-mcp?
Die meisten LLMs vergessen alles, sobald das Gespräch endet.
waggle-mcp behebt dies, indem es Ihrer KI einen persistenten Wissensgraphen gibt, den sie über jeden MCP-kompatiblen Client lesen und beschreiben kann.
Waggles Hauptvorteil ist die Token-Effizienz bei strukturiertem Kontext:
Ohne waggle-mcp | Mit waggle-mcp |
Kontext in einen 200k-Token-Prompt gestopft | ~4× weniger Token — kompakter Teilgraph, nur relevante Knoten werden abgerufen |
"Was haben wir bezüglich des DB-Schemas entschieden?" → ❌ Verloren, als die Sitzung endete | ✅ Ruft den Entscheidungsknoten ab, wann er getroffen wurde und was er widerspricht |
Flache Aufzählungsliste als Speicher | Typisierte Kanten: |
Eine Sitzung, ein Agent | Multi-Mandanten, Multi-Sitzung, Multi-Agent |
Hinweis zum Abruf: Waggle tauscht etwas rohe Abrufabdeckung gegen dramatisch niedrigere Token-Kosten und reicheren relationalen Kontext ein. Siehe den Benchmark-Abschnitt für ehrliche Zahlen.
Schnellstart — 30 Sekunden
pip install waggle-mcp
waggle-mcp initDer init-Assistent erkennt Ihren MCP-Client, schreibt dessen Konfigurationsdatei und erstellt das Datenbankverzeichnis — keine JSON-Bearbeitung erforderlich. Unterstützt Claude Desktop, Cursor, Codex und einen generischen JSON-Fallback.
Starten Sie nach der Initialisierung Ihren MCP-Client neu, und Ihre KI verfügt über einen persistenten Speicher. Kein Cloud-Dienst. Kein API-Schlüssel. Die semantische Suche läuft vollständig lokal.
In Aktion sehen
Hier ist ein konkretes Vorher/Nachher für einen Entwickler, der die KI täglich nutzt:
Sitzung 1 — 10. April
User: Let's use PostgreSQL. MySQL replication has been painful.
Agent: [calls observe_conversation()]
→ stores decision node: "Chose PostgreSQL over MySQL"
→ stores reason node: "MySQL replication painful"
→ links them with a depends_on edgeSitzung 2 — 12. April (frisches Kontextfenster, keine Historie)
User: What did we decide about the database?
Agent: [calls query_graph("database decision")]
→ retrieves the decision node + linked reason from April 10
"You decided on PostgreSQL on April 10. The reason recorded was
that MySQL replication had been painful."Sitzung 3 — 14. April
User: Actually, let's reconsider — the team is more familiar with MySQL.
Agent: [calls store_node() + store_edge(new_node → old_node, "contradicts")]
→ conflict is flagged automatically; both positions are preserved in the graphDer Agent benötigte nie explizite Anweisungen zum Merken oder Abrufen — er rief die richtigen Tools basierend auf dem Gespräch auf, und der Graph lieferte ihm den richtigen Kontext.
Funktionsweise
Speicher wird nicht einfach nur gespeichert — er durchläuft einen Lebenszyklus:
You talk to your AI
│
▼
observe_conversation() ← AI drops the turn in; facts extracted via structured LLM (regex fallback)
│
▼
Graph nodes are created ← "Chose PostgreSQL" becomes a decision node
Edges are inferred ← linked to the "database" entity node
│
▼
Future conversation starts
│
▼
query_graph("DB schema") ← semantic search finds the node from 3 sessions ago
│
▼
AI answers with full context ← "You decided on PostgreSQL on Apr 10, here's why…"Jeder Knoten trägt semantische Einbettungen, die lokal mit all-MiniLM-L6-v2 berechnet werden — einem schnellen, leichtgewichtigen Modell, das vollständig auf dem Gerät läuft, ohne dass ein API-Schlüssel oder Netzwerkaufruf erforderlich ist. Das bedeutet, die semantische Suche funktioniert offline, kostet pro Abfrage nichts und hält Ihre Daten privat.
Das magische Tool: observe_conversation
Dies ist das Tool, das Sie am häufigsten verwenden werden. Sie müssen Fakten nicht manuell speichern — weisen Sie den Agenten einfach an, jeden Gesprächsverlauf zu beobachten, und er erledigt den Rest.
observe_conversation(user_message, assistant_response)Unter der Haube:
Extrahiert atomare Fakten aus beiden Seiten des Gesprächs
Entfernt Duplikate gegenüber bestehenden Knoten mittels semantischer Ähnlichkeit
Erstellt typisierte Kanten zwischen verwandten Konzepten
Markiert Widersprüche zu bestehenden gespeicherten Überzeugungen
Keine Anweisungen erforderlich. Kein Schema zu definieren. Einfach beobachten.
Unter der Haube führt jeder Aufruf einen Pydantic-validierten LLM-Extraktionsdurchlauf (mit einem Regex-Fallback) aus, um strukturierte Fakten aus unordentlichen Dialogen zu ziehen.
Beispiel: "Lass uns PostgreSQL verwenden, weil MySQL-Replikation zu schmerzhaft ist."
{
"facts": [
{
"label": "PostgreSQL for generic events",
"content": "Chose PostgreSQL over MySQL because MySQL replication is too painful.",
"node_type": "decision",
"confidence": 0.95,
"tags": ["llm-extracted", "confidence:0.95"]
}
]
}Jede Extraktion mit confidence < 0.5 oder einem ungültigen Schema wird stillschweigend verworfen, um Halluzinationsrauschen zu vermeiden.
Speichermodell
Knotentypen — was gespeichert wird:
Typ | Beispiel |
| "Die API verwendet JWT-Token" |
| "Benutzer bevorzugt Dark Mode" |
| "Entscheidung für PostgreSQL statt MySQL" |
| "Projekt: waggle-mcp" |
| "Ratenbegrenzung" |
| "Sollen wir GraphQL hinzufügen?" |
| "TODO: Integrationstests hinzufügen" |
Kantentypen — wie Knoten verbunden sind:
relates_to · contradicts · depends_on · part_of · updates · derived_from · similar_to
MCP-Tools
Ihre KI ruft diese direkt auf — Sie müssen sie nicht manuell verwenden.
Tool | Was es tut |
| Einen Gesprächsverlauf einfügen — Fakten werden extrahiert, gespeichert und verknüpft |
| Semantische + zeitliche Suche im Graphen |
| Manuelles Speichern eines Fakts, einer Präferenz, Entscheidung oder Notiz |
| Verknüpfen zweier Knoten mit einer typisierten Beziehung |
| Durchlaufen von Kanten von einem bestimmten Knoten aus |
| Aktualisieren von Inhalten oder Tags eines bestehenden Knotens |
| Entfernen eines Knotens und aller seiner Kanten |
| Automatisches Zerlegen langer Inhalte in atomare Knoten |
| Sehen, was sich in den letzten N Stunden geändert hat |
| Generieren eines kompakten Briefings für ein neues Gespräch |
| Erkennen von Themenclustern mittels Community-Erkennung |
| Knoten-/Kantenanzahl und am stärksten verbundene Knoten |
| Interaktive Browser-Visualisierung |
| Portables JSON-Backup |
| Wiederherstellung aus einem JSON-Backup |
Performance & Benchmarking
Alle unten stehenden Zahlen sind reproduzierbar anhand der eingecheckten Fixtures in benchmarks/fixtures/ unter Verwendung des Harness unter scripts/benchmark_extraction.py. Gespeicherte Ausgabe-Artefakte befinden sich in tests/artifacts/.
Ein Befehl erzeugt alle unten stehenden Tabellen (Extraktions-Regex-Baseline, Abruf, Deduplizierung und der Pilot zur vergleichenden Token-Effizienz):
PYTHONPATH=src .venv/bin/python scripts/benchmark_extraction.py \
--extraction-backend regex \
--systems waggle rag_naive \
--output tests/artifacts/benchmark_current.jsonDie LLM-Extraktionszeile (75%) erfordert einen separaten Durchlauf mit einer lokalen Ollama-Instanz — sie ist nicht in benchmark_current.json enthalten:
# Requires Ollama running locally with qwen2.5:7b pulled
PYTHONPATH=src .venv/bin/python scripts/benchmark_extraction.py \
--extraction-backend llm --ollama-model qwen2.5:7b --ollama-timeout-seconds 30Extraktionsgenauigkeit
Korpus: 12 Dialogpaare, die einfache Erinnerung, Unterbrechungen, Umkehrungen, vage Aussagen und widersprüchliche Signale abdecken (benchmarks/fixtures/extraction_cases.json).
Backend | Fälle | Genauigkeit |
Regex (Fallback) | 12 | 33% |
LLM ( | 12 | 75% |
Abrufgenauigkeit
Korpus: 18 Knoten, 18 Abfragen — 6 einfach (direkte Paraphrasierung) und 12 schwer (adversariell: semantische Verallgemeinerung, zeitliche Disambiguierung, indirekte Domänenübersetzung, Privatsphäre-Framing). Quelle: benchmarks/fixtures/retrieval_cases.json.
Schwierigkeit | Abfragen | Hit@k |
Einfach | 6 | 6/6 = 100% |
Schwer (adversariell) | 12 | 9/12 = 75% |
Gesamt | 18 | 15/18 = 83% |
Token-Effizienz vs. naive gechunkte Vektor-RAG
Die obige Tabelle zur Abrufgenauigkeit misst die eigenständige Suchqualität von Waggle. Der Vergleich unten verwendet einen separaten Multi-Sitzungs-Korpus, der darauf ausgelegt ist, die Token-Effizienz gegenüber einer gechunkten Vektor-Baseline zu testen.
Korpus: 24 Multi-Sitzungs-Szenarien, 66 Abruf-Abfragen über 7 Aufgabenfamilien (benchmarks/fixtures/comparative_eval.json).
Aufgabenfamilie | Abfragen | Waggle Hit@k | RAG Hit@k |
| 18 | 18/18 = 100% | 100% |
| 19 | 17/19 = 89% | 100% |
| 11 | 10/11 = 91% | 100% |
| 8 | 8/8 = 100% | 100% |
| 4 (kleines n) | 4/4 = 100% | 100% |
| 4 (kleines n) | 2/4 = 50% | 100% |
| 2 (kleines n) | 1/2 = 50% | 100% |
Gesamt | 66 | 60/66 = 91% | 100% |
System | Mittlere Token | Median Token | p95 Token | Hit@k | Exakte Unterstützung |
Waggle | 36.9 | 37.0 | 42.0 | 91% | 74% |
Naive gechunkte Vektor-RAG | 152.8 | 155.0 | 162.8 | 100% | 100% |
Waggle verwendet ~4× weniger Token pro Abruf als die naive gechunkte Baseline in diesem Korpus.
Die Lücke zwischen Waggles Hit@k (91%) und der exakten Unterstützung (74%) zeigt, dass der Graph-Abruf das richtige Thema findet, aber manchmal unzureichende unterstützende Details zurückgibt — am deutlichsten bei cross_scenario_synthesis-Abfragen (8/8 Treffer, 1/8 exakt). Die Verbesserung der Kontextzusammenstellung — insbesondere die Kantendurchlauf-Tiefe und die Multi-Hop-Teilgraphen-Erweiterung — ist ein verfolgter nächster Schritt.
Der Kompromiss ist ehrlich: Die gechunkte Baseline erreicht 100% Hit@k in diesem Korpus, da bei top_k=5 jeder Fakt aus seinem eigenen Sitzungs-Chunk abrufbar ist. Der Vorteil der Token-Effizienz ist real und reproduzierbar; der Anspruch auf Überlegenheit beim Abruf erfordert einen Korpus, bei dem die Chunk-Abdeckung nicht für fehlenden relationalen Kontext kompensieren kann. Die Korpus-Härtung läuft.
Wenn die Extraktion fehlschlägt
Benutzer: "Ja, lass uns einfach das Ding machen, über das wir gesprochen haben."
Das LLM weist mehrdeutigen Eingaben ein geringes Vertrauen (confidence < 0.5) zu; Waggle verwirft die Extraktion stillschweigend, anstatt eine Vermutung zu speichern. Die Pipeline greift bei einem Timeout nicht stillschweigend auf Regex zurück — Backend-Fehler treten als explizite Fehler auf, die protokolliert werden.
Korpus: 22 Knotenpaare — 11 echte Duplikate (Synonym, Paraphrase, Domänenäquivalenz) und 11 falsche Freunde (gleiche Technologiekategorie, unterschiedliche Technologie). Quelle: benchmarks/fixtures/dedup_cases.json.
Die Pipeline durchläuft fünf Ebenen:
Ebene 0 — Entitätsschlüssel-Hard-Block — wenn beide Knoten unterschiedliche Technologien in der gleichen Kategorie benennen (z.B.
postgresqlvsmysql), wird die Zusammenführung bedingungslos blockiert.Ebene 0b — Numerischer Konfliktschutz — gleiche Entität, aber unterschiedliche kritische Zahlen (z.B.
jwt15 Min vs 1 Std) → blockieren. Schützt davor, unterschiedliche Fakten zusammenzuführen, die eine Technologie teilen, sich aber in einem Schlüsselwert unterscheiden.Ebene 1 — Exakter String-Abgleich — normalisierter Inhalt oder Label-Gleichheit.
Ebene 2 — Teilstring-Enthaltung — ein Satz ist eine strikte Teilmenge des anderen.
Ebene 3 — Semantische Ähnlichkeit — Kosinus via
all-MiniLM-L6-v2:Aggressiver Pfad für gleiche Entitäten: wenn beide auf denselben Entitäts-Token verweisen, Zusammenführung bei Kosinus ≥ 0.60 (erfasst Paraphrasen-Echt-Duplikate wie "fastapi wurde gewählt" / "wir haben fastapi gewählt, weil async")
Typ-bewusster Schwellenwert:
decision/preference→ 0.82;fact→ 0.92;entity→ 0.97Jaccard-verstärkter Pfad: Wortüberschne
Latest Blog Posts
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/Abhigyan-Shekhar/Waggle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server