Commits a cluster of entangled agap-mcp / Adolf-tooling WIP that had accumulated
uncommitted in shared files (server.js, the three MCP-config layers). Bundled as
one commit because server.js interleaves all of it and cannot be cleanly split;
each stream is named here for the record. Authorized by alvis 2026-07-23.
- **kb#95 — family MediaWiki tools:** new src/mediawiki.js (wiki_search / wiki_read
/ wiki_edit, MediaWiki login->CSRF->edit flow, no new deps), registered in
server.js and fetched from the family.alogins.net Vaultwarden login item.
Proven standalone against family.alogins.net (search/read/edit, revid 1520 on a
bot-userspace page). Wired into all three layers: openai/shared-mcp.json,
adolf/openclaw.json, openai/agent-registry.yaml.
- **kb#147 — vault trust-gate (A2A-15), DORMANT:** new src/trust-gate.js (+ two
test files), requireVaultAccess() around the vw_* tools, gated by
AGAP_MCP_ENFORCE_VAULT_TRUST (docker-compose.yml, default 0). OFF by default —
vw_* behaviour is byte-for-byte unchanged until an operator sets ENFORCE=1 and
populates AGAP_MCP_AGENT_TOKENS from Vaultwarden. That activation is a separate
human step; kb#147 remains escalated for human verification and is NOT verified
by this commit. js-yaml added to read the registry. agent-registry.yaml mounted
read-only as the trust-class source of truth.
- **Todoist tools:** new src/todoist.js (initTodoist + 6 todoist_* tools),
registered in server.js, sourced from the TODOIST_TOKEN Vaultwarden item.
- **kanboard cutover cleanup:** removes src/kanboard.js and its imports — the
kanboard_* slice moved to the standalone kanboard-mcp on 2026-07-06.
- **openai/validate_capability_grants.py:** cross-checks the registry against the
live openclaw.json + shared-mcp.json layers; passes (exit 0).
No secrets committed: all tokens come from Vaultwarden via env/.env; the trust
gate's AGAP_MCP_AGENT_TOKENS defaults to `{}` (fail-closed). node_modules/ now
gitignored, package-lock.json tracked.
NOT YET ACTIVATED: agap-mcp has not been rebuilt and adolf-llm/adolf not
restarted, so the wiki/todoist tools are wired but not live. That restart is the
outstanding step on kb#95 (and stays a human/orchestrator action).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adolf — OpenClaw gateway deployment
Adolf is the self-hosted OpenClaw fork that runs as the adolf container
(Matrix-first personal assistant). This directory holds its version-controlled
gateway configuration.
- Source tree (the OpenClaw fork being built):
/home/alvis/adolf - Compose service
adolflives in:openai/docker-compose.yml - This config directory lives at the repo root (
agap_git/adolf/), not nested insideopenai/, since it is shared config rather than part of theopenaicompose project's own tree. - Model backend:
adolf-llmcontainer (Kimi-CLI wrapper) on:8010
Config source of truth
The gateway config is openclaw.json in this directory. It is bind-mounted
read-only over the adolf-state volume:
volumes:
- adolf-state:/home/node/.openclaw # runtime state only
- ../adolf/openclaw.json:/home/node/.openclaw/openclaw.json:ro # tracked config
Previously this file was a hand-edited copy inside the adolf-state Docker
volume (edited via docker cp into the running container). It is now tracked
in git and seeded into the container by the mount, so git is the single
source of truth.
- The file is JSONC (comments + unquoted keys allowed).
- No secrets live here. Every credential is a
${VAR}reference resolved from the container's environment, which is sourced fromopenai/.env(gitignored, never committed):OPENCLAW_GATEWAY_TOKEN,ADOLF_KEY,MATRIX_*,MARKETPLACE_MCP_TOKEN. - The gateway reads this file and writes its own
openclaw.json.last-goodandopenclaw.json.rejected.*snapshots into the volume dir (writable). It does not rewrite this file, so the read-only mount is safe.
Changing the config
- Edit
agap_git/adolf/openclaw.json. - Restart the container:
env -u HTTPS_PROXY -u HTTP_PROXY -u ALL_PROXY -u https_proxy -u http_proxy -u all_proxy \ docker compose -f /home/alvis/agap_git/openai/docker-compose.yml up -d adolf - Verify it came up healthy and the config was accepted:
A fresh
env -u HTTPS_PROXY -u HTTP_PROXY -u ALL_PROXY -u https_proxy -u http_proxy -u all_proxy \ docker ps --filter name=adolf --format '{{.Names}} {{.Status}}' env -u HTTPS_PROXY -u HTTP_PROXY -u ALL_PROXY -u https_proxy -u http_proxy -u all_proxy \ docker logs --tail 40 adolfopenclaw.json.rejected.*file in/home/node/.openclawmeans the edit failed validation and the previous.last-goodis still in use.
Because the mount is read-only, editing config through the gateway UI/API is intentionally disabled — all changes go through git.
Granting a Matrix user access to Adolf
Adolf only responds to Matrix users on an allow-list. This is the
channels.matrix.dm block in openclaw.json:
channels: {
matrix: {
enabled: true,
encryption: true,
dm: {
policy: "allowlist",
allowFrom: [
"@admin:mtx.alogins.net",
"@elizaveta:mtx.alogins.net",
],
},
groupPolicy: "disabled", // no group-room handling yet
autoJoin: "always",
},
}
dm.policy: "allowlist"— only users whose full Matrix ID appears inallowFromcan DM the bot. Everyone else is ignored. (policy: "pairing"is the alternative: the owner must approve each unknown sender interactively.allowlistis stricter and declarative.)dm.allowFrom— the list of authorized Matrix user IDs.groupPolicy: "disabled"— Adolf does not act in group rooms; DM only.
To grant a new user access
- Get the user's full Matrix ID, e.g.
@ivan:mtx.alogins.net. - Add it to
allowFrominagap_git/adolf/openclaw.json:allowFrom: [ "@admin:mtx.alogins.net", "@elizaveta:mtx.alogins.net", "@ivan:mtx.alogins.net", ], - Restart adolf (see "Changing the config" above).
- The user can now start a DM with Adolf's Matrix account
(
MATRIX_USER_IDinopenai/.env).autoJoin: "always"means Adolf auto-accepts the DM invite; conversation is end-to-end encrypted (encryption: true).
To revoke access, remove the ID from allowFrom and restart.
Matrix accounts themselves are created on the Synapse homeserver (
mtx.alogins.net) — see the AgapHost wiki Matrix page. The allow-list here only controls which existing Matrix users Adolf will talk to.