Legwork について
Legworkは、AIクライアントがGitHubでオープンソースツールを探し、コードを確認してサンドボックスにインストール・テストし、利用できるようにするMCPサーバーです。ローカルファイルへのアクセスを制限しながらツールを追加したい人向けです。
主な機能
- 01GitHubでツールを検索
- 02コード内の隠れたペイロードを検査
- 03サンドボックス型MCPツールの構築とテスト
- 04許可したフォルダーへのアクセス制限
- 05インストール済みツールのキャッシュ
活用シーン
- 01MCPサーバーのない作業向けのツール探し
- 02ローカルPDFから表を抽出
- 03音声や動画ファイルの文字起こし
- 04URLからQRコードを作成
MCP 対応
Legworkはローカルのstdio MCPサーバーとして動作します。hubは検索、インストール、状態確認、インストール済みツールの一覧表示と実行を提供し、ファイルやネットワークへのアクセスは設定範囲内に制限されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Legwork
AI が GitHub で必要なオープンソースツールを見つけます。Legwork がサンドボックスにインストールします。
https://github.com/user-attachments/assets/9e9b80b5-99ff-4d21-b689-74655418f23d
Claude Desktop での実際の実行例です。25 秒かかるインストールを早送りし、マルウェアを含むリポジトリの名前は伏せています。
Legwork を Claude、Cursor、Codex、opencode、または任意の MCP クライアントに一度追加するだけです。AI が対応するツールを持っていない作業を頼むと、 GitHub を検索してリポジトリを選び、インストールの承認を求めます。 その後 Legwork がコードに隠れたペイロードがないか確認し、サンドボックス内で動作するツールをビルドして テストし、引き渡します。ホームフォルダー内では、許可したフォルダーだけを読み取れます。
claude mcp add legwork -- uvx legwork-mcp hub --allow-read ~/Downloads
あとは頼むだけです。まず試せる 4 つのツールは、すべて公開キャッシュにあるため、 API キーは不要です。
- 「Legwork を使って ~/Downloads/memo.m4a を文字起こしして。」 音声メモ、mp3、動画に対応し、オフラインで動作します。英語やその他の広く使われている言語に最適です。組み込みの小型モデルは、テルグ語などの言語では信頼性が低くなります。
- 「Legwork を使って ~/Downloads/photo.jpg の背景を削除して。」
- 「Legwork を使って ~/Downloads/report.pdf から表を取り出して。」
- 「Legwork を使って https://github.com/kumarganduri/legwork の QR コードを作成して。」
Claude Desktop では、「Legwork を使って」と指定することが重要です。指定しないと、Claude は独自のクラウドコードサンドボックスを使う可能性があり、ファイルを添付しない限り、コンピューター上のファイルを参照できません。
AI がツール(faster-whisper、
rembg、
pdfplumber、
qrcode)を見つけ、インストールを承認すると、
約 1 分後には作業を実行します。ツールが作成したファイルは
~/Legwork/outputs/ にコピーされます。macOS でツールが Downloads を初めて読み取るときは、
uvx にアクセスを許可するかどうかを macOS が尋ねます。一度許可してください。動作しない場合は、
uvx legwork-mcp doctor でセットアップを確認できます。または、uvx legwork-mcp owner/repo で自分でツールを
ビルドすることもできます(キャッシュにないリポジトリにはモデルキーが必要です)。
AI にインストールを頼むだけではだめなのですか?
- ほとんどのリポジトリには、インストールできる MCP サーバーがありません。 AI はその場で毎回、テストされていないサーバーを作成しなければなりません。Legwork は一度作成し、セルフテストで動作を確認してからキャッシュするため、次の人が同じ作業をする必要はありません。
- AI がインストールするものは、すべてコンピューターにフルアクセスできます。 SSH キー、ファイル、環境変数にもアクセスできます。以下の 2 つのマルウェアリポジトリは、こうして侵入していたでしょう。Legwork はまずコードに難読化されたペイロードがないか確認し、インストールするすべてのツールをサンドボックスで実行します。ホームフォルダー内では、許可したフォルダーだけを参照できます。
- さまざまなツールで使えます。 同じインストールを Claude Code、 Claude Desktop、Cursor、opencode、Codex CLI、Goose、OpenClaw で利用できます。
実際のリポジトリでの動作
2026-09-26 に、Legwork を使って、前週に GitHub で作成された AI リポジトリのうちスター数上位 10 件を、検索結果の順位どおりに選び、難しいという理由で除外することなく実行しました。
| 結果 | リポジトリ |
|---|---|
| ✅ 動作する MCP サーバーを構築 | 3 — npm CLI、Python ライブラリ、Go バイナリ |
| ↩️ 適切な理由を示して拒否 | 5 — Android/macOS アプリ 2 件、デスクトップアプリ、使用方法のドキュメントがないリポジトリ、独自の API キーが必要なツール |
| 🛑 インストール前にブロック(マルウェア) | 2 |
上位 10 件の「AI ツール」のうち 2 件は、当時、スター数がそれぞれ約 700 で作成から 3 日しか経っていませんでしたが、ファイル名を変えただけのバイト単位で同一な難読化ドロッパーを含んでいました。Legwork はインストール前のスキャンで、約 1 秒で両方を拒否しました。どちらからも何もインストールも実行もされていません。スター数は信頼性の指標ではありません。
このトリップワイヤーは、一般的なコードに対しても誤検知してはなりません。GitHub のスター数上位 150 件の Python、JavaScript、TypeScript リポジトリを対象に実行したところ(2026-10-01)、ブロックしたのは 1 件だけでした。それは、実際に eval(unescape(...)) を実行する、2009 年のデバッグスクリプトを同梱した lodash です。
失敗した点や修正内容も含めた詳細なレポート: docs/designs/legwork-trending-trial-2026-09-26.md。
次の新しいトレンドリポジトリ 22 件を対象にした、2 つのモデルによるより大規模な 2 回目の実行では、gpt-5 は 12 件を構築し、理由を示して 10 件を拒否し、クラッシュはありませんでした。OpenRouter の無料版 Nemotron は 4 件を構築しました。この実行では、マルウェアに関する誤警告 2 件と、公開済みパッケージしかインストールできないという問題も見つかりましたが、どちらも修正済みです。レポート。
AI が独自にツールを見つけられるようにする(ハブ)
legwork hub は、AI に 5 つのツール(find_tools、
install_tool、install_status、list_installed_tools、use_tool)を提供する MCP サーバーです。
claude mcp add legwork -- uvx legwork-mcp hub --allow-read ~/Downloads
Claude Desktop(macOS)では、
legwork.mcpb
をダウンロードして、ダブルクリックしてください。デスクトップアプリに拡張機能としてインストールされます。Settings → Extensions → Legwork → Configure で、ツールによる読み取りを許可するフォルダー(デフォルトは Downloads)と、インターネットの使用を許可するかどうかを選べます。リリース時の legwork-mcp を PyPI から実行します。
または、拡張機能を使わずに Cursor や Claude Desktop を使う場合は、MCP 設定に以下を追加してください(Claude Desktop の場合は、アプリを終了した状態で追加します)。パスのユーザー名はご自身のものに置き換えてください。存在しないフォルダーを指定すると、ハブは起動しません。
{ "mcpServers": { "legwork": { "command": "uvx",
"args": ["legwork-mcp", "hub", "--allow-read", "/Users/you/Downloads"] } } }
opencode では、~/.config/opencode/opencode.json に以下を追加してください。opencode はデフォルトで確認なしに MCP ツールを実行するため、インストール前に確認を求めるには permission の行が必要です。
{
"$schema": "https://opencode.ai/config.json",
"mcp": { "legwork": { "type": "local",
"command": ["uvx", "legwork-mcp", "hub", "--allow-read", "~/Downloads"] } },
"permission": { "legwork_install_tool": "ask" }
}
- インストールごとに承認が必要です: クライアントにリポジトリと、要求されるフォルダーが表示されます。リポジトリがキャッシュにない場合、モデルがビルド中にインストールコマンドを作成します。ビルドはそのコマンドを実行する前に停止し、正確なコマンドを表示します。2 回目の呼び出しで承認できます(
legwork buildはターミナルで y/N を尋ねます)。 - ハブのフラグが上限になります。 インストールで要求できるのは、許可したフォルダー以下の範囲のみで、それを超えることはできません。また、ハブを
--allow-netを付けて起動しない限り、ネットワークへのアクセスもできません。秘密情報を含むフォルダー(~/.ssh、~/.awsなど)は必ず拒否されます。 - インストールしたツールは名前で表示されます(
pdfplumber__extract_tables)。ツールリストを更新しないクライアントでもuse_toolが動作します。インストール内容は再起動後も保持されます。 - 検索結果から、AI は重要な情報を確認できます: スター数、ライセンス、リポジトリの最終更新時期、Legwork キャッシュ内にあるかどうか、すでに MCP サーバーがあるかどうか、そして非常に新しいリポジトリへの警告(検出したマルウェアは公開から 3 日でした)。説明文は信頼できないテキストとしてマークされます。
37 個のツールが公開キャッシュにあり、API キーなしで約 1 分でインストールできます:音声のテキスト化、OCR、背景の除去、PDF と Office ファイル、動画、YouTube の文字起こし、グラフ、DuckDB と CSV のツール、数学と単位、リンターとフォーマッターです。それぞれ、キャッシュに追加する前にビルドし、手作業でレビューしたうえで、実際に呼び出してテストしています。また、ラップ対象のパッケージのバージョンを固定しています(依存関係はインストール時に解決されます)。リリースで読み込まれるキャッシュは、そのリリースのタグが付いたものです。そのため、キャッシュの変更を利用できるのはアップグレード後です。それ以外のツールにはモデルのキーが必要で、ビルドには 1~5 分かかります。キーを ~/.legwork.env に記述してください(3 行、chmod 600)。ハブはビルドが必要になったときにキーを読み込むため、キーを平文で保存する MCP 設定に記述する必要はありません。
legwork find "extract tables pdf" を実行すると、同じ検索をターミナルから行えます。
- インターネットを使うツール(YouTube の文字起こしとダウンロード、ウェブページ)には、
--allow-netを付けてハブを起動する必要があります。付けない場合、インストールはできますが、接続できません。 - ツールが作成するファイル(トリミングした動画、グラフ、QR コード)は
~/Legwork/outputs/<tool>/にコピーされ、返信で保存先が示されます。画像は返信内にも表示されます。許可したフォルダーは引き続き読み取り専用のため、ツールがファイルの隣に書き込むことはできません。コピーされたファイルは実行可能にはならず、macOS ではダウンロードと同じ隔離フラグが付与されます。--outputs DIRを指定すると別の場所に保存でき、--outputs offを指定するとコピーを無効にできます。 - GitHub ではトークンなしの場合、1 分あたり 10 回の検索が可能です。
find_tools1 回につき 2~4 回の検索を行います。GitHub の検索制限に達しても、キャッシュ済みのツールは引き続き表示されます。1 分あたり 30 回にするには、GITHUB_TOKEN=<スコープのない GitHub トークン>を~/.legwork.envに追加してください。
その他の MCP クライアント
Legwork は標準的な stdio 経由の MCP サーバーなので、ローカル MCP サーバーを実行できるクライアントならどれでも利用できます。異なるのは、ツールを呼び出す前にクライアントが確認を求めるかどうかです。Legwork はツールにラベルを付けており(検索は読み取りのみ、インストールは操作を実行)、表で「確認あり」と記載されているクライアントはそのラベルを使用します。
| クライアント | テスト済み | Legwork の追加方法 | インストール前の確認 |
|---|---|---|---|
| Claude Code | ✅ | claude mcp add legwork -- uvx legwork-mcp hub --allow-read ~/Downloads | 確認あり |
| Claude Desktop | ✅ | 上記の JSON | 確認あり |
| Cursor | ✅ | 上記の JSON | デフォルトの自動レビュー モードでは AI が判断し、テストでは確認なしでインストールが実行されました。すべてのインストールを承認制にするには、Settings → Agents → Approvals & Execution で Allowlist を選択し、install_tool をリストに追加しないでください |
| opencode | ✅ 1.18 | 上記の JSON | 上記の permission 行がある場合のみ確認 |
| Codex CLI | ✅ 0.159 | codex mcp add legwork -- uvx legwork-mcp hub --allow-read ~/Downloads | 確認あり |
| Goose | ✅ 1.52 | goose session --with-extension "uvx legwork-mcp hub --allow-read ~/Downloads" | GOOSE_MODE=smart_approve の場合は確認あり。デフォルトのモードでは確認されません |
| OpenClaw | ✅ 2026.9 | openclaw mcp add legwork --command uvx --arg legwork-mcp --arg hub --arg --allow-read --arg ~/Downloads | デフォルトの全権限モードでは確認されません |
| Gemini CLI、Cline、Zed、Continue、... | 未テスト | クライアントの MCP 設定で同じコマンドを指定 | クライアントの設定を確認してください |
どのクライアントでも、ハブの起動時に指定したフォルダーとネットワークが利用範囲の上限となり、クライアントが確認を求めるかどうかは関係ありません。
起動を高速化するには: uvx は初回実行時に Legwork をダウンロードするため、一部のクライアントが待機できる時間より遅くなることがあります(Codex の待機時間は 10 秒です。~/.codex/config.toml の [mcp_servers.legwork] の下に startup_timeout_sec = 60 を追加してください)。または、uv tool install legwork-mcp で一度インストールし、which legwork で表示されるフルパスに hub ... を続けたものをコマンドとして使用してください(デスクトップアプリからはシェルの PATH が見えません)。uv tool upgrade legwork-mcp で更新できます。
クイックスタート
macOS または Linuxとuvが必要です。 公開キャッシュ内のツールには、それ以外は必要ありません。ほかのリポジトリでは、OpenAI 互換のチャット補完エンドポイント用のモデルキーも必要です(モデルプロバイダーを参照)。Legwork 自体は無料です。費用がかかるのはご自身のモデル使用分のみで、ビルドごとに1〜3回の呼び出しが発生します。
Linux: bubblewrap をインストールする(Ubuntu 24.04 以降では追加の手順が1つあります)
Linux のサンドボックスにはbubblewrapを使用します。
sudo apt install bubblewrap python3-venv # Debian/Ubuntu
sudo dnf install bubblewrap # Fedora
Ubuntu 24.04 以降では、プログラムの AppArmor プロファイルで許可されていない限り、bubblewrap が必要とするユーザー名前空間がブロックされます。システム全体で制限を無効にするのではなく、bwrap のみ許可してください(Ubuntu では Chrome と Flatpak に対してこの方法を採用しています)。
sudo tee /etc/apparmor.d/bwrap <<'EOF'
abi <abi/4.0>,
include <tunables/global>
profile bwrap /usr/bin/bwrap flags=(unconfined) {
userns,
include if exists <local/bwrap>
}
EOF
sudo apparmor_parser -r /etc/apparmor.d/bwrap
不足しているものがある場合、Legwork は停止し、これらの手順を表示します。
すべてのコミットでテスト済み: Apple シリコンおよび Intel 搭載の macOS、x86-64 および ARM64 の Ubuntu、Fedora、Debian。Windows: ネイティブではサポートされていません。WSL2 は Ubuntu と同様に動作するはずです(bubblewrap をインストールしてください)が、テストは行われていません。
公開キャッシュ内のリポジトリでは、モデルも API キーも必要ありません。
uvx legwork-mcp jsvine/pdfplumber
キャッシュ済みのラッパーを約1分でインストールしてテストし、接続用の行を表示します。
Installed the cached MCP wrapper for jsvine/pdfplumber; it passed its self-test here.
What it wraps: Extract text, tables, and low-level page objects from local PDFs using pdfplumber's Python API
Connect it to Claude Code:
claude mcp add pdfplumber -- ~/.local/bin/uvx legwork-mcp serve jsvine/pdfplumber
ほかのリポジトリでは、Legwork がモデルを使ってラッパーを作成します(1〜5分、ご自身のキーでモデルを1〜3回呼び出します。モデルプロバイダーを参照)。
export LEGWORK_LLM_ENDPOINT=https://api.openai.com/v1
export LEGWORK_LLM_API_KEY=... # your own key; never a CLI flag
export LEGWORK_LLM_MODEL=gpt-5
uvx legwork-mcp owner/repo
Claude Desktop、Cursor、その他のクライアント向けの mcpServers ブロックも表示されます。Claude Desktop の場合は、アプリを終了した状態で claude_desktop_config.json に追加してください。起動中のアプリは終了時に設定を書き戻し、自分で加えていない変更を破棄します。legwork コマンドを永続的に使うには、uv tool install legwork-mcp を実行してください。
アップグレード: uvx は最初にダウンロードしたバージョンを使い続けます。修正(およびそれに付属するキャッシュ)を取得するには、uvx legwork-mcp@latest を一度実行するか、uv cache clean legwork-mcp を実行してください。クライアントが古いバージョンに固定されている場合は、legwork doctor が警告します。
名前について: パッケージ名は legwork-mcp です。pip install legwork と uvx legwork では、無関係な天文学パッケージがインストールされます。
モデルプロバイダー
OpenAI 互換のチャット補完エンドポイントであれば、どれでも動作します。~/.legwork.env に3行を記述し、chmod 600 ~/.legwork.env でアクセスを制限してください。Legwork は環境内で変数が設定されていない場合にこのファイルを読み込みます(ほかのユーザーが読み取り可能な場合は使用しません)。
LEGWORK_LLM_ENDPOINT=https://api.openai.com/v1
LEGWORK_LLM_API_KEY=sk-...
LEGWORK_LLM_MODEL=gpt-5
| プロバイダー | LEGWORK_LLM_ENDPOINT | LEGWORK_LLM_MODEL(テスト済み) | 費用 |
|---|---|---|---|
| OpenAI | https://api.openai.com/v1 | gpt-5 | ご自身の API クレジット |
| Anthropic | https://api.anthropic.com/v1 | claude-sonnet-5 | ご自身の API クレジット |
| OpenRouter | https://openrouter.ai/api/v1 | nvidia/nemotron-3-super-120b-a12b:free | 無料モデル、レート制限あり |
| Ollama(ローカル) | http://127.0.0.1:11434/v1 | gpt-oss:20b | 無料。14 GB のダウンロード、約16 GB の RAM |
LEGWORK_LLM_API_KEY はご自身のキーです(Ollama の場合は空でない値なら何でも構いません)。
Ollama: コンテキストウィンドウを大きくして起動してください。そうしないと、Legwork のプロンプトが約2,000トークンでひそかに切り詰められ、モデルに指示が届きません。OLLAMA_CONTEXT_LENGTH=32768 ollama serve を実行してください。Ollama が検出されると、Legwork はこのヒントを表示します。
OpenRouter の無料モデルは入れ替わりがあり、混雑していることもよくあります(HTTP 429)。何度も失敗する場合は、モデル一覧から別のモデルを選んでください。
2026-09-27 に測定。同じ4つのリポジトリ(reverify、golive-skill、AnyJev、phone-harness)で、ビルドされたラッパーを集計しました。
| モデル | ビルド数 | 備考 |
|---|---|---|
| gpt-5 | 4 / 4 | すべて初回で成功 |
| Nemotron 3 Super(OpenRouter、無料) | 3 / 4 | |
| gpt-oss:20b(Ollama、ローカル) | 3 / 4 | 最も遅く、M5 では返信ごとに1〜3分 |
| Claude Sonnet 5 | 1 / 4 | 最も慎重。サードパーティーアカウント、ペアリング済みの iPhone、「研究パイプライン」を理由に3件を拒否 |
拒否されてもクラッシュではありません。Legwork はモデルが示した理由を報告し、何もインストールせずに停止します。
仕組み
- キャッシュ。 リポジトリが公開キャッシュにある場合、Legwork は手順 3~4 の代わりにそのラッパーを使用します。それでもリポジトリをクローンしてスキャンし、キャッシュ済みのラッパーもスキャンしたうえで、ローカルにインストールしてセルフテストを行います。セルフテストに失敗した場合は、新しいラッパーを作成します。
--no-cacheを指定するとキャッシュをスキップします。 - 取得。 リポジトリが公開されていてアクセス可能かを確認し、その後、浅いクローンを作成します。
- スキャン。 難読化されたペイロード(XOR でデコードされるバイト配列、動的に計算されるインポート、javascript-obfuscator の出力、デコードされた文字列の
eval、空白の背後に画面外へ隠されたコード)を検出するため、すべての Python および JavaScript/TypeScript ファイルを静的スキャンします。検出された場合は、インストールを行う前にすべての処理を停止します。 - 読み取り。 README と、README からリンクされているセットアップドキュメント(
install.md、docs/getting-started.mdなど)を読み取ります。上限は 50KB で、インストールと使用方法のセクションを先頭に配置します。 - 作成。 モデルがインストールコマンドとセルフテスト付きの Python MCP ラッパーを作成するか、具体的な理由(プログラムから利用できるエントリーポイントがない、ハードウェアが必要、専用の認証情報が必要、サンドボックスにないツールチェーンが必要など)を示して拒否します。
- インストール。 ネットワークを有効にしたサンドボックス内で行います。
- セルフテスト。 ネットワークを無効にしたサンドボックス内で行います。失敗した場合はモデルに戻し、最大 3 回、最長 30 分まで再試行します。試行間でダウンロードキャッシュを共有するため、再試行時に PyTorch のような数 GB の依存関係を再ダウンロードすることはありません。
- 提供。
legwork serve owner/repoを実行すると、ネットワークを無効にしたサンドボックス内で、stdio 経由の MCP サーバーとしてラッパーを起動します。
権限:許可するまでは厳しく制限
提供されるツールは、権限を付与するまでホームフォルダーを読み取れず、ネットワークにも接続できません。クライアントに追加する際は、ツールに必要な権限だけを付与してください。
# Build it once (cached: no key needed), then let it read one folder (read-only):
uvx legwork-mcp microsoft/markitdown
claude mcp add markitdown -- uvx legwork-mcp serve microsoft/markitdown --allow-read ~/Downloads
# A tool that fetches web pages:
uvx legwork-mcp serve owner/repo --allow-net
--allow-read は繰り返し指定でき、常に読み取り専用です。要求された場合でも許可できないフォルダーがあります。/、ホームフォルダー全体、既知の認証情報の保存場所の一覧(~/.ssh、~/.aws、~/.config、~/.gnupg、macOS のキーチェーンとブラウザーデータ、Linux のキーリングと Firefox のプロファイル、~/.npmrc、~/.pgpass、~/.legwork.env、シェルの履歴と起動ファイル、AI クライアントの設定ファイル)、およびそのいずれかを含むフォルダー(~/Library など)が該当します。これは一覧であるため、環境によっては、この一覧にない場所に秘密情報が保存されている場合があります。
許可したフォルダーの内容はすべて読み取り可能になります。その中に .env ファイルやキーがある場合も同様です。コードフォルダーではなく、~/Downloads を許可してください。フォルダーへのアクセス権限と --allow-net の両方を持つツールは、読み取った内容をインターネットに送信できる可能性があります。そのため、両方が必要なツールに限って、両方を許可してください。--allow-net を指定すると、ツールはこのマシン上のサービス(localhost)にアクセスできますが、SSH エージェントや Docker などのローカルソケットにはアクセスできません。
ホームフォルダー以外では、Python と必要なライブラリが保存されているため、ツールは /usr、/opt、/etc、/tmp、macOS のユーザー別一時フォルダー、/Users/Shared、および /Volumes 以下の外付けドライブなどのシステム上の場所を読み取れます。これらの場所に秘密情報を保存しないでください。(Linux では、/tmp は空の専用フォルダーです。)
macOS では、ツールが保護されたフォルダー(Downloads、Documents、Desktop)を初めて読み取るときに、uvx にアクセスを許可するかどうかを macOS 自体が確認します。これは Legwork の許可設定とは別に行われる、オペレーティングシステム独自のプライバシー確認です。一度許可してください。
「built」の意味
セルフテストでは、ドキュメントに記載された最も簡単なコマンドを実行し、その結果の形式を確認します。つまり、「built」とは、ラッパーが起動し、最も簡単なツールが動作することを意味します。すべてのツールが動作するという意味ではありません。今回の試行では、次のとおりでした。
- golive-skill のラッパーが公開するのは読み取り専用のコマンドであり、アカウントが必要なデプロイの手順は公開しません。
- AnyJev の判断ツールには、稼働中の vLLM サーバーが必要ですが、セルフテスト時には用意されていませんでした。
ラッパーとそのセルフテストは同じモデルが作成するため、README を誤って解釈したラッパーでも、誤ったテストに合格することがあります。**キャッシュされたツールには、もう1つ確認項目があります。**既知の回答、固定の入力、それに対して人が期待する出力を用いたテストで、エントリーを追加または変更する前に合格する必要があります(#3)。
実行時にネットワークへの接続が必要なツールには --allow-net が必要です。これがない場合、ネットワークは無効になります。
リスクについて率直に説明します
Legwork は、自分で作成していないコードを実行します。対象リポジトリのインストール手順と、見知らぬ人が書いた README を基に LLM が作成したラッパーです。これらを封じ込める仕組みは次のとおりです。
- 最大のリスクはインストール時です。 パッケージのインストールと
install.shスクリプトは、必要なためネットワーク接続を有効にして実行します。サンドボックスにより、 作業フォルダー内だけに制限されます。ホームディレクトリ(SSH キー、クラウド認証情報、ドットファイル)にはアクセスできず、システム上の場所 (/tmpなど)は読み取り可能です。フォルダー外への書き込みもできず、 あなたの環境変数(モデルキーを含む)が一切ない環境で実行されます。悪意のある パッケージでも、そのフォルダー内で不正な動作をしたり、インストール中に ネットワークにアクセスしたりすることは可能です。Legwork はアクセスした ホストを記録します(legwork log owner/repo)。その記録で見逃す可能性のある内容については、 THREAT_MODEL.md を参照してください。 - スキャン対象はリポジトリのソースであり、インストーラーがダウンロードするものではありません。
たとえば magpie は、ベンダーの
curl … | shを使ってインストールします。ダウンロードされた コードに対しては、サンドボックスが保護手段になります。 - プロンプトインジェクションは防止されません。 README によってモデルが誘導され、 指示した内容とは異なる動作をするラッパーが作成されることがあります。 ラッパーはネットワークを無効にしたサンドボックス内で実行されるため、被害は 限定されますが、不適切なツールや誤解を招くツールを防ぐことはできません。
- x86-64 と ARM64 以外のアーキテクチャでの Linux: インストール中に Unix の「抽象」ソケット(X11 ディスプレイなど)へアクセスできる可能性があります。 インストール中に Unix ソケットをブロックする seccomp フィルターが、この 2 つの アーキテクチャにしか対応していないためです。実行フェーズではネットワークがなく、 この影響はありません。
- macOS では、自身をデタッチするプロセスを停止できません。 インストールと
セルフテストはそれぞれ完了時にクリーンアップされますが、macOS では意図的に
デタッチするコード(
setsid)が、その後も実行され続ける可能性があります。 サンドボックス内にとどまり(ホームフォルダーにアクセスできず、自身のフォルダー外に 書き込めません)、ログアウトするまでインストール手順のネットワークアクセスも維持されます。 Linux のサンドボックスは、このようなプロセスも停止します。 - キーのファイルはホームフォルダー内に保管してください(デフォルトは
~/.legwork.env)。サンドボックス内のコードはホームフォルダーを読み取れませんが、 その外のほとんどの場所は読み取ることができます。 - Linux でのインストールでは、このマシン上のサービスにアクセスできます
(
localhostのデータベース、開発サーバーなど)。bubblewrap はインストール中にホストの ネットワークを共有します。macOS ではアクセスできません。Unix ソケットはどちらでも ブロックされます。 - 未対応:
legwork serveを単独で使うと、ツールが誤って出力した内容をそのまま 渡すため、クライアントが混乱する可能性があります(ハブはその内容を除外します)。 - スキャンは難読化を検知するための仕組みであり、マルウェアスキャナーではありません。 これまでに実際のペイロードで確認された隠蔽パターンを検知しますが、意図的な作者なら 回避できます。保護手段はサンドボックスです。
サンドボックスには macOS では sandbox-exec、Linux では bubblewrap を使い、両方で
同じルールを適用します。システムは読み取り専用、ホームディレクトリは非表示、
書き込みはビルド専用のフォルダー内のみ、ローカルソケット(SSH エージェント、Docker、
ディスプレイサーバー)へのアクセスは禁止、ビルドに必要なシステムサービスのみ利用可能、
ネットワークはインストール中のみ利用可能です。サンドボックスが利用できない場合、
Legwork は実行を拒否します。サンドボックスなしで実行することはありません。
THREAT_MODEL.md には、各フェーズでツールがアクセスできる対象の完全な一覧、 Docker および VM との比較、これまでに見つかったすべての脱出方法と、それを防ぐテストが 記載されています。
コマンド
| コマンド | 説明 |
|---|---|
legwork hub [--allow-read PATH] [--allow-net] | AI が、設定した制限の範囲内でツールを検索、インストール、使用するための MCP サーバー |
legwork find "keywords" | 選ぶ際の参考となる情報とともに、特定の機能を持つツールを GitHub で検索します |
legwork owner/repo | 可能な場合はキャッシュからラッパーを構築します(legwork build も同じです)。owner/repo または github.com の URL を指定できます。--no-cache を指定すると、常に新しいラッパーを作成します |
legwork serve owner/repo | 構築したラッパーを stdio 経由で MCP サーバーとして実行します。モデルキーは不要です。--allow-read PATH と --allow-net でアクセスを許可できます(「アクセス許可」を参照) |
legwork contribute owner/repo [--out DIR] | PR を作成できるよう、ビルドを公開キャッシュのエントリーとして書き出します(下記参照) |
legwork doctor | このマシンの準備状況(サンドボックス、キャッシュ、キー、検索上限、クライアント設定)を確認します。読み取り専用で、キーは出力しません。バグ報告に貼り付けてください |
legwork show owner/repo | 構築したツールの由来を表示します。スキャンしたコミット、ラッパーのハッシュ、インストールコマンド、インストールしたすべてのパッケージを確認できます |
legwork log owner/repo | Legwork がサンドボックスの外に記録したツールの履歴を表示します。各インストールが接続したホストと、実行中にサンドボックスがブロックした内容(Linux ではネットワーク接続の試行)が記録されています |
legwork clean [owner/repo] | ディスク容量を確保します。古いビルドと失敗したビルドを削除し、実行中のものは残します。--dry-run、--all |
ビルドは ~/.legwork に保存されます(LEGWORK_HOME で変更できます)。ビルドに失敗すると、エラー出力全体がビルドフォルダー内の attempts.log に保存されます。各ビルドは独自の環境を保持します。PyTorch を使用するリポジトリでは、これに数 GB を要します。legwork clean は古いビルドと失敗したビルドを削除し、実行中のものは残します(実行前に確認するには --dry-run、すべて削除するには --all を指定します)。
ラッパーへの貢献
legwork contribute owner/repo は wrapper.py と manifest.json を含む
cache/<owner>__<repo>/ を書き出し、PR の説明を表示します。書き出す前に、次の処理を行います。
- ラッパーにソースリポジトリから連続して 50 語以上コピーされている場合、エントリーの作成をブロックします
- サンドボックス内でセルフテストを再実行します
- 自分が設定したキーを含め、API キーのような形式の文字列が出力に含まれている場合、書き込みをブロックします
GPL、AGPL、ライセンスなし、または認識できないソースライセンスは、マニフェストと PR の説明に記載されますが、ブロックはされません。リポジトリにビルドより新しいコミットがある場合、または既存のエントリーより新しいコミットがある場合は、警告が表示されます。PR は自分で作成してください。不適切なエントリーは、通常の git revert で削除されます。
ステータス
初期段階です。今後の予定:
- 単一の最も簡単なコマンドによるセルフテストより優れた、複数ツールの検証
開発
CONTRIBUTING.md を参照してください。セキュリティに関する報告:SECURITY.md。
uv sync
uv run pytest # sandbox tests need macOS, or Linux with bubblewrap
tests/fixtures/ai_data_extractor_payload.py は、ペイロードを破壊した実際の悪意あるファイルです(コードの形状は保ったまま、エンコードされたバイトをすべてランダム化してあります)。そのため、スキャナーを実際の手法に対してテストできます。テストでは ast で解析するだけです。tests/fixtures/README.md を参照してください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。