CAT
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Cross AI Tools

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

Waggle Mcp

abhigyan-shekhar/waggle-mcp
167 toolsSTDIOregistry active
Summary

Waggle gives Claude and other MCP clients a persistent graph memory that survives context windows. It stores decisions, their reasons, and contradictions as typed nodes and edges in SQLite or Neo4j, then retrieves relevant subgraphs on demand. You get three core tools: query_graph for retrieval, observe_conversation to persist turns, and prime_context to hydrate sessions. Setup is one command (waggle-mcp setup --yes) that auto-configures Claude Code, Cursor, and others. Includes local sentence-transformers embeddings with a deterministic fallback, so no API keys required. Ships with Graph Studio for inspection and a demo mode that runs sample queries against a preloaded graph. Built for agents that need to remember what they decided three sessions ago and why.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Tools

Public tool metadata for what this MCP can expose to an agent.

7 tools
searchFind A2A agents by capability or use case using semantic search.10 params

Find A2A agents by capability or use case using semantic search.

Parameters* required
autharray
Filter by auth type (e.g. ["public"])
limitinteger
Max results (1-20, default 10)
querystring
Natural language search query
offsetinteger
Pagination offset (default 0)
providerstring
Fuzzy provider name search
input_modesarray
Filter by input MIME types
capabilitiesarray
Required capabilities (e.g. ["streaming"])
healthy_onlyboolean
Only return currently online agents
output_modesarray
Filter by output MIME types
verified_onlyboolean
Only return verified agents
invokeSend a message to an A2A agent directly (pass-through proxy). Provide either url_hash (from search) or agent_url (direct URL).7 params

Send a message to an A2A agent directly (pass-through proxy). Provide either url_hash (from search) or agent_url (direct URL).

Parameters* required
messagestring
Message to send (max 2000 chars)
task_idstring
Task ID for follow-up or async polling
url_hashstring
Agent URL hash from search results (required if agent_url omitted)
agent_urlstring
Direct agent URL (required if url_hash omitted)
context_idstring
Context ID for agents with server-side history
conversation_idstring
Conversation ID for follow-ups and rating linkage
protocol_versionstring
A2A protocol version (auto-detected if omitted)
pollCheck the status of an async A2A task.5 params

Check the status of an async A2A task.

Parameters* required
task_idstring
Task ID returned by the agent
agent_urlstring
The agent's URL
context_idstring
Context ID for server-side history
conversation_idstring
Conversation ID for tracking
protocol_versionstring
A2A protocol version
infoGet full details about a specific agent — skills, health, ratings, and capabilities.1 params

Get full details about a specific agent — skills, health, ratings, and capabilities.

Parameters* required
url_hashstring
Agent URL hash
registerSubmit a new A2A agent URL for indexing in Waggle.1 params

Submit a new A2A agent URL for indexing in Waggle.

Parameters* required
urlstring
Agent URL to register
check_usageView your current API quota, daily usage, and rate limit status.

View your current API quota, daily usage, and rate limit status.

No parameter schema in public metadata yet.

rate_transactionRate an agent interaction to improve ranking quality.6 params

Rate an agent interaction to improve ranking quality.

Parameters* required
notesstring
Optional feedback (max 500 chars)
qualityinteger
Quality rating 1-5
successboolean
Whether the interaction was successful
url_hashstring
Agent URL hash
rating_idstring
Optional idempotency key
conversation_idstring
Conversation ID from invoke/poll

waggle-mcp

Persistent memory that remembers decisions, reasons, and contradictions across sessions.
Your AI forgets everything when the context window closes. Waggle gives it a graph-backed brain that persists.

Not a code indexer. A conversational memory engine — it stores what you decided, why you decided it, and what changed, so the next session picks up where the last one left off.

PyPI PyPI Downloads Python 3.11+ MCP compatible Apache-2.0 Local embeddings


Core

This repository is the public Waggle product repo: Apache-2.0 licensed, available on GitHub and PyPI, and focused on the local-first memory engine.

Tech Stack

  • Python 3.11+ package built with pyproject.toml
  • MCP server exposed through waggle-mcp
  • SQLite graph storage by default, with an optional Neo4j backend
  • Local sentence-transformers embeddings with a deterministic offline fallback
  • Ruff, mypy, and pytest for linting, type checks, formatting, and tests
  • GitHub Actions for pull request CI/CD checks
  • Vite/React assets for the bundled Graph Studio UI under apps/mcp/graph-ui/

Quick Start

# Install globally (no venv needed)
pipx install waggle-mcp

# One-line setup — detects your MCP clients and writes config
waggle-mcp setup --yes

# Verify everything is healthy
waggle-mcp doctor

(No pipx? Run brew install pipx && pipx ensurepath first.)

setup --yes detects Claude Code, Codex, Cursor, Gemini CLI, and Antigravity, writes the MCP config, and installs automatic memory hooks where supported. Restart your client and you're live.

Windows users: Run all commands with python -X utf8 or set PYTHONUTF8=1 to avoid UnicodeEncodeError from emoji in log output.

Local Development Setup

These steps are intended to work on a clean macOS, Linux, or Windows checkout with Python 3.11+ and Git installed:

For a complete list of supported environment variables and configuration options, see docs/environment-variables.md.

git clone https://github.com/Abhigyan-Shekhar/Waggle-mcp.git
cd Waggle-mcp
python -m venv .venv
source .venv/bin/activate      # macOS/Linux
# .venv\Scripts\activate       # Windows PowerShell
python -m pip install --upgrade pip
pip install -e ".[dev]"
WAGGLE_MODEL=deterministic pytest -q
ruff check src/ tests/
ruff format --check src/ tests/

Use WAGGLE_MODEL=deterministic for local verification so setup does not require downloading the embedding model.

Install Waggle

Waggle is a local MCP server that gives coding agents persistent graph memory.

Recommended:

  • VS Code: install the live Waggle: Local Memory for AI Agents extension from the Marketplace for one-click setup
  • MCP clients: use docs/install and Smithery metadata in smithery.yaml
  • Claude: use docs/install/claude-code.md or docs/install/claude-desktop.md
  • Developers: pipx install waggle-mcp

Benchmark:

  • LongMemEval 500-case retrieval-only: 97.4% R@5, 89.0% Exact@5 for graph_raw retrieval

VS Code extension features:

  • one-click Enable for this Workspace onboarding
  • installs waggle-mcp with consent if it is missing
  • safely creates or updates .vscode/mcp.json
  • preserves existing non-Waggle MCP servers
  • runs waggle-mcp doctor
  • opens Graph Studio
  • exports Waggle memory from the editor

Claude distribution:

  • Claude Code does not use an .mcpb bundle. Users add Waggle directly as an MCP server:
pipx install waggle-mcp
claude mcp add --transport stdio waggle -- waggle-mcp serve --transport stdio
  • Claude Desktop uses the claude-desktop-extension.mcpb bundle, which can be distributed through GitHub Releases.

Manual MCP config:

{
  "mcpServers": {
    "waggle": {
      "command": "waggle-mcp",
      "args": ["serve", "--transport", "stdio"]
    }
  }
}

Enterprise Evaluation

For self-hosted production review and security posture:

  • Production deployment guide
  • Security model
  • Hardening checklist
  • Reference

Contributing & Community

  • Contributing guide
  • Repository map
  • Starter issues
  • Label catalog
  • Contact channel: open a GitHub issue for bugs, feature proposals, and contributor assignment requests. Use SECURITY.md for vulnerability reports.

Contributor layout note:

  • The repo root is reserved for packaging, deployment entrypoints, and external registry manifests. Contributor-facing docs, examples, and utilities should live under docs/, examples/, scripts/, or deploy/.

Maintainer Tip

Repository labels are synced from .github/labels.yml. To preview changes locally:

python3 scripts/sync_github_labels.py --repository Abhigyan-Shekhar/Waggle-mcp --dry-run

60-Second Demo

No MCP client needed. Run this from a fresh install:

waggle-mcp demo

This imports a pre-loaded example graph and runs 4 scripted queries locally — no API key, no network, no client required. Add --with-embeddings to use the real sentence-transformers model for higher-fidelity retrieval (requires ~420 MB download on first run).


Why Waggle

waggle-mcp is a local-first memory layer for MCP-compatible AI clients, built on a persistent knowledge graph.

The core difference from flat note storage or chunked RAG is the graph structure. Waggle doesn't just store facts — it stores the relationships between them: this decision depends on that constraint, this preference contradicts that earlier one, this requirement was updated three sessions ago. When you query, you get a subgraph with the reasoning chain attached, not just the matching text.

Without WaggleWith Waggle
Paste context into every sessionCompact subgraph retrieved at query time
Session-local memory onlyPersistent memory across all sessions
Flat notes, no structureTyped nodes and edges: decisions, reasons, contradictions
"What changed?" requires replaying logsTemporal queries, diffs, and conflict resolution are first-class
Contradictions silently overwrite historyBoth positions preserved, contradiction edge explicit

What Is In Core Today

Waggle Core is the open-source local memory foundation:

  • SQLite-backed graph memory
  • MCP server integration
  • CLI setup and doctor flows
  • local embeddings or deterministic fallback
  • graph querying, observation, and context priming
  • import/export and graph inspection utilities

Product Scope

This public repo is the product-facing Waggle surface:

  • MCP server and tool surface
  • local-first graph memory
  • automatic memory hooks and orchestration
  • .abhi export, import, diff, merge, and checkpoint handoff
  • Graph Studio and admin tooling

Research artifacts, benchmark harnesses, evaluation reports, and paper material now live in the private waggle-pro repo.


Architecture

flowchart TD
    U["User / Developer"] --> C["MCP Client<br/>Claude, Codex, Cursor, Gemini CLI, Antigravity, ChatGPT"]
    C --> S["waggle.server<br/>MCP tool surface"]

    S --> P["Automatic memory policy<br/>prime_context before sessions<br/>query_graph before contextual answers<br/>observe_conversation after durable turns"]

    P --> R["RecursiveContextController<br/>token-budgeted context assembly"]
    R --> HR["Hybrid retrieval<br/>graph + verbatim transcript + recency"]
    HR --> GE["Graph engine"]

    GE --> SQ["MemoryGraph<br/>SQLite local-first store"]
    GE --> N4J["Neo4jMemoryGraph<br/>remote / HTTPS deployment option"]

    SQ --> DM["Graph data model<br/>typed nodes + typed edges"]
    N4J --> DM

    DM --> NT["Nodes<br/>fact, entity, concept,<br/>preference, decision, question, note"]
    DM --> ET["Edges<br/>updates, contradicts, depends_on,<br/>derived_from, relates_to, similar_to"]

    P --> ING["Ingestion pipeline"]
    ING --> VT["Verbatim transcript stored first"]
    VT --> EX["Memory extraction"]
    EX --> INF["Edge inference + evidence records"]
    INF --> DM

    R --> PACK["Compact context pack<br/>ranked subgraph + provenance<br/>conflicts + update chains"]

    DM --> CW["Context windows<br/>session-level memory containers"]
    CW --> XW["Cross-window edges<br/>handoff, overlap, temporal continuity"]

    DM --> ABHI[".abhi portable memory artifact"]
    ABHI --> OPS["commit / pull / diff / merge / fsck / show"]
    ABHI --> HANDOFF["checkpoint handoff<br/>between sessions or machines"]

    S --> GS["Graph Studio / debug tools<br/>retrieval debugger, graph viz,<br/>conflict review, provenance inspection"]

Recursive Context Assembly

Waggle stores memory outside the model context window. Instead of pasting long context into every prompt, agents call build_context to get a compact, high-signal context pack assembled from the graph.

Inspired by Recursive Language Models — the idea of externalising long context into an environment and interacting with it through decomposition and targeted retrieval.

How it works:

  1. Decompose — the query is split into targeted subqueries (decisions, constraints, implementation details, unfinished work, conflicts)
  2. Retrieve — each subquery runs against graph, hybrid, and verbatim transcript retrieval
  3. Expand — the graph is traversed around top nodes via typed edges (updates, contradicts, depends_on, derived_from)
  4. Resolve — update chains and contradictions are detected; superseded nodes are flagged
  5. Deduplicate & rank — overlapping hits are merged; high-signal node types (decisions, preferences) are boosted
  6. Compress — everything is packed into a structured context brief under a configurable token budget

Example MCP call:

{
  "tool": "build_context",
  "arguments": {
    "query": "Continue implementing Waggle from where we left off",
    "project": "waggle-mcp",
    "token_budget": 1000,
    "depth": 2
  }
}

Example output:

### Waggle Recursive Context Pack
Task: Continue implementing Waggle from where we left off

Current relevant decisions:
- [decision] Use SQLite for local storage: We chose SQLite with WAL mode for local-first deployments.
- [decision] Hybrid retrieval default: Hybrid (vector + BM25 + graph) is the default retrieval mode.

Active constraints:
- [preference] No external LLM APIs required: All retrieval must work fully local.

Important implementation context:
- [fact] RecursiveContextController added: New module waggle/recursive_context.py implements build_context.

Conflicts or superseded context:
- Possible conflict: 'Use Flask' contradicts 'Use FastAPI'

Config env vars:

VariableDefaultDescription
WAGGLE_RECURSIVE_CONTEXT_ENABLEDtrueEnable/disable the feature
WAGGLE_RECURSIVE_CONTEXT_DEFAULT_BUDGET1200Default token budget
WAGGLE_RECURSIVE_CONTEXT_MAX_SUBQUERIES6Max decomposed subqueries
WAGGLE_RECURSIVE_CONTEXT_DEFAULT_DEPTH2Graph expansion depth
WAGGLE_RECURSIVE_CONTEXT_INCLUDE_EVIDENCEtrueInclude transcript evidence

Tool aliases: recursive_context, assemble_context, rlm_context all resolve to build_context.


How It Works

User  → Agent → observe_conversation(...)  → Graph stores typed nodes + edges
User  → Agent → query_graph("database")   → Subgraph returned → Agent answers with linked rationale

Session 1

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 edge

Session 2 (fresh context window, no history)

User:  What did we decide about the database?
Agent: [calls query_graph("database decision")]
       → retrieves the decision node + linked reason from Session 1
       "You decided on PostgreSQL. The reason recorded was that MySQL replication had been painful."

Session 3

User:  Actually, let's reconsider — the team is more familiar with MySQL.
Agent: [calls store_node() + store_edge(new_node → old_node, "contradicts")]
       → both positions are preserved, and the contradiction is explicit

Setting Up as an MCP Server

One-time install: pipx install waggle-mcp — no API key, no cloud account, no Docker required for local use.

Shared JSON config for clients that accept mcpServers JSON:

{
  "mcpServers": {
    "waggle": {
      "command": "waggle-mcp",
      "args": ["serve"],
      "env": {
        "WAGGLE_TRANSPORT": "stdio",
        "WAGGLE_BACKEND": "sqlite",
        "WAGGLE_DB_PATH": "~/.waggle/waggle.db",
        "WAGGLE_DEFAULT_TENANT_ID": "local-default",
        "WAGGLE_MODEL": "all-MiniLM-L6-v2",
        "WAGGLE_STARTUP_MODE": "normal"
      }
    }
  }
}

First run takes ~30 s — all-MiniLM-L6-v2 (~420 MB) downloads on first use. To skip the download: set "WAGGLE_MODEL": "deterministic" (offline-safe, instant start, slightly lower retrieval quality).

Claude Desktop

Config file location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add the mcpServers block above.

Claude Code

claude mcp add waggle \
  --env WAGGLE_TRANSPORT=stdio \
  --env WAGGLE_BACKEND=sqlite \
  --env WAGGLE_DB_PATH=~/.waggle/waggle.db \
  --env WAGGLE_DEFAULT_TENANT_ID=local-default \
  --env WAGGLE_MODEL=all-MiniLM-L6-v2 \
  -- waggle-mcp serve

Claude Code also supports automatic memory hooks — see the Hooks section below.

Codex

Add to ~/.codex/config.toml:

[mcp_servers.waggle]
command = "waggle-mcp"
args    = ["serve"]
env     = {
  WAGGLE_TRANSPORT         = "stdio",
  WAGGLE_BACKEND           = "sqlite",
  WAGGLE_DB_PATH           = "~/.waggle/waggle.db",
  WAGGLE_DEFAULT_TENANT_ID = "local-default",
  WAGGLE_MODEL             = "all-MiniLM-L6-v2"
}

waggle-mcp setup --yes also writes a managed memory block into AGENTS.md in the current workspace so automatic memory is enabled by default for that repo.

Gemini CLI

gemini mcp add waggle \
  -e WAGGLE_TRANSPORT=stdio \
  -e WAGGLE_BACKEND=sqlite \
  -e WAGGLE_DB_PATH=~/.waggle/waggle.db \
  -e WAGGLE_DEFAULT_TENANT_ID=local-default \
  -e WAGGLE_MODEL=all-MiniLM-L6-v2 \
  waggle-mcp serve

After restarting, run /mcp to confirm Waggle is connected.

Cursor

Cursor Settings → Features → MCP Servers → + Add

  • Command: waggle-mcp
  • Args: serve
  • Env vars: same keys as the JSON block above.

Antigravity

The AI agent reads ~/.gemini/antigravity/mcp_config.json (macOS/Linux) or %USERPROFILE%\.gemini\antigravity\mcp_config.json (Windows). Add the waggle block there. The VS Code extension panel reads a different file — adding waggle there will NOT make it available to the AI agent.

Run waggle-mcp doctor to see exactly which config files exist and which ones have a waggle entry.

ChatGPT

ChatGPT custom MCP connectors require a remote HTTPS server. Deploy Waggle in HTTP mode with the Neo4j backend, expose /mcp over HTTPS, then add that URL as a custom connector in ChatGPT (Settings → Connectors → Advanced → Developer mode).

WAGGLE_TRANSPORT=http \
WAGGLE_BACKEND=neo4j \
WAGGLE_DEFAULT_TENANT_ID=workspace-default \
WAGGLE_NEO4J_URI=bolt://localhost:7687 \
WAGGLE_NEO4J_USERNAME=neo4j \
WAGGLE_NEO4J_PASSWORD=change-me \
waggle-mcp serve

Do not expose Waggle publicly without authentication.

waggle-mcp not on PATH?

pipx ensurepath   # then restart your terminal

Automatic Memory — Prompt Rules

Registering Waggle as an MCP server only makes the tools available. For the agent to call them automatically, add this instruction block to your client's prompt, rules, or project instructions:

Use Waggle automatically for conversational memory.

At the start of a new session, if project, agent, or session scope is known, call prime_context.

Before answering questions that may depend on prior decisions, preferences, constraints, project state,
or earlier conversation context, call query_graph with the narrowest relevant scope.

After completed turns that contain durable information such as decisions, preferences, constraints,
requirements, user corrections, project facts, or meaningful task outcomes, call observe_conversation
automatically.

Waggle should remember relevant context automatically. If memory appears empty, the session is likely
missing the automatic memory policy or the runtime hooks that call build_context before answers and
on_assistant_turn after answers.

Do not ask the user to trigger Waggle manually. Use it in the background when relevant.

Use the same stable project value for the same codebase across sessions, or recall will fragment.


Automatic Memory Hooks (Claude Code)

For Claude Code, waggle-mcp setup --yes installs three hook scripts that capture memory deterministically — no prompt rules needed:

Hook scriptClaude Code eventWhat it does
pre_response.pyUserPromptSubmitTries scoped DB recall first; if the scope is cold and a session checkpoint exists, imports the .abhi checkpoint and retries before Claude responds
post_response.pyStopApplies Waggle's durable-ingest policy and only calls observe_conversation for turns worth remembering
pre_compact.pyPreCompactCalls ingest_transcript_handoff to preserve durable info before context compression, emit a session .abhi checkpoint, and refresh the checkpoint manifest

Each hook always exits 0 (a Waggle bug never blocks your session) and has a 5-second timeout. post_response.py scans turn text for likely secrets before storing, skips low-value chatter, and only ingests durable turns.

# Install hooks (included in setup --yes)
waggle-mcp setup --yes

# Skip hook installation
waggle-mcp setup --yes --no-hooks

# Remove hooks
waggle-mcp uninstall-hooks

Verify It Works

After restarting your client, ask the agent:

"Store a note: we're using PostgreSQL for this project."

Then open a fresh session and ask:

"What database are we using?"

Expected:

You're using PostgreSQL for this project.

MCP Tool Reference

The full tool surface is large (~40 tools). In practice, an agent in normal use only needs the six core tools. Everything else is for human-driven inspection, graph management, and export workflows.

Core tools — what the agent calls automatically

These are the tools your prompt rules or hooks should wire up. An agent that only knows these six will handle the vast majority of memory tasks correctly.

ToolWhen the agent calls it
observe_conversationAfter any turn containing a decision, preference, constraint, correction, or project fact. Persists the verbatim turn first, then extracts graph nodes. Returns turn_id, verbatim_stored, nodes_extracted, edges_inferred.
query_graphBefore answering questions that may depend on prior context. Hybrid retrieval (graph + verbatim transcript) by default. Supports as_of for point-in-time queries.
prime_contextAt the start of a new session to hydrate context from the most relevant scoped memories.
graph_diffWhen the user asks what changed recently.
store_node + store_edgeWhen the agent needs to store a single atomic fact or explicitly link two nodes. Prefer observe_conversation for conversational turns — use these for structured, deliberate writes.

observe_conversation and decompose_and_store create edges automatically. If you only call store_node, you get isolated facts with no traversal value.

Extended retrieval — agent-callable, situational

ToolDescription
aggregate_graphBroad filtered subgraph for map-reduce tasks. Use when you want a large scoped slice rather than high-precision top-K. Supports node_types, tags, as_of, include_invalidated.
get_relatedFetch the neighborhood around a specific node by ID.
get_node_historyInspect a node's evidence, validity window, and connected context.
get_topicsTopic clusters via community detection across the full tenant graph.
timelineChronological view of memory changes for a node or query.
list_conflictsList unresolved contradiction and update edges.
resolve_conflictMark a conflict resolved. Pass winner (node ID) to supersede the losing node — sets its valid_to to now.

Operator / human tools — not for routine agent use

These are for you as the operator: graph health, deduplication, export, and migration. Exposing all of these to an agent in normal use adds noise without benefit.

Graph management

ToolDescription
update_nodeUpdate an existing node's content, label, or tags.
delete_nodeDelete a node and all its edges.
decompose_and_storeBreak long content into atomic nodes and infer edges automatically.
dedup_candidatesReturn near-duplicate node pairs above a similarity threshold for human review.
canonicalize_nodeMerge multiple nodes into one canonical node. Repoints all edges, collects aliases. Idempotent.
edge_quality_reportAudit edge quality — counts, average confidence per type, top/bottom confidence edges.
debug_retrievalDiagnose retrieval ranking for a query — embedding scores, window routing, tiered vs flat comparison.

Context windows

ToolDescription
list_context_scopesKnown agent, project, and session scope values.
list_context_windowsChat/session-level memory containers with status and node counts.
get_context_windowInspect one context window and its nodes.
close_context_windowClose a session window and derive cross-window edges.
window_graph_vizExport the context-window graph as an interactive HTML visualization.
export_graph_htmlExport the memory graph as an interactive HTML visualization.
get_statsNode/edge counts, type breakdowns, and recent highly-connected nodes.

Memory files — git-vocabulary interface

Waggle uses a git-inspired vocabulary for portable memory snapshots:

ToolGit analogyDescription
commitgit commitSnapshot the graph to a .abhi file. Formats: abhi (default), backup (raw JSON), bundle (Markdown/JSON context pack).
pullgit pullLoad a .abhi or backup file into the current graph. Runs integrity verification before merging.
diffgit diffCompare two .abhi files — added/removed/updated nodes and edges.
mergegit mergeThree-way merge two .abhi branches against a common base. Conflicts surface as CONTRADICTS edges.
fsckgit fsckValidate a .abhi file without importing it.
showgit showInspect a .abhi file's summary stats without loading it.
grepgit grepExecute a saved or ad hoc query against a .abhi file.
load_abhi_chunks—Load only selected or query-relevant chunks from a .abhi file.

Legacy tool names (export_graph_backup, import_abhi, diff_abhi, merge_abhi, validate_abhi, inspect_abhi, query_abhi) are still accepted and automatically mapped to their canonical equivalents.

Vault

ToolDescription
export_markdown_vaultExport the graph as an Obsidian-compatible Markdown vault.
import_markdown_vaultImport an edited Obsidian vault back into the graph non-destructively.

What To Ask The Agent

Ask the agent...Tool called
"Remember that..."observe_conversation
"What do you know about X?"query_graph
"What changed recently?"graph_diff
"Summarize context for a new session"prime_context
"Show all stored topics"get_topics
"Export my memory to a file"commit
"Are there any duplicate nodes?"dedup_candidates
"What's the quality of my graph edges?"edge_quality_report

Edges are what make graph memory work. observe_conversation and decompose_and_store create edges automatically. If you only call store_node, you get isolated facts — not a connected graph.

For broad summarization tasks, prefer aggregate_graph over query_graph when you want a large scoped slice of memory instead of high-precision semantic ranking.


Graph Data Model

Node types: fact, entity, concept, preference, decision, question, note

Edge types: relates_to, contradicts, depends_on, part_of, updates, derived_from, similar_to

Temporal validity: Every node supports valid_from and valid_to fields. query_graph and aggregate_graph exclude expired nodes by default. Pass include_invalidated: true to include them, or as_of: "<ISO-8601 datetime>" to query the graph at a specific point in time. resolve_conflict with a winner node ID automatically sets the losing node's valid_to to now.


Cross-Client Handoffs & Migration

Same machine — automatic sharing

Point multiple clients at the same WAGGLE_DB_PATH (default ~/.waggle/waggle.db) and they share one brain automatically.

Session handoffs

# Explicit checkpoint before switching sessions or apps
waggle-mcp checkpoint-context --project MCP --session-id thread-123 --output ./handoff.abhi

Resume order is:

  • same machine / shared WAGGLE_DB_PATH: use the live SQLite memory first
  • if that scoped DB recall is empty: import the session .abhi checkpoint
  • different machine or explicit transfer: waggle-mcp pull ./handoff.abhi

Full migration

# Export
waggle-mcp export-graph-backup --output-path my_memory.json

# Import on new machine
waggle-mcp import-graph-backup --input-path my_memory.json

CLI Command Reference

CommandDescription
waggle-mcp --helpShow all commands and options.
waggle-mcp featuresBest first command — tool map, workflows, and setup hints.
waggle-mcp doctorRun this if something isn't working — checks config, model cache, DB path.
waggle-mcp doctor --fixRe-embed stale rows after a WAGGLE_MODEL change.
waggle-mcp setup --yesNon-interactive one-line setup for all detected clients.
waggle-mcp initInteractive setup wizard for one client.
waggle-mcp serveRun the MCP server (usually started by your client).
waggle-mcp demoRun the 60-second local demo with a pre-loaded example graph.
waggle-mcp edit-graphLaunch Graph Studio in the browser.
waggle-mcp uninstall-hooksRemove the waggle-managed hooks block from Claude Code settings.
waggle-mcp export-context-bundleExport a portable Markdown/JSON context pack.
waggle-mcp export-markdown-vaultExport the graph as an Obsidian-style vault.
waggle-mcp ingest-transcript-handoffIngest a rollover transcript, export a handoff bundle, and emit a session .abhi checkpoint.

WAGGLE_STARTUP_MODE

ValueBehaviourBest for
normal (default)Model loads in background; server responds immediatelyDaily use
fastML never loads; semantic tools return unavailableSchema inspection, tool listing
strictServer blocks until model is fully loadedProduction deployments

Graph Studio

waggle-mcp edit-graph

A local browser-based graph editor for inspecting and editing memory directly. Features:

  • Dual-layer graph/conversation views in the same UI
  • Transcript provenance and retrieval-debug inspection for hybrid memory results
  • Mouse-based node dragging and shift-drag edge creation
  • Collapsible side panels, focus mode, and label toggling for large graphs
  • Live graph stats: connected nodes, isolates, cluster count
  • Export/import of the current graph, including .abhi preview, diff, and sharing workflows

.abhi files are JSON underneath — they support optional embedded vectors, optional AES-256-GCM encryption, deterministic content hashing, and a magic-bytes header (WGL\x01) for format identification. Legacy bare-ZIP files are read transparently.

waggle-mcp push encrypts .abhi exports by default. Export paths refuse to proceed if transcript text contains likely secrets unless you pass --force.


Model Support

Waggle uses a local sentence-transformers model selected by WAGGLE_MODEL.

  • Default: all-MiniLM-L6-v2
  • Any locally available sentence-transformers model name works.
  • If the model is unavailable, Waggle falls back to deterministic SHA-256 embeddings.
WAGGLE_MODEL=all-mpnet-base-v2 waggle-mcp serve

For existing DBs, a model change is a migration event: run waggle-mcp doctor, then waggle-mcp doctor --fix if mixed embedding_model_id values are reported.

WAGGLE_DEDUP_THRESHOLD

Controls the cosine similarity threshold for automatic node deduplication at write time (default 0.88, minimum 0.85). Nodes above this threshold with matching type and scope are merged automatically. Use dedup_candidates to review near-duplicates below the auto-merge threshold.


Security & Privacy

  • Data stays local by default (~/.waggle/waggle.db). No telemetry, no cloud calls for local operation.
  • Memory only leaves your machine if you configure a remote backend or explicitly export/push.
  • Local SQLite is not encrypted at rest — use OS disk encryption if the stored history is sensitive.
  • Before .abhi export, Waggle scans transcript text for likely secrets (API keys, JWTs, passwords). Export is refused if secrets are found unless you pass --force.
  • waggle-mcp push defaults to AES-256-GCM encrypted export.

Known Limitations

  • Edges are load-bearing. observe_conversation and decompose_and_store create them automatically. Raw store_node calls without follow-up edges produce disconnected nodes with no traversal value.
  • Graph retrieval trades tokens for reasoning context. Factual lookups are often cheaper than chunked RAG; graph-expansion queries intentionally spend more tokens to carry update chains and contradictions.
  • Hybrid rerank is not the default. The no-rerank hybrid path is stronger right now. The rerank path is available but intentionally not the launch default.
  • Deduplication is similarity-based, not universal semantic equivalence. Broader production text may still require additional aliases or stricter domain guards.

Troubleshooting

Run waggle-mcp doctor first — it usually identifies the actual failure mode.

Diagnostics

  • waggle-mcp doctor
  • waggle-mcp doctor --fix
  • which waggle-mcp
  • python3 -m pip show waggle-mcp
  • env | grep WAGGLE
  • lsof -i :8080
  • sqlite3 "$WAGGLE_DB_PATH" "PRAGMA integrity_check;"

Common failure modes

Missing waggle module

  • Cause: the package is not installed in the active Python environment.
  • Fix: install from the repo root with pip install -e ".[dev]" and confirm which python points at the activated venv.

Slow first start / stuck on loading model

  • Cause: all-MiniLM-L6-v2 downloads on first use (~420 MB).
  • Fix: wait for the one-time model download, or use WAGGLE_MODEL=deterministic for instant offline startup.

OSError: [Errno 98] Address already in use

  • Cause: port 8080 or the configured WAGGLE_HTTP_PORT is already bound.
  • Fix: run WAGGLE_HTTP_PORT=18080 waggle-mcp serve or stop the conflicting process.

sqlite3.OperationalError: database is locked

  • Cause: another Waggle process holds the SQLite write lock.
  • Fix: ensure only one server is running and remove any stale lock file at the configured DB path.

AuthenticationError: Invalid API key

  • Cause: HTTP transport requires a valid API key header.
  • Fix: send X-API-Key: <your_key> and generate one with waggle-mcp keys create; see docs/reference.md.

Client cannot see tools

  • Cause: the client is not connected to the correct MCP server.
  • Fix: verify the client config points to waggle-mcp serve --transport stdio, restart the client, and confirm the MCP entry is enabled.

Database path permissions

  • Cause: the configured database path is not writable.
  • Fix: set WAGGLE_DB_PATH to a writable location and rerun waggle-mcp doctor.

Mixed embedding model IDs after model change

  • Cause: an existing database was created with a different embedding model.
  • Fix: run waggle-mcp doctor and then waggle-mcp doctor --fix if mixed embedding_model_id values are reported.

Reference & Docs

  • Environment variables, full tool surface, admin commands, Docker setup: waggle-mcp --help or docs/reference.md
  • Production deployment: deploy/kubernetes/README.md
  • Operations and troubleshooting: docs/install/troubleshooting.md
  • Automatic memory rules (copy-pasteable): docs/automatic-memory-rules.md
  • Hook integration details: docs/hooks.md
  • .abhi format spec: docs/abhi-format-v2.md

Contributing

This repository is maintained privately. Internal contributors can use the docs in this repo as the source of truth.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Configuration

WAGGLE_TRANSPORTdefault: stdio

Transport mode for the MCP server.

WAGGLE_BACKENDdefault: sqlite

Backend database type: sqlite for local use or neo4j for service deployments.

WAGGLE_DB_PATHdefault: ~/.waggle/memory.db

Path to the SQLite memory database when WAGGLE_BACKEND is sqlite.

WAGGLE_DEFAULT_TENANT_IDdefault: local-default

Default tenant ID for local or shared memory isolation.

WAGGLE_MODELdefault: all-MiniLM-L6-v2

Sentence-transformers model used for local embeddings.

Categories
AI & LLM Tools
Registryactive
Packagewaggle-mcp
TransportSTDIO
UpdatedApr 21, 2026
View on GitHub

Related AI & LLM Tools MCP Servers

View all →
SkillFM LLM Cost Optimizer

io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage

LLM cost optimizer for OpenAI, Anthropic, token usage, BYOK, and SkillFM Beacon audits.
Llm Orchestration Agent

io.github.mikerawsonnz/llm-orchestration-agent

Run a prompt through a LangChain (system + human) chain over Gemini on Vertex AI; optional LangSmith
Authenticated Llm Agent

io.github.mikerawsonnz/authenticated-llm-agent

JWT-gated LLM gateway: authenticate (bcrypt/JWT), then run a LangChain-on-Vertex Gemini completion.
Copilot Memory MCP

labforgedev/copilot-memory-mcp

Persistent semantic memory for AI agents using local ChromaDB vector search. No cloud required.
1
Agent Prompt Injection Firewall Mcp

csoai-org/agent-prompt-injection-firewall-mcp

The WAF for agents. Pattern-based + heuristic firewall scans prompts, RAG documents, tool argume...
Authenticated Multi Llm Agent

io.github.mikerawsonnz/authenticated-multi-llm-agent

Google-OAuth-gated LLM gateway: verify a Google ID token, then run a Gemini (Vertex AI) completion f