🚀 MCPバックグラウンドジョブサーバ
MCP(モデルコンテキストプロトコル)サーバで、コーディングエージェントが長時間実行されるシェルコマンドを非同期で実行し、完全なプロセス管理機能を提供します。
🚀 クイックスタート
MCPバックグラウンドジョブサーバは、シェルコマンドをバックグラウンドで実行するための強力なソリューションを提供します。エージェントはプロセスを起動、状態を監視、インタラクション、ライフサイクルを管理できます。これは、ビルドプロセス、テストスイート、サーバーなどの長時間実行される操作を含む開発ワークフローに特に有用です。
Claude Codeを使用する場合
設定が完了したら、Claudeにバックグラウンドタスクの支援を依頼できます。
You: "デベロッパーサーバーをバックグラウンドで起動し、監視してください"
Claude: バックグラウンドジョブサーバーを使用してデベロッパーサーバーを起動します。
[実行ツールを使用して開発サーバーを実行]
[ジョブIDを表示し、起動プログレスを監視]
[ステータスの更新を提供]
Claude: "デベロッパーサーバーが http://localhost:3000 で起動しました。
後でコントロールする必要がある場合は、ジョブIDは abc123-def456 です。"
手動でサーバーを使用する場合
開発や直接使用のためには、次のコマンドを実行します。
uvx mcp-background-job
uv run python -m mcp_background_job
✨ 主な機能
- 非同期プロセス実行:一意のジョブIDでシェルコマンドをバックグラウンドジョブとして実行
- プロセスライフサイクル管理:バックグラウンドプロセスの起動、監視、インタラクション、終了
- リアルタイム出力監視:バッファリングと末尾追跡機能でstdout/stderrをキャプチャして取得
- 対話型プロセスサポート:stdinを介して実行中のプロセスに入力を送信
- リソース管理:設定可能なジョブ制限と完了したプロセスの自動クリーンアップ
- MCPプロトコル統合:エージェントとのインタラクションのためのモデルコンテキストプロトコルとの完全な統合
📦 インストール
クイックインストール(推奨)
uvxを使用してPyPIから直接インストールします。
uvx mcp-background-job
Claude Codeへの統合
サーバーをClaude Codeの設定に追加します。
- オプションA: Claude Codeデスクトップを使用する場合
- Claude Codeの設定/偏好設定を開きます。
- MCPサーバーのセクションに移動します。
- 新しいサーバーを追加します。
- 名前:
background-job
- コマンド:
uvx
- 引数:
["mcp-background-job"]
- オプションB: 設定ファイルを使用する場合
Claude Codeの設定ファイルに次の内容を追加します。
{
"mcpServers": {
"background-job": {
"command": "uvx",
"args": ["mcp-background-job"]
}
}
}
- 新しいMCPサーバーを読み込むために、Claude Codeを再起動します。
開発環境のセットアップ
ローカル開発やコントリビューションのためのセットアップ手順です。
前提条件
- Python 3.12以上
- uv パッケージマネージャー
セットアップ手順
- プロジェクトディレクトリをクローンして移動します。
git clone https://github.com/dylan-gluck/mcp-background-job.git
cd mcp-background-job
- 依存関係をインストールします。
uv sync
- 開発モードでインストールします。
uv add -e .
💻 使用例
基本的な使用法
execute_result = await execute_command("npm run dev")
job_id = execute_result.job_id
status = await get_job_status(job_id)
print(f"Job status: {status.status}")
output = await tail_job_output(job_id, lines=20)
print("Recent output:", output.stdout)
interaction = await interact_with_job(job_id, "some input\n")
print("Process response:", interaction.stdout)
result = await kill_job(job_id)
print(f"Kill result: {result.status}")
📚 ドキュメント
MCPツールリファレンス
サーバーは、プロセス管理のための7つのMCPツールを公開しています。
読み取り専用ツール
| ツール |
説明 |
パラメータ |
戻り値 |
list |
すべてのバックグラウンドジョブをリスト表示 |
なし |
{jobs: [JobSummary]} |
status |
ジョブのステータスを取得 |
job_id: str |
{status: JobStatus} |
output |
ジョブの完全な出力を取得 |
job_id: str |
{stdout: str, stderr: str} |
tail |
最近の出力行を取得 |
job_id: str, lines: int |
{stdout: str, stderr: str} |
対話型ツール
| ツール |
説明 |
パラメータ |
戻り値 |
execute |
新しいバックグラウンドジョブを開始 |
command: str |
{job_id: str} |
interact |
ジョブのstdinに入力を送信 |
job_id: str, input: str |
{stdout: str, stderr: str} |
kill |
実行中のジョブを終了 |
job_id: str |
{status: str} |
ジョブステータス値
running - プロセスが現在実行中
completed - プロセスが正常に終了
failed - プロセスがエラーで終了
killed - プロセスがユーザーによって終了
設定
環境変数
次の環境変数を使用してサーバーの動作を設定します。
export MCP_BG_MAX_JOBS=20
export MCP_BG_MAX_OUTPUT_SIZE=20MB
export MCP_BG_MAX_OUTPUT_SIZE=20971520
export MCP_BG_JOB_TIMEOUT=3600
export MCP_BG_CLEANUP_INTERVAL=600
export MCP_BG_WORKING_DIR=/path/to/project
export MCP_BG_ALLOWED_COMMANDS="^npm ,^python ,^echo ,^ls"
環境変数を使用したClaude Codeの設定
{
"mcpServers": {
"background-job": {
"command": "uvx",
"args": ["mcp-background-job"],
"env": {
"MCP_BG_MAX_JOBS": "20",
"MCP_BG_MAX_OUTPUT_SIZE": "20MB"
}
}
}
}
プログラムによる設定
from mcp_background_job.config import BackgroundJobConfig
config = BackgroundJobConfig(
max_concurrent_jobs=20,
max_output_size_bytes=20 * 1024 * 1024,
default_job_timeout=7200,
cleanup_interval_seconds=600
)
🔧 技術詳細
アーキテクチャ
サーバーはモジュール化されたアーキテクチャで構築されています。
- JobManager: ジョブのライフサイクル管理のための中央サービス
- ProcessWrapper: I/Oバッファリングを備えたサブプロセス処理の抽象化レイヤー
- FastMCP Server: ツール定義を含むMCPプロトコルの実装
- Pydantic Models: 型安全なデータ検証とシリアライゼーション
主要コンポーネント
src/mcp_background_job/
├── server.py # FastMCPサーバーとツール定義
├── service.py # JobManagerサービスの実装
├── process.py # サブプロセス管理のためのProcessWrapper
├── models.py # Pydanticデータモデル
├── config.py # 設定管理
└── logging_config.py # ロギング設定
開発に関する情報
テストの実行
uv run pytest tests/
uv run pytest tests/unit/ -v
uv run pytest tests/integration/ -v
コードフォーマット
uv run ruff format
uv run mypy src/
開発ワークフロー
- 変更を加えます。
- テストを実行します:
uv run pytest tests/
- コードをフォーマットします:
uv run ruff format
- 変更をコミットします。
開発サーバーのワークフロー
job_id=$(echo '{"command": "npm run dev"}' | mcp-tool execute)
mcp-tool tail --job_id "$job_id" --lines 10
mcp-tool status --job_id "$job_id"
mcp-tool kill --job_id "$job_id"
長時間実行されるビルドプロセス
job_id=$(echo '{"command": "docker build -t myapp ."}' | mcp-tool execute)
while true; do
status=$(mcp-tool status --job_id "$job_id")
if [[ "$status" != "running" ]]; then break; fi
mcp-tool tail --job_id "$job_id" --lines 5
sleep 10
done
mcp-tool output --job_id "$job_id"
対話型プロセスの例
job_id=$(echo '{"command": "python -i"}' | mcp-tool execute)
mcp-tool interact --job_id "$job_id" --input "print('Hello, World!')\n"
mcp-tool interact --job_id "$job_id" --input "import sys; print(sys.version)\n"
mcp-tool interact --job_id "$job_id" --input "exit()\n"
セキュリティに関する考慮事項
- プロセス分離: 各ジョブは別のサブプロセスとして実行されます。
- リソース制限: 同時実行ジョブ数とメモリ使用量の設定可能な制限。
- 入力検証: すべてのパラメータはPydanticモデルを使用して検証されます。
- コマンド制限: 本番環境ではコマンドの許可リストを実装することを検討してください。
- 出力サニタイズ: プロセスの出力には機密情報が含まれる可能性があることに注意してください。
トランスポートサポート
サーバーは複数のMCPトランスポートをサポートしています。
- stdio: ローカル開発とエージェント統合のためのデフォルトのトランスポート
- HTTP: リモートアクセス用(追加の設定が必要)
stdioトランスポートを使用する場合は、プロトコルの競合を避けるために、ログをstderrのみに出力するようにしてください。
トラブルシューティング
一般的な問題
インポートエラー: パッケージが開発モードでインストールされていることを確認してください。
uv add -e .
テストが実行されない: まずパッケージをインストールしてから、テストを実行してください。
uv sync
uv add -e .
uv run pytest tests/
権限エラー: 実行しようとしているコマンドに適切な権限があることを確認してください。
メモリ問題: 大量の出力を生成するプロセスを扱う場合は、MCP_BG_MAX_OUTPUT_SIZEを調整してください。
コントリビューション
- リポジトリをフォークします。
- 機能ブラン,を作成します。
- テストを含めて変更を加えます。
- テストスイートとコードフォーマットを実行します。
- プルリクエストを送信します。
📄 ライセンス
このプロジェクトはMITライセンスの下でライセンスされています。詳細については、LICENSEファイルを参照してください。
変更履歴
v0.1.1
uvxを通じて簡単にインストールできるようにPyPIに公開
- コンソールスクリプトのエントリポイント(
mcp-background-job)を追加
- インストールと使用方法の説明を含むドキュメントを更新
- リンティングの問題を修正し、コード品質を向上
v0.1.0
- 完全なMCPツールサポートを備えた初期実装
- プロセスのライフサイクル管理
- 設定可能なリソース制限
- 包括的なテストスイート
❤️ FastMCP とPython 3.12+ を使用して構築されました。