Local MCP setup

Start the local MCP stack without guessing.

One local LLM endpoint. One bounded host-ops bridge. One truth check after each layer. That is enough to get Chopshopr running without turning setup into folklore.

Opinions Start the local MCP stack without guessing.
Join newsletter

The usual failure mode in local AI bring-up is not that the model is too weak. It is that the stack shape gets fuzzy. One command starts a server with unclear defaults, another tool talks to a different port, a health probe forgets auth, and a host-ops bridge looks broken when it is simply pre-onboarding. The repair is to keep the stack narrow and make each layer prove itself before you trust the next one.

The operating rule:

In Chopshopr, one MCP registration should represent one default model endpoint. Use local_generate_default for normal work, use local_health before blaming the model, and treat No sandboxes registered as a normal NemoClaw pre-onboarding state instead of a mysterious failure.

The stack contract

The public contract is intentionally small. src/index.js exposes the local LLM tools. src/nemoclaw-mcp.js exposes bounded host-side NemoClaw and OpenShell operations. The build and push path stays worktree-first, so the final proof is not just that the server booted. The final proof is that the branch verified and shipped.

01

Keep one default model per registration

Do not make callers remember hidden model overrides. Register the baseline and the higher-reasoning profile separately, then stay on local_generate_default most of the time.

02

Trust health checks before vibes

Reach for local_health, bun run wait:local-llm, and the auth-aware /v1/models probe before concluding that vLLM or Codex registration is broken.

03

Read NemoClaw state literally

No sandboxes registered means the bridge is alive but onboarding has not happened yet. That is a normal pre-onboarding state, not a reason to reinstall the whole host stack.

04

Finish on the ship gate

The route is not trustworthy until the worktree passes bun run build and the branch closes through bun run ship:mainline.

Read doctor output as states, not vibes

The fastest way to waste an afternoon is to treat every non-green line as the same kind of failure. Chopshopr's doctor output is narrower than that. The point is to tell you which layer is actually ready, which layer is merely pre-onboarding, and which missing dependency is the only thing worth fixing next.

pre_onboarding

NemoClaw is alive, just not onboarded

No sandboxes registered maps to pre_onboarding. That means the bridge answered correctly and you should run nemoclaw onboard only when you actually want to create or refresh sandboxes.

gateway_missing

OpenShell is installed but not wired

No gateway configured maps to gateway_missing. The binary is there, but sandbox operations will not work until you start or add the local gateway.

installed

Host prerequisites are visible

When Docker, Node, and npm report installed, stop reinstalling the host toolchain and move up one layer to the actual MCP or gateway state.

missing

Fix the named binary only

A missing state is intentionally specific. Install the missing binary that the doctor named instead of flattening the whole local stack and starting over.

Register the surfaces you will actually use

Chopshopr keeps two active Nemotron 3 profiles: baseline for normal work and Super for the higher-reasoning path. The fallback Nano 12B health target still exists, but it is not the default operating surface. Register the bounded NemoClaw bridge separately so host operations do not get mixed into inference setup.

Baseline

Nemotron 3 Nano A3B via vLLM

Use this as the default Codex MCP registration for normal local inference work.

codex mcp add local-llm-nemotron-baseline -- \
  env LOCAL_LLM_BACKEND=vllm \
      VLLM_BIN=/home/chopshopr/venvs/nemotron-super-vllm/bin/vllm \
      LOCAL_LLM_MODEL=nvidia/nemotron-3-nano-30b-a3b \
      LOCAL_LLM_MODEL_PATH=/home/chopshopr/models/offline/transformers/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16 \
      LOCAL_LLM_SERVED_MODEL_NAME=nvidia/nemotron-3-nano-30b-a3b \
      LOCAL_LLM_BASE_URL=http://127.0.0.1:8007/v1 \
      LOCAL_LLM_API_KEY=local-dev-token \
      VLLM_MAX_MODEL_LEN=8192 \
      node /home/chopshopr/code/chopshopr/src/index.js
High reasoning

Nemotron 3 Super via vLLM

Keep this separate so the heavier path never masquerades as the everyday default.

codex mcp add local-llm-nemotron-super -- \
  env LOCAL_LLM_BACKEND=vllm \
      VLLM_BIN=/home/chopshopr/venvs/nemotron-super-vllm/bin/vllm \
      LOCAL_LLM_MODEL=nvidia/nemotron-3-super \
      LOCAL_LLM_MODEL_PATH=/home/chopshopr/models/offline/transformers/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4 \
      LOCAL_LLM_SERVED_MODEL_NAME=nvidia/nemotron-3-super \
      LOCAL_LLM_BASE_URL=http://127.0.0.1:8000/v1 \
      LOCAL_LLM_API_KEY=local-dev-token \
      node /home/chopshopr/code/chopshopr/src/index.js
Host ops

NemoClaw + OpenShell bridge

Use a separate MCP server for doctor, status, logs, and other bounded host operations.

codex mcp add nemoclaw -- \
  node /home/chopshopr/code/chopshopr/src/nemoclaw-mcp.js

Run the truth checks in order

The best setup loop is boring. Bring up the endpoint, verify the endpoint, then ask Codex to use it. Bring up NemoClaw, verify the bridge, then decide whether sandbox onboarding is the next step. This order keeps you from misreading an auth issue as a model issue or a pre-onboarding state as a gateway failure.

Local LLM proof bun run wait:local-llm curl -i http://127.0.0.1:8007/v1/models curl -s -H "Authorization: Bearer local-dev-token" http://127.0.0.1:8007/v1/models

Use the port that matches the profile you registered. A protected /v1/models returning 401 means the server is up and the probe forgot credentials.

NemoClaw proof bun run setup:nemoclaw:spark -- --onboard nemoclaw_doctor nemoclaw_run status

If the doctor output says No sandboxes registered, the bridge is alive and you still need onboarding. Do not treat that message as a crash.

  • local_health is the first MCP-side diagnostic before any prompt call.
  • local_list_models is only needed when you intentionally want a non-default model.
  • local_wait exists so the same MCP run can survive warmup instead of faking a new human turn.
  • local_start_server and local_stop_server are operator controls, not the normal inference path.

Close on the verified worktree path

The stack is only half-configured if it can talk locally but never closes into a verified ship path. Chopshopr uses a worktree-first contract so the same child branch that ran the build is the branch that rebases and pushes.

Ship gate bun run worktree:check bun run build bun run ship:mainline

That sequence checks the worktree guard, runs the repo build gate, rebases with autostash, reruns verification, and pushes directly to the default branch without force.

Read next only if you need the deeper why

If the emotional logic behind local-first tooling matters more than the command path, read The killer app for on-device inference is dignity, not latency. If the failure map matters more than the bring-up steps, read What breaks first in local agents is not the model. If you want the raw repo contract, inspect the entrypoints, operator playbooks, MCP tools, and worktree-first autoship sections in the repo.