WhiteMagic — governed local memory for agent continuity
Governed local-first memory and continuity for AI agents — signed receipts, optional hosted lane.
¿Debería usar esto?
Calidad y seguridad
Hallazgos (23)
- LOWen wm
- LOWen memory.search
- LOWen memory.read
- LOWen memory.list
- LOWen memory.hybrid_recall
- LOWen session.continuity
- LOWen memory.revisions
- LOWen receipts.verify
- LOWen memory.count
- LOWen memory.stats
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"whitemagic-mcp": {
"command": "npx",
"args": [
"whitemagic-mcp"
]
}
}
}Paquetes ejecutables
9.3.1stdioPuntos de conexión remotos
https://mcp.whitemagic.dev/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (23)
🟢wm(args, route, thought)
WhiteMagic meta-tool — memory and continuity kernel over the curated tool surface (69 tools): persistent memory, session continuity and recall, governance/audit, and local tool execution. Mode: READ-ONLY — writes (session.*, memory.create/update) are refused; recall only. Scope: store /srv/whitemagic/hosted-store/lmdb. Invoke with thought=<natural language> (auto-routed), route=<exact tool id> (e.g. 'memory.search', 'session.continuity'), or args=<object> (passthrough). Provide exactly one of thought or route. Say 'list tools' to enumerate the curated surface. Prefer a discrete lifecycle tool when one matches your task; use wm for natural-language routing and the wider curated catalog.
Esquema de entrada
{
"type": "object",
"properties": {
"args": {
"description": "Arguments to pass through to the target tool.",
"type": "object"
},
"route": {
"description": "Explicit tool name for direct dispatch (e.g. 'memory.create', 'tools.list').",
"type": "string"
},
"thought": {
"description": "Natural language input describing what to do. Auto-routes to the best-matching tool via TF-IDF NLU classification.",
"type": "string"
}
}
}Esquema de salida
{
"type": "object",
"properties": {
"_wm_route": {
"description": "Dispatch metadata: resolved tool, routing confidence, matched input.",
"properties": {
"confidence": {
"description": "Routing confidence (1.0 for explicit routes)",
"type": "number"
},
"input": {
"description": "Routing input that produced the match",
"type": "string"
},
"tool": {
"description": "Resolved route name",
"type": "string"
}
},
"type": "object"
}
},
"additionalProperties": true,
"description": "The dispatched tool's result envelope plus `_wm_route` dispatch metadata; fields vary by route."
}🟢memory.search(cold_scan_limit, galaxy, include_cold, limit, min_importance, ...)
Search memories: hybrid BM25 + vector fusion with deterministic episodic and full-text fallbacks; each result discloses its recall_mode. The preferred recall tool.
Esquema de entrada
{
"type": "object",
"properties": {
"cold_scan_limit": {
"description": "Maximum cold records to scan when include_cold is set (default 2048)",
"type": "integer"
},
"galaxy": {
"description": "Galaxy filter (optional; default: search all memory galaxies, results labeled; \"all\" is accepted as an alias for the unfiltered default)",
"type": "string"
},
"include_cold": {
"description": "Opt-in unranked cold recovery (no thaw). Trust/importance floors apply; BM25 floors do not apply to unscored recovery. Search content is scrubbed navigation capped at 8192 characters; read by id/galaxy for the exact original.",
"type": "boolean"
},
"limit": {
"description": "Maximum results (default 10; must be >= 1)",
"minimum": 1,
"type": "integer"
},
"min_importance": {
"description": "Minimum memory importance (0-1)",
"type": "number"
},
"min_score": {
"description": "Absolute BM25 score floor",
"type": "number"
},
"min_score_ratio": {
"description": "Relative floor: reject hits below this fraction of the top score",
"type": "number"
},
"min_trust": {
"description": "Minimum source_trust (0-1): drop results below this trust floor",
"type": "number"
},
"query": {
"description": "Full-text query",
"type": "string"
}
},
"required": [
"query"
]
}Esquema de salida
{
"type": "object",
"properties": {
"count": {
"description": "Number of results returned",
"type": "integer"
},
"evidence_bundle": {
"description": "Per-result provenance (coverage, history, integrity, retrieval, source_time, visibility) plus conflicts.",
"type": "object"
},
"galaxy": {
"description": "Galaxy scope the query ran against",
"type": "string"
},
"hint": {
"description": "Optional recovery hint when results are thin (null when there is none)",
"type": [
"string",
"null"
]
},
"recall_mode": {
"description": "Retrieval path used (hybrid, episodic, fts, importance, none)",
"type": "string"
},
"results": {
"description": "Ranked memories (id, content, score, galaxy, source)",
"items": {
"type": "object"
},
"type": "array"
},
"status": {
"description": "Operation status",
"type": "string"
}
},
"additionalProperties": true,
"description": "Ranked recall results with an evidence bundle and recall-mode disclosure."
}🟢memory.read(galaxy, id)
Retrieve a specific memory by its ID or coordinate address.
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy containing the memory (default codex)",
"type": "string"
},
"id": {
"description": "Memory UUID",
"type": "string"
}
},
"required": [
"id"
]
}Esquema de salida
{
"type": "object",
"properties": {
"content": {
"description": "Full memory content",
"type": "string"
},
"created_at": {
"description": "RFC 3339 creation timestamp",
"type": "string"
},
"galaxy": {
"description": "Galaxy containing the memory",
"type": "string"
},
"id": {
"description": "Memory UUID",
"type": "string"
},
"status": {
"description": "Operation status",
"type": "string"
},
"tags": {
"description": "Memory tags",
"items": {
"type": "string"
},
"type": "array"
}
},
"additionalProperties": true,
"description": "The exact stored memory record."
}🟢memory.list(exclude_tags, galaxy, limit, offset)
List memories with filters (galaxy, tags, limit, offset) for inventory and discovery.
Esquema de entrada
{
"type": "object",
"properties": {
"exclude_tags": {
"description": "Drop memories carrying any of these tags",
"items": {
"type": "string"
},
"type": "array"
},
"galaxy": {
"description": "Galaxy to list (default codex)",
"type": "string"
},
"limit": {
"description": "Maximum entries (default 20)",
"type": "integer"
},
"offset": {
"description": "Skip this many matching entries before returning (default 0)",
"type": "integer"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy scope listed",
"type": "string"
},
"matched": {
"description": "Total records matching the filter",
"type": "integer"
},
"memories": {
"description": "Records (id, content_preview, created_at, tags)",
"items": {
"type": "object"
},
"type": "array"
},
"offset": {
"description": "Pagination offset applied",
"type": "integer"
},
"returned": {
"description": "Records in this page",
"type": "integer"
},
"status": {
"description": "Operation status",
"type": "string"
},
"total": {
"description": "Total records in scope",
"type": "integer"
}
},
"additionalProperties": true,
"description": "A page of memory records with pagination counters."
}🟢memory.hybrid_recall(cold_scan_limit, galaxy, include_cold, limit, min_importance, ...)
Compatibility alias of memory.search — same implementation, same arguments, same results. Kept for clients pinned to this name; prefer memory.search.
Esquema de entrada
{
"type": "object",
"properties": {
"cold_scan_limit": {
"description": "Maximum cold records to scan when include_cold is set (default 2048)",
"type": "integer"
},
"galaxy": {
"description": "Galaxy filter (optional; default: search all memory galaxies, results labeled; \"all\" is accepted as an alias for the unfiltered default)",
"type": "string"
},
"include_cold": {
"description": "Opt-in unranked cold recovery (no thaw). Trust/importance floors apply; BM25 floors do not apply to unscored recovery. Search content is scrubbed navigation capped at 8192 characters; read by id/galaxy for the exact original.",
"type": "boolean"
},
"limit": {
"description": "Maximum results (default 10; must be >= 1)",
"minimum": 1,
"type": "integer"
},
"min_importance": {
"description": "Minimum memory importance (0-1)",
"type": "number"
},
"min_score": {
"description": "Absolute BM25 score floor",
"type": "number"
},
"min_score_ratio": {
"description": "Relative floor: reject hits below this fraction of the top score",
"type": "number"
},
"min_trust": {
"description": "Minimum source_trust (0-1): drop results below this trust floor",
"type": "number"
},
"query": {
"description": "Full-text query",
"type": "string"
}
},
"required": [
"query"
]
}Esquema de salida
{
"type": "object",
"properties": {
"count": {
"description": "Number of results returned",
"type": "integer"
},
"evidence_bundle": {
"description": "Per-result provenance (coverage, history, integrity, retrieval, source_time, visibility) plus conflicts.",
"type": "object"
},
"galaxy": {
"description": "Galaxy scope the query ran against",
"type": "string"
},
"hint": {
"description": "Optional recovery hint when results are thin (null when there is none)",
"type": [
"string",
"null"
]
},
"recall_mode": {
"description": "Retrieval path used (hybrid, episodic, fts, importance, none)",
"type": "string"
},
"results": {
"description": "Ranked memories with per-result source labels",
"items": {
"type": "object"
},
"type": "array"
},
"status": {
"description": "Operation status",
"type": "string"
}
},
"additionalProperties": true,
"description": "Recall results (memory.search implementation) with an evidence bundle and recall-mode disclosure."
}🟢session.continuity(current_session_id, max_content_bytes, max_response_bytes, n, since, ...)
Recall where the previous session left off: recent turns, checkpoints, and open work.
Esquema de entrada
{
"type": "object",
"properties": {
"current_session_id": {
"description": "Session to exclude (optional)",
"type": "string"
},
"max_content_bytes": {
"description": "Per-turn content cap in bytes (256-262144, default 8192)",
"type": "integer"
},
"max_response_bytes": {
"description": "Turns budget in bytes (256-262144, default 49152)",
"type": "integer"
},
"n": {
"description": "Number of prior turns (default 10)",
"type": "integer"
},
"since": {
"description": "Time-range floor: epoch seconds, RFC 3339, or YYYY-MM-DD",
"type": "string"
},
"until": {
"description": "Time-range ceiling: epoch seconds, RFC 3339, or YYYY-MM-DD",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"properties": {
"checkpoint": {
"description": "Latest checkpoint handoff, or null",
"type": [
"object",
"null"
]
},
"checkpoint_id": {
"description": "Memory UUID of the checkpoint, or null",
"type": [
"string",
"null"
]
},
"count": {
"description": "Turns returned",
"type": "integer"
},
"max_content_bytes": {
"description": "Per-turn byte cap applied",
"type": "integer"
},
"max_response_bytes": {
"description": "Total response byte budget applied",
"type": "integer"
},
"previous_session": {
"description": "Session the turns were read from",
"type": "string"
},
"status": {
"description": "Operation status",
"type": "string"
},
"truncated": {
"description": "Whether the response hit its byte budget",
"type": "boolean"
},
"turns": {
"description": "Turns (memory_id, role, turn_type, sequence, content, content_bytes, content_truncated, importance)",
"items": {
"type": "object"
},
"type": "array"
},
"turns_omitted": {
"description": "Turns dropped by the response budget",
"type": "integer"
}
},
"additionalProperties": true,
"description": "Recent turns plus the latest checkpoint handoff for the prior session."
}🟢memory.revisions(action, galaxy, id)
List or verify a memory's content revision chain (tamper evidence): every content update is chained and head-checked.
Esquema de entrada
{
"type": "object",
"properties": {
"action": {
"description": "Action: list (default) | verify",
"type": "string"
},
"galaxy": {
"description": "Galaxy (default: codex)",
"type": "string"
},
"id": {
"description": "Memory UUID to inspect",
"type": "string"
}
},
"required": [
"id"
]
}Esquema de salida
{
"type": "object",
"properties": {
"action": {
"description": "Action performed (list, restore, ...)",
"type": "string"
},
"count": {
"description": "Number of revisions returned",
"type": "integer"
},
"galaxy": {
"description": "Galaxy containing the memory",
"type": "string"
},
"id": {
"description": "Memory UUID",
"type": "string"
},
"revisions": {
"description": "Revision records with content hashes and timestamps",
"items": {
"type": "object"
},
"type": "array"
},
"status": {
"description": "Operation status",
"type": "string"
}
},
"additionalProperties": true,
"description": "Revision chain for a memory (newest first)."
}🟢receipts.verify(bundle, id, require_anchor, variant)
Verify a stored receipt id or a bundle offline; fail-closed without an anchor (verdict PROVISIONAL).
Esquema de entrada
{
"type": "object",
"properties": {
"bundle": {
"description": "Inline bundle to verify (alternative to id)",
"type": "object"
},
"id": {
"description": "Stored receipt task id (UUID or urn:uuid:)",
"type": "string"
},
"require_anchor": {
"description": "Fail-closed: without an anchor the verdict is PROVISIONAL",
"type": "boolean"
},
"variant": {
"description": "Stored variant (default original)",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"properties": {
"id": {
"description": "Receipt UUID that was verified",
"type": "string"
},
"require_anchor": {
"description": "Whether an external anchor was required",
"type": "boolean"
},
"result": {
"description": "Verdict detail: errors, insufficient/provisional reasons, and a summary (attestations, issuers, receipts, settled, terminated, types).",
"type": "object"
}
},
"additionalProperties": true,
"description": "Verification report for a receipt or bundle."
}🟢memory.count(galaxy)
Count memories matching optional filters without returning content.
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy to count (optional; all memory galaxies when absent)",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.stats(galaxy)
Memory-store statistics: totals, galaxy spread, and index health.
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy to summarize (optional; default codex)",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.tags(galaxy)
List the tag vocabulary with usage counts.
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy whose tags to list (optional; default codex)",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.aggregate(limit, metric, query)
Aggregate a numeric or categorical field over matched memories.
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum candidates considered (default 50; must be >= 1)",
"minimum": 1,
"type": "integer"
},
"metric": {
"description": "Aggregate metric: count | session_count | session_span",
"type": "string"
},
"query": {
"description": "Full-text query selecting the memories to aggregate over",
"type": "string"
}
},
"required": [
"query",
"metric"
]
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.associations(direction, id)
Associative neighbours of a memory (spreading activation over the association graph).
Esquema de entrada
{
"type": "object",
"properties": {
"direction": {
"description": "Direction: from | to | both (default: both)",
"type": "string"
},
"id": {
"description": "Memory UUID to inspect",
"type": "string"
}
},
"required": [
"id"
]
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.batch_read(galaxy, ids)
Read several memories by id in one call.
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy (default: codex)",
"type": "string"
},
"ids": {
"description": "Memory UUIDs to read",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"ids"
]
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.query(created_after, created_before, galaxy, limit, max_importance, ...)
Structured query over memories with filters and ordering.
Esquema de entrada
{
"type": "object",
"properties": {
"created_after": {
"description": "Filter: only memories created at or after this RFC 3339 timestamp (e.g. 2026-08-01T00:00:00Z)",
"type": "string"
},
"created_before": {
"description": "Filter: only memories created at or before this RFC 3339 timestamp",
"type": "string"
},
"galaxy": {
"description": "Galaxy to query (default codex)",
"type": "string"
},
"limit": {
"description": "Maximum entries (default 50)",
"type": "integer"
},
"max_importance": {
"description": "Filter: maximum importance (0-1)",
"type": "number"
},
"min_importance": {
"description": "Filter: minimum importance (0-1)",
"type": "number"
},
"query": {
"description": "Case-insensitive substring filter over content (literal match). For tokenized, ranked full-text retrieval use memory.search",
"type": "string"
},
"tags": {
"description": "Filter: memories with all of these tags",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.filter(created_after, created_before, exclude_tags, galaxy, limit, ...)
Filter memories by metadata (tags, importance, recency).
Esquema de entrada
{
"type": "object",
"properties": {
"created_after": {
"description": "Filter: only memories created at or after this RFC 3339 timestamp (e.g. 2026-08-01T00:00:00Z)",
"type": "string"
},
"created_before": {
"description": "Filter: only memories created at or before this RFC 3339 timestamp",
"type": "string"
},
"exclude_tags": {
"description": "Filter: drop memories carrying any of these tags",
"items": {
"type": "string"
},
"type": "array"
},
"galaxy": {
"description": "Galaxy to filter (default codex)",
"type": "string"
},
"limit": {
"description": "Maximum entries (default 50)",
"type": "integer"
},
"max_importance": {
"description": "Filter: maximum importance (0-1)",
"type": "number"
},
"min_importance": {
"description": "Filter: minimum importance (0-1)",
"type": "number"
},
"offset": {
"description": "Skip this many matching entries before returning (default 0)",
"type": "integer"
},
"query": {
"description": "Filter: every whitespace-separated term must appear (case-insensitive) in the content or title",
"type": "string"
},
"tags": {
"description": "Filter: memories with all of these tags",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.nearby(galaxy, limit, query, radius)
Memories near a coordinate address (5D spatial neighbourhood).
Esquema de entrada
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy (default: codex)",
"type": "string"
},
"limit": {
"description": "Maximum results (default 10)",
"type": "integer"
},
"query": {
"description": "Query text to locate in 5D space",
"type": "string"
},
"radius": {
"description": "Spatial radius cutoff (optional)",
"type": "number"
}
},
"required": [
"query"
]
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.vector.search(embedding, galaxy, limit, memory_id)
Vector-similarity search over memory embeddings.
Esquema de entrada
{
"type": "object",
"properties": {
"embedding": {
"description": "Raw embedding vector (alternative to memory_id)",
"items": {
"type": "number"
},
"type": "array"
},
"galaxy": {
"description": "Galaxy filter (optional)",
"type": "string"
},
"limit": {
"description": "Maximum results (default 10)",
"type": "integer"
},
"memory_id": {
"description": "Memory UUID whose stored embedding is the query",
"type": "string"
}
},
"required": [
"memory_id"
]
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢session.list(sequence, session_id, title, type)
List sessions with titles and summaries.
Esquema de entrada
{
"type": "object",
"properties": {
"sequence": {
"description": "Filter by start sequence number",
"type": "integer"
},
"session_id": {
"description": "Filter by session UUID",
"type": "string"
},
"title": {
"description": "Filter by title substring",
"type": "string"
},
"type": {
"description": "Filter by session type",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢session.recall(limit, session_id)
Recall a session's turns without continuity packaging.
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"description": "Maximum turns to return (default 50)",
"type": "integer"
},
"session_id": {
"description": "Session UUID to recall (defaults to the most recent session)",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢session.replay(cursor, include_superseded, max_wire_bytes, min_importance, mode, ...)
Replay a session's recorded turns in order.
Esquema de entrada
{
"type": "object",
"properties": {
"cursor": {
"description": "Lossless mode opaque placement cursor",
"type": "string"
},
"include_superseded": {
"description": "Also return turns replaced via supersedes (default false).",
"type": "boolean"
},
"max_wire_bytes": {
"description": "Lossless mode serialized JSON ceiling (1024-49152)",
"type": "integer"
},
"min_importance": {
"description": "Selective mode floor (default 0.7)",
"type": "number"
},
"mode": {
"description": "full | selective | progressive | lossless (default full)",
"type": "string"
},
"n": {
"description": "Maximum turns (default 50)",
"type": "integer"
},
"page_size": {
"description": "Lossless mode records per page (1-64, default 16)",
"type": "integer"
},
"session_id": {
"description": "Target session (required explicit UUID for lossless; otherwise default most recent)",
"type": "string"
},
"since": {
"description": "Time-range floor: epoch seconds, RFC 3339, or YYYY-MM-DD",
"type": "string"
},
"token_budget": {
"description": "Progressive mode token budget (default 2000)",
"type": "integer"
},
"turn_types": {
"description": "Selective mode: turn types to keep",
"items": {
"type": "string"
},
"type": "array"
},
"until": {
"description": "Time-range ceiling: epoch seconds, RFC 3339, or YYYY-MM-DD",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢gnosis.status
Knowledge-surface status: galaxies, counts, and index health.
Esquema de entrada
{
"type": "object",
"properties": {}
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢gnosis.explain(args_hash, has_purpose, is_network, is_spawn, is_write, ...)
Explain why a memory or route was selected (provenance readout).
Esquema de entrada
{
"type": "object",
"properties": {
"args_hash": {
"description": "Hash of the arguments under evaluation",
"type": "string"
},
"has_purpose": {
"description": "Claim: the invocation carries a purpose",
"type": "boolean"
},
"is_network": {
"description": "Claim: the invocation uses the network",
"type": "boolean"
},
"is_spawn": {
"description": "Claim: the invocation spawns a process",
"type": "boolean"
},
"is_write": {
"description": "Claim: the invocation writes",
"type": "boolean"
},
"tool_name": {
"description": "Tool name to explain",
"type": "string"
}
},
"required": []
}Esquema de salida
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}Prompts recomendados
memory.searchmemory.searchmemory.readmemory.readmemory.listComunidad
Evidencia