WhiteMagic — governed local memory for agent continuity
Local-first memory and continuity for AI coding agents. No cloud backend; optional hosted lane.
使うべきか
品質と安全性
検出事項(23)
- LOWwm 内
- LOWmemory.search 内
- LOWmemory.read 内
- LOWmemory.list 内
- LOWmemory.hybrid_recall 内
- LOWsession.continuity 内
- LOWmemory.revisions 内
- LOWreceipts.verify 内
- LOWmemory.count 内
- LOWmemory.stats 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"whitemagic-mcp": {
"command": "npx",
"args": [
"whitemagic-mcp"
]
}
}
}実行可能なパッケージ
9.2.9stdioリモートエンドポイント
https://mcp.whitemagic.dev/mcpstreamable-httpできること
ツール一覧
ツール(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.
入力スキーマ
{
"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"
}
}
}出力スキーマ
{
"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.
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy containing the memory (default codex)",
"type": "string"
},
"id": {
"description": "Memory UUID",
"type": "string"
}
},
"required": [
"id"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"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.
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"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.
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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).
入力スキーマ
{
"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": []
}出力スキーマ
{
"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.
入力スキーマ
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy to count (optional; all memory galaxies when absent)",
"type": "string"
}
},
"required": []
}出力スキーマ
{
"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.
入力スキーマ
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy to summarize (optional; default codex)",
"type": "string"
}
},
"required": []
}出力スキーマ
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢memory.tags(galaxy)
List the tag vocabulary with usage counts.
入力スキーマ
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy whose tags to list (optional; default codex)",
"type": "string"
}
},
"required": []
}出力スキーマ
{
"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.
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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).
入力スキーマ
{
"type": "object",
"properties": {
"direction": {
"description": "Direction: from | to | both (default: both)",
"type": "string"
},
"id": {
"description": "Memory UUID to inspect",
"type": "string"
}
},
"required": [
"id"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"type": "object",
"properties": {
"galaxy": {
"description": "Galaxy (default: codex)",
"type": "string"
},
"ids": {
"description": "Memory UUIDs to read",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"ids"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"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).
入力スキーマ
{
"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": []
}出力スキーマ
{
"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).
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"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"
]
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"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.
入力スキーマ
{
"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": []
}出力スキーマ
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}🟢gnosis.status
Knowledge-surface status: galaxies, counts, and index health.
入力スキーマ
{
"type": "object",
"properties": {}
}出力スキーマ
{
"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).
入力スキーマ
{
"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": []
}出力スキーマ
{
"type": "object",
"additionalProperties": true,
"description": "Result envelope for this tool; fields vary by operation."
}コミュニティ
エビデンス