Skip to main content
Fracta ships a curated catalog of MCP server definitions and a 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:
  1. The catalog — a tree at <root>/mcp-servers/ containing one server.yaml per MCP server fracta knows about. Operator-owned, git-tracked, edited like any other config.
  2. Your scaffold — the per-mode files fracta init wrote (fracta.yaml, plus deployment/docker-compose.yml or deployment/k8s/manifests/ depending on the mode).
  3. 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:
Three commits land on your repo: the scaffold (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

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

Every add shows you what it’s about to do and waits for confirmation:
Pass --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 fetched mcp-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.yaml makes 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.yaml alongside the fetched ones; fetch --merge preserves 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 deliberately does not bake the catalog into the binary. 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: After a successful non-merge fetch, the source is recorded in mcp-servers/.fracta-source. Subsequent fetch calls without arguments use the recorded source rather than the global default.

Replace vs merge

By default fetch 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

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.
Authoring loop for the org admin:
Operators on the team then run:
For CI reproducibility, pin a specific archive sha256 via the HTTPS tarball form:

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:
To incorporate remote-only entries, run 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 under fracta config mcp auth:
These are the same runners that used to live at fracta mcp <verb> — the deprecated alias still works for one minor release.

What’s next