-
Notifications
You must be signed in to change notification settings - Fork 8
Troubleshooting
Most problems fall into three buckets: the Docker fleet, tool registration in your MCP client,
and image builds. Work top-down - docker compose ps first, then logs for the offending
service.
The MCP server registers only tools whose container is healthy at server startup. If a tool is missing:
-
Is its container running?
docker compose ps- look for the service and ahealthystatus. -
Is its profile enabled? Tools are grouped into
COMPOSE_PROFILEScategories. A tool in a profile you didn't enable never starts. See Configuration. -
Did you start it after the server? The server probes health once at startup. If you
bring a container up later, restart the server so it re-probes:
Then reconnect the client (or restart it) to pick up the new tool list.
docker compose restart mcpwner
-
Is the container unhealthy? Check its logs:
docker compose logs --tail=50 <service>
upsert_finding, list_findings, get_finding, and diff_discovery are always registered
(local file/git operations, no container gate). If those are missing, the server itself failed
to load - check docker compose logs mcpwner.
These three depend on the linguist container. Linguist runs unconditionally (no profile), so if they're absent the container is unhealthy:
docker compose ps linguist
docker compose logs --tail=50 linguistLinguist runs as UID 1000 to match cloned-workspace ownership; a permissions error here usually
means the workspaces volume ownership is off - re-run volume-init with
docker compose up -d volume-init.
Chromium, WireMock, mitmproxy, and the aiohttp fuzzer are opt-in utilities. They only start
under the dast or poc profiles. If run_dast_scan or run_utilities_scan reports the tool
as unavailable, add the profile and restart:
# .env
COMPOSE_PROFILES=sast,dast,poc
docker compose up -d
docker compose restart mcpwnerThe mcp SDK published a 2.x release that FastMCP 2.14.0 is not compatible with. requirements.txt
pins a FastMCP version that constrains mcp<2.0; if you changed that pin, restore a FastMCP
release that carries the upper bound (2.14.7+) and rebuild:
docker compose build mcpwnerThe Linguist image is based on Alpine, which packages Universal Ctags as ctags, not
universal-ctags. docker/linguist/Dockerfile installs ctags; if you edited it, use that name.
Usually a cold Docker daemon or flaky network pulling base images. Pre-pull and retry:
docker pull python:3.12-alpine
docker compose buildYou almost certainly don't need every category. Narrow COMPOSE_PROFILES to what the engagement
needs - a static-only audit is just sast (plus the always-on linguist, mcpwner, and
volume-init). Fewer containers means less memory, less disk, and a smaller local attack surface.
Cannot connect to the Docker daemon / dockerDesktopLinuxEngine ... system cannot find the file means the Docker engine isn't running. Start Docker Desktop (or dockerd) and wait for it
to report ready before docker compose up.
Copy the example before first run:
cp config/config.yaml.example config/config.yamlconfig.yaml is git-ignored so your local service URLs and log settings stay out of version
control.