MCP server that exposes MIOSA computer-use tools to Claude Code
Project description
miosa-mcp
MCP (Model Context Protocol) bridge that exposes MIOSA cloud sandboxes & 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"
}
}
}
}
Use stdio when you need to wrap the MCP layer with custom local logic, or your client doesn't 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.
Tools
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 tenant. |
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. |
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:
- Reads
MIOSA_API_KEYfrom the environment - Initializes an
AsyncMiosaclient - Maintains an in-process cache of
AsyncComputerobjects - Serves MCP tools over stdio (the protocol Claude Code uses)
- Maps every tool call to the corresponding MIOSA SDK method
- 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file miosa_mcp-0.2.0.tar.gz.
File metadata
- Download URL: miosa_mcp-0.2.0.tar.gz
- Upload date:
- Size: 34.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41b174c257946761ea92e01d5bcf1165e8824c1b7572376239d5f2e981c43478
|
|
| MD5 |
3d329cf1514bcd0c478634184856f087
|
|
| BLAKE2b-256 |
3228f307212267604196141378a9934a1ec44d3a49e2b79646c93f3866ece59f
|
File details
Details for the file miosa_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: miosa_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 32.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4adc940a216ab0c49a1cea5b335bb4498fc6f996049104ea88bb6c318d58c915
|
|
| MD5 |
3a6fbeea7a4551ddf525dfbca2a2a53f
|
|
| BLAKE2b-256 |
d2c738bb174b281faed9ccdd7af219ed03b3c1d4d73f0a8fbab5eb630397a945
|