The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the SpecMgr listing page.
An artifact manager for system specifications.
This project is an MCP server that you can use to manage different specification artifacts.
At this time, we have these artifact types:
See MCP Server and docs/MCP.md for details.
The MCP server (and the management CLI) are optional. You install them as "extras" (see Installation).
As a library only (no CLI, no MCP server):
With the CLI:
With the MCP server:
Or with uv:
With the CLI you can generate schema and documentation. We use these commands
in pre-commit hooks and ci.yml.
No domain document-management commands (create/update/status/etc.) exist
in the CLI yet — those are currently MCP-only, see
MCP Server. The CLI covers version, mcp (below), and a
handful of cross-cutting/doc-generation commands (specmgr --help for the
full list).
Requires the mcp extra. The server exposes resources, tools, and prompts
for document management, plus cross-cutting utilities (e.g. markdown
formatting).
The full, up-to-date list of every resource, resource template, tool, and
prompt — with parameters, MIME types, and descriptions — lives in
docs/MCP.md. That document generated from the live server
registration by specmgr mcp-docs and kept in sync by a pre-commit hook and
a CI check.
Every document type stores its .md files in a base directory on disk —
the file is always the source of truth, re-read and re-parsed on every
tool call, so hand-editing a file between calls is safe.
docs/adr, configurable via the
SPECMGR_ADR_DIR environment variable. This is ADR-specific and not
shared with other document types.SPECMGR_DOCS_DIR environment variable (default
docs), with each type's own subdirectory appended automatically (e.g.
docs/req for requirements)..specmgr/feat, configurable
via the SPECMGR_FEAT_DIR environment variable. This is FEAT-specific,
like ADRs above, and not shared via SPECMGR_DOCS_DIR.confluence_fetch tool (renamed from webfetch; bearer-authenticated,
URL-filtered HTTP GET, intended primarily for Confluence instances using
PAT authentication) requires two environment variables:
SPECMGR_CONFLUENCE_BASE_URL (the base URL requested URLs must
case-insensitively start with) and SPECMGR_CONFLUENCE_BEARER (the
bearer token sent as the Authorization header). Both must be set or the
tool raises an error; there are no defaults.All of the base directories above are resolved relative to the MCP server
process's own current working directory unless overridden by their env var
(or, for the shared SPECMGR_DOCS_DIR root, unless the server was started
with --directory/uv run --directory targeting your project). If that
CWD is not what you expect — e.g. after adding specmgr to an MCP host
per Add to OpenCode below — read the specmgr://config
resource to see every domain's actually-resolved absolute base directory
and whether its env var is explicitly set, without needing shell access to
the server's host.
Start the server with the mcp command:
By default it runs over stdio, for MCP hosts that launch it as a
subprocess (see Add to OpenCode below). It can also
run over SSE/network:
Or over the spec-current streamable-http transport, which replaces the
legacy/deprecated sse transport for HTTP deployments:
| Option | Env var | Default | Description |
|---|---|---|---|
--transport / -t | SPECMGR_MCP_TRANSPORT | stdio | Transport mode: stdio, sse, or streamable-http |
--host / -h | SPECMGR_MCP_HOST | localhost | Bind address (SSE/streamable-http mode only) |
--port / -p | SPECMGR_MCP_PORT | 8000 | TCP port (SSE/streamable-http mode only) |
To add the specmgr MCP server to your OpenCode configuration:
Open your OpenCode config file (typically ~/.config/opencode/opencode.json or ~/.config/opencode/opencode.jsonc)
Add a configuration to the mcp section (and use it via stdio).
A bare uvx --from biz-dfch-specmgr[mcp] specmgr mcp command with no
--directory and no SPECMGR_*_DIR env vars is unsafe: the server
resolves every base directory (docs, docs/adr, .specmgr/feat, ...)
relative to its own process's current working directory, which an MCP
host is free to launch from anywhere — not necessarily your project
root. Pick one of the two options below instead of the plain form:
Option A — pin the working directory with --directory (a global
uv/uvx flag, so it must come before --from):
Option B — set the directory env vars explicitly instead of (or in
addition to) --directory:
Either option (or both together) makes the resolved base directories
independent of wherever the MCP host happens to launch the server
from. Whichever you choose, you can confirm it worked by reading the
specmgr://config resource, which reports the actually-resolved
absolute base directory for every domain and whether its env var is
explicitly set.
Save the file and restart OpenCode
uv sync only installs Python dependencies into the venv — it never
registers the hooks from .pre-commit-config.yaml with git, so run
this once per clone before your first commit.
You can exercise the MCP server directly with the MCP Inspector, in either its CLI (scriptable) or TUI (interactive terminal) client.
mcp extra installed (see Installation), so
.venv/bin/specmgr exists.npx (ships with Node.js,
version 22.19.0 or newer) — no separate Inspector install is required, it
runs on demand via npx @modelcontextprotocol/inspector.Point the Inspector at the venv's specmgr binary directly (rather than at
uv run specmgr mcp) so none of uv run's own flags (e.g. --frozen) are
mistaken for Inspector flags:
Each CLI invocation connects, runs one request, prints the result, and exits — useful for scripting or a quick smoke test.
Get the specmgr://version resource:
List task lists via the list_tsk tool:
Get one task list via the get_tsk tool (replace <id> with a real task
list id from the list_tsk output above):
Add --format json to any of the above to get machine-readable output,
e.g. piped into jq.
This launches the server as an ad-hoc stdio target and opens the terminal
UI with it preselected (unlike the CLI, the TUI has no --server <name>
flag — it lists whichever servers are available and you pick one, though
with a single ad-hoc target there is nothing else to pick). Press c to
connect, then use the tabs to explore:
t — Tools tab: browse and call tools (e.g. get_tsk) with a
form-based input.r — Resources tab: browse and read resources (e.g.
specmgr://version, specmgr://iso25010).m — Prompts tab: list and render prompts.p — Protocol tab: raw JSON-RPC request/response history, useful
for debugging.o — Console tab: stderr from the connected specmgr mcp
process (tracebacks land here).c / d — connect / disconnect; Esc or Ctrl+C — exit.The TUI requires a real TTY (raw-mode support) and does not run in a headless CI job — use the CLI client there instead.
The normative release procedure is the SOP
Perform a release of biz.dfch.SpecMgr
(SOP 98537416). Where this section, the script, or the command ever
disagree with the SOP, the SOP wins.
The command drives the staged script and performs the SOP's agent-judgment
steps: it confirms the resolved version with you, curates the changelog's
[Unreleased] section, pauses at the merge gate before dev is merged
into main, and triages failures without ever auto-retrying.
Each SOP step maps to a deterministic, idempotent stage (the SOP carries a manual fallback command for every step):
Changelog curation (SOP step 3) is an agent or manual step: the
changelog stage only moves the already-curated [Unreleased] section
into its dated form.
Follow the SOP step by step — each step carries a Manual fallback
paragraph. The essentials: bump the version in pyproject.toml and
move the [Unreleased] section of CHANGELOG.md into a new dated
## [x.y.z] - YYYY-MM-DD section; uv lock; commit exactly
pyproject.toml + uv.lock + CHANGELOG.md as
chore(release): bump version to vX.Y.Z and push to dev; once CI is
green, open the dev → main pull request and merge it
fast-forward-only (git merge --ff-only dev — never a merge commit or
squash: main must stay a strict ancestor of dev); then create
git tag vX.Y.Z on main, push the tag, and wait for the publish
workflow.
Note: .github/workflows/publish.yml handles the rest of the release
automatically once the tag above is pushed — it builds and publishes the
sdist/wheel to TestPyPI then PyPI via Trusted Publishing (OIDC, no
stored token), creates the matching GitHub Release with the built
artifacts attached, and publishes server.json (repo root, the MCP
Registry publisher manifest — see the
server.json format spec)
to the MCP Registry
via mcp-publisher/GitHub OIDC. biz-dfch-specmgr is live on
PyPI and in the
MCP Registry
as of v0.1.0.