Skip to content

Inspector

The inspector is Dockyard's local test + debug surface (RFC §12). It is:

  • Dev-mode-gated, localhost-only, operator-initiated only. Never a production client; never reachable off-localhost (P4 in §1). "Operator- initiated only" — re-cast from the older "read-only" framing in D-144 — means every client-shaped operation is driven by an explicit operator UI action (a button click), runs in a short-lived per-request MCP client session, and has a documented decision entry (D-099 / D-103 / D-131 / D-134) explaining why it stays within P4.
  • A pure Logbook consumer. It reads no runtime internals — every signal it shows is an emitted Logbook event (P2).
  • Wired to your project. Verdicts re-run dockyard validate; the Fixtures switcher derives from the project's generated tool contracts; the App preview reads the running server's ui:// resources via short-lived MCP client sessions, scoped to operator- initiated UI actions (decisions D-103, D-130, D-144).

Attach

The fastest path is dockyard dev — it auto-attaches the inspector as a third supervised child alongside the Go server and Vite, and prints the inspector URL to stdout:

bash
dockyard dev
# ...
# INFO inspector ready at http://127.0.0.1:54321

cmd-click the URL to open it. Pass --no-inspector (CI / headless) to skip the supervised inspector child. See the dev loop guide for the auto-attach details.

For a server that is not under dockyard dev — a remote loopback build, a deployed dev server you are debugging — use the standalone path. In one terminal, run the server on HTTP (the inspector relays via HTTP):

bash
DOCKYARD_TRANSPORT=http dockyard run

In a second terminal, attach the inspector:

bash
dockyard inspect --url http://127.0.0.1:8080 --dir path/to/project
FlagWhat
--urlthe running MCP server's base URL; required to attach
--dirthe project directory; powers Verdicts + Fixtures
--portthe inspector's loopback port (default: OS-assigned)
--no-opendon't open a browser — CI / headless use

A non-loopback --port host is refused before the listener opens (the CVE-2025-49596 lesson).

Rail tabs

TabWhat it shows / does
ToolsAll registered tools; fire one (the Operator-Invoke surface, D-131)
PromptsAll registered MCP prompts; fill arguments and render prompts/get messages (D-163)
AppsEach ui:// resource rendered in a sandboxed iframe
TasksActive + recent tasks rendered as a lifecycle Timeline
EventsThe live Logbook stream
AnalyticsPer-tool latency + counts
FixturesPick a UI state for the App preview
VerdictsRe-runs dockyard validate
RPCRaw JSON-RPC log

tools-invoke

events

The Apps preview is a faithful host: it validates your App's ui/initialize handshake against the MCP Apps schema (rejecting a non-spec shape instead of silently accepting it) and sizes the preview iframe to the App's reported content height — so a handshake or rendering problem surfaces here, not only in a real host. If an App renders blank, see the blank-App troubleshooting.

The Prompts panel

MCP separates two model-facing primitives. Tools are things the model PUSHES (a typed input becomes a typed output). Prompts are templates the host PULLS via prompts/get (named curated message sets a chat host surfaces as /slash commands; the user picks one, the host fills its arguments, the model is seeded). The Prompts panel lists every prompt the attached server registered via runtime/server.AddPrompt. Pick one, fill its string arguments (MCP prompt arguments are flat strings — see D-152; no JSON Schema form), press Invoke prompts/get. The inspector opens a short-lived MCP client session, calls prompts/get, closes the session, and renders the resulting message list.

The panel's invocation surface uses the same operator-initiated P4 framing as the Tools tab (D-131, D-144) — the inspector remains the lone client-shaped component, dev-mode-gated, localhost-bound. The new endpoint is POST /api/prompts/get.

Try it against examples/prompts-demo — three prompts (summarize_for_review, code_review, explain_error) exercise the panel end-to-end.

The Fixtures switcher

Each tool ships six default fixtures (D-130):

FixtureDrives
happyready state with realistic synthetic payload
emptyempty arrays / nil branches
errorhandler-returned error path
permissionpermission-denied stub
slowdeliberately delayed response
largestress-sized payload

On-disk project fixtures (<dir>/fixtures/<tool>/<kind>.json) override the schema-derived synthetic ones.

fixtures

Capability emulation

Flip Apps, Tasks, the logging capability on/off to verify your server degrades gracefully on a host that hasn't negotiated that capability (RFC §7.5, the capability-driven rule from AGENTS.md §6).

Task lifecycle

For task-augmented tools, the Tasks tab renders the lifecycle as a Timeline (created → working → input_required → working → completed):

tasks panel

Why this is different

mcp-use's inspector is interactive but not a test harness (brief 04 §2.5): no fixture system, no scripted state-switch, no contract drift catcher, no host-compatibility matrix. Dockyard's inspector is wired to the project — the same checks dockyard validate runs, the same fixtures dockyard test exercises, the same Logbook stream the runtime emits. The inspector is the interactive face of the same quality gates.

See also

Apache-2.0 licensed — see LICENSE.