Skip to content

v2.0.0 — Hardened, write-verified FuseBase MCP

Choose a tag to compare

@ryan-haver ryan-haver released this 25 Sep 15:19
19da7d6

v2.0.0 is a hardening release. It follows a full review of the server (remediation plan).

Every change was tested against a live FuseBase workspace. In the live suites, each write is now proven by reading the stored data back. That found several tools that reported success without storing anything, and they are fixed here.

⚠️ Breaking changes

  • HTTP transport is locked down. It listens on loopback (127.0.0.1) by default. Listening on any other address requires MCP_AUTH_TOKEN, which clients send as a bearer token. Requests are also checked for an allowed Host and Origin (MCP_ALLOWED_HOSTS, MCP_ALLOWED_ORIGINS).
  • Saved credentials are re-encrypted. The first start migrates data/*.enc to a new random key, stored in data/.key or supplied as FUSEBASE_SECRET_KEY. It keeps a .legacy-bak copy of each file. Restart any server started before the upgrade, and keep the key: without it, the saved credentials can't be read.
  • Docker image moved to Node 22. The image no longer bundles anything from data/; mount it as a volume.
  • fusebase_cli_logs now maps to the CLI's remote-logs command. type: "dev" returns an error.
  • get_org_trials no longer takes orgId; FuseBase never used it.
  • move_page can return a different pageId. FuseBase recreates a moved page under a new id. Use the returned pageId, and check idChanged.

Fixed: tools that reported success without doing the work

Tool Problem
move_page Returned the old id, which no longer exists after a move. Moves "to root" were silently ignored; they now go to the top level.
publish_page_to_portal Never published or unpublished: FuseBase ignored the field it sent.
update_page_content (replace) Could leave behind content appended just before it.
add_database_row Returned no row id when no values were given.
get_comment_threads Returned comment counts only. It now returns each comment's text.
duplicate_database, create_view, search_tasks Ignored title, the view type/grouping, and query.
fusebase_swarm_task_transition Didn't store its audit comment or hand-over. It now writes both to the swarm board.
list_folders Dropped subfolders.

Security

  • Path traversal and CLI argument injection are fixed. Page content fetched into prompts is marked as untrusted.
  • Error messages from FuseBase no longer pass on its internal request details.
  • New 1Password support. Keep secrets in 1Password and start with op run --env-file=.env, or load a 1Password Environment with a read-only service account. See docs/1PASSWORD.md.

Reliability

  • One request path for every API call: timeouts, a single shared session refresh, and truncated or HTML responses treated as errors, not data.
  • No duplicate writes when a request fails over to Gate. No formatting bleeding between text runs.
  • Page content survives a read → write round trip (tables, nested blocks, checklists).
  • Page writes are confirmed against FuseBase before the tool reports success.
  • The active profile is per session in HTTP mode.

Testing

  • npm run hooks:install enables a gate. Each commit runs the offline checks (typecheck, lint, build, unit tests, tool audit). Each push also runs the live suites against a sandbox workspace, and every write must be proven by a read. A sweep then checks nothing was left behind. See docs/TESTING.md.
  • CI runs the offline checks on Node 22 and 24.
  • For this release, all seven live stages pass, and the Docker image was tested live.

Full change list: PR #2 and PR #3 · v1.0.0…v2.0.0