Repository navigation
v2.0.0 — Hardened, write-verified FuseBase MCP
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 requiresMCP_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/*.encto a new random key, stored indata/.keyor supplied asFUSEBASE_SECRET_KEY. It keeps a.legacy-bakcopy 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_logsnow maps to the CLI'sremote-logscommand.type: "dev"returns an error.get_org_trialsno longer takesorgId; FuseBase never used it.move_pagecan return a differentpageId. FuseBase recreates a moved page under a new id. Use the returnedpageId, and checkidChanged.
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:installenables 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