waxwing-mcp
Allows configuring OpenAI-compatible Chat Completions endpoints as worker providers for delegated coding tasks, with API keys sourced from the environment and tasks managed locally.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@waxwing-mcpcreate a coding task to fix the failing login tests in my project, then show the diff"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Waxwing
Waxwing is a local-first delegation manager for DeepSeek and OpenAI-compatible coding agents. A delegating Agent defines a task and acceptance criteria, a worker Agent implements it, and the delegating party independently inspects the evidence before accepting the result.
CLI, MCP stdio, and the Tauri desktop app are three adapters over one manager
listening only on 127.0.0.1. The current release is a 0.1.0 preview intended
for a trusted local user and a trusted delegating Agent, not a public or
multi-tenant service.
中文说明 · Architecture · Contributing · Security
Why Waxwing
Delegation without a control plane. Tasks stay on your machine.
Provider-neutral. Use DeepSeek Harness or any compatible OpenAI Chat Completions endpoint.
Independent acceptance. A model saying “done” is not acceptance. The delegating Agent records its own checks and evidence.
Durable round leases. Results, errors, heartbeat health, fallback, and rework are ordered by an explicit
roundIdprotocol.Workspace isolation. Clean Git repositories automatically run in sibling worktrees; non-Git directories use an exclusive shared lock.
Unlimited by default. Request counts, tool loops, and cost limits are not blocked unless you explicitly configure a threshold.
Bounded APIs. Default CLI/MCP responses stay small; results, reports, history, usage, workspace metadata, diffs, and logs are paged on demand.
Related MCP server: Codex DSH MCP
Install
Requires Node.js 20 or newer.
The npm registry publication for 0.1.0 is pending. Until it is available,
download waxwing-0.1.0.tgz from the
v0.1.0 release
and install that file:
npm install -g ./waxwing-0.1.0.tgz
waxwing health
waxwingnpm install -g waxwing becomes the supported install command after the
package is published to the npm registry.
The package installs two commands:
waxwing— CLI and interactive task consolewaxwing-mcp— MCP stdio server
You can also run from a checkout:
git clone https://github.com/quanertsuki/waxwing.git
cd waxwing
node bin/waxwing.mjs healthQuick start
1. Choose a provider
The default public configuration expects DeepSeek Harness as a sibling checkout:
workspace/
waxwing/
deepseek-harness/Create a local, ignored override when your paths differ:
Copy-Item prototype/config.local.example.json prototype/config.local.jsonFor an OpenAI-compatible endpoint, copy
examples/providers/openai-compatible.json into your provider directory
(<WAXWING_HOME>/providers by default), set apiKeyEnv, and point
defaultProvider at the provider name. API keys remain in the environment and
are never copied into task data.
Request budgets are opt-in. maxToolRequests omitted, null, or 0 means no
tool-loop limit.
2. Create a task
waxwing create @task.jsonExample task.json:
{
"workspace": "C:\\work\\my-project",
"workspaceMode": "auto",
"prompt": "Implement the requested feature and run the tests.",
"plan": "Inspect, implement, test.",
"criteria": "Independent tests pass and the diff is limited to the requested behavior."
}workspaceMode accepts:
Value | Behavior |
| Clean Git repository → isolated worktree; non-Git directory → shared lock; dirty Git repository → refused |
| Require a clean Git repository and isolated worktree |
| Explicitly work in the original directory |
3. Inspect, verify, rework, accept
waxwing status task-xxxxxxxxxxxx
waxwing status task-xxxxxxxxxxxx --view result
waxwing status task-xxxxxxxxxxxx --view report
waxwing status task-xxxxxxxxxxxx --view diff
waxwing status task-xxxxxxxxxxxx --view log
waxwing rework @rework.json
waxwing accept @acceptance.json
waxwing close task-xxxxxxxxxxxxAvailable paginated views: result, history, usage, report, workspace,
diff, and log. Use --offset and --limit for large output.
Acceptance evidence must describe checks actually performed by the delegating party, not a restatement of the worker’s claim.
MCP
Configure your MCP client to run:
waxwing-mcpPublic tools use the waxwing_* prefix. The complete ds_* catalogue remains
available throughout 0.1.x for compatibility and is scheduled for removal no
earlier than 0.2.0.
Core tools include create, list, status, rework, accept, cancel,
close, cleanup_worktree, export, preview_delete, and delete.
Desktop
Development:
cd desktop
npm ci
npm run tauri devBuild a Windows portable release from the repository root:
npm run desktop:portableThe Windows portable archive includes the desktop executable, backend
resources, a Node runtime, license, and unsigned-build notice. It is not code
signed; verify SHA256SUMS and expect possible SmartScreen warnings.
Runtime protocol
run → ack → events/heartbeat → result|error → releasedA result is not a release. Rework and provider fallback wait until the previous
round is explicitly released. A busy worker returns worker_busy; it never
silently drops a run. Every round message carries a roundId, and every task
event has a monotonic sequence.
Workers heartbeat every five seconds. Twenty seconds without a heartbeat marks the runtime unhealthy but does not kill it. On manager restart, Waxwing only terminates a residual process when PID, task ID, owner marker, and command line all match. Otherwise it keeps the workspace lock and reports manual action.
See docs/architecture.md for the full flow.
Data and migration
Default data roots:
Windows:
%LOCALAPPDATA%\WaxwingmacOS:
~/Library/Application Support/WaxwingLinux:
$XDG_DATA_HOME/waxwingor~/.local/share/waxwing
WAXWING_HOME overrides the root. On first start, repository-local legacy data
is copied into the new root; the old directory is retained. Migration never
overwrites a non-empty target.
Task directories contain local state and must not be used as worker workspaces. Deleting task scratch data requires a separate interactive human authorization; project files and the external report are preserved.
Configuration
Configuration layering:
prototype/config.jsonorWAXWING_CONFIGprototype/config.local.jsonorWAXWING_LOCAL_CONFIGenvironment variables
Common environment variables:
Variable | Purpose |
| Per-user data root |
| Main configuration file |
| Local override file |
| Node executable for workers |
| DeepSeek Harness checkout |
| DSH credential store |
| Provider JSON directory |
| Loopback manager port, default |
| Packaged/custom backend root for the desktop app |
DSH_SUBAGENT_* and DSH_PROTOTYPE_* remain supported compatibility aliases
during 0.1.x.
Security model
Manager binds to
127.0.0.1and requires a random bearer token.Browser origins are rejected.
Worker credentials are read from the environment/credential store, not copied into arguments or task JSON.
Workspaces overlapping the managed data root are refused.
Only owned, identity-matched runtime processes may be terminated.
The trust boundary is the local operating-system account. Waxwing cannot distinguish a human from another program running as that user.
Report vulnerabilities through GitHub Private Vulnerability Reporting as described in SECURITY.md.
Development
npm test
npm run desktop:build
cargo fmt --manifest-path desktop/src-tauri/Cargo.toml -- --check
cargo check --locked --manifest-path desktop/src-tauri/Cargo.tomlCore tests do not need real model credentials. Real provider checks consume quota and are intentionally excluded from CI.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted coding agent: start, follow up on and stop tasks that can open GitHub pull requests.
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Hand tasks, bugs and finished work to AI coding agents, and get back a write-up with evidence.
Read a project's prompts, logs and agents, and send new work to the agent on your own machines.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables an AI agent to run local tools on the user's own machine via stdio, including command execution, workspace file read/write, and system status checks.52MIT
- FlicenseBqualityBmaintenanceEnables local, stdio-based task dispatch from Codex to DeepSeek Harness with independent review, bounded rework, persistent queues, and completion tracking.15-
- AlicenseAqualityBmaintenanceA task-level STDIO MCP server that lets Codex or any other MCP client hand off scoped coding jobs to an asynchronous worker agent which reads the code, edits files, and runs tests, while the client keeps ownership of planning and acceptance. Exposes submit, wait, query, follow-up, and cancel tools so multiple clients can queue and monitor tasks against a chosen project root.51MIT
- AlicenseAqualityAmaintenanceEnables a DeepSeek Harness agent to delegate bounded coding tasks to a local ZCode runtime, follow their progress through events, and review the resulting diffs before accepting or continuing the work. It also exposes model catalog, default-model, and setup-diagnostics tools for managing those delegated tasks.12Apache 2.0