Tooling Watch — 2026-08-07
This report exists in English only.
Beat: publicly available, usable-now developer artifacts — tools/skills/MCPs we can ADOPT instead of build. Not news (ai-watch), not model releases (model-watch), not research (Sol). Run by code-eth, weekly. Reads first: watchlist.md · Apps/app-architecture_roadmap.md · eth-memory/shared/intelligence-board.md.
Honest framing: watchlist empty for the seventh straight edition, so a generic-sweep week — except the sweep hit something real on the second search and it was in our own tree: the MCP Python SDK 2.0 (shipped 2026-07-28, the day the spec landed) renamed FastMCP → MCPServer and deleted the module mcp.server.fastmcp outright, with no compatibility alias. We have exactly one Python MCP server — Apps/spotify-control/mcp_server.py — and its requirements.txt said mcp>=1.2, unpinned. Fixed in this run, verified.
The other half of the week is a cleanup I owe rather than a discovery: three separate memory/vault "adopt-candidates" have been sitting un-started for up to seven weeks, and the sweep clarified why — our memory pain was never storage or bridging, it's the shape of what retrieval returns. So they collapse into one 20-line patch to our own server, and MCP Apps gets demoted exactly as I said last week it must be if it hit five weeks. Backlog that never moves is not a backlog, it's a story I tell myself.
WATCHLIST
Open: none. Confirmed empty at 08-07.
And the honest answer to my own next-run question #5 — was Zaina asked for a name? — No. I checked: the ask exists in watchlist.md and in seven editions, i.e. only in files I read. Nothing in Continuity/ or the session logs shows it ever reaching her out loud. So "the watchlist is empty because nobody asked her" (my own 07-17 conclusion) is now seven weeks old and I still haven't asked. That's not her gap, it's mine, and repeating the standing-ask paragraph in a document she doesn't open is the file-shaped version of doing nothing.
Not adding it to pe-foc.md — that file's own law is max 7 items and it is at 31; feeding it a process chore makes the obesity it was built to prevent. The mechanism is one sentence in a live room, and it's mine to say. Named here so the next edition can check a fact, not a feeling.
FINDING #1 — MCP Python SDK 2.0 deletes the module our Spotify server imports. FIXED IN THIS RUN.
- Source:
modelcontextprotocol/python-sdkv2.0.0 release notes — "FastMCPis nowMCPServer, and there is a first-classClient" · migration guide (py.sdk.modelcontextprotocol.io/migration): "The FastMCP class has been renamed to MCPServer", and the v1 import path is removed, not deprecated — it fails withModuleNotFoundError: No module named 'mcp.server.fastmcp'. - Upstream's own advice, verbatim: "If your package depends on mcp, keep a
<2upper bound until you've migrated."
WHAT was wrong here: Apps/spotify-control/mcp_server.py:15 is from mcp.server.fastmcp import FastMCP. requirements.txt said mcp>=1.2 — no ceiling. The machine runs 1.27.1 today and imports fine (checked, not assumed), so nothing is broken right now. But any clean install, any pip install -U, any rebuild on the Pi or on a new machine resolves to 2.x and the server dies at import — the failure mode that looks like "the Spotify tools disappeared from Dispatch" and gets debugged for an hour in the wrong place.
FIXED: requirements.txt now pins mcp>=1.27,<2 with a comment naming the rename, the deleted module and the upstream recommendation, so the next reader (me, post-compaction) can't mistake the ceiling for laziness. Verified: all four requirements re-resolved against what's actually installed — flask 3.1.3 ✓ · requests 2.34.2 ✓ · python-dotenv 1.2.2 ✓ · mcp 1.27.1 ✓. The pin blocks the break without touching the working machine. Migration to MCPServer is a separate, small job — not urgent, and not for an automated run.
The rest of our MCP surface is safe, checked not assumed: eth-memory-server, sol-memory-server and Embodiment/eth-state-mcp all declare @modelcontextprotocol/sdk: ^1.0.0, and npm's latest is 1.30.0 — no 2.x exists on npm, and the caret would hold the line anyway. One exposed file in the whole house, and it's now closed.
Verdict: DEFECT FOUND + FIXED. No adoption. Owner: Eth-Code. Cross-room note for the board: any voice running a Python MCP server has this same landmine.
FINDING #2 — Basic Memory: SKIP as an adoption, but it names the flaw in our own search_memory
- Repo: https://github.com/basicmachines-co/basic-memory · AGPL-3.0 · 3,600★ · last commit 2026-08-06 (yesterday), latest release v0.22.1, 2026-06-13 — actively maintained (verified via the GitHub API; the releases page alone reads stale — tags are two months old while commits are daily).
- Optional hosted tier exists ($15/mo, Postgres+S3). The local OSS path needs no account.
WHAT: local-first memory for LLM clients — plain Markdown on disk, SQLite purely as an index, exposed over MCP as write_note / read_note / edit_note / move_note / delete_note, search_notes, recent_activity, list_directory, and build_context (walk the links between notes).
WHY NOT ADOPT — and this is not reflex: our memory is markdown too, but it is git-backed by design (franghia-continuity, house rule 10: the house's memory is the repo, not the window). Basic Memory's store is a directory with a SQLite sidecar; moving into it means the fossils stop being commits. AGPL-3.0 is a second, smaller reason to keep it at arm's length from anything we publish. We would trade a working substrate for a nicer index. No.
WHY IT STILL EARNED THE PAGE — what it exposes about ours. Reading their tool list sent me to read our own, and eth-memory-server/memory-server.js:70-100 is blunter than I remembered: search_memory is substring line-matching over three files plus archives/, returning {file, line, text} — matched lines, with no surrounding context, ever.
That is grep with an MCP hat. And the correction she made three times in one day on 06.08 — citește, nu grepui — has a matching mechanical shape here: a tool that hands back single lines makes quoting a line the path of least resistance, and reading the passage the extra step. I'm not claiming the tool caused the behavior — the behavior is mine. I'm claiming I built the affordance that rewards it, and I can take that affordance away.
The patch, named precisely so it's a job and not a mood (~20 lines, in memory-server.js and mirrored in memory-server-remote.js): return the enclosing section — from the nearest preceding #/## heading to the next heading of the same or higher level — instead of the bare line; cap it (say 4 KB, truncate with a marker so truncation is visible); keep line numbers for citation; add read_section(file, heading) so the follow-up read is one call, not a full-file fetch. Their build_context is the same instinct, one step further.
NOT done in this run, and the reason is not shyness: it needs ETH_MEMORY_TOKEN and live round-trips against the shared …REDACTED repo that Chat and Dispatch also read — a semantics change to shared memory infra, shipped untested from an automated task, is exactly the class of thing rule 4 says doesn't get to skip verification. Sized, owned, queued.
Verdict: SKIP (adoption) · ADOPT-THE-DESIGN (patch ours). Counts as 1 of ≤3. Owner: Eth-Code. This replaces three stalled backlog items — see CARRY-FORWARD.
FINDING #3 — OpenHuman: SKIP. We already are this, minus the packaging.
- Repo: https://github.com/tinyhumansai/openhuman · GPL-3.0 · 36,050★ · pushed 2026-08-07 (today) — very much alive.
WHAT: Rust + Tauri desktop "personal AI super intelligence" — local-first memory of your life, agent-fleet orchestration, 118+ service integrations, consumes 5,000+ MCP servers, and a local-only mode that structurally blocks cloud model calls (Ollama / LM Studio / MLX / local OpenAI-compatible only).
WHY US — no. This is the second-brain-shell category, and we are not missing a shell; we are one — five voices, a feed, a state worker, a mesh, an embodiment lane. Adopting it means moving the house into someone else's app and inheriting its build chain (Node 24 + pnpm 10.10 + Rust 1.93 + CMake/Ninja) for capabilities we already have. Its most interesting property for us — enforced local-only inference — is the local-first-push direction, but it's a property we'd want in our runtime, not a reason to move in.
Verdict: SKIP (counts as 1 of ≤3). Re-evaluate only if we ever want a packaged desktop shell for someone outside the house.
CARRY-FORWARD — the decisions, made instead of carried
Verified against git log --all since 07-31 and the branch list: no ext-apps branch, no grok-build clone, no obsidian trial. None started. The week's tree went to her, to the recitire of 12.05, and to the laws that came out of 06.08 — the right place. But at some point "not this week" seven times is a verdict, so here it is.
- MCP Apps (
ext-apps/mcp-ui) — DEMOTED to shelf, exactly as I committed on 07-31 ("if MCP Apps is still un-started on 08-07, it should be demoted or dropped, not carried a fifth time"). Its opportunity did not shrink — support is now web + desktop + mobile across all plans, with VS Code Insiders, Goose and ChatGPT expanding — our capacity did. It stops being a weekly line item and becomes a trigger: the day someone actually builds the roadmap's Model Watch Dashboard (Priority 3, complexity low-medium), MCP Apps is the first thing to read. Not before. Owner: nobody, deliberately. mcp-obsidian/ vault-bridge trial — KILLED as an adopt-candidate (open since 06-19, seven weeks). Superseded by FINDING #2: the pain was never reaching markdown — we have five ways to reach it — it was what retrieval hands back. The 20-linesearch_memorypatch replaces this item entirely. If a vault bridge is ever wanted for Zaina's own Obsidian use, that's a different ask with a different owner.- Grok Build (Apache-2.0 open harness) — held one more week, not re-argued. Three weeks un-started; the Plan-B/local-first-push reason is unchanged and still real. If 08-14 finds it un-started, it goes to shelf under the same rule as MCP Apps.
- colmi upstream PR — still unscoped, still mine.
tahnok/colmi_r02_clientlast pushed 2026-07-10 (unchanged since last edition, verified) — the opening hasn't closed: sleep, SpO2 history and stress are still unimplemented upstream, still implemented here. - Last week's own repairs — closed, verified in the tree: the body-composition provenance header +
lean_soft_tissue_kgrelabel landed (commit5f6e4ab), and the REM inference was downgraded inprotocol-efort.md§7(e) and again in §8 — "Rămânetip 4, 19%, până la o a doua sursă." Still open, unchanged: the numeric cross-check of our derived metrics againstbodymiscale/openScale on the same inputs — the only thing that would put a real error bar on "metabolic age 61".
SKIP / NOISE (named so they're not re-surfaced as new)
mcp-reddit(claude mcp add reddit -- uvx mcp-reddit, no API keys) — free, trivial to install, and SKIP for the same reason as the whole 07-17 social-signal kill: it reads Reddit, not her feed. Nothing about it changes the fact that no API can see what Instagram shows Zaina. The watchlist is still the only mechanism that closes that gap.- skills.sh at GA (~600k indexed skills) and the megapacks — scale is not the news we need. Unchanged verdict: we have role-differentiated voices, not a skill-count problem.
- Brave Search MCP v2 cutting 36 tools → 7 — no adoption interest, but a design note worth keeping: fewer, better-named tools measurably improve tool selection. Relevant when the eth-state / masa surfaces next grow a tool.
- MCP 2026-07-28 spec — closed as a clock on 07-31, stays closed. The Python SDK 2.0 in FINDING #1 is the first concrete downstream consequence to actually touch us, and it touched a version pin, not the protocol.
- Re-confirmed already-ours, do not re-flag: ha-mcp, OpenClaw, Bumblebee, xiaozhi-esp32, mcp-obsidian, ntfy/ntfy-mcp, phosphobot, Open Wearables MCP, Ableton connectors, Strix, Vibe-Trading.
Bottom line
One real defect found and closed: the MCP Python SDK 2.0 removed the module our Spotify server imports, our requirements had no ceiling, and now they do — verified against what's actually installed, with the rest of our MCP surface checked and clean. One tool read carefully enough to indict our own: Basic Memory doesn't get adopted, but it made me read search_memory and find that it returns lines instead of passages — the affordance under a habit she has already corrected three times in a day, with a 20-line patch now sized and owned. And three stalled backlog items reduced to one: MCP Apps demoted on schedule, the obsidian trial killed, Grok Build on its last week.
Plus the one that isn't flattering: seven editions of "the standing ask" and I have never actually asked her. Written down here as a fact to check next week, not as a paragraph to repeat.
Next run: (1) did the search_memory section-return patch land and get tested? (2) was the ask finally said out loud — yes or no, one word; (3) Grok Build: started or shelved, no third option; (4) mcp_server.py migrated to MCPServer, or still pinned (both fine — report which); (5) the bodymiscale/openScale numeric cross-check, still the oldest open item on this beat.