{
  "markdown": "<h1 align=\"center\">Midas</h1>\n\n<p align=\"center\"><b>The local memory layer for long-horizon AI agents — remembers across sessions, keeps what's current, and won't act on stale memory.</b><br/>No LLM at ingest · $0 per message · fully local · every recall traces to its source.</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/vornicx/Midas/actions/workflows/ci.yml\"><img src=\"https://github.com/vornicx/Midas/actions/workflows/ci.yml/badge.svg\" alt=\"tests\"></a>\n  <a href=\"https://pypi.org/project/midas-memory/\"><img src=\"https://img.shields.io/pypi/v/midas-memory\" alt=\"PyPI\"></a>\n  <a href=\"https://www.npmjs.com/package/midas-memory-mcp\"><img src=\"https://img.shields.io/npm/v/midas-memory-mcp?label=npm\" alt=\"npm\"></a>\n  <img src=\"https://img.shields.io/badge/python-3.11%2B-blue\" alt=\"Python 3.11+\">\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License: MIT\"></a>\n</p>\n\nYour AI assistant forgets everything between sessions. **Midas is the memory that lives next to it, on\nyour machine.** Your coding agent remembers the decisions, conventions, and bugs from three sessions\nago — without piping every message through an LLM to \"extract\" facts. It costs **nothing per message**,\n**nothing leaves your computer**, every memory **traces back to the exact turn it came from**, and it\n**won't let an agent act on memory that's stale or never confirmed**.\n\n```bash\nuv tool install \"midas-memory[mcp,local]\"   # install\nmidas init                                  # create the shared memory + wire up your MCP clients\n# or, no Python:    npx -y midas-memory-mcp     # TypeScript port\n# or, as a library: pip install \"midas-memory[local]\"\nuv tool upgrade midas-memory   # Update Midas\n```\n\n<p align=\"center\">\n  <a href=\"#connect-it-to-your-coding-agent\"><b>Install in your agent</b></a>\n  ·\n  <a href=\"#how-it-does-on-the-benchmarks\"><b>See the benchmarks</b></a>\n  ·\n  <a href=\"docs/MIDAS.md\"><b>Complete overview</b></a>\n  ·\n  <a href=\"ROADMAP.md\"><b>Roadmap</b></a>\n</p>\n\n---\n\n## Why Midas\n\nMost memory tools call an LLM to summarize every session — so you pay in tokens forever, add latency,\nship every turn to a provider, and get back *rewritten* facts you can't audit. Midas makes the opposite\nbet, and that bet is what makes it cheap, private, and trustworthy:\n\n- **$0 and private by construction.** No LLM at ingest or query → no API spend, nothing leaves your\n  machine, fast local ops (~tens of ms, no per-turn network round-trip).\n- **You can trust what it recalls.** Recall returns the **verbatim source turn**, not an LLM rewrite —\n  so there's no extraction step that can silently hallucinate a \"fact\" you never said.\n- **It stays current on its own.** Typed belief revision supersedes the old value instead of piling up\n  duplicates; selective forgetting keeps it bounded — all with no LLM.\n- **It's safe to build on.** A provenance **guard** lets memory inform planning but **blocks\n  memory-justified external or destructive actions** unless you explicitly confirmed them — and a\n  *superseded* memory can't authorize an action at all.\n- **One file, many tools.** Point Claude Code, Cursor, and your chat app at one SQLite file and they\n  share one live memory.\n- **Proven, not asserted.** Every claim has a reproducible benchmark — *including the experiments that\n  failed.*\n\n## How Midas compares\n\nEvery Midas number below is measured and reproducible from this repo; the LLM-at-ingest column\nreflects the structural properties of that design class (Mem0, Zep, Hindsight) and the figures\ndocumented in [BENCHMARKS.md](BENCHMARKS.md).\n\n|  | **Midas** | LLM-at-ingest systems (Mem0, Zep, Hindsight) |\n|---|---|---|\n| LLM calls at ingest | **0** | ≥1 per session |\n| Cost per message | **$0** | per-token API spend, forever |\n| Data egress at ingest | **None** | every turn leaves the box |\n| Ingest latency | **~16–116 ms**, local, embed-bound | ~668 ms + API round-trip |\n| Recall returns | **verbatim source turn**, traceable | LLM-rewritten facts (source `recall@k` not computable) |\n| Deterministic & reproducible | **yes — every number, one command** | no |\n| Works fully offline | **yes** (measured end-to-end with a local Ollama reader) | no |\n| LongMemEval-`s` judged answer (gpt-4o) | **0.84** | 0.84 — Observational Memory, with LLM ingest |\n| Whole-conversation aggregation / summarization | ❌ **by design** — top-k retrieval can't cover it ([documented](BENCHMARKS.md)) | ✅ their structural edge |\n\nThe last row is deliberate: Midas trades whole-conversation abilities for $0, privacy, and\nauditability, and publishes the measurements that show exactly where that trade bites.\n\n## More than recall: a memory you can govern\n\nFinding a buried fact is table stakes. A long-horizon coding agent needs memory it can **act on\nsafely** and **resume from cleanly** — which is where similarity search alone falls short:\n\n| You ask… | Midas answers with | Why top-k recall can't |\n|---|---|---|\n| *\"Can I run this destructive migration?\"* | **Guard**: allowed only if **you** confirmed it, and only if that confirmation is still current | provenance + currency aren't a similarity match |\n| *\"What's the current state of project Apollo?\"* | **`memory_state`**: the live, non-superseded decisions / constraints / facts | a broad \"current state\" query matches no single turn |\n| *\"What changed since our last session?\"* | **`memory_diff`**: beliefs added, and beliefs revised (old → new) | \"what's new\" isn't a content query at all |\n| *\"How do I speed up the transactions list?\"* | the **prior fix** resurfaces, so the agent doesn't re-diagnose it | — |\n\nThese properties are measured, not asserted — the **[agent-memory bench suite](docs/agent-memory-benches.md)**\nscores action-safety, decision-adherence, repeated-mistake avoidance, **resume fidelity**, **conflict\ndetection/precision** (live contradictions between agents found without over-flagging), and adversarial\n**memory-safety** across scripted multi-session projects. The safety eval blocks **10 / 10 adversarial attacks** (ASR\n**0.00**) — including a planted confirmation next to a prohibition, a confirmation for a *different* action,\na provenance-laundering supersession, and a cross-namespace approval — with **no over-blocking** (benign-pass\n**1.00**). Deterministic, $0, no LLM. **Reproduce every number with one command:**\n\n```bash\nuv run python -m eval.benches      # the whole governance suite — or `midas bench` from a checkout\n```\n\n## How it does on the benchmarks\n\nDeterministic, reader-independent **retrieval** (`recall@k` — fraction of the gold supporting turns\npulled into context) on the **full public sets**, vs a recency-window baseline:\n\n| Benchmark (full set) | baseline | **Midas** |\n|---|---:|---:|\n| **LongMemEval-`s`** — 500 questions, 246,750 turns | 0.01 | **0.92** |\n| **LoCoMo** — 10 conversations, n=1,540 | 0.05 | **0.73** |\n| **BEAM** — frontier benchmark, 100K → **10M tokens** | 0.00 | **0.56 → 0.32** |\n\nAnd the cross-system metric, **judged answer-rate** (same gpt-4o judge the leaderboards use):\n\n| Judged answer | baseline | **Midas** |\n|---|---:|---:|\n| LongMemEval-`s` (gpt-4o reader, ties LLM-ingest SOTA at **$0 ingest**) | — | **0.84** |\n| BEAM-100K (gpt-4o judge, raw-turn floor, $0 ingest) | 0.05 | **0.40** |\n\nAll of it at **0 LLM calls, $0, and 0 data egress** at ingest. Full numbers, per-category breakdowns,\nreproduce commands, and the head-to-head vs Mem0/Zep/Mastra are in **[BENCHMARKS.md](BENCHMARKS.md)**.\n\n> **Eval-first means we publish the misses too.** Hybrid retrieval, reranking, thread-diversification,\n> dual-granularity indexing, and *naive distillation* were all measured to **not** help (or to hurt) and\n> are documented as such. That honesty is the point — see BENCHMARKS.md and\n> [`docs/frontier-2026.md`](docs/frontier-2026.md).\n\n---\n\n## Connect it to your coding agent\n\n**One command wires up everything:**\n\n```bash\nmidas init        # creates the shared memory + configures every MCP client it finds\nmidas status      # check what's wired   ·   run `midas init --dry-run` to preview first\n```\n\nBoth take **`--json`** to emit a machine-readable *client wiring receipt* — which memory each client got\nwired to, under which scope/policy, and which clients were skipped (config paths only, never memory\ncontents). Paste it into a bug report, or let another agent verify the setup without scraping prose.\n\n`midas init` creates **one shared memory** (`~/.midas/memory.sqlite3`) and points the MCP clients it\ndetects — **Claude Code, Codex, Grok Build, Cursor, Claude Desktop, Windsurf, VS Code, Gemini CLI,\nCline, Zed** — at it. So all your agents read and write the **same** memory, autonomously, with no\nper-client paths to keep in sync.\n\nPrefer a single endpoint over per-client launches? Run one server and give your clients an **MCP URL**:\n\n```bash\nmidas serve --http        # → http://127.0.0.1:7077/mcp   (one server, one memory, every client shares it)\nmidas serve --http --token <secret>   # require `Authorization: Bearer <secret>` on every request\n```\n\nKeep Midas current with **`midas update`**. See your memory anytime with **`midas inspect`**.\n\nAlready carrying agent memory in files? **`midas import --from claude-md CLAUDE.md`** (or\n`--from cursorrules`, `--from jsonl`, `--from mem0`, `--from zep`) turns those rules and exports into\nfirst-class, recallable, governable memories — tagged with where they came from, idempotent on re-run.\n\nWant memory even when the agent never calls `capture`? **`midas init --claude-hook`** installs a\nClaude Code SessionEnd hook that offers each session's user turns to memory — Midas's no-LLM policy\nstill decides what is actually kept.\n\n<details>\n<summary><b>Manual setup</b> — any client, or to customize (click to expand)</summary>\n\nMidas is a standard MCP server: point any client at the **`midas-mcp`** command. It uses the shared store\nby default — no path needed. The universal block:\n\n```json\n{ \"mcpServers\": { \"midas\": { \"command\": \"midas-mcp\", \"env\": { \"MIDAS_MCP_EMBEDDER\": \"local\" } } } }\n```\n\n| Client | Where the config goes |\n|---|---|\n| **Claude Code** | `claude mcp add midas -s user -e MIDAS_MCP_EMBEDDER=local -- midas-mcp` |\n| **Cursor** | `~/.cursor/mcp.json` — paste the JSON block |\n| **Claude Desktop** | Settings → Developer → Edit Config (`claude_desktop_config.json`) — paste, restart |\n| **Codex CLI** | `codex mcp add midas -- midas-mcp` |\n| **Grok Build** | `grok mcp add --scope user midas -e MIDAS_MCP_EMBEDDER=local -e MIDAS_MCP_CLIENT=grok-build -- midas-mcp` |\n| **Windsurf** | `~/.codeium/windsurf/mcp_config.json` — paste the block |\n| **VS Code** | user `mcp.json` (`servers` key, `\"type\": \"stdio\"`) — `midas init` writes it |\n| **Gemini CLI** | `~/.gemini/settings.json` (`mcpServers` key) — `midas init` writes it |\n| **Cline** | `cline_mcp_settings.json` in VS Code global storage — `midas init` writes it |\n| **Zed** | `settings.json` → `context_servers` — `midas init` writes it |\n| **Anything else** | point it at command `midas-mcp` |\n| **No Python** | `npx -y midas-memory-mcp` — the [TypeScript port](packages/midas-ts) (experimental; semantic embeddings via optional `@huggingface/transformers`) |\n\nOverride per client with env: **`MIDAS_MCP_DB`** (default `~/.midas/memory.sqlite3`; `:memory:` = ephemeral)\n· `MIDAS_MCP_MAX_RECORDS` · `MIDAS_MCP_MIN_IMPORTANCE` · `MIDAS_MCP_NAMESPACE`.\n\n> ⚠️ **GUI apps don't share your shell `PATH`.** If a client says *\"command not found\"*, use the absolute\n> path from `which midas-mcp`. On Windows use forward slashes in JSON paths.\n\n</details>\n\n**Once connected**, Midas injects a short policy into the agent (*recall first, then capture durable\nfacts/decisions/preferences/constraints/corrections*). The agent captures freely; **Midas decides what's\nkept** — it scores importance (no LLM), drops trivia, skips duplicates, revises stale beliefs, and forgets\nthe low-value tail to stay bounded. Before any memory-justified external or destructive action, the agent\ncalls `check_memory_use` and is **blocked unless you confirmed it** (and that confirmation is still\ncurrent).\n\n### One memory, many clients\n\nBy default every client shares **one live memory** (`~/.midas/memory.sqlite3`) — each detects the others'\nwrites (SQLite `data_version`) and refreshes, so a fact captured in your IDE is recallable from your chat\napp seconds later, no restarts.\n\nWant **per-project** separation instead? **`midas init --project-scoped`** (or `MIDAS_MCP_NAMESPACE=auto`)\ngives each project its own partition in the same store — the scope is derived from the git repo / cwd the\nserver runs in. Or scope it manually per project/agent/user with `MIDAS_MCP_NAMESPACE`.\n\n<p align=\"center\">\n  <img src=\"docs/demo-multi-client.gif\" alt=\"Two live processes share one Midas SQLite file: a recall that finds nothing, a capture from a different process, then the same never-restarted session recalls it\" width=\"820\">\n</p>\n\n<p align=\"center\"><sub>Real run, reconstructed chrome — the capture/recall lines are verbatim output of two separate processes sharing one file.</sub></p>\n\n<details>\n<summary><b>All tools & env knobs</b></summary>\n\n**Tools:** `remember`, `capture` (policy-gated auto-store), `recall` (source-traceable), `build_context`\n(compact, dated, today-anchored prompt block), `resume` (the one-call session-onboarding pack: pinned +\nstate + changes + open loops + conflicts), `memory_state` (current project state), `memory_diff`\n(what changed since), `memory_conflicts` (live beliefs that contradict each other, ranked),\n`open_loops` / `remember_commitment` / `close_loop` (promised work that survives sessions),\n`check_memory_use` (guard), `memory_policy`, `maintain` (TTL + dedup + forgetting, returns a deletion\naudit), `stats`, `forget` (chain-safe), `forget_matching` (topic-level erasure, dry-run by default),\n`forget_all`. Prompts: `memory_session`, `distill`.\n\n**Env:** `MIDAS_MCP_DB` · `MIDAS_MCP_EMBEDDER` (`local` / `hashing` / `multilingual` / any fastembed id) ·\n`MIDAS_MCP_MAX_RECORDS` · `MIDAS_MCP_MIN_IMPORTANCE` · `MIDAS_MCP_NAMESPACE` (`=auto` → per-project scope) · `MIDAS_MCP_ANN=1` (sub-linear\nIVF for huge stores) · `MIDAS_MCP_SUPERSEDE` · `MIDAS_MCP_NLI=1` (NLI-gated revision) ·\n`MIDAS_MCP_AUTO_MAINTAIN=<min>` (idle-time upkeep) · `MIDAS_MCP_PINNED` (pin standing directives) ·\n`MIDAS_MCP_TTL` (per-kind retention, e.g. `chat=30,note=90`) · `MIDAS_MCP_TOKEN` (HTTP bearer auth) ·\n`MIDAS_MCP_KEY` (SQLCipher encryption at rest — `pip install \"midas-memory[encrypted]\"`).\n\n</details>\n\n### Troubleshooting\n\nSomething not wired right? **`midas doctor`** is the one-command diagnosis — it checks `midas-mcp` is on\n`PATH`, that your store opens, whether the local embedder is available, and which clients are actually\nwired, with a fix hint per failed check. It reads config paths and versions only — **no memory contents**,\nso its output is safe to paste into a bug report.\n\n```bash\nmidas doctor          # ✓/⚠ per check, with a hint for each failure\nmidas status          # what's wired + the store's record count\n```\n\n| Symptom | Likely cause & fix |\n|---|---|\n| Client says **\"command not found\"** | GUI apps don't inherit your shell `PATH`. Use the absolute path from `which midas-mcp` in the client config. |\n| **Recall feels weak / lexical** | The offline hashing embedder is in use. Install the local embedder: `uv tool install \"midas-memory[mcp,local]\"` (or `pip install \"midas-memory[local]\"`). `midas doctor` flags this. |\n| A client **doesn't see** another's memory | Confirm both point at the same store — `midas status` shows the path; the wiring receipt (`midas status --json`) shows each client's exact command + env. |\n| **MCP server won't start** | The SDK is installed but the `[mcp]` extra isn't — `pip install \"midas-memory[mcp]\"`. `midas doctor` calls this out specifically. |\n\nStill stuck? Open a [bug report](https://github.com/vornicx/Midas/issues/new?template=bug_report.yml)\n(it pre-fills the `midas doctor` block) or ask in [Discussions](https://github.com/vornicx/Midas/discussions).\n\n---\n\n## Use it from Python (the SDK)\n\n```python\nfrom midas import Memory, LocalEmbedder\n\nmem = Memory(embedder=LocalEmbedder())   # fully local. (Or Memory() for a zero-setup offline embedder.)\n\nmem.remember(\"Decision: the primary database is PostgreSQL.\", kind=\"constraint\", importance=5)\nmem.remember(\"The launch date moved to September 14.\", kind=\"fact\", importance=5)\nmem.capture(\"lol ok cool\")               # filler — auto-scored below the floor, skipped (no LLM)\n\nmem.assemble(\"when do we launch?\", token_budget=128)          # prompt-ready, dated, source-traceable\nfor hit in mem.recall(\"which database did we pick?\", limit=3):\n    print(f\"{hit.score:.2f}  {hit.record.content}\")           # each hit traces to its source\n```\n\n<details>\n<summary><b>Project state & diff · belief revision · forgetting · namespaces · bitemporal · LangGraph</b></summary>\n\n```python\nfrom midas import Memory, LocalEmbedder\nfrom midas.nli import LocalNLI\nfrom midas.sqlite_store import SQLiteStore\nfrom midas.state import memory_state, memory_diff   # the control-plane views\n\n# Durable, shareable, no native extension. Safe across threads & processes (live data_version refresh).\nmem = Memory(store=SQLiteStore(\"memory.db\"), embedder=LocalEmbedder(),\n             supersede=True, nli=LocalNLI())   # a turn that CONTRADICTS an old belief supersedes it\n\n# Control-plane: the current state of a project, and what changed since a point in time (no LLM):\nmemory_state(mem, scope={\"project\": \"apollo\"})          # live, non-superseded decisions/constraints/facts\nmemory_diff(mem, since=last_session_epoch)              # {added: [...], revised: [(old, new), ...]}\n\nmem.forget_decayed(max_records=50_000)         # evict lowest value (importance × recency); protects facts\nmem.recall(\"when is the launch?\", as_of=1_700_000_000)   # bitemporal: \"what did we believe on date X\"\n\n# Right-to-be-forgotten — preview, then erase, with an audit trail:\nmem.forget_matching(\"the user's home address\", dry_run=True)\nmem.forget_matching(\"the user's home address\")\n\n# Back LangGraph's long-term memory with Midas:\nfrom midas.integrations.langgraph_store import MidasStore\nstore = MidasStore(); store.put((\"user\", \"123\"), \"pref\", {\"text\": \"prefers dark mode\"})\n```\n\n</details>\n\n---\n\n## See &amp; control your memory — `midas inspect`\n\nMost memory is a black box of LLM-rewritten facts. Midas is **glass-box**: run a **local** inspector over\nyour store and see exactly what your agent remembers, why, and from what source — then correct, pin, or\nforget it.\n\n```bash\nmidas inspect --db ~/.midas/memory.sqlite3      # opens http://localhost:7777 — local only, zero egress\n# before install:  python -m midas.inspector --db <your.sqlite3> --embedder hashing\n```\n\n- **Overview** — counts, attributability, a 30-day activity chart, and kind/provenance/recency breakdowns,\n  each kind and provenance color-coded *consistently across every view* (a fixed categorical palette,\n  validated for colorblind-safe contrast in both themes — never color-only, every value keeps its label).\n- **Browse + search** every memory (verbatim, with provenance + source), filterable by kind, provenance,\n  and sort order.\n- **Belief history + time-travel** — what you believed, what it superseded, and when.\n- **Project state** (decisions / bugs / forbidden) and **what changed** since a date.\n- **Governance** — would memory authorize an action, and why (the audit trail); **forget** with a receipt.\n- **Conflicts** and **Open loops** — the same control-plane views from `memory_conflicts`/`open_loops`,\n  with one-click resolve/close from the UI.\n- **Audit log** — the hash chain's verification status and its most recent entries.\n- Light + dark themes (a real second theme, not an inverted dark one), keyboard shortcuts (**⌘K** to jump\n  anywhere or search, **/** to focus search), and a responsive layout down to phone width.\n\nAnd every mutation (write / revise / forget) appends to a **tamper-evident, hash-chained audit log**\ninside the store — hashes only, never content. `midas audit` shows it; `midas audit --json` verifies\nthe whole chain and reports the first broken entry if anyone rewrote history.\n\nNo LLM, no account, runs on your file. The thing a black-box memory can't show.\n\n## Free &amp; open source\n\nMidas is **fully free and open source under [MIT](LICENSE)** — the memory engine, the guard, the\nMCP server, the CLI, the inspector, the TypeScript port, and the entire [bench suite](docs/agent-memory-benches.md).\nNo paid tiers, no feature gates, no telemetry, no account. Use it, fork it, embed it in commercial\nproducts — the license permits all of it.\n\nIf Midas is useful to you, the best ways to give back are a ⭐, a\n[reproduced benchmark number](BENCHMARKS.md), a bug report, or a\n[measured contribution](CONTRIBUTING.md) — see the [roadmap](ROADMAP.md) for where help matters most.\n\n## Honest status\n\nMidas is **early** but built narrow and measured-first. Where it stands, plainly:\n\n- **Retrieval is its strength and is essentially maxed** for a no-LLM design — confirmed by our own A/Bs\n  *and* by the frontier papers (the retriever is not the bottleneck). The benchmark numbers above are the\n  result.\n- **The frontier's extra lever is structure-preserving extraction — and it needs a capable model Midas\n  deliberately won't run at ingest.** We built the judged harness and measured it on BEAM's summarization\n  category: a small local extractor doesn't help (raw 0.28 vs replace 0.07 rubric coverage), and the lift\n  is gated on a strong model — so it belongs to *the agent's* model, not Midas's. The optional distillation\n  dial ships **off by default**; we don't claim it as a win. (Details: [`docs/frontier-2026.md`](docs/frontier-2026.md) §2b.)\n- **Where it's heading:** from recall to a **governed memory control-plane** — `memory_state` / `memory_diff`,\n  the provenance guard that won't act on stale or unconfirmed memory, and the\n  [Agent Continuity Bench](eval/continuity.py) that measures those properties. Local, auditable, and\n  honest about what's proven.\n\n## The eval harness\n\n`eval/` (dev-only) runs Midas and competitors through synthetic / LoCoMo / LongMemEval / multiday /\nconflicts-v1 / **BEAM** with deterministic `recall@k` + `precision@k`, cost/latency instrumentation, a\n**dumb-reader ablation** (proves the numbers aren't reader-inflated), and an optional local-or-hosted LLM\njudge. The anti-cheating checklist (no query rewriting, no LLM at ingest, no gold leakage, seeded sampling),\nconflict handling, failure traces, and the verbatim MCP policy are in\n[`docs/methodology.md`](docs/methodology.md).\n\n```bash\npython -m eval.runner --dataset longmemeval --variant s --local --midas-no-rerank --max-questions 40\npython -m eval.runner --dataset beam --beam-tier 100K --local --dumb-reader   # frontier benchmark\npython -m eval.continuity                                                      # Agent Continuity Bench\n```\n\n## Privacy & license\n\nLocal-first: every memory lives in a SQLite file on your machine, recall returns the exact stored text,\nand capture/recall/forget make **no network calls**. No account, API key, or telemetry. The only outbound\ntraffic is a one-time embedding-model download (for the `local` backend) and the package install.\nOptional **encryption at rest**: set `MIDAS_MCP_KEY` with the `[encrypted]` extra and the store is a\nSQLCipher database — unreadable without the key (and Midas fails closed rather than silently writing\nplaintext). Full details in [`PRIVACY.md`](PRIVACY.md) · [MIT](LICENSE).\n",
  "bytes": 23572,
  "sha": "a668aaa634ba18d3e8e38f7dc5ecc24063b79548637b74008954b9f0c29510f1",
  "repo_slug": "vornicx/midas",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vornicx_midas_d9246152/readme"
}