Minion

io.github.Apophisss由 GitHub 账号 Apophisss 发布v1.1.1更新于 Nov 6, 2026

Featherweight Linux desktops for AI agents: read the screen as text, click, type, run any app.

概览

AI 生成的概览

为 AI 智能体提供一个轻量级 Linux 桌面容器,让它把屏幕读成文本、点击、输入并运行任意应用。

可以做什么
  • 读取屏幕:把窗口控件列成带稳定编号的文本,无障碍信息缺失时用 OCR 补读,并可截图并标注编号
  • 操作桌面:点击、输入、填写字段、按键、滚动、选择下拉项、执行菜单命令、填写打开/保存对话框
  • 管理桌面:创建、克隆、冻结、快照和恢复容器,并行运行多个桌面,并在桌面内执行 Python 代码
  • 使用应用与文档:按名称打开 130 多个应用、安装软件包、把 docx、xlsx、pptx、pdf 读成文本并转换格式
  • 交给人处理:打开浏览器实时视图接管鼠标键盘、传输文件、共享剪贴板,并等待人工完成登录
  • 录制与回放:导出会话时间线或 GIF,或把会话转成无需模型的 Python 回放脚本
适用场景
适合智能体需要操作没有 API 的真实桌面软件或网站(如 LibreOffice、IDE、终端、Windows 程序)的场景,也适合希望把这些操作隔离在一次性容器里、而不是在自己电脑上执行的情况。
运行要求
以本地 stdio 进程运行(uvx 或 npx minion-desktop mcp,或 Claude Desktop 扩展)。需要 Docker、OrbStack 或 Podman,或在 Linux 上原生运行,用来承载桌面容器。各配置档首次使用时会下载镜像(约 200 MB 至 720 MB)。未声明任何 API 密钥或环境变量。
安装前请注意
智能体可以安装软件并运行任意程序:容器内桌面用户拥有免密 sudo。应把屏幕上的内容视为不可信输入(提示注入),除非有人工接管,否则不要把凭据放进桌面。为复用而保存的登录状态会留在本机 Docker 中。远程共享会以带令牌的 HTTPS 暴露桌面,直到你停止共享。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Minion,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Minion: instant desktops for AI agents]

Give every AI agent its own computer.

Featherweight Linux desktops (office, dev, research, browser, data, Windows apps) that any agent can use:
Claude, ChatGPT, Gemini, Cursor, VS Code, LangChain, your own code, or a model running on your laptop.
Agents read the screen as text, act in batches or in code, and use any program or website.

[PyPI] [CI] [Python 3.11+] [Zero dependencies] [MCP] [MIT]

English · 简体中文 · 繁體中文 · 한국어 · 日本語 · עברית

Get started

All you need is Docker (or OrbStack or Podman). Then pick one:

1. One click in your AI app:

[Download the Claude Desktop extension] [Install in VS Code] [Add to Cursor] [Install in Visual Studio] [Add to LM Studio] [Install in Goose] [Add to Kiro]

Claude Code: claude plugin marketplace add apophisss/minion && claude plugin install minion@minion. Any other MCP client: uvx minion-desktop mcp, or npx -y minion-desktop mcp. The buttons, uvx and npx start Minion with uv (npx can use pipx instead); the Claude Desktop extension needs nothing else.

2. One line that installs Minion and connects every AI app on your computer (Claude Desktop, Claude Code, Cursor, VS Code, Windsurf/Devin, Gemini CLI, Codex, LM Studio, Cline, Kiro):

bash
curl -fsSL https://raw.githubusercontent.com/apophisss/minion/main/install.sh | sh        # macOS, Linux
powershell
irm https://raw.githubusercontent.com/apophisss/minion/main/install.ps1 | iex             # Windows

It ends with minion setup, which checks Docker, prepares a desktop and runs minion connect. Run either one again any time.

3. From ChatGPT, Claude.ai or Le Chat in the browser: run minion share and paste the URL it prints into the app's connector settings (how).

Then just ask: "Create an office desktop, write a one-page brief about our Q3 numbers in Writer and save it as brief.docx." Every way to install is in docs/install.md.

[Play the one-minute demo: an agent researches Lisbon on Wikipedia, makes a budget with a chart in LibreOffice Calc and exports a plan as PDF from Writer]

▶ Watch the one-minute demo: an agent researches a trip on Wikipedia, makes a budget with a chart and writes the plan as a PDF. 12 tool calls and 2,372 tokens of text; the same steps with screenshots would cost about 36,855. Recorded live with python scripts/demo_video.py, which makes the calls an agent would make.


Why Minion

  • 🖥️ Any program, any website. Every desktop is a real Linux computer: browsers, LibreOffice, IDEs, terminals, file dialogs and installers, plus Windows programs through the windows (Wine) profile. Open any app by name and it is installed the first time (open gimp, open vscode, open dbeaver, any Debian package), web apps open in the browser (open gmail), and the first open answers with a few tips for the app. 130+ apps by name.
  • 🧭 Shortcuts through every app. see --menus lists every menu command with its keyboard shortcut, and menu "File > Export as PDF" runs one without opening a menu. path ~/out.pdf fills any Open/Save dialog. Right-click menus show up in see, button:Save picks one kind of control, and a button below the fold is scrolled into view. Any document reads as text (read report.docx, xlsx with formulas, pptx, pdf) and converts in one call (convert report.docx pdf).
  • 🧠 Agents read the screen as text. see turns any window into a list of controls with stable @ids, taken from the accessibility tree with OCR as a fallback: @12 button "Save" (210,62). Web pages, editors (with line numbers), terminals, dropdowns with their options, and spreadsheets (row by row: row 2: A2 North · B2 120) all come out as exact text. When pixels matter, screenshots can draw the @ids for you.
  • 🎯 Honest actions. Every action waits for the screen to settle (for web pages to load, and while an app says "Loading…") and reports what happened: windows, a page's alert or prompt, files saved or downloaded, a pop-up that took the click. Text targets must really be on screen: a miss fails with the closest candidates instead of clicking something else. Tested on 93 everyday tasks done by AI agents.
  • 🪙 Built to save tokens. You get diffs instead of re-reads (see(changes=true): about 80 tokens instead of about 900). Code mode runs a 50-step GUI loop in one call, crops and half-size screenshots cut image cost, a compact mode shrinks the tool definitions from about 3,300 tokens to 450, and the Agent Skill costs about 100 tokens until it is used.
  • 🪶 Featherweight. One small container per desktop (Xvfb, a 2-process window manager and taskbar, a small agent), with no VNC and no desktop environment. Desktops are ready in about 1.5 s and use about 60 MB when idle. Idle desktops are frozen automatically (0% CPU) and wake in about 0.2 s.
  • 🔌 Works with every agent. One toolset everywhere: MCP (local or remote), function calling for OpenAI, Anthropic, Gemini and local models, HTTP with OpenAPI, a CLI and an Agent Skill for shell agents, Python and TypeScript SDKs, and native adapters for Claude, OpenAI and Gemini computer use.
  • ⚡ Parallel by design. create count=8 starts a desktop per worker, fork clones one before a risky step, and sessions keep agents apart.
  • 🙋 Humans in the loop. A live view in the browser offers one-click take control, moves files both ways (drop them on the screen) and shares the clipboard. Agents can hand off ("please sign in") and wait for Done, and a sign-in saved once by hand starts new desktops signed in.
  • 🎞️ Teach once, replay forever. Every action is recorded. Export an HTML timeline or GIF, or turn the session into a Python script that replays it with no model at all.
  • 📦 Zero dependencies. The host side is pure Python standard library. Desktops run in Docker or Podman (macOS, Windows, Linux), or natively on Linux.

A quick tour from the shell

Any agent with a terminal (Claude Code, Codex CLI, Aider, Open Interpreter, Goose) can use the CLI directly, and minion skill --install teaches it how:

bash
minion up researchminion open en.wikipedia.org             # waits until the page has loadedminion fill "Search Wikipedia" "Ada Lovelace" && minion key Returnminion wait-for "Analytical Engine"      # says where it saw the textminion see --full                        # read the article as textminion select @14 "Title"                # pick a dropdown optionminion shot -o page.png --marks          # a screenshot with @ids drawn on itminion read ~/Downloads/paper.pdf         # any document as text: pdf, docx, xlsx, pptx, epub...minion open gimp                          # any app by name: installed the first timeminion menu "File > Export As > Export as PDF..."   # any menu commandminion path ~/Documents/report.pdf        # fill the open Save/Open dialogminion cp :~/Documents/notes.md .        # copy files out (and in)

[An agent exports a PDF through LibreOffice's menu and Save dialog, then opens GIMP, which installs itself first]

Menus, file dialogs and apps by name: menu "File > Export As > Export Directly as PDF", path ~/Documents/report.pdf, then open gimp, which installed GIMP in 16 s. Recorded by the flight recorder.

Works with every agent

Your agentConnect with
Claude Desktop/Code, Cursor, VS Code, Codex, Gemini CLI, opencode, OpenClaw, Windsurf/Devin, LM Studio, Kiro, Gooseone click, minion connect, or uvx minion-desktop mcp (install)
Agent frameworks: OpenAI Agents SDK, LangChain/LangGraph, LlamaIndex, CrewAI, smolagents, Pydantic AI, Google ADK, AutoGenthe same MCP server (verified recipes)
ChatGPT, Claude.ai, Le Chat (web apps)minion share: remote MCP over HTTPS (docs)
Any model with function calling (OpenAI, Anthropic, Gemini, Mistral, local models via Ollama/vLLM)Toolkit().definitions("openai" | "anthropic" | "gemini") + Toolkit().run_calls() (docs)
Anything that speaks HTTP (n8n, Dify, GPT Actions, any language)minion serve → /api/tools/*, /mcp and /openapi.json (docs)
Shell agentsthe minion CLI (docs) and its Agent Skill (minion skill --install)
Python / TypeScript codefrom minion import Desktop (docs) · clients/typescript
Native computer-use modelsClaude toolset (docs) · OpenAI and Gemini computer use (docs)

A complete agent with any OpenAI-compatible model ("anthropic", "gemini" and "openai-responses" work the same way):

python
from openai import OpenAIfrom minion.tools import Toolkit
tk = Toolkit()client = OpenAI()  # or OpenAI(base_url="http://localhost:11434/v1", api_key="ollama") for a local modelmessages = [{"role": "user", "content": "On a research desktop, find the population of Iceland on Wikipedia."}]while True:    msg = (        client.chat.completions.create(model="YOUR-MODEL", messages=messages, tools=tk.definitions("openai"))        .choices[0]        .message    )    messages.append(msg)    if not msg.tool_calls:        break    messages += tk.run_calls(msg.tool_calls)  # runs every call, returns the messages to send backprint(msg.content)

Python, and code mode

python
from minion import Desktop
with Desktop.create("office", keep=False) as desk:  # removed when the block ends    desk.open("calc")    result = desk.script("""for item, price in [("Coffee", 3.5), ("Bagel", 2.25), ("Juice", 4)]:    write(f"{item}\\t{price}\\n")             # Tab moves right, Return goes downwrite("Total\\t=SUM(B1:B3)\\n")print(cells()["B4"])                          # visible cells as {"A1": ...}""")    print(result.stdout)  # 9.75    desk.key("ctrl+s")    desk.fill("Name", "q3.xlsx")    desk.key("Return")    desk.wait_for("q3.xlsx")    desk.download("~/Documents/q3.xlsx", ".")

script runs Python inside the desktop with click · write · key · scroll · fill · see · elements · cells · wait_for · launch · run. Loops cost one call, and only what the code prints comes back. The Desktop API also has screenshot · see · act · open · run · upload · download · clipboard · windows · freeze · fork · snapshot · restore · recording · create_many. See docs/python.md.

Native computer use (Claude, OpenAI, Gemini)

Minion is a ready environment for each vendor's computer-use model, with screenshot scaling and coordinate mapping handled for you:

python
import anthropicfrom minion import Desktopfrom minion.integrations.anthropic import MinionComputer, allow_all
desk = Desktop.create("office")with MinionComputer(desk, confirm=allow_all) as computer:  # the desktop is the sandbox    runner = anthropic.Anthropic().beta.messages.tool_runner(        model="claude-opus-5-5",        max_tokens=16000,        tools=[computer],        messages=[{"role": "user", "content": "Make a 3-slide deck about otters in Impress."}],    )    for message in runner:        print(message)

Claude's computer_toolset_20260801 (all 17 actions) and the earlier computer_20251124 are covered in docs/computer-use.md. OpenAI and Gemini computer use are covered in docs/computer-use-openai-gemini.md.

Profiles

ProfileWhat's insideDownloadIdle RAM
🌐 browserFirefox with uBlock Origin (ads, trackers, cookie banners, newsletter pop-ups), downloads straight to ~/Downloads, a terminal see can read363 MB~55–100 MB
📄 officeLibreOffice Writer, Calc, Impress + text editor + file manager + Firefox + PDF tools. Saves Microsoft formats by default, and types exactly what the agent sends (no AutoCorrect)526 MB~85 MB
🛠️ devgit, Python, Node.js, build tools, Geany IDE, a real terminal (readable by see), Firefox + Chromium714 MB~55 MB
🔎 researchFirefox + pdftotext, pandoc, a notes editor, Python with requests and BeautifulSoup422 MB~55 MB
📊 dataoffice + pandas, NumPy, SciPy, matplotlib, seaborn, openpyxl, SQLite674 MB~105 MB
🪟 windowsWine 10 for 64- and 32-bit Windows .exe/.msi programs, plus Firefox to download them. x86-64 hosts (docs)717 MB~56 MB (~270 MB with a program open)
🧩 baseX server, window manager, terminal and the agent. The foundation to build on199 MB~65 MB

Your own profile is a 5-line TOML file in ~/.config/minion/profiles/. It is built automatically the first time you use it:

toml
# ~/.config/minion/profiles/designer.tomlextends = "browser"description = "Firefox plus GIMP and Inkscape."packages = ["gimp", "inkscape"]apps = [{ name = "GIMP", command = "gimp" }, { name = "Inkscape", command = "inkscape" }]

Or add software at runtime: minion run "minion-install gimp https://example.com/tool.AppImage pip:yt-dlp". See docs/profiles.md.

How agents see the screen

see is the agent's main sense. Here it is on a LibreOffice window:

text
Screen 1280x800 · 1 window  [1] "Untitled 1 — LibreOffice Writer" — libreoffice-writer (focused) at 0,0 1280x770
UI of "Untitled 1 — LibreOffice Writer" (click/fill with @id; (x,y) is the element center):@1 menu "File" (22,38)@2 menu "Edit" (62,38)…@12 document text "Untitled 1 - LibreOffice Document" [editable] (603,424)  @13 heading "Q3 Market Brief" (603,247)  @14 paragraph "Prepared by an AI agent on a Minion desktop. No human touched the keyboard." (603,282)

After an action, observe="changes" (or see(changes=true)) returns only the difference:

text
✓ typed 30 chars→ screen changed <1% (region 404,226 236x20)Changes since your last look 1.0s ago (81 elements unchanged; their @ids still work):  + @84 paragraph "Quarterly numbers look strong." [focused] (603,234)  ~ @80 label "4 words, 30 characters" (281,730)

Text that accessibility doesn't expose (a slideshow, a canvas app, a picture of text, a remote screen, a program without an accessibility tree) is read with OCR, only where it is missing and in the screen's own language: the scripts in the window's titles and labels choose it. Hebrew, Arabic, Russian, Chinese, Japanese, Korean and Hindi are built in, and other languages install on first use. Large text and light text on colour get passes of their own, and a picture that hasn't changed is never read twice. On 24 photographed Hebrew slides, see reads 94% of the words. Here it is on a web page that shows a slide as an image:

text
@2 heading "Board meeting, October 15" (640,131)@3 paragraph "The slides from the quarterly review:" (640,186)
Text in the picture at 0,117 800x480 (OCR: accessibility doesn't have it):  @4 "Q3 review" (146,254)  @5 "Revenue grew 12% to $4.1M" (218,348)  @6 "1,240 new customers, churn down to 2.1%" (291,404)  @7 "Next: launch in Japan and Brazil" (239,460)  @8 "| Goal: $5M in Q4" (163,555)

When pixels matter, screenshot --marks labels every control with its @id:

[Screenshot with @id marks on every clickable element]

Efficiency, measured

Five real tasks (a PDF report, a spreadsheet, a Wikipedia lookup, a web form, reading a document) cost an agent 8,668 tokens with Minion and 50,505 with screenshots: 5.8× fewer. The full table and method are in docs/benchmarks.md; reproduce it with python scripts/bench_tasks.py.

Tokens
Screenshot 1280×800~1,365the baseline
screenshot(detail="low")~341half size
act(observe="crop"), only the changed region~200
see of a LibreOffice window~920exact text plus clickable ids
see(changes=true) after typing a sentence~80stable ids, diff only
see of a terminal~50–90
Tool definitions: 9 tools / compact computer~3,300 / ~450sent with every request
5 rows of spreadsheet entry: act ×5 / script ×15 calls / 1 callno model round trip per step
Resources
Ready in1.2–1.8 s (every profile)
Idle RAM54–105 MB per desktop (Firefox/LibreOffice add their own when open)
Frozen0.00% CPU, thawed in ~0.2 s on the next call
3 desktops in parallel3.0 s

These were measured on a 2-vCPU VM. Reproduce them with python scripts/bench.py.

Watch, take over, hand off

minion view (or the view tool) opens a live view of any desktop in your browser. Click Take control to use your own mouse and keyboard. An agent can call view(message="Please sign in to your Google account"): you get a banner, sign in, press Done, and the agent continues. Files downloads from the desktop and uploads to it (or drop files on the screen), Copy brings the desktop's clipboard to yours, and Keys sends the ones your browser keeps (Ctrl+W, Alt+Tab).

Sign in once and start desktops signed in: minion login github https://github.com/login opens a desktop there in the live view, you sign in and press Done, and from then on minion up --login github (or desktop(action="create", login="github")) starts desktops already signed in. The sign-in stays in your computer's Docker (details). minion serve adds a dashboard with live thumbnails:

[The Minion dashboard with live desktop thumbnails]

How it works

mermaid
flowchart LR  subgraph host["Your machine"]    A["Any agent<br/>(MCP, function calling, HTTP, CLI, SDK)"] --> T["minion tools<br/>(pure-stdlib Python)"]    T --> V["Live view and dashboard<br/>(minion serve)"]  end  subgraph desk["Desktop (one container each)"]    S["minion agent<br/>RPC over docker exec"] --> X["Xvfb + JWM"]    S --> AT["AT-SPI<br/>accessibility tree"]    S --> O["Tesseract OCR"]    S --> C["code mode<br/>(Python inside)"]    X --> Apps["Firefox · LibreOffice · Terminal · Wine · …"]  end  T -->|"docker exec (no open ports)"| S

Read docs/design.md for the reasoning behind each choice, and docs/architecture.md for the internals.

Security

Each desktop is an unprivileged container with no host mounts by default. Use --offline to cut network access, or limit resources with --memory and --cpus. The HTTP server binds to 127.0.0.1, needs a random token, and refuses cross-site and DNS-rebinding requests. File transfers to and from your computer stay inside one folder, and minion share URLs carry a fresh token and stop working when you stop sharing. The desktop user has passwordless sudo inside the container, so agents can install software. Treat everything on a screen as untrusted input (prompt injection), and keep credentials out of desktops unless a human hands off. Read SECURITY.md.

Documentation

Website · Install · Connect your apps · Remote MCP · Design · Agents & MCP · Integrations · CLI · Python · HTTP API · Claude computer use · OpenAI & Gemini computer use · Profiles · Apps by name · Windows apps · Architecture · FAQ

Contributing

Questions and ideas are welcome in Discussions, and bugs in issues. To help build Minion, pick a good first issue (translations, apps, agent apps, benchmark tasks), read CONTRIBUTING.md, and see where it's going in the roadmap.

License

MIT. The desktops contain open-source software under their own licenses (Debian, Firefox, LibreOffice, Wine, …).

来源:README.md,提交 f63929e

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v1.1.1最新Oct 16, 2026
  2. v1.0.0Oct 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分