nomad
nomad
nomad is a local MCP server for agentic remote development. It keeps source
code local while an AI agent syncs with rsync, runs commands over SSH, manages
long jobs in remote tmux, and pulls artifacts back into the project.
For Codex, use the project-scoped Streamable HTTP daemon. Stdio remains available for compatible clients and one-off use.
Features
Multiple remote targets per local project.
Project-local
.nomad.jsonconfiguration.SSH preflight checks and read-only network diagnostics.
Incremental
rsyncpush and guarded artifact pull.Short remote commands and long-running
tmuxtasks.Optional persistent reverse SSH tunnels.
Path guards, dangerous-command checks, output limits, and secret redaction.
Requirements
Python 3.11+,
ssh, andrsyncKey-based SSH access to remote targets
Remote
tmuxwhen using long-running tasks
Daemon lifecycle management supports macOS, Linux, and other POSIX systems. Windows is not currently supported or tested.
Installation
Run the latest PyPI release without installing it globally:
uvx --from nomad-mcp nomadOr install an isolated global command:
pipx install nomad-mcpCodex Setup
nomad codex setup is an optional Codex configuration adapter, not a protocol
requirement. Any MCP host can use Nomad through the standard stdio or
Streamable HTTP transports without Codex configuration.
From the project you want Codex to control, run:
nomad codex setup --project "$PWD"
nomad codex doctor --project "$PWD"The adapter starts or repairs a project daemon and writes only the trusted
project's .codex/config.toml. It never changes user-level Codex configuration
or project trust. Resolve any reported global conflict, then fully restart
Codex so it loads the project MCP entry.
Other MCP hosts can launch Nomad directly over stdio:
{
"mcpServers": {
"nomad": {
"command": "uvx",
"args": ["--from", "nomad-mcp", "nomad"]
}
}
}Use nomad client-config to generate JSON or TOML for standard stdio or
Streamable HTTP clients. See Persistent MCP Daemon
for manual registration, lifecycle, security, and troubleshooting.
Quick Start
Start and register the project daemon.
Open Codex in the local project.
Call
health, theninit_discover.Select an SSH target and remote workspace.
Save
.nomad.jsonwithinit_save_config.Push code with
sync_push.Use
run_remotefor short commands.Use
task_startandtask_statusfor long jobs.Pull artifacts with
sync_pull.
Use run_remote only for short synchronous work. Downloads, builds, training,
servers, and batch jobs belong in task_start. If a call with side effects
times out, inspect its status before retrying it.
Documentation
Safety
nomad executes commands over SSH and synchronizes files with rsync. Use it
only with trusted local projects and remote machines. Its guardrails reduce
risk, but cannot make an untrusted agent or host trustworthy.
Development
python -m pip install -e .[dev]
nomad doctor
python -m pytest
python -m compileall -q src testsLicense
MIT