local-workspace-mcp について
local-workspace-mcpは、ローカルワークスペースへの限定的なアクセスを提供する、AIアシスタント向けの読み取り専用MCPサーバーです。ファイルシステムとGitの確認、許可リストに登録したタスクを扱い、書き込み・削除・任意のシェル実行ツールは備えません。
主な機能
- 01範囲を限定したファイル読み取りと検索
- 02読み取り専用のGit状態・差分・ログ・内容確認
- 03画像・アーカイブ・PDF・Officeファイルの検査
- 04運用者が設定するワークスペースと拒否ルール
- 05出力制限付きの許可リスト登録タスク
活用シーン
- 01ワークスペースの書き込み権限を与えずにファイルを確認
- 02未コミットの変更とリポジトリ履歴を確認
- 03許可されたワークスペース内の画像や文書を調査
- 04任意のシェルを許可せず定義済みタスクを実行
MCP 対応
stdio JSON-RPC経由でMCPクライアントに23のツールを提供します。ファイルシステムとGitのツールは読み取り中心で、task_runは運用者が許可リストに登録したコマンドのみを実行します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
local-workspace-mcp
AI アシスタントに必要なのはコンテキストです。無制限のアクセスではありません。
ローカルワークスペース向けの読み取り中心の MCP サーバーです。書き込み、削除、任意のシェル実行を行うツールは存在しません。制限または無効化されているのではなく、そもそもありません。すべてのファイルシステムパスは、オペレーターが許可したルートと、シークレット、.env ファイル、秘密鍵、.git 内部ファイルを対象とするデフォルト拒否リストに照らしてチェックされます。Git の読み取りツールと、オペレーターが宣言した名前付きタスクにより、モデルにシェルを渡すことなく、制限された機能を提供します。
- 23 個のツールを stdio JSON-RPC 経由で提供します。制限付きのファイルシステム読み取り/検索、読み取り専用 Git(status/diff/log/show/branches)、マルチモーダルなファイル検査(画像/アーカイブ/PDF/Office)、および明示的に許可リストへ登録したコマンドを実行する
task_runが含まれます。 - **トランスポートは 1 つです。**各 MCP ホストが
workspace-mcp serve --stdioを起動します。サーバー自体は受信リスナーを持たず、デーモンを常駐させず、ネットワーク呼び出しを行いません(許可リストに登録されたタスクはユーザーとして実行され、ネットワーク制限はありません。以下の ChatGPT トンネル経由の経路では、ホストが起動するプロセスの代わりに、監視対象のtunnel-clientプロセスが実行されます)。 - 適用範囲を正直に示します。
task_runはユーザーとして実際のコマンドを実行します。許可リストで制限されるのは 呼び出せるもの であり、呼び出されたコードが実行できることではありません。これはサンドボックスではありません。
チームでの利用を評価していますか?docs/THREAT-MODEL.md と SECURITY.md から確認してください。
目次: 問題点 · クイックスタート · 使用例 · ツールの概要 · 対応ホスト · 権限モデル · 実行しないこと · セキュリティアーキテクチャ · 設定 · トラブルシューティング · 互換性 · ビルドの検証 · リリース状況
問題点
ホスト組み込みのファイルツールは便利ですが、クライアントの権限確認ループ内で動作します。このループは、ユーザーが疲れて迂回してしまうのと同じものです(--dangerously-skip-permissions、「すべて許可」)。公式の @modelcontextprotocol/server-filesystem は、デフォルトのシークレット拒否リストがないまま、読み取りおよび書き込みツールを提供しており、実際にユーザーの .env を上書きしたことがあります(上流の issue #1869)。汎用のファイルシステム MCP はモデルにファイルアクセスを与えますが、制限された アクセスは提供しません。
このサーバーでは境界をサーバー側に移します。ルート、拒否ルール、タスクの許可リスト、監査は、リポジトリの内容から拡張できないオペレーター設定に置かれます。プロンプトループが侵害されたり迂回されたりしても、存在しないツールは呼び出せません。
クイックスタート
Node ≥ 20 が必要です。また、git_* ツールには git、コンテンツ検索には ripgrep(rg)が必要です。クローンからビルドするには pnpm が必要です(corepack enable)。
npm install -g local-workspace-mcp # puts workspace-mcp on PATH
# or from a clone:
pnpm install && pnpm build && npm link
workspace-mcp init-config # writes ~/.config/local-workspace-mcp/config.json (mode 600)
# REQUIRED: replace the example workspace path with a real absolute path —
# any editor works; doctor fails until you do
nano ~/.config/local-workspace-mcp/config.json
workspace-mcp doctor # must print "doctor: ALL GREEN" (use --json for CI)
生成される設定には example というプレースホルダーのワークスペースが含まれます。実際のルートに置き換えないと、doctor が root.example FAIL を報告します。正常に実行されると、次のように終了します。
PASS policy.selftest — 9/9 cases correct
PASS mcp.startup — tool registration ok
doctor: ALL GREEN
最小限の動作する設定(厳密な JSON — コメントや末尾のカンマは使用できません):
{
"version": 1,
"workspaces": {
"myproj": { "path": "/absolute/path/to/repo", "tasks": [] }
},
"tasks": {},
"deny": []
}
次に、ホストにサーバーを登録します。Claude Code の場合:
claude mcp add local-workspace --scope user -- workspace-mcp serve --stdio
claude mcp list # confirm it registered
ほかのホストでは設定ファイルに項目を追加します(以下を参照してください。which workspace-mcp で得られる絶対パスに置き換えてください)。その後、「workspace_roots を使ってから、myproj に対して fs_list を実行して」と依頼します。最初に役立つ一連の呼び出しは、fs_list → git_status → 未コミットの作業に対する git_diff です。これがなければ、チャットクライアントには中身が見えません。
使用例
# what the assistant can ask for
workspace_roots # authorized workspace ids, no host paths
fs_list {workspace:"myproj"}
fs_read {workspace:"myproj", path:"src/index.ts", startLine:1, maxLines:120}
fs_search_content {workspace:"myproj", query:"TODO"} # literal; regex:true for rg syntax
git_status {workspace:"myproj"} # branch, HEAD, uncommitted truth
git_diff {workspace:"myproj"} # worktree diff, bounded output
git_show {workspace:"myproj", spec:"HEAD"}
task_list {workspace:"myproj"}
task_run {workspace:"myproj", taskId:"typecheck"}
拒否される動作は明示的に示され、黙って処理されることはありません。
fs_read {workspace:"myproj", path:".env"} → ACCESS_DENIED (or NOT_FOUND if absent)
fs_read {workspace:"myproj", path:"../../outside-root.txt"} → OUTSIDE_ROOT
task_run {workspace:"myproj", taskId:"nuke"} → TASK_DENIED (valid id, not enabled)
task_run {workspace:"myproj", taskId:"rm -rf /"} → INVALID_ARGUMENT (malformed task id)
git_show {workspace:"myproj", spec:"--exec"} → INVALID_ARGUMENT
拒否コードはポリシーが意図どおりに動作していることを示すもので、エラーとして報告するものではありません。
アクセス範囲の拡大は、オペレーターの設定でのみ行えます。タスクや検索のタイムアウト、出力制限は、エラーではなく通常の結果として timedOut:true/truncated:true を返します。INTERNAL_ERROR はプロセスの起動やツールの失敗を示すもので、正常な使用時には発生しないはずです。Git リポジトリではないルートでの git_* は、正常に {repo:false} を返します。
ツール一覧
全 23 個のツールがあり、readOnlyHint が true の場合は注記されています(ホストは読み取り専用操作を自動承認できます)。副作用があるのは task_run のみです。
| ツール | 対象 | 備考 |
|---|---|---|
fs_inspect | 1 ファイル | マジックバイトによる種類の検出(画像/zip/ooxml/pdf/テキスト/バイナリ)、寸法、sha256、openWith のヒント |
fs_image | 1 画像 | ネイティブ MCP image ブロック(デフォルトでは元のバイト列。frame/fitMaxDim/format による変換を明示);svg はスキャン後にラスタライズ |
fs_contact_sheet | ≤24 画像 | ラベル付きモンタージュ;項目ごとの認可とエラー表示;出力に上限を設定 |
fs_archive_list | 1 zip | メンバーの表(サイズ、比率、暗号化、拒否/安全でないことを示すフラグ);ページ分割、上限付き |
fs_archive_entry | 1 メンバー | 画像 → ネイティブブロック、テキスト → 上限付きテキスト、その他 → 拒否;トラバーサル/シンボリックリンク/ネストされたメンバーはフェイルクローズ |
fs_pdf_info | 1 pdf | ページ数、テキストレイヤーの有無(PDFium/WASM) |
fs_pdf_page | ≤4 pdf ページ | レンダリングしたページをネイティブ画像ブロックとして出力;ピクセル数に上限を設定 |
fs_pdf_text | ≤50 pdf ページ | 上限付きテキスト抽出;画像のみのページはその旨を正確に報告 |
fs_office_text | 1 ooxml | docx の段落/pptx のスライド/xlsx のセル;マクロはフラグを付け、決して実行しない;レガシー OLE は拒否 |
workspace_roots | 設定を読み取り | ワークスペース ID と利用可能状況;ホストのパスは決して返さない |
fs_list | 1 ディレクトリ | 上限付き、ページ分割;拒否されたエントリーはクラス別にフラグを付ける |
fs_stat | 1 パス | メタデータ;シンボリックリンクの解決を明示 |
fs_read | 1 ファイル | 行範囲指定、バイト数に上限あり;バイナリは拒否 |
fs_read_many | バッチ | ファイルごとのインラインエラー、全体の上限 |
fs_search_files | ファイル名 | glob;リポジトリが存在する場合は git のファイル集合を使用(リポジトリの最上位にある .gitignore を適用);それ以外では上限付きディレクトリ走査 |
fs_search_content | ファイル内容 | ripgrep --json;リテラル検索または regex:true;時間/件数に上限を設定 |
git_status | リポジトリ | ブランチ、HEAD、ステージ済み/変更済み/削除済み/名前変更済み/未追跡 |
git_diff | リポジトリ | ワークツリー/ステージ済み/ref の差分;上限付き;拒否されたパスは伏せ字にする |
git_log | リポジトリ | ≤100 コミット |
git_show | リポジトリ | コミット/タグおよび ref:path の blob;ref を厳密に検証 |
git_branches | リポジトリ | ブランチ、上流、ワークツリー(ホストのパスは伏せ字にする) |
task_list | 設定 | ワークスペースごとに有効なタスク ID |
task_run | サブプロセス | 許可リストにある argv のみ;shell:false;時間/出力に上限を設定 |
サポート対象のホスト
| ホスト | 仕組み | ステータス |
|---|---|---|
| Claude Code | claude mcp add local-workspace --scope user -- workspace-mcp serve --stdio;claude mcp list で確認します | 検証済み |
| Claude Desktop | claude_desktop_config.json の mcpServers エントリー;アプリを再起動します | 設定済み |
| Codex CLI | ~/.codex/config.toml の mcp_servers stdio エントリー | 対応 |
| ChatGPT / Responses API | OpenAI Secure MCP Tunnel(openai/tunnel-client、アウトバウンド専用);この表の下にあるトンネルの注記とクラウドに関する開示を参照してください | ChatGPT の画像を検証済み;Responses は未テスト |
| MCP Inspector | scripts/inspector-smoke.sh による一連のテスト、17 項目 | 検証済み |
GUI ホスト(特に Claude Desktop)は、シェルの PATH ではなく、最小限の PATH でサーバーを起動します。
ホストが ENOENT を報告する場合や、doctor が問題なしでも接続が切れたままの場合は、
バイナリがホストの PATH にありません。コマンドに絶対パス(which workspace-mcp)を指定し、
ホストの MCP ログを確認してください。
Claude Desktop(macOS の場合は ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"local-workspace": {
"command": "/absolute/path/to/workspace-mcp",
"args": ["serve", "--stdio"]
}
}
}
Codex CLI(~/.codex/config.toml、または codex mcp add):
[mcp_servers.local-workspace]
command = "/absolute/path/to/workspace-mcp"
args = ["serve", "--stdio"]
ChatGPT / Responses API では OpenAI Secure MCP Tunnel を使用します。tunnel-client
がアウトバウンドの HTTPS パスをポーリングし、stdio コマンドをローカルで起動します。
インバウンドのネットワークリスナーは開きません(tunnel-client はオプションで
ループバックのみのヘルスエンドポイントをバインドできます。docs/OPERATIONS.md を参照してください)。
関係する値は 3 つです。混同しないでください(OpenAI の公式ドキュメントでも、
よく混同されると警告されています)。tunnel_… は識別子であり、シークレットではありません。
デーモンに必要なシークレットは Runtime API key のみです(その
env: 名は CONTROL_PLANE_API_KEY です)。Admin API key が必要なのは、
CLI からトンネルを作成または管理する場合のみで、ここでは必要ありません。
# 1. Install tunnel-client (github.com/openai/tunnel-client).
# 2. In the OpenAI platform console, create a tunnel and a Runtime API key
# (Tunnels permission: Read+Use to run/select one, Read+Manage to create):
# https://platform.openai.com/settings/organization/tunnels
# https://platform.openai.com/settings/organization/api-keys
# 3. Store the key where the daemon can read it unattended. On macOS, put it
# in the login keychain and materialize a 0600 file the profile will
# reference via `file:` (scripts/launchd/install.sh does both steps
# against this exact location; on other platforms write the file
# directly). Never put the raw key in the profile YAML, a plist, or on a
# command line.
security add-generic-password -s tunnel-client-control-plane -a "$USER" -w
mkdir -p "$HOME/Library/Application Support/tunnel-client/secrets"
chmod 700 "$HOME/Library/Application Support/tunnel-client/secrets"
security find-generic-password -s tunnel-client-control-plane -a "$USER" -w \
> "$HOME/Library/Application Support/tunnel-client/secrets/control-plane-api-key"
chmod 600 "$HOME/Library/Application Support/tunnel-client/secrets/control-plane-api-key"
# 4. Write the profile, validate it, and start the managed runtime
# (attach to the existing tunnel id — no admin key needed):
tunnel-client init --profile local-workspace \
--tunnel-id <tunnel_…> \
--mcp-command "$(command -v workspace-mcp) serve --stdio" \
--control-plane-api-key-ref file:"$HOME/Library/Application Support/tunnel-client/secrets/control-plane-api-key"
tunnel-client doctor --profile local-workspace --explain
tunnel-client runtimes connect --alias local-workspace \
--profile local-workspace --tunnel-id <tunnel_…> \
--runtime-api-key file:"$HOME/Library/Application Support/tunnel-client/secrets/control-plane-api-key"
tunnel-client runtimes status local-workspace --json
# expect process_running=true, healthy=true, ready=true
# 5. In ChatGPT: https://chatgpt.com/#settings/Connectors → add connector →
# Connection: Tunnel → select the tunnel (or paste its id) while the
# daemon is running. A tunnel created in Platform does not appear in
# ChatGPT until you bind a connector to it here.
macOS での永続化:scripts/launchd/install.sh は、再起動、ログイン、
アプリの再起動、プロセスの終了、ネットワークの切断、スリープ/復帰をまたいで
管理対象ランタイムを稼働状態に保つ、ユーザーごとの LaunchAgent をインストールします。
手動での再起動は不要です。手順 3 のキーチェーン項目
(tunnel-client-control-plane、アカウント $USER)が必要で、0600 のファイルを
自動的に作成します。PATH 上に jq が必要です。
docs/OPERATIONS.md §Persistence を参照してください。
運用手順書:docs/OPERATIONS.md。
ChatGPT ホストの検証(2026-10-11):コネクターを更新した後、ライブ接続で
23 個すべてのツールが検出され、ネイティブの fs_image 画像ブロックが処理されました。
合成の視覚的カナリアは、ファイルのメタデータとは独立して、ピクセルから説明されました。
PDF および Office のツールは公開されていますが、ChatGPT 側での個別の抽出/レンダリング経路は
まだテストされていません。今後のツールスキーマの更新では、コネクターの手動更新が
再び必要になる可能性があります。すべての画像ツールは、視覚コンテンツを公開しないホスト向けに、
メタデータも返します。
クラウドに関する開示:ChatGPT のトンネル経路では、画像のバイト列や抽出されたドキュメントのテキストを含む ツールの出力が、モデルに届くまで OpenAI のコネクターインフラストラクチャを通過します。 これは連携の目的そのものですが、境界によってモデルが読み取れるものはすべて、 そのホストへ送信されることを意味します。クラウドコネクターに提供するワークスペースでは、 ルートと拒否ルールを厳格に設定してください。
権限モデル
- ルートは明示的です。 ファイルシステムツールは
workspaces[].pathの外側を読み取れません。~、制御文字、Windows のドライブパス、..による遡りは、 システムコールの前とrealpathの後に再度拒否されます。(許可リストに登録されたtask_runコマンドだけは例外です。ルート外でユーザーとして実行されるため、 自分で実行するコマンドだけを許可リストに登録してください。)実際に作業する プロジェクトをルートに指定してください。~/や、アシスタントに読み取らせるべきでない ファイルを含む親ディレクトリは、決して許可しないでください。 - デフォルトでは拒否されます。 以下も対象です:
.env*/*.envの表記(.env[.*].{example,sample,template}を除く)、.envrc、秘密鍵のファイル名、.pem/.key/.p12/.pfx/.jks/.kdbx、.ssh、.aws、.azure、.gnupg、.kube/kubeconfig、.docker、.npmrc、.netrc、.pgpass、.pypirc、.git-credentials/.gitconfig、シェルの履歴、*.tfvars、secrets.{json,yaml,yml,toml}/.secrets/secrets.d、credentials/service-account*.json/gha-creds-*.json、およびすべての.git内部ファイルです。これは代表的な一覧です。正式なルールはリポジトリのsrc/policy.tsにあるDEFAULT_DENYで定義されており、拒否ルールはフェイルクローズです。 - 名前だけが境界ではありません: 無害に見える名前のファイルでも、
BEGIN … PRIVATE KEY形式の秘密鍵を含む場合、読み取り、git_showの blob、検索プレビューで拒否されます。このスキャンは、多層防御のための ヒューリスティックな対策です(エンコーディングとサイズ上限については脅威モデルに記載されています)。 名前とポリシーによる拒否が主要な境界です。 - Git は読み取り専用で、セキュリティが強化されています: argv のみでプロセスを起動し、
--end-of-options、厳格な ref の検証、リテラルの pathspec、GIT_TERMINAL_PROMPT=0を使用します。 許可リストに登録されたタスク内では、主要なリポジトリ設定の実行キーがGIT_CONFIG_*オーバーライドで固定されます(core.fsmonitor、core.sshCommand、diff.external、core.hooksPath。ドライバーごとのdiff.<name>/filter.<name>フックは、文書化された残存リスクです)。 名前が示されるすべてのパスについて、リネームの差分とマージ競合のdiff --ccブロックが ポリシーによってチェックされます。 - タスクは宣言するものであり、入力するものではありません: 設定内の argv 配列、
shell:false、サニタイズされた環境変数、タスクごとのタイムアウトと出力上限を使用します。 オペレーターの環境変数からGIT_*、ローダー、インタープリターのフックを注入することはできません。 - エラーの内容は制限されます: すべての失敗は
CODE: messageの形式です。サーバーが生成する ツールエラーからはホストの絶対パスが除去されます。ただし、タスクの起動に失敗した場合は、 オペレーターが設定した argv 自体が報告されます。task_runは、タスクで設定されたcwdとワークスペースのルート文字列を<root>に置き換えて、 サブプロセスの stdout/stderr を返します。コマンドが出力するその他の絶対パスは除去されません。 その出力はオペレーターが許可リストに登録したコマンドのものです。
エラー:ACCESS_DENIED、OUTSIDE_ROOT、NOT_FOUND、BINARY_FILE、
RESOURCE_LIMIT、TASK_DENIED、UNKNOWN_WORKSPACE、UNSUPPORTED_FORMAT、
WORKSPACE_UNAVAILABLE、INVALID_ARGUMENT、INTERNAL_ERROR。設定の読み込み/起動時には
CONFIG_ERROR も発生します。task_run と検索のタイムアウトは、結果に timedOut:true を返します。
メディア処理の期限切れは、失敗した項目または呼び出しに TIMEOUT: として報告されるため、
複数項目の結果は全体が失敗するのではなく、一部のみ返される場合があります。
Git コマンドの失敗は、INVALID_ARGUMENT として通知されます(git_diff/git_log/git_show は、
タイムアウトによる強制終了を含むゼロ以外の終了コードをこのエラーに対応付けます)。
git_status の場合は INTERNAL_ERROR となります。リポジトリ検出がタイムアウトした場合は
repo:false として扱われ、git_branches はゼロ以外の終了コードを許容し、空の一覧を返します。
実行しないこと
書き込み、編集、削除、名前変更、ファイル作成は行いません。シェルも使用しません。Git の
変更操作(commit、push、clean …)も行いません。ネットワークリスナーも起動しません。
リポジトリが制御する設定も使用しません。タスクではオペレーターが事前に宣言したものだけを実行します。
それらも実際の副作用を伴ってユーザーとして実行されるため、許可リストは厳しく保ち、
読み取り専用のコマンドを優先してください。
セキュリティアーキテクチャ
ポートとアダプター、1 つの実装、1 つのトランスポートです。
AI host ── stdio JSON-RPC ──▶ workspace-mcp serve --stdio
config.ts trust root: operator config (keep it outside watched roots)
paths.ts lexical + realpath containment, bounded error mapping
policy.ts default-deny rules + validated operator globs
fsOps.ts bounded reads/searches (ripgrep --json, structured parsing)
git.ts read-only git, strict refs, diff redaction, object-type gates
tasks.ts allowlisted argv only, process-group timeouts
exec.ts sanitized + git-hardened subprocess environments
audit.ts metadata-only JSONL; refuses symlinked targets
境界の詳細な分析、複数ラウンドにわたる調査結果の台帳、敵対的な回帰テストスイート、文書化された残存リスクについては、docs/THREAT-MODEL.md をご覧ください。情報開示ポリシーは SECURITY.md に記載されています。
設定リファレンス
~/.config/local-workspace-mcp/config.json。ファイルまたはそのディレクトリがグループや全ユーザーに書き込み可能な場合、またはパスがシンボリックリンクの場合、読み込み時に拒否されます。
// annotated for reading — the parser is strict JSON;
// this block is documentation, not a template. Start from `init-config`
// output, or strip the // comments (the JSON itself is otherwise valid).
{
"version": 1,
"workspaces": {
"myproj": {
"path": "/abs/path", // required
"description": "…",
"tasks": ["typecheck"], // ids the caller may run here
},
},
"tasks": {
"typecheck": {
"command": ["pnpm", "typecheck"], // argv only; never a command string
"cwd": "subdir-inside-root", // optional; contained to the root
"timeoutMs": 180000, // 1s..300s; 300s is a hard cap
"env": { "PATH": "/opt/node/bin:${PATH}" }, // ${VAR} expands vs base env
},
},
"deny": ["**/extra-secret/**"], // appended to built-in rules; evaluated
// BEFORE the template allowlist, so an operator can re-deny
// .env.example; malformed patterns fail config load, fail-closed
"auditLog": "/abs/path.jsonl", // optional; defaults next to the config
"limits": {}, // byte/line/count caps
}
共通の limits キー(キー:デフォルト値):maxReadFileBytes:読み取り時のファイルサイズ上限 5 MB、defaultReadBytes:読み取りあたり 64 KiB、maxSearchResults:200、searchDeadlineMs:20 s、gitTimeoutMs:15 s、maxTaskOutputBytes:64 KiB、walkEntryCap/walkDepthCap:エントリー数 50k/深さ 20。上限値を含む完全なスキーマは、リポジトリの src/config.ts にあります。呼び出し元は task_run に timeoutMs を指定してタスクのタイムアウトを短縮できます。設定値または 300 s のハード上限を超えることはできません。
上書き設定:WORKSPACE_MCP_CONFIG(設定ファイル)、WORKSPACE_MCP_CONFIG_DIR(設定ディレクトリと監査ログの保存場所)、workspace-mcp serve --config <path>(CLI フラグ)。init-config は既存の設定ファイルへの上書きを拒否します。リセットする場合は、先にファイルを削除してください。
トラブルシューティング
| 症状 | 対処 |
|---|---|
npm install -g が EACCES で失敗する | ユーザープレフィックスを設定する(npm config set prefix ~/.local を実行し、~/.local/bin を PATH に追加する)か、nvm で管理されている Node を使用してください。sudo npm -g は使用しないでください |
インストール後に command not found と表示される | バイナリは $(npm prefix -g)/bin にあります。PATH に追加するか、クローンして npm link する方法を使用してください |
| ホストが切断状態と表示される | workspace-mcp doctor を実行し、最初の FAIL を修正してください。すべて成功している場合は、ホストの spawn PATH が異なっています。バイナリの絶対パスを使用してください |
起動時に CONFIG_ERROR が表示される | 権限、JSON、シンボリックリンク、または不明なタスクが原因です。メッセージに原因が示されています |
init-config が 1 で終了する | 既存の設定の上書きを拒否します。先に既存の設定を削除してください |
WORKSPACE_UNAVAILABLE | ルートパスが移動または削除されています。ワークスペースのエントリを修正するか、削除してください |
TASK_DENIED | そのワークスペースでタスク ID が有効になっていません。task_list に許可リストが表示されます |
| タスク実行ファイルが見つからない | doctor が task.<id>.executable にフラグを立てます。インストールするか、タスクの env.PATH を修正してください |
| 検索結果が返らない | rg がサニタイズ済み PATH 上にある必要があります。doctor で確認できます |
ACCESS_DENIED/OUTSIDE_ROOT/BINARY_FILE | ポリシーは意図どおりに機能しています。変更する場合は、オペレーター設定でのみ許可範囲を広げてください |
メディア呼び出し/項目で TIMEOUT: が表示される | 制限時間に達しました。リクエストを絞り込む(ページ数/項目数を減らす、fitMaxDim を小さくする)か、limits.mediaTimeoutMs を増やしてください |
予期しない INTERNAL_ERROR が発生する | ホストの MCP stderr ログを確認し、SECURITY.md に従って報告してください |
| トンネル(ChatGPT)が停止している | tunnel-client runtimes status を実行してください。復旧方法は docs/OPERATIONS.md を参照してください |
| トンネルを作成したが、ChatGPT で選択できない | プリンシパルに Tunnels Read+Use が付与されていることを確認し、反映を待ってください。Platform 上のトンネルが自動的に ChatGPT に表示されることはありません |
| 再起動/ログイン後にトンネルが消える | scripts/launchd/install.sh で自己修復する LaunchAgent をインストールできます。docs/OPERATIONS.md §Persistence を参照してください |
workspace-mcp doctor --json は、CI またはラッパースクリプト用の機械可読な出力を返します。完全にリセットするには、設定ファイルと
~/.config/local-workspace-mcp/audit.jsonl を削除し、init-config を再実行してください。完全にアンインストールするには、ホストのエントリ(claude mcp remove、mcpServers/mcp_servers ブロック、またはトンネルプロファイル)も削除し、npm uninstall -g local-workspace-mcp(クローンからリンクした場合は npm unlink)を実行してください。
互換性
- Node ≥ 20(
node:utilの parseArgs を使用します。パッケージ化されたインストールは Node 20.11、22.12、24.21 で検証済みです)。 - macOS/Linux のみ —
package.jsonのosで宣言され、doctorのplatformで確認されます。Windows は未検証というだけでなく、サポート対象外です。タスクの タイムアウトは POSIX プロセスグループの kill に依存し、git/タスクの分離では/dev/nullに固定しているためです。 - MCP SDK
@modelcontextprotocol/sdkv1.x 系(仕様 ≤ 2025-11-25); v2 API サーフェスは意図的にまだ採用していません(docs/RESEARCH.md を参照)。 fs_search_contentには ripgrep が、git_*には git が必要です。
ビルドの検証
pnpm install --frozen-lockfile
pnpm test # 275 vitest cases incl. adversarial + red-team regressions
pnpm typecheck && pnpm build
workspace-mcp doctor # deterministic diagnostics
scripts/inspector-smoke.sh <workspace-id> # 17-check MCP Inspector battery
pnpm audit --prod # dependency audit
コントリビュート、セキュリティ、ライセンス
- CONTRIBUTING.md:RED ファーストのテスト、フェイルクローズのルール、設計レビューなしで新たな機能を追加しないこと。
- SECURITY.md:脆弱性の報告方法と対象範囲。
- CHANGELOG.md:発見事項/バージョンごとのリリースノート。
- ライセンス:MIT。
リリース状況
バージョン 0.2.0 は npm で local-workspace-mcp として公開されており(SLSA
provenance、OIDC trusted publishing)、公式 MCP
Registry には io.github.peter4leadson/local-workspace-mcp — latest として掲載されています。
リリース履歴については CHANGELOG.md を参照してください。
0.2.0 のリリース決定記録は、リポジトリ内の
docs/RELEASE-0.2.0-DECISION.md で管理されています(内部台帳 — tarball には同梱されません;
凍結済みの 0.1.0 の記録は docs/RELEASE-PACKET.md です)。
Peter C. Bennett がメンテナンスしています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。