MCP Shell Server について
MCP Shell Serverは、許可リストに登録されたシェルコマンドの実行機能をMCPクライアントに公開します。argv実行、制限、監査ログを備えますが、サンドボックスではなく、許可されたプログラムはサーバープロセスのOS権限を引き継ぐと明記しています。
主な機能
- 01許可リストに基づくargv実行
- 02stdin入力と検証済みパイプライン
- 03実行時間と出力の制限
- 04作業ディレクトリ内に限定したリダイレクト
- 05最小限の子プロセス環境
- 06構造化監査ログ
活用シーン
- 01MCPクライアントから許可済みコマンドを実行
- 02コマンドラインプログラムへの入力
- 03監査ログでコマンド結果を確認
MCP 対応
MCPを実装し、MCPクライアントにコマンド実行機能を公開します。クライアントはstdin、パイプライン、実行制限を伴って許可リスト内のコマンドを呼び出せます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Shell Server
Model Context Protocol(MCP)を実装した、信頼された実行サーバーです。許可リストに登録されたコマンドを argv 配列として実行し、stdin 入力、範囲内に制限されたリダイレクト、最小限の子プロセス環境、実行制限、構造化された監査ログを提供します。
このパッケージはサンドボックスではありません。 コマンドを許可すると、そのプログラムにサーバープロセスが既に持つ OS 権限が委譲されます。設定する前に信頼された実行に関する契約をお読みください。
機能
- argv ベースのコマンド実行:許可されたコマンドは、シェル文字列として解釈されることなく、subprocess argv を介して実行されます
- 標準入力のサポート:stdin を介してコマンドに入力を渡せます
- 包括的な出力:stdout、stderr、終了ステータス、実行時間を返します
- 安全なパイプラインのサポート:シェルを呼び出す代わりに、パイプラインの argv セグメントを保持して検証します
- 実行制限:サーバー側のデフォルトタイムアウト、最大タイムアウト、出力バイト数の上限が適用されます
- 範囲内に制限されたリダイレクト:
<、>、>>の対象は、要求された作業ディレクトリ内にとどまる必要があります - 最小限の子プロセス環境:子プロセスには、サーバーのすべてのシークレットを継承させるのではなく、許可リストに基づく小さな環境を渡します
- 構造化された監査ログ:成功、拒否、タイムアウト、出力上限超過、プロセスエラーの結果を、機密情報を伏せて記録します
信頼された実行に関する契約
以下の設定例を確認する前にお読みください。このサーバーは、起動時にロガーを通じて(stderr に)同じ警告を一度出力します。MCP の stdout フレーミングは変更されません。
サーバーが制御すること
mcp-shell-server は、サーバー自身の動作に境界を設けます。
- サーバーが直接起動する実行ファイル名(
ALLOW_COMMANDS、ALLOW_PATTERNS) - シェル文字列として解釈されない argv ベースのプロセス生成
- 要求された作業ディレクトリ配下に制限された、サーバー管理の
<、>、>>リダイレクト - サーバーが構築する子プロセス環境
- タイムアウトと出力バイト数の上限
- 構造化された監査記録
サーバーが制御しないこと
コマンドを許可することは、権限の委譲を意味します。許可されたプログラムは、サーバープロセスが既に持つ OS アイデンティティ、ファイルシステムアクセス、ネットワークアクセス、認証情報を使って実行されます。ALLOW_COMMANDS と ALLOW_PATTERNS が制限するのは、サーバーが直接起動するコマンド名のみです。以下を制限することは保証しません。
- 許可されたプログラムが起動する子プロセス
- プログラム固有のインタープリター、式言語、プラグイン
- プログラム自身が読み込む設定ファイル、ドットファイル、環境変数に左右される動作
- サーバー管理のリダイレクト以外で、プログラム自身が行うファイルシステムの読み書き
- プログラム自身が行うネットワークアクセス
セキュリティで説明するコマンド固有の拒否ルールは、既知の危険な引数形式に対する、多層防御としてのベストエフォートです。これらのルールは網羅的ではなく、許可されたプログラムが安全であることを証明するものでもありません。
信頼できない入力には外部隔離が必要です
信頼された認証済みの MCP クライアントであっても、処理するコンテンツまで信頼できるとは限りません。モデルが提供したテキスト、取得した Web ページ、イシューのテキスト、リポジトリの内容は、クライアント自体が信頼されていても信頼できない入力であり、LLM はその内容からリクエストを構築するよう誘導される可能性があります。
リクエスト、またはサーバーがアクセス可能なファイルのいずれかが信頼できない入力に由来する可能性がある場合は、独立して適用される OS の境界(コンテナー、VM、jail、または OS ポリシー)内でサーバーを実行してください。その境界では、次のことを実現します。
- 最小権限の ID — 専用の非 root ユーザーを使用し、ホスト上の管理者権限を与えません。
- ファイルシステムの範囲 — ワークロードに必要なディレクトリだけを、可能な限り読み取り専用でマウントし、ホストの設定、SSH キー、クラウド認証情報ファイルにはアクセスできないようにします。
- ネットワークの制限 — デフォルトでは外部への通信を拒否し、ワークロードに必要な宛先のみ許可します。
- 認証情報の除外 — サーバープロセスから、暗黙的に利用可能なトークン、クラウドのインスタンスメタデータへのアクセス、エージェントのソケットに到達できないようにします。
- 子孫プロセスの封じ込め — プロセス/cgroup の名前空間を使用し、許可されたプログラムが起動したプロセスをサンドボックス内に制限して、サンドボックスとともに確実に終了させます。
- リソース制限 — CPU、メモリ、ディスク、プロセス数、実行時間の上限を、このパッケージの外部で適用します。
許可リストは、ワークロードで可能な限り狭くしてください。狭い許可リストはリスクを軽減しますが、上記の境界の代わりにはなりません。
Claude.app の MCP クライアント設定
公開バージョン
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"shell": {
"command": "uvx",
"args": [
"mcp-shell-server"
],
"env": {
"ALLOW_COMMANDS": "ls,cat,pwd,grep,wc,touch,find"
}
},
}
}
ローカルバージョン
設定
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"shell": {
"command": "uv",
"args": [
"--directory",
".",
"run",
"mcp-shell-server"
],
"env": {
"ALLOW_COMMANDS": "ls,cat,pwd,grep,wc,touch,find"
}
},
}
}
インストール
Smithery 経由でインストールする
Smithery 経由で Claude Desktop 用の Shell Server を自動的にインストールするには:
npx -y @smithery/cli install mcp-shell-server --client claude
手動インストール
pip install mcp-shell-server
使い方
サーバーの起動
ALLOW_COMMANDS="ls,cat,echo" uvx mcp-shell-server
# Or using the alias
ALLOWED_COMMANDS="ls,cat,echo" uvx mcp-shell-server
環境変数 ALLOW_COMMANDS(またはその別名 ALLOWED_COMMANDS )は、実行を許可するコマンドを指定します。コマンドは、前後に任意のスペースを入れてコンマで区切ることができます。
ALLOW_COMMANDS または ALLOWED_COMMANDS の有効な形式:
ALLOW_COMMANDS="ls,cat,echo" # Basic format
ALLOWED_COMMANDS="ls ,echo, cat" # With spaces (using alias)
ALLOW_COMMANDS="ls, cat , echo" # Multiple spaces
ALLOW_PATTERNS を使用すると、コマンド名に一致する正規表現をコンマ区切りで指定できます。各パターンは完全一致で評価されるため、ALLOW_PATTERNS="ls" で許可されるのはコマンド名 ls のみであり、lsof や ls -la は許可されません。空白やシェルのメタ文字を含むパターンおよびコマンド名は拒否されます。シェルコマンド文字列や引数単位のポリシーを指定する目的で ALLOW_PATTERNS を使用しないでください。
ALLOW_PATTERNS="python[0-9.]*,node" # Command-name patterns only
コマンド名を許可リストに登録しても、そのプログラム独自の引数レベルの実行機能がサンドボックス化されるわけではありません。バイナリが許可されている場合でも、サーバーはデフォルトで引数を強化します。find -exec/-execdir/-ok/-okdir などの既知の実行機能を持つ引数パターン、シェル/インタープリターの起動ツールや deno/bun などの JavaScript ランタイム、awk system()、tar --checkpoint-action=exec などの tar 外部プログラム指定オプション(チェックポイントアクションはすべて拒否されます)、env、xargs、timeout/nice/nohup/setarch/strace/valgrind などのコマンドラッパーツール、sed/less/vim/ssh などのシェルエスケープツール、gfind/gawk/gtar/bsdtar/gsort などの一般的な別名、外部プログラム、出力先、外部ファイルリスト、または外部一時ディレクトリを指定する GNU sort のオプション(--compress-program、-o/--output、--files0-from、-T/--temporary-directory。省略形や --co、--o、-ro FILE、-rT DIR などの連結形式も含みます)、Git のすべてのコマンド単位の設定上書き、永続的な git config の書き込み、および以下で説明する Git のサブコマンド実行オプションは、サブプロセスの作成前に拒否されます。たとえば、ALLOW_COMMANDS="git" を指定しても、git -c user.name=Example status、git -c alias.pwn=!sh -c "touch marker" pwn、git config alias.pwn '!sh -c "touch marker"' は許可されません。すべてのグローバルな git -c <name=value> および git -c<name=value> による上書きは、キーや値にかかわらず拒否されます。setarch、strace、valgrind、deno、bun などの危険な名前は、deno --version や strace -p PID など、バージョン表示のみ、またはプロセスへのアタッチのみを行う形式も含め、例外なく拒否されます。許可リストへの登録によってこの制限を上書きすることはできません。
Git のサブコマンド実行オプションは、有限の Git 2.53.0 オプショングラマーによって拒否されます。対象は、git grep のページャー選択(-O、単独形式と複合形式(-OP、-nOP、-1OP など)、および空でない任意のプレフィックスを持つ --open-files-in-pager(--op など))、git rebase の実行(-x、単独形式と複合形式(-xP、-qxP など)、およびオペランドの後も含め、空でない任意のプレフィックスを持つ --exec(--ex など))、すべての git filter-branch の呼び出し、そして run が bisect の直後に続く git bisect run です。それ以外のすべてのサブコマンドでは、--exec とその空でないプレフィックス(--e、--ex、--exe)は、リモートヘルパーの選択子として引き続き拒否されます(例:git push --exec=PROG)。グローバルオプション(-C、--git-dir、--work-tree、--namespace など)や、値を取る grep/rebase オプション(-e、-f、--context、--onto、-s、-X、--strategy-option など)によって消費される値はデータとして扱われ、再スキャンされません。そのため、git grep -e -O data と git rebase --onto --exec は許可されます。消費されていない -- または --end-of-options があると grep/rebase のオプション解析は終了し、grep は最初のオペランドで解析を終了します。ただし、(/) は例外です。不明な短い文字や、対象を含む曖昧なプレフィックス(git grep --o=P など)は、予防的に拒否されます。git send-email のプログラム選択子は、残りの引数に対する 3 つの Getopt::Long パス(識別、ヘルプ/エイリアス一覧表示、メインオプション)に従う有限の Git 2.53.0 認識器によって拒否されます。この認識器は、デフォルトの並べ替えモードと POSIXLY_CORRECT による必須順序モードの両方で判定し、どちらかの解釈で選択子に到達可能な場合は拒否します。--sendmail-cmd、--to-cmd、--cc-cmd、--header-cmd は、選択された場合、値が空または欠落している場合も含め、また --dry-run、後続の上書き、--no-header-cmd がある場合も拒否されます。--smtp-server は、値が欠落または空の場合、/ または \ で始まる場合、あるいは ASCII のドライブ文字とコロンで始まる場合(C: など)に拒否されます。このパス規則は、POSIX と Windows の表記を保守的に組み合わせたものであり、Git が実行しないドライブ相対パスやルート相対文字列も拒否する場合があります。また、Windows の実行時隔離を保証するものではありません。オプション名では大文字と小文字が区別されず、--、-、+ の各プレフィックスを使用でき、--sendm など一意に特定できる省略形も受け付けます。--smtp-server-port や --smtp-server-option などの完全一致する名前が優先され、選択子を含む曖昧なプレフィックス(--send、--cc-c、--to-c、--smtp-serv など)は、Git でそれぞれがプログラムを実行するからではなく、保守的に拒否されます。通常の SMTP ホスト(--smtp-server=smtp.example.invalid、localhost、127.0.0.1、[::1])、-h、--dump-aliases、--dry-run、値を取るオプションによって消費される値(git send-email --subject --sendmail-cmd=DATA、--identity --sendmail-cmd=DATA)、および消費されていない -- の後の引数は引き続き許可されます。オペランドの後でもオプションは認識され、--end-of-options は send-email のオプション解析を終了しません。また、必須の値として消費された -- はデータとして扱われます。初期パスで無効となるトークン(等号付きのフラグ、空の必須文字列、無効な数値)は、残りの argv として保持されます。2 つのモードの和集合によって、一方のモードでしか消費されない選択子のように見えるデータが拒否される場合があります。設定によって指定されるヘルパー(sendemail.sendmailCmd、sendemail.smtpServer、sendemail.toCmd、sendemail.ccCmd、sendemail.headerCmd)や、--compose/--annotate で実行されるエディター、git format-patch に渡されるオプションなど、argv によって指定されるその他の動作については、権限委譲されたままです。互換性: git filter-branch は、git filter-branch --help を含め、例外なく拒否されます。これらは多層防御のための有限のルールであり、Git を完全に隔離するものではありません。フック、エディター、マージ戦略、textconv ドライバー、その他の argv または設定によって指定されるヘルパー(difftool コマンドや submodule foreach を含む)は、引き続き権限委譲されたままです。
これらの拒否対象は、既知の名前と引数形式を列挙した有限のリストです。このポリシーは、ヘルパーや他のプログラムを起動できるすべてのプログラムを認識するわけではありません。許可リストに登録したプログラムは、それぞれ独自の委譲動作を維持します。make のレシピは独自のコマンドを実行し、dd/tee は、それぞれのオペランド(of=、ファイル引数)で指定されたパスに対し、サーバープロセスの OS 権限で読み書きします。プログラムが独自に行うこれらの操作は委譲されたものであり、制限対象ではなく、検証によって阻止されません。悪意のある、または信頼できないワークロードには、外部の最小権限 OS/コンテナ分離が必要です。
tar とその別名である gtar/bsdtar については、tar が別のプログラムを起動するオプションを拒否します。対象となるのは、--checkpoint-action(exec= だけでなく、すべてのアクション)、--use-compress-program/-I、--to-command、--rsh-command、--rmt-command、および --info-script/--new-volume-script/-F です。拒否対象には、値を分離して指定する形式と = で指定する形式、このいずれかの名前が候補に含まれるすべての省略形(--use-comp、--to、--rm など)、短いオプションの組み合わせ内の任意の位置にある -I/-F、および cIf のように旧形式の語の先頭に置かれた場合が含まれます。オペランドの後に置かれたオプションも対象です。実行ファイル名にかかわらず、GNU tar 1.34 と bsdtar 3.5.3/3.7.4 の両方のオプション文法で引数を確認し、どちらかの解釈でヘルパーのオプションに到達する場合はコマンドを拒否します。たとえば、bsdtar では -H/-L はフラグ、-Wname は --name として扱われますが、GNU tar ではこれらは値を取るオプションとして扱われます。無害なオプションに取り込まれる値はデータとして扱われ、独立した未消費の -- があるとオプション解析は終了します。また、通常の作成/一覧表示/展開、組み込みの圧縮切り替えオプション(-z/-j/-J)、および数値を指定する --checkpoint=N の間隔は引き続き許可されます。互換性: --checkpoint-action=dot のような exec 以外のチェックポイントアクションも新たに拒否されます。また、一方の tar 方言では無害でも、もう一方ではヘルパーを実行する引数リストも拒否されます。これは有限のルールセットであり、tar のサンドボックスではありません。ファイルリストや tar のその他のファイルシステム操作は検証されません。
sort -o の代わりに、サーバーの制限付きリダイレクトを使ってソート結果を書き込んでください。["sort", "input", ">", "output"] では出力先が指定された作業ディレクトリ内に保たれますが、sort -o を使うと、プロセスがアクセス可能な任意のパスに直接書き込めます。オプションのようなファイル名も、["sort", "--", "--output=data"] のように区切り文字 -- の後に指定すれば引き続き使用できます。
この強化は、既知の危険な引数形式に対する多層防御を目的としたベストエフォートの対策です。網羅的ではなく、信頼できない任意のコマンド実行に対する完全なサンドボックスではありません。リクエストやファイルの内容が信頼できない入力に由来する可能性がある場合に必要な外部の分離については、信頼された実行の契約を参照してください。
子プロセスの環境
コマンドは分離された子プロセス環境で実行されます。サーバーは親プロセスの環境全体を子コマンドに渡さないため、API トークン、認証情報、SECRET_TOKEN などの無関係な変数は、デフォルトでは存在しません。
デフォルトで子プロセス環境に含まれるのは、コマンドの実行に必要な最小限の起動キーのみです。POSIX システムでは PATH が含まれ、該当する場合は Windows のプロセス起動キー(COMSPEC、PATHEXT、SYSTEMROOT、WINDIR)も含まれます。
子プロセスの PATH はサーバープロセスから継承されません。次の優先順位に従って選択されます。
PATHがMCP_SHELL_CHILD_ENV_ALLOWLISTに明示的に指定されている場合は、呼び出しごとのenvsのPATH値を使用し、それ以外の場合は親プロセスのPATHを使用します。空文字列を含め、引き渡される値はそのまま渡されます。- それ以外の場合、空白のみではない
MCP_SHELL_SAFE_PATHを、設定どおりに使用します(トリミングは行いません)。 - それ以外の場合、POSIX ではデフォルトの
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinを使用します。MCP_SHELL_SAFE_PATHが未設定、空、または空白のみの場合は、このデフォルトが使用されます。
POSIX では、git などのパスを含まないコマンド名は、この子プロセスの PATH を使って解決されます。そのため、サーバー独自の PATH 内にある先行する実行ファイルは選択されず、安全な PATH にないコマンドは、親プロセスの PATH にフォールバックせずに失敗します。したがって、システムディレクトリ以外にインストールされたツール(Apple Silicon の Homebrew、~/.local/bin、バージョンマネージャーのシムなど)を使うには、そのディレクトリを MCP_SHELL_SAFE_PATH に追加するか、MCP_SHELL_CHILD_ENV_ALLOWLIST="PATH" を使って明示的に引き渡す必要があります。
MCP_SHELL_SAFE_PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin" \
ALLOW_COMMANDS="git,rg" \
uvx mcp-shell-server
PATH の引き渡しは、オペレーターが明示的に許可するものです。許可しない場合、呼び出しごとの envs の PATH 値は無視されます。Windows では、空白のみではない MCP_SHELL_SAFE_PATH が子プロセスの PATH として使われます。それ以外の場合は親プロセスの PATH が維持され、親の PATH がない場合に限り os.defpath にフォールバックします。Windows のネイティブ実行ファイル検索は、子プロセス環境の PATH に従わないため、この設定は Windows で安全な検索を保証するものではありません。
MCP_SHELL_CHILD_ENV_ALLOWLIST を使用すると、親プロセスから継承する環境変数名や、コマンドごとの環境変数オーバーライドで受け付ける環境変数名を明示的に許可できます。許可リストはカンマ区切りで、環境変数名は完全一致で指定します。
MCP_SHELL_CHILD_ENV_ALLOWLIST="LANG,LC_ALL,MY_TOOL_HOME" \
ALLOW_COMMANDS="printenv,my-tool" \
uvx mcp-shell-server
MCP_SHELL_CHILD_ENV_ALLOWLIST に指定されたキーのみが転送されます。シークレットと思われる名前はログで慎重に扱われます。子コマンドにそのシークレットを読み取らせる意図がない限り、許可リストに追加しないでください。
構造化監査ログ
コマンドの呼び出しごとに、shell_execution_audit という名前の mcp-shell-server.audit ログイベントが1件出力されます。監査レコードには、実行の成功、サブプロセス作成前の検証による拒否、タイムアウト、出力上限による終了、サブプロセスの作成失敗を含むプロセスエラーが記録されます。
監査メタデータには、次の情報が含まれます。
timestamp、duration、result_type- コマンド名と、機密情報が伏せられた
argv - 解決済みの作業
directory - stdin、stdout、stdout への追記に関するリダイレクトフラグ
- 指定された場合は、呼び出しごとの環境変数オーバーライドの、機密情報が伏せられたメタデータ
- 実際に適用された
timeoutとoutput_limit stdout_bytesとstderr_bytes- 取得可能な場合は
return_code - 該当する場合は
rejection_reasonまたはerror_type
監査ログには、stdout や stderr の生の内容は意図的に含まれません。SECRET、TOKEN、PASSWORD、PASSWD、API_KEY、ACCESS_KEY、PRIVATE_KEY、KEY、CREDENTIAL、AUTH などのマーカーを含む、シークレットと思われる argv の値や環境変数名・値は [REDACTED] に置き換えられます。数値以外の長い値は、生の値ではなく短い SHA-256 ダイジェストで表されます。
リクエスト形式
directory 引数は省略可能です。省略した場合、コマンドは MCP サーバープロセスの現在の作業ディレクトリ(サーバープロセスの CWD)で実行されます。相対パスの directory 値は、同じサーバープロセスの CWD を基準に解決されます。この基準は MCP クライアントの CWD ではなく、mcp-shell-server を起動したプロセスの作業ディレクトリです。
# Basic command execution in the server process CWD
{
"command": ["ls", "-l"]
}
# Command with a relative working directory resolved from the server process CWD
{
"command": ["pwd"],
"directory": "subproject"
}
# Command with stdin input
{
"command": ["cat"],
"stdin": "Hello, World!"
}
# Command with timeout
{
"command": ["long-running-process"],
"timeout": 30 # Maximum execution time in seconds
}
# Command with working directory and timeout
{
"command": ["grep", "-r", "pattern"],
"directory": "/path/to/search",
"timeout": 60
}
レスポンス形式
成功時のレスポンス:
{
"stdout": "command output",
"stderr": "",
"status": 0,
"execution_time": 0.123
}
エラーレスポンス:
{
"error": "Command not allowed: rm",
"status": 1,
"stdout": "",
"stderr": "Command not allowed: rm",
"execution_time": 0
}
単一コマンドの失敗:コマンドがゼロ以外のステータスで終了すると、MCP ツールの結果は isError: true となり、そのテキストは Error executing command: Command failed with exit status N で始まります(プロセスがシグナルによって終了させられた場合は Error executing command: Command terminated by signal N)。その後に、存在する場合はコマンドの標準出力と標準エラーが続きます。この出力は、本文をログに記録せずにクライアントへ返されます。成功したコマンド(終了ステータス 0)は、標準出力/標準エラーを変更せずに返します。パイプラインの失敗処理は変更されておらず、同じ方法で出力を保持することはありません。
セキュリティ
以下の対策は、サーバー自体が強制できる境界であり、OS のサンドボックスではありません。コマンド名の許可リストによって、サーバーが直接起動する実行ファイルを制御しますが、許可されたプログラムはサーバープロセスの OS 権限で実行されるため、アクセス可能なファイルの読み取り、CPU の消費、子プロセスの起動、ネットワークへの接続が可能です。これで制限できることとできないこと、および信頼できない入力を扱う場合に必要な外部隔離については、信頼された実行に関する契約を参照してください。
- コマンドの許可リスト:明示的に許可されたコマンド名、または完全一致する
ALLOW_PATTERNSのエントリーのみ実行できます。許可されるのは実行ファイル名であり、許可されたプログラム自体の動作を制限するものではありません。 - デフォルトの引数強化(網羅的ではない多層防御):シェル/インタープリター、JS ランタイム(
deno、bun)、コマンドラッパー(setarch、strace、valgrind、timeout、…)、env、xargs、find -exec/-execdir/-ok/-okdir、awk system()、tar の外部プログラムオプション(GNU および BSD tar の両方の文法で、--checkpoint-action、--use-compress-program/-I、--to-command、--rsh-command、--rmt-command、--info-script/--new-volume-script/-F)、GNUsort --compress-program/-o/--files0-from/-T、Git の外部プログラムオプション(git grep -O、git rebase -x/--exec、git filter-branch、git bisect run、git send-emailの--sendmail-cmd/--to-cmd/--cc-cmd/--header-cmd、およびプログラムのような値を指定する--smtp-serverなど)、さらにすべてのグローバルなgit -c <name=value>またはgit -c<name=value>設定オーバーライドは、コマンド名が許可リストに含まれている場合でも、デフォルトで拒否されます。これは有限のリストであり、ヘルパーを起動できるすべてのプログラムを検出するものではありません。許可リストに含まれるmakeのレシピや、dd/teeがプログラム自身の処理として行うファイル I/O は、委譲された権限のままです。 - シェル文字列による実行なし:通常のコマンドとパイプラインは
asyncio.create_subprocess_exec(*argv)を使って実行され、ユーザー制御の文字列はシェルに渡されません。 - リダイレクトの範囲制限:リダイレクト先のパスは
directoryを基準とする相対パスでなければなりません。絶対パス、..によるディレクトリ移動、シンボリックリンクによる範囲外へのアクセスは、ファイルを開く前に拒否されます。 - 環境の分離:子プロセスには、最小限の環境と
MCP_SHELL_CHILD_ENV_ALLOWLISTに記載された名前が渡されます。トークンなどの親プロセスのシークレットは、デフォルトでは継承されません。呼び出しごとのenvsの値は、明示的に許可リストに含まれた名前に限り受け付けられます。 - 実行制限:
MCP_SHELL_DEFAULT_TIMEOUT_SECONDSのデフォルトは 30 秒、MCP_SHELL_MAX_TIMEOUT_SECONDSのデフォルトは 300 秒、MCP_SHELL_OUTPUT_LIMIT_BYTESのデフォルトは、キャプチャされる標準出力/標準エラーのストリームごとに 1 MiB です。クライアントが指定するタイムアウトはサーバーの上限に合わせて制限され、省略された場合はデフォルト値が適用されます。タイムアウトしたプロセスや出力上限を超過したプロセスは、タイムアウト/出力上限のエラーが明示的に返される前に終了され、回収されます。 - 監査ログ:各呼び出しについて、成功、拒否、タイムアウト、出力上限超過、プロセスエラーの結果を示す構造化された監査メタデータが出力されます。シークレットのような
argvの値は秘匿され、標準出力/標準エラーの内容はログに記録されません。
セキュリティ関連の環境変数
| Variable | Default | Description |
|---|---|---|
ALLOW_COMMANDS / ALLOWED_COMMANDS | empty | 許可するコマンド名をカンマ区切りで指定します |
ALLOW_PATTERNS | empty | コマンド名に対して fullmatch() で照合する正規表現パターンをカンマ区切りで指定します |
MCP_SHELL_DEFAULT_TIMEOUT_SECONDS | 30 | クライアントが timeout を省略した場合に使用するタイムアウト |
MCP_SHELL_MAX_TIMEOUT_SECONDS | 300 | クライアントから受け付ける実効タイムアウトの最大値 |
MCP_SHELL_OUTPUT_LIMIT_BYTES | 1048576 | プロセスごとにキャプチャする stdout/stderr の最大バイト数 |
MCP_SHELL_CHILD_ENV_ALLOWLIST | empty | 子プロセスで許可する親プロセスまたは呼び出しごとの環境変数をカンマ区切りで指定します |
MCP_SHELL_SAFE_PATH | /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin | 子プロセスに渡す PATH であり、PATH が MCP_SHELL_CHILD_ENV_ALLOWLIST に含まれていない場合は POSIX コマンドの検索にも使用されます。空の値の場合はデフォルトを使用します |
開発
開発環境のセットアップ
- リポジトリをクローンします
git clone https://github.com/yourusername/mcp-shell-server.git
cd mcp-shell-server
- テスト要件を含む依存関係をインストールします
pip install -e ".[test]"
テストの実行
pytest
API リファレンス
リクエスト引数
| Field | Type | Required | Description |
|---|---|---|---|
| command | string[] | はい | コマンドとその引数を配列要素として指定します |
| stdin | string | いいえ | コマンドに渡す入力 |
| directory | string | いいえ | 作業ディレクトリ。省略した場合はサーバープロセスの CWD が使用され、相対パスはそのサーバープロセスの CWD を基準に解決されます |
| timeout | integer | いいえ | 実行時間の上限(秒) |
レスポンスフィールド
| Field | Type | Description |
|---|---|---|
| stdout | string | コマンドの標準出力 |
| stderr | string | コマンドの標準エラー出力 |
| status | integer | 終了ステータスコード |
| execution_time | float | 実行にかかった時間(秒) |
| error | string | エラーメッセージ(失敗した場合のみ存在) |
要件
- Python 3.11 以降
- mcp>=1.1.0
ライセンス
MIT ライセンス。詳細は LICENSE ファイルを参照してください
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
