coder/skills/ov-mcp/SKILL.md
MCP server exposing the full ov CLI as tools (Streamable HTTP on port 18765). Meta-layer composition — layers: [ov, supervisord] — ships only service wiring + `/workspace` bind-mount + OV_PROJECT_DIR env plumbing. Auto-falls back to the upstream overthinkos/overthink repo when /workspace has no image.yml. Use when composing an MCP gateway into any image so LLM agents can drive ov remotely.
npx skillsauth add overthinkos/overthink-plugins ov-mcpInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| Property | Value |
|----------|-------|
| Kind | Meta-layer (no install files of its own) |
| Composition | layers: [ov, supervisord] |
| Port | 18765 (Streamable HTTP MCP endpoint at /mcp) |
| Service | supervisord-managed ov-mcp program |
| Volumes | project → /workspace (bind-mount the project root from the host) |
| Env | OV_PROJECT_DIR: "/workspace" |
| mcp_provides | {name: ov, url: http://{{.ContainerName}}:18765/mcp, transport: http} |
Volume naming note: the volume NAME is project (deployer-facing
API: ov config <image> --bind project=/path) but the in-container PATH
is /workspace — a neutral term that works regardless of whether the bind
mount is an overthink checkout or any other dev workspace.
Deploys ov mcp serve --listen :18765 inside the container under
supervisord. The server exposes the entire ov CLI (auto-generated from
Kong reflection, currently ~192 tools including the authoring
surface — project scaffolding, YAML editing, file-write verbs) as MCP
over Streamable HTTP. Any image composing ov-mcp advertises itself
via the org.overthinkos.mcp_provides OCI label, so consumers —
Claude Code, Open WebUI, OpenClaw, or the in-repo ov eval mcp client
— can drive it without any out-of-band URL configuration.
See /ov-build:ov-mcp-cmd Part 2 for the full server architecture: Kong
reflection, destructive-hint annotations, --read-only filter,
transport dispatch.
This layer uses layer:, not require: — deliberately. The
distinction:
require: says "my install needs these layers installed first."layer: says "I am these layers plus my additions."ov-mcp installs no packages and copies no files — it's pure wiring
(service block, mcp_provides declaration, volumes/env, one mkdir
task to create /workspace with 0777 so ov version works even
when no bind-mount is attached). A meta-layer composition (layer:)
captures that exactly. The validator requires every layer to ship
something installable; layer: satisfies that by transitively
pulling in the children's install files.
Build-mode MCP tools (image.build, image.list.images,
image.inspect, etc.) need to read image.yml. The ov-mcp layer
supports three paths, in order of "how much local setup":
1. Bind-mount a local project (maximal local iteration):
ov config <image> --bind project=/home/you/overthink
ov start <image>
The agent reads image.yml + layers/ directly from the host — any local edit is immediately visible.
2. Pin a remote repo (reproducible, no local checkout):
ov config <image> -e OV_PROJECT_REPO=overthinkos/overthink@<sha>
ov start <image>
At serve-startup, ov mcp serve clones into
~/.cache/ov/repos/github.com/overthinkos/overthink@<sha> and chdirs
there. No bind mount needed. Good for CI, headless dev, or shipping
an agent that always drives a specific upstream version.
3. Auto-fallback (zero setup — the default):
ov config <image>
ov start <image>
# Nothing bound to /workspace; /workspace is world-writable but empty.
# ov mcp serve's bootstrapProject() detects no image.yml in cwd and
# silently clones + chdirs into the default overthinkos/overthink
# cache. Logs a single line naming the reason.
Opt out with --no-default-repo (hard-fail instead of falling back).
The top-level ov CLI never auto-fetches — only ov mcp serve does.
How the fallback fires: this layer's env: block permanently sets
OV_PROJECT_DIR=/workspace, but bootstrapProject() does NOT early-return on
that env being set — it checks for an actual image.yml in the resolved cwd
and falls back to the default repo if missing. That is what makes pattern 3
work by default even though OV_PROJECT_DIR is always populated. See
/ov-build:ov-mcp-cmd "Project-dir wiring" for the full RCA.
Six deploy-scope tests ship with the layer:
| Test | Purpose |
|---|---|
| ov-mcp-service | supervisord ov-mcp program is running |
| ov-mcp-port | host 127.0.0.1:${HOST_PORT:18765} reachable |
| mcp-ov-ping | MCP ping succeeds over the in-repo client (URL rewritten via rewriteMCPURLForHost, host-networked containers included) |
| mcp-ov-list-tools | MCP list-tools returns a catalog containing the canonical image.build, status, test.mcp.ping entries |
| mcp-ov-call-version | MCP call version returns the in-container CalVer (proves round-trip of a safe tool) |
| mcp-ov-call-list-images | MCP call image.list.images returns images — proves the bind-mount OR auto-fallback is working (matches "fedora" either way, since upstream overthinkos/overthink always has a fedora image) |
All mcp: checks pass mcp_name: ov so they stay unambiguous on
images that also expose jupyter or chrome-devtools servers
(e.g. /ov-openclaw:openclaw-desktop).
Host-networked containers have an empty NetworkSettings.Ports. The
ov/mcp_client.go lookupHostPort() function detects
HostConfig.NetworkMode == "host" and returns the container port
verbatim (container ports ARE host ports under network: host). See
ov/testvars.go IsHostNetworked() + the matching mergeRuntimeVars()
handling for HOST_PORT:<N> env-var population.
Practical impact: ov-mcp works on both bridge-networked images
(e.g. /ov-coder:arch-ov) and host-networked ones (e.g.
/ov-coder:fedora-coder, /ov-distros:fedora-ov).
Default :18765 chosen for non-collision with sibling MCP layers:
8888 — jupyter-mcp9224 — chrome-devtools-mcp (via mcp-proxy)18789 — openclaw gatewayCompose ov-mcp into any image that should be reachable as an MCP
gateway. Current users:
/ov-coder:fedora-coder — kitchen-sink dev image; uses pattern 3 (auto-fallback) by default, pattern 1 when the developer wants local edits visible./ov-coder:arch-ov — Arch-based ov toolchain image (bridge network, ports 2222/18765).Images composing ov-mcp must publish port 18765 (either via
layer-declared ports: [18765] that auto-collects into the
container's EXPOSE, or an image-level ports: ["18765:18765"] block
in image.yml). Both network: host and the default ov bridge work.
/ov-tools:ov — The underlying binary layer this wraps./ov-infrastructure:supervisord — Init system for the ov-mcp program./ov-jupyter:jupyter-mcp — Sibling MCP server (notebook manipulation, FastMCP-based)./ov-selkies:chrome-devtools-mcp — Sibling MCP server (browser automation, mcp-proxy wrapper)./ov-build:ov-mcp-cmd — Part 2: Server is the authoritative reference for ov mcp serve architecture, destructive-hint policy, --read-only filter, capture model, and the new bootstrapProject() logic./ov-image:image — "Project directory resolution" covers the -C / --dir / OV_PROJECT_DIR global flag and --repo / OV_PROJECT_REPO./ov-core:ov-config — --bind project=<path> is the deployer's handshake with this layer's volume: declaration./ov-eval:eval — Deploy-scope mcp: test verb methods used here./ov-internals:go — ov/mcp_server.go bootstrapProject() implementation, including the env-var proxy detection of top-level flags and the unconditional image.yml check.MUST be invoked when:
ov-mcp to an image's layer list.layer: composition + volumes + env + service + auto-fallback)./ov-image:layer — layer authoring reference (layer.yml schema, task verbs, service declarations)development
Claude Code multi-agent support in Overthink — sub-agents, dynamic workflows, and agent teams, and how each drives the existing `ov eval` disposable beds to test and verify. MUST be invoked before authoring or invoking an ov sub-agent / dynamic workflow / agent team, wiring agent-lifecycle hooks, or asking "which primitive should drive the R10 beds?".
tools
Mounts a virtiofs share tagged `workspace` at /workspace inside a VM guest via a systemd .mount unit. Use when a kind:vm entity shares a host directory into the guest and you need it auto-mounted (and re-mounted at every boot).
development
MUST be invoked before any work involving: the `kind: android` schema kind, a `target: android` deploy, the `apk:` layer package format (installing Android apps declaratively), AndroidDeployTarget, an in-pod emulator OR a remote/physical adb-endpoint device, or nested `pod → android` deployment. The first-class Android device + app surface that sits above `ov eval adb`/`appium`.
tools
Use when committing, branching, pushing, merging, tagging, creating PRs, or approving/merging PRs with gh — the feat/-branch, R10-gated, never-force-push landing workflow across the main repo + the plugins submodule + image/<distro> submodules. Covers sync-to-upstream, branch/worktree pruning, the fork+PR path for contributors without write access, and cross-repo @github landing order.