Skip to main content

MCP server for MIOSA computers, sandboxes, deployments, and durable runs

Project description

miosa-mcp

MCP (Model Context Protocol) bridge that exposes MIOSA cloud sandboxes and desktops to any MCP-aware client (Claude Code, Cursor, Gemini CLI, etc.).

Two ways to run it

1. Hosted (recommended) - no install

MIOSA ships a public MCP endpoint at https://api.miosa.ai/api/v1/mcp. Point any MCP client at it with your msk_u_* API key as a Bearer token:

claude mcp add --transport http miosa \
  https://api.miosa.ai/api/v1/mcp \
  --header "Authorization: Bearer msk_u_your_key_here"

Full guide: docs/api/mcp-connect.md.

2. Local stdio (this Python package)

Install:

pip install miosa-mcp

Add to ~/.claude/mcp.json:

{
  "mcpServers": {
    "miosa": {
      "command": "python",
      "args": ["-m", "miosa_mcp"],
      "env": {
        "MIOSA_API_KEY": "msk_u_your_key_here",
        "MIOSA_TENANT": "optional-organization-slug"
      }
    }
  }
}

Use stdio when you need to wrap the MCP layer with custom local logic, or your client does not yet support remote MCP. Both modes hit the same MIOSA REST API under the hood.

Get your API key at https://miosa.ai/dashboard/api-keys.

MIOSA_TENANT selects an initial organization for every API request. You can also change organization context during a session with organization_switch. The backend verifies membership before MCP updates its active context.

Tools

Organizations

Tool Description
organization_list() List organizations available to the authenticated user.
organization_current() Show the organization currently used for MCP requests.
organization_switch(organization) Select an organization by UUID or slug and propagate it through X-MIOSA-Tenant.

Durable runs

Tool Description
run_create(target_kind, target_id, instruction?, command?, ...) Start a durable agent or command run on a Sandbox or Computer.
run_list(...) List runs with target, status, and external attribution filters.
run_get(run_id) Get current run state.
run_cancel(run_id) Cancel a run.
run_outputs(run_id) Get structured run outputs.
run_messages(run_id) Get structured run messages.
run_files(run_id) List files produced by a run.

Runs are the canonical agent execution contract exposed by MCP. Use run_create instead of legacy agent-run terminology in new integrations.

Lifecycle

Tool Description
computer_create(name, template_type?, size?) Create a computer and start it. Becomes the active computer.
computer_list() List all computers in your active organization.
computer_destroy(computer_id?) Permanently destroy a computer.

Desktop - Visual

Tool Description
computer_screenshot(computer_id?) Capture a PNG screenshot. Claude can see and reason about it.
computer_get_screen_size(computer_id?) Get screen resolution in pixels.
computer_get_cursor_position(computer_id?) Get current cursor x/y.

Desktop - Pointer

Tool Description
computer_click(x, y, button?, computer_id?) Click at coordinates.
computer_double_click(x, y, computer_id?) Double-click at coordinates.
computer_move_cursor(x, y, computer_id?) Move cursor without clicking.
computer_drag(from_x, from_y, to_x, to_y, computer_id?) Click-drag between positions.
computer_scroll(direction?, clicks?, x?, y?, computer_id?) Scroll up/down/left/right.

Desktop - Keyboard

Tool Description
computer_type(text, computer_id?) Type text into the focused field.
computer_key(key, computer_id?) Press a single key (Return, Tab, Escape, etc.).
computer_hotkey(keys, computer_id?) Press a key combo (e.g. ["ctrl", "c"]).

Clipboard

Tool Description
computer_get_clipboard(computer_id?) Read clipboard text.
computer_set_clipboard(text, computer_id?) Write clipboard text.

Window Management

Tool Description
computer_windows(computer_id?) List open windows with IDs, titles, positions.
computer_launch(app, computer_id?) Launch an app by name (firefox, gedit, xterm…).

Shell & Files

Tool Description
computer_bash(command, timeout?, computer_id?) Run a bash command; returns stdout, stderr, exit_code.
computer_write_file(path, content, computer_id?) Write a file inside the VM.
computer_read_file(path, computer_id?) Read a file from inside the VM.

Docker Deploy

Use this sequence for app/container publishing:

Step Tool Purpose
1 docker_deploy_template_list / docker_deploy_template_get Choose a Docker Deploy app template. Template data may include DESIGN.md context and design reference presets.
2 docker_deploy_host_ensure Create or reuse the workspace Docker appliance.
3 sandbox_deploy_docker Publish the sandbox app to Docker Deploy. Pass docker_deploy_template_id when the app came from a template.
4 docker_deploy_doctor Verify product marker, host health, route metadata, and public URL before reporting success.

Agents should treat docker_deploy_doctor.ok=false as not live, even if the URL returns HTTP 200. The doctor detects the platform gateway JSON response that can otherwise look like a successful app response.

Sandbox and deployment creation tools preserve external_workspace_id, external_user_id, and external_project_id attribution. URL-bearing results are returned as JSON and keep preview_url or public_url alongside the resource data instead of flattening the response into prose.

Errors

Failed tool calls use MCP isError=true and include a structured error object. The object preserves the backend error code, HTTP status, request ID, response details, tool name, and human-readable message. Clients can branch on stable codes such as INVALID_TENANT_CONTEXT without parsing display text.

Active Computer

All tools accept an optional computer_id. When omitted, the server uses the most recently created or accessed computer automatically. This means you can computer_create once and omit the ID for the rest of the session.

Example session

> computer_create(name="my-dev-box")
Created computer 'my-dev-box' (id=comp_abc123, status=running). This is now the active computer.

> computer_screenshot()
[PNG image of the desktop appears in Claude's context]

> computer_bash(command="ls /home")
stdout:
ubuntu
exit_code: 0

> computer_launch(app="firefox")
Launched: firefox

> computer_screenshot()
[Firefox is now open]

> computer_click(x=640, y=50)
Clicked (640, 50) button=left

> computer_type(text="https://miosa.ai")
Typed: 'https://miosa.ai'

> computer_key(key="Return")
Pressed key: Return

Development

# Install deps (requires Python 3.10+)
pip install -e ".[dev]"

# Type-check
mypy miosa_mcp/

# Lint
ruff check miosa_mcp/

Architecture

The server is a single async Python process that:

  1. Reads MIOSA_API_KEY from the environment
  2. Applies optional MIOSA_TENANT context through X-MIOSA-Tenant
  3. Initializes an AsyncMiosa client
  4. Maintains an in-process cache of AsyncComputer objects
  5. Serves MCP tools over stdio (the protocol Claude Code uses)
  6. Maps every tool call to the corresponding MIOSA SDK or REST contract
  7. Returns screenshots as base64-encoded PNG images (MCP ImageContent)

All desktop action tools (click, type, key, etc.) call the MIOSA platform API which proxies commands through to the running VM's envd daemon at port 49983.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

miosa_mcp-0.3.0.tar.gz (145.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

miosa_mcp-0.3.0-py3-none-any.whl (41.0 kB view details)

Uploaded Python 3

File details

Details for the file miosa_mcp-0.3.0.tar.gz.

File metadata

  • Download URL: miosa_mcp-0.3.0.tar.gz
  • Upload date:
  • Size: 145.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for miosa_mcp-0.3.0.tar.gz
Algorithm Hash digest
SHA256 4c83cd3e87b447bf85433dde394569ec13d63438706f7ba0aa06eb3c2be51f39
MD5 f1e5d40dd2c3530a955511d225bffc2f
BLAKE2b-256 8dd18365887ffe2c098325e9dede3fcec252a0aea3b88714a1654f1262df2013

See more details on using hashes here.

File details

Details for the file miosa_mcp-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: miosa_mcp-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 41.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for miosa_mcp-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0294c95037d624521837f6ca7a517376b761c66d7f3a7bd71d2ea826c6a92a00
MD5 21310c649bae82cc8043ea7c769c4dce
BLAKE2b-256 cf5751ba639625f8865f7f37e8fa9032ebdfcfd8cb14712bd4d0388516b24326

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page