Global Flags
Enable verbose logging output
Top-Level Commands
Authentication
m87 login
Authenticate with make87 via browser-based OAuth flow.
m87 logout
Logout and clear local credentials.
Device Management
m87 devices list
List all accessible devices.
m87 devices approve <device>
Approve a pending device registration.
Device name or ID to approve
m87 devices reject <device>
Reject a pending device registration.
Device name or ID to reject
m87 devices show <device>
Show detailed information about a specific device.
Device name or ID
This command is not yet fully implemented.
File Operations
m87 cp <source> <dest>
Copy files between local and remote devices (SCP-style).
Source path. Use
<device>:<path> for remote, <path> for local.Destination path. Use
<device>:<path> for remote, <path> for local.m87 sync <source> <dest>
Sync files between local and remote devices (rsync-style).
Source path. Use
<device>:<path> for remote, <path> for local.Destination path. Use
<device>:<path> for remote, <path> for local.Delete files from destination that are not present in source
Watch for changes and sync automatically
Show what would be done without making changes
Exclude files matching pattern (can be used multiple times)
m87 ls <path>
List files on a device.
Remote path in format
<device>:<path>Utility Commands
m87 version
Show CLI version information including build details and platform.
m87 update
Update the CLI to the latest version.
Configuration
m87 config set
Set configuration values.
Override API URL (e.g., https://eu.public.make87.dev)
Set owner reference (email or org ID)
Set make87 API URL
Set make87 app URL
Trust invalid server certificates (use with caution)
m87 config show
Display current configuration.
m87 config file
Show path to configuration file.
SSH Commands
m87 ssh enable
Enable SSH host resolution for .m87 domains.
m87 ssh disable
Disable SSH host resolution.
MCP Server
m87 mcp
Start MCP server (Model Context Protocol) for AI agent integration. The server runs on stdin/stdout and exposes m87 platform commands as MCP tools.
Device Commands
Device commands follow the patternm87 <device> <command>. These commands operate on a specific device.
m87 <device> shell
Open an interactive shell on the device.
m87 <device> exec
Execute a command on the device.
Keep stdin open (for responding to prompts)
Allocate a pseudo-TTY (for TUI apps like vim, htop)
Command and arguments to execute (use
-- before command)m87 <device> forward
Forward remote port(s) to localhost.
Port forwarding specifications. Supports:
- Single port:
8080 - Port mapping:
3000:8080(local:remote) - Port range:
8080-8090 - Range mapping:
8080-8090:9080-9090 - With host:
8080:192.168.1.50:9080 - With protocol:
8080/udp(default: tcp)
m87 <device> docker
Run docker commands on the device.
Docker CLI arguments (passed through to docker command)
m87 <device> logs
Stream container logs from the device.
Follow log output
Number of lines to show from end of logs
m87 <device> metrics
Show device system metrics (CPU, memory, disk, network).
m87 <device> stats
m87 <device> status
Show device status including health, crashes, and incidents.
m87 <device> audit
View audit logs showing who interacted with the device.
End time in RFC 3339 format (e.g., 2026-01-31 or 2026-01-31T13:00:00)
Start time in RFC 3339 format
Maximum number of log entries
Show detailed audit information
m87 <device> serial
Connect to a serial device.
Path to serial device (e.g., /dev/ttyUSB0)
Baud rate for serial connection
Deployment Commands
Deployment commands manage asynchronous job execution on devices.m87 <device> deploy
Add a run spec to a deployment.
Path to deployment file (docker-compose.yml or run spec YAML)
Spec type:
auto, compose, runspec, deploymentOptional display name for the run spec
Add to a specific deployment (otherwise uses active deployment)
m87 <device> undeploy
Remove a run spec from a deployment.
Job ID or name to remove
Remove from specific deployment (otherwise uses active deployment)
m87 <device> deployment list
List all deployments for the device.
m87 <device> deployment new
Create a new deployment.
Make this deployment active immediately
m87 <device> deployment show
Show deployment details including run specs.
Specific deployment to show (defaults to active deployment)
Output as YAML instead of formatted display
m87 <device> deployment status
Get deployment execution status.
Specific deployment (defaults to active deployment)
Show logs from deployment steps
m87 <device> deployment active
Print the currently active deployment ID.
m87 <device> deployment activate
Set the active deployment.
Deployment ID to activate
m87 <device> deployment rm
Remove a deployment.
Deployment ID to remove
Skip confirmation prompt
m87 <device> deployment clone
Clone an existing deployment into a new one.
Source deployment ID to clone
Make the cloned deployment active immediately
m87 <device> deployment update
Update a deployment (remove/replace/rename specs).
Deployment to update (defaults to active)
Remove job(s) by ID (can be used multiple times)
Replace job:
<job_id>=<file> (can be used multiple times)Rename job:
<job_id>=<new_name> (can be used multiple times)Enable job(s) by ID (can be used multiple times)
Disable job(s) by ID (can be used multiple times)
Spec type for replacements:
auto, compose, runspecDevice Access Control
m87 <device> access list
List users with access to the device.
m87 <device> access add
Grant access to a user or organization.
Email address or organization ID
Role:
admin, editor, or viewerm87 <device> access remove
Revoke access from a user or organization.
Email address or organization ID
m87 <device> access update
Update user or organization role.
Email address or organization ID
New role:
admin, editor, or viewerOrganization Commands
m87 org list
List all organizations.
m87 org create
Create a new organization.
Organization ID
Email of organization owner
m87 org delete
Delete an organization.
Organization ID to delete
m87 org update
Update organization ID.
Current organization ID
New organization ID
Organization Members
m87 org members list
List organization members.
Organization ID (auto-resolved if omitted)
m87 org members add
Add a member to the organization.
Member email address
Role:
admin, editor, or viewerOrganization ID (auto-resolved if omitted)
m87 org members update
Update a member’s role.
Member email address
New role:
admin, editor, or viewerOrganization ID (auto-resolved if omitted)
m87 org members remove
Remove a member from the organization.
Member email address
Organization ID (auto-resolved if omitted)
Organization Devices
m87 org devices list
List devices owned by the organization.
Organization ID (auto-resolved if omitted)
m87 org devices add
Add a device to the organization.
Device name or ID
Organization ID (auto-resolved if omitted)
m87 org devices remove
Remove a device from the organization.
Device name or ID
Organization ID (auto-resolved if omitted)
Runtime Commands (Linux Only)
These commands manage the m87 runtime service on Linux devices. Most require root privileges and automatically invokesudo.
m87 runtime login
Register this device as a runtime (headless flow, requires approval).
Organization ID to register runtime under (mutually exclusive with —email)
Email address to register runtime under (mutually exclusive with —org-id)
m87 devices approve <device>.
m87 runtime logout
Logout and deauthenticate the runtime.
m87 runtime run
Run the runtime daemon (blocking, used by systemd service).
Organization ID to register runtime under
Email address to register runtime under
m87 runtime start
Start the runtime service now.
Organization ID to register runtime under
Email address to register runtime under
m87 runtime stop
Stop the runtime service now.
m87 runtime restart
Restart the runtime service.
Organization ID to register runtime under
Email address to register runtime under
m87 runtime enable
Configure service to auto-start on boot.
Enable AND start service immediately
Organization ID to register runtime under
Email address to register runtime under
m87 runtime disable
Remove auto-start on boot.
Disable AND stop service immediately