fracta config mcp command suite that turns them into per-mode deployment config. This page is the operator narrative: when to use which verb, what gets committed where, and how org-private catalogs fit in.
For the exhaustive flag reference, see fracta config mcp. For the schema of a server.yaml entry, see MCP Servers Catalog.
The mental model
Three things to keep separate:- The catalog — a tree at
<root>/mcp-servers/containing oneserver.yamlper MCP server fracta knows about. Operator-owned, git-tracked, edited like any other config. - Your scaffold — the per-mode files
fracta initwrote (fracta.yaml, plusdeployment/docker-compose.ymlordeployment/k8s/manifests/depending on the mode). fracta config mcp— the CLI that reads (1) and mutates (2) on your behalf.
fetch populates (1). add reads (1) and writes (2). Both are reversible.
The default workflow
From a fresh project:fracta init), the catalog (fetch), and each server (add). Reviewing those PRs is the whole point — your team sees exactly which image, which auth mode, and which endpoint is being introduced before it hits production.
What add writes per mode
| Mode | Files touched |
|---|---|
local | fracta.yaml only (inserts mcp_servers.servers.<id>.local) |
docker-compose | fracta.yaml + deployment/docker-compose.yml + .env.example |
k8s | fracta.yaml + deployment/k8s/manifests/<id>-mcp.yaml + deployment/k8s/manifests/<id>-mcp-secret.yaml (if the server needs env vars) |
add refuses to run if the scaffold for the chosen mode isn’t present — the error names the prereq command (fracta init --scaffold <mode>) verbatim.
The pre-flight summary
Everyadd shows you what it’s about to do and waits for confirmation:
--yes in CI. Pass --dry-run to see the summary without writing.
Removing a server
fracta config mcp remove <server> reverses an add: it deletes the per-mode manifest and removes the mcp_servers.servers.<id> block from fracta.yaml. The result is byte-identical to the pre-add state (modulo filesystem timestamps).
If add fails partway through a multi-file write, the rollback is automatic — transient .bak files restore the original content and are then removed. After a successful add, no .bak files remain on disk.
Why the catalog is checked in
The fetchedmcp-servers/ directory is first-class config, not a cache. It belongs in git for three reasons:
- Audit. Reviewers should see the image refs and OAuth endpoints before they ship. A git diff on
mcp-servers/elastic/server.yamlmakes that review trivial. - Local entries. Operators routinely add servers that aren’t in the canonical catalog — an internal CRM MCP, a vendor-specific bridge. Those live as
mcp-servers/<id>/server.yamlalongside the fetched ones;fetch --mergepreserves them. - Reproducibility. The catalog’s
version:field bumps over time. Pinning a specific version in git means everyone on the team runs against the same definitions.
fracta config mcp list errors with a clear remediation if <root>/mcp-servers/ is missing:
Catalog sources
fracta config mcp fetch [<source>] accepts the same syntax everywhere fracta takes a source:
| Form | Example | Notes |
|---|---|---|
| Default (canonical) | fracta config mcp fetch | Equivalent to github:darkquasar/fracta@main |
| GitHub repo | fracta config mcp fetch github:acme/fracta-cat@v1 | Tag, branch, or sha after @ |
| Browser-pasted URL | fracta config mcp fetch https://github.com/acme/fracta-cat | Trailing slash and .git suffix tolerated |
| SSH form | fracta config mcp fetch git@github.com:acme/fracta-cat.git@v1 | Pasted from git remote -v; fetched over HTTPS regardless |
| Raw tarball | fracta config mcp fetch https://example.com/cat.tar.gz | Expects mcp-servers/ at archive root |
| Local directory | fracta config mcp fetch ./internal-cat | Reads <path>/mcp-servers/ |
mcp-servers/.fracta-source. Subsequent fetch calls without arguments use the recorded source rather than the global default.
Replace vs merge
By defaultfetch is replace: the existing mcp-servers/ is removed and rewritten from the source. Pass --merge to overlay the source’s entries on top of what you have, preserving local-only entries by id. Merge does not update .fracta-source — it’s a one-shot overlay, not a primary-source change.
Trust boundaries
| Source | Trust |
|---|---|
github:darkquasar/fracta@main | The darkquasar/fracta GitHub repo. Pin with --source-checksum if using the tag-archive HTTPS form. |
| Custom github source | The org or user that owns the repo. |
| HTTPS tarball | The host serving it. --source-checksum sha256:... recommended. |
| Local directory | You. |
add is interactive by default and shows every image ref before writing — operators audit at the moment of adoption, not as a separate exercise.
Org-private catalogs
Mirror the canonical schema (catalog.yaml + mcp-servers/<id>/server.yaml) in any GitHub repo, HTTPS tarball, or local directory. There’s no fracta-side registration — the source spec is the entire interface.
Diffing local vs remote
fracta config mcp list --remote compares the local catalog against the canonical remote without writing anything. Use it as a “what’s new upstream” check before deciding to refetch:
fracta config mcp fetch --merge (preserves local-only) or fracta config mcp fetch (wholesale replace).
OAuth-protected servers
Some MCP servers (Notion, Readwise, Google Drive) authenticate via OAuth rather than env tokens. The credential flow stays underfracta config mcp auth:
fracta mcp <verb> — the deprecated alias still works for one minor release.
What’s next
fracta config mcpreference — every flag, every subcommand.- MCP Servers Catalog reference —
server.yamlschema, the bundled entries. fracta mcp(deprecated alias) — old top-level verbs and the remapping table.

