Wendy MCP tools
Tool groups, device selectors, compact results, and current CLI coverage.
Wendy starts with 16 core tools for signing in, connecting, deploying, inspecting containers, reading logs, and discovering hardware. Running apps can provide additional tools.
For ChatGPT Desktop, run wendy mcp setup chatgpt to add the Wendy plugin to
your personal marketplace. It includes a scoped local MCP gateway, device
workspace, and bundled skills. Follow the
ChatGPT setup guide to install it and enable access.
The tool groups below describe the broader wendy mcp serve developer server.
Skills and first-time setup
The server also exposes the bundled end-user skills through the MCP skills
extension. Call skills/list with {} to get the single wendy entry, then
skills/get with its URI. Read instructions and supporting files through
resources/read; each catalog resource includes its SHA-256 digest. These calls
work offline without a device connection or a local skill installation.
The bundle includes wendy-onboarding for installing and verifying a first
physical device, or setting up a local simulator when hardware is unavailable.
The ChatGPT plugin's setup entry opens this skill. Native skill installation
through wendy mcp setup remains available for other clients.
OpenAI imports MCP skills as a snapshot during Scan Tools. Restart the MCP server after a CLI update, then scan again before submitting updated skills.
CLI update notices
wendy_status includes cli_version for the running MCP server and cli_update
for cached update details. When a newer release is known, cli_update includes
latest_version, update_command, restart_required, and a message to relay to
the user. last_checked_at records the last release-check attempt;
available=false does not confirm that the check succeeded or the CLI is current.
wendy mcp serve checks the cache at startup and hourly, contacting the release
API only when the existing 24-hour check interval expires. Development builds
skip release checks. The next tool result carries a text notice once per release
per MCP session, including sessions where a terminal already printed the notice.
The notice preserves the tool's result and error state. Run the supplied update
command, then restart the Wendy MCP server to load the new version and tools.
Enable specialist tools
Call wendy_tools with {"groups":["robotics"]} to expose ROS inspection tools.
The selection replaces the previous specialist groups. Core tools always remain.
Omit groups to inspect the selection, or pass an empty array to return to core.
| Group | Operations |
|---|---|
core | Session status and sign-in, group selection, device discovery/connection/info, deployment, container lifecycle/exec/stats, logs, hardware discovery |
setup | Installation jobs and verification, project validation, agent/OS updates, WiFi, enrollment, default device |
simulator | Local simulator list, create, stop, delete |
hardware | Bluetooth, camera discovery/controls/snapshots |
robotics | ROS topics, topic info, samples, rates, LiDAR summaries |
observability | App inspection, kernel logs, metrics and traces |
cloud | Cloud discovery/connection, tunnel open/list/close, ping |
all | Every advertised built-in tool |
Clients receive notifications/tools/list_changed when the selection changes.
For clients that cache tools at startup, configure
wendy mcp serve --tool-groups core,robotics or --tool-groups all.
Groups control discovery, not authorization. Known tools remain callable, and
app-provided tools remain visible. Restart the MCP process after upgrading the CLI.
Sign in
Most devices need a signed-in Wendy Cloud session. wendy_status reports auth
as logged_in, pending, expired, or logged_out. Call auth_login to sign
in without a terminal: it returns a link to show the user, opens it in the
browser on a desktop session, and finishes in the background (up to five
minutes). Calling it again while a sign-in is pending returns the same link.
Cloud tools return AUTH_REQUIRED until a session exists.
The link must be opened in a browser on the machine running Wendy; from another
machine, forward the port in the link's redirect_uri over SSH first. If the
user abandons the sign-in or the five minutes pass, auth leaves pending
(back to logged_out or expired) and wendy_status shows auth_login_error.
Calling auth_login again starts a fresh link.
Device selection
device_list returns a device selector for every entry. Pass it unchanged to
device_connect or run. Cloud selectors pin the endpoint, organization or
tenant, and device identity. vm:name selects an existing local simulator and
starts it if needed. run without device uses the current connection's target.
run(start=false) creates the container without starting it. Starting or
restarting a container may interrupt its current task. Use telemetry_logs for
passive inspection and container_exec for a command in a running container.
For compatibility, device_connect(address=...) still works. run still accepts
legacy device_name, cloud_grpc, broker_url, and deploy arguments even though
new schemas omit them. deploy=true is equivalent to start=false; contradictory
arguments fail. run always detaches, so detach=false fails. container_attach
remains callable by existing clients but is not advertised because its restart
behavior is easy to mistake for observation.
Bounded results
Telemetry defaults to format="compact", with up to 100 records and 16384 JSON
bytes. Logs, metric points, and trace spans appear under logs, metrics, and
traces. Resource attributes, instrumentation scope, timestamps, and measurement
fields accompany records. OTLP AnyValue wrappers are flattened; OTLP integer and
timestamp strings remain strings to preserve precision.
Use format="otlp" for the original batches envelope. Consumers of the old
default telemetry shape must set this explicitly. max_records applies to compact
output; max_batches bounds collection in both formats. Collection also ends
after ten seconds. Raw format preserves the original protobuf JSON fields.
List truncation retains a prefix of complete rows and adds returned, omitted,
and truncated. These counts describe collected rows only. An oversized first row
can leave no rows in the result; increase max_bytes or narrow the query.
collection_limited indicates that compact collection reached its batch limit.
Its absence or false value does not establish that all historical telemetry was read.
The byte budget covers the JSON payload; MCP may also carry its text fallback.
Host and diagnostic workflows
Enable simulator to list, create, stop and delete local simulators. Creation
returns a stopped simulator and its vm:name selector. device_connect boots it
and provisions its selected generic, go2 or g1 profile. Creation downloads
images without a terminal UI and does not install QEMU. Stop waits for a graceful
shutdown unless force=true; delete refuses a running simulator.
Enable observability and call app_inspect(app_name=...) for app and service
states, recorded exit, memory/storage/CPU usage, and recent warning/error logs.
CPU usage is cumulative nanoseconds, not a percentage. Optional project_path
reads local TCP readiness declarations; it does not prove that configuration is
deployed. Direct TCP probes can pass or fail. Cloud and simulator forwarding can
accept a local connection before the application answers, so those checks remain
unknown. Missing declarations and unavailable diagnostics remain explicit.
device_os_logs returns a bounded kernel-log tail, with timestamps in microseconds
since boot. device_update_agent is in setup: it updates only the agent and
verifies the result through the existing CLI updater. It preserves the connected
device selector and reconnects unless another device was selected during the
update. A timeout is an unconfirmed update, not proof that no change occurred.
cloud_tunnel_list shows only forwards owned by this MCP server. Use their IDs
with cloud_tunnel_close to release listeners and active connections. Closing an
already closed ID is safe. Tunnels are closed when the server stops.
Use project_validate in setup before deployment to inspect configuration and
build inputs without running a build or project hooks. Device compatibility may
remain unknown when disconnected or when the device supplies insufficient data.
CLI flows without dedicated built-in MCP tools
| Flow | Current route |
|---|---|
| Simulator console logs and editing existing robot profiles | wendy vm logs, wendy vm robot; MCP can select a profile when creating a simulator |
| Project creation, entitlements/framework configuration, build-only and watch workflows | wendy init, wendy project, build/watch CLI options |
| Rename, unenrollment, pairing, time sync | wendy device subcommands |
| Driver add-ons, persistent volumes, cache management | wendy device drivers, volumes, cache |
| Audio, live camera streams | Device audio/camera CLI; MCP supports camera snapshots and controls |
| ROS nodes, services, parameters, actions, lifecycle, graph, bags | wendy device ros2; MCP provides topic and LiDAR inspection |
| Data sources, recording, episodes, campaigns, downloads | wendy data |
Cloud logout and credential-session selection (sign in with auth_login) | wendy cloud / wendy auth |
| Agent-only installation and first-boot WiFi/name/enrollment customization | Installation plan instructions or terminal installer; MCP image jobs use Ethernet for first boot |
An agent with shell access can invoke these commands. MCP-only clients do not automatically have shell access. App-provided tools may cover additional workflows.
Installation with physical steps
Enable setup, call os_install_plan, and inspect media with os_list_drives
when applicable. os_install_start creates a persistent job for a supported
raw-media or Jetson developer-kit recovery installation. It records the exact
published artifact and checksum and returns physical instructions without writing.
G1 PC2 keeps vendor Ubuntu; agent-only installation follows the plan's terminal
instructions instead of an image job.
| Phase | Completion condition |
|---|---|
| Plan | Exact board/carrier, artifact, target, and erase scope recorded |
waiting_for_target | User follows physical instructions; os_install_resume probes the selected media or USB recovery board |
awaiting_erase_confirmation | User approves the target and erase scope; resume with its target.fingerprint as target_id and confirm_erase=true; non-removable media also needs confirm_internal=true |
queued / running | Detached worker prepares the pinned artifact, rechecks identity and records the write boundary before flashing; poll os_install_status |
waiting_for_boot | Write completed; follow power/recovery instructions, connect Ethernet, identify the booted device |
completed | Resume with explicit address and optional expected_public_key; expected agent, OS version and board are verified |
write_outcome_unknown | Worker stopped after writing began; inspect hardware and logs. The job cannot repeat the write. Verify a booted target or create and authorize a new recovery job |
Show the returned instructions to the user between calls. Job IDs survive client and server restarts; status and repeated resume calls cannot restart a completed write. User acknowledgment alone never authorizes erasure or replaces the probe. The workflow works without MCP elicitation support.
Jobs do not prompt for administrator passwords over MCP. When elevation is needed, the job returns an exact terminal command to resume the same job after password entry. Use the supplied executable, job root and target fingerprint. Jobs do not pre-seed WiFi, device names or cloud enrollment; use the terminal installer for those options. USB recovery requires the appropriate host driver and a readable chip identity, checked again on the claimed recovery handle. The flashing gadget must stay on the confirmed physical USB path; a topology change during recovery stops the job and may require the terminal installer. The gadget protocol does not expose the recovery chip ID, so later stages use path and session identity. Media identity uses serial/WWN when available; some SD adapters only expose path, model and capacity, so check those carefully before authorizing.
os_install_verify can also check first boot independently, including enrollment.
Boot verification does not verify application behavior. An empty discovery scan
does not establish a network failure.