local-mcp-chatgpt-tunnel
Enables ChatGPT Developer Mode to securely invoke multiple Windows-local stdio MCP servers through a single gateway, with tool namespacing, path restrictions, and serial execution control. It includes safe-file, image, and download tools for local workspace interaction.
README
Local MCP ChatGPT Tunnel
Windows上で動くstdio形式のMCPサーバーを、OpenAI公式Secure MCP Tunnel経由でChatGPT Developer Modeへ接続するためのローカルGatewayです。<br> 複数のstdio MCPを1つに集約し、ツール名の名前空間化、公開ツールの除外、パス許可、直列実行、遅延起動を設定ファイルから制御できます。<br>
<br>
インストール方法
[!IMPORTANT] Windows環境での導入手順はINSTALL.mdを参照してください。
セキュリティ警告
[!WARNING] 自分のWindows PC、自分のOpenAI Platform Organization、自分のChatGPT Workspaceだけで使う個人専用ツールです。<br> 任意コード実行能力を持つMCPを接続できるため、第三者への共有や公開Pluginとしての運用は想定していません。<br>
AIによる実装について
[!CAUTION] このリポジトリは、ChatGPT 5.6 Sol Highによって実装されました。<br> AIが生成したコードを含むため、誤りや脆弱性が残っている可能性があります。<br> 実際に使用する前にコードと設定内容を確認し、利用者自身の責任で使用してください。<br>
何ができるか
- ChatGPTからWindows上のstdio MCPサーバーを呼び出す
- 複数のMCPを
<prefix>__<tool>形式のツール名へまとめる - 任意のstdio MCPを
config/gateway.tomlへ追加する - MCPごとに許可するディレクトリとファイルを制限する
- 危険なツールを名前または部分文字列で非公開にする
- 同時実行させたくないMCPを
serial_groupで直列化する - 必要に応じて、特定のMCP全体を無効化する
このリポジトリが行わないこと
- OpenAI Responses APIやChat Completions APIの呼び出し
- 独自AIエージェント、独自ハーネス、モデル課金処理の実装
- 公開MCP URLやローカル受信ポートの提供
- Node.js、Git、ripgrep、Python、tunnel-clientの自動インストール
- Ghidra MCP、Chrome DevTools MCP、DQ9 MCPなど第三者MCPの再配布
<br>
Secure MCP Tunnelへの接続は公式tunnel-client.exeが担当します。<br>このリポジトリは、その標準入出力へ接続するローカルMCP Gatewayと同梱MCPを提供します。
対応環境
現在の導入手順はWindows 11向けです。<br>実行にはNode.js LTSとOpenAI公式tunnel-client.exeを使います。<br>同梱のファイル検索機能にはripgrepを使い、GitHub Actions確認にはGitHub CLIを使います。診断スクリプトはnode、npm、git、gh、rg、pyを確認します。
macOSとLinux向けの導入手順、Docker構成、受信ポートを開く構成は用意していません。
使い始めるまで
使えるようになるまでの手順は、INSTALL.mdにまとめています。<br> 大まかな流れは次のとおりです。<br>
- 必要なソフトと公式
tunnel-client.exeを手動で用意する config/gateway.example.tomlをconfig/gateway.tomlへコピーして絶対パスを書き換える- OpenAI Platformで個人用Tunnelと実行専用runtime API keyを作る
- Tunnel IDとruntime API keyをWindowsのユーザー環境変数へ保存する
start.cmdで診断後にTunnelを起動する- ChatGPT Developer Modeから個人用Tunnelを選択する<br> 設定や権限を推測して進めず、必ずINSTALL.mdを上から確認してください。<br>
同梱MCP
| MCP | 公開ツールの例 | 用途 |
|---|---|---|
safe-files |
list_files、search_text、read_text_file、write_text_file、replace_text、apply_patch |
許可したWorkspace内の一覧、UTF-8検索、読み書き、限定されたパッチ適用 |
safe-images |
read_image |
PNG、JPEG、WebPをChatGPTの画像コンテンツとして読み取る |
safe-download |
download_zip |
許可したソースを単一ファイルでもZIPとしてChatGPTへ渡す |
gitmcp |
status、diff、log、branches、switch_branch、add_all、commit、push、pull、clone_repository |
許可したリポジトリに対する限定されたGit操作 |
gh-workflow |
list_runs、watch_run、view_run、view_run_jobs、view_failed_logs、list_workflows、view_workflow_yaml |
明示的に許可したGitHubリポジトリのActions実行状況を読み取り専用で確認 |
同梱MCPは外部npm依存を持ちません。すべてのツールがoutputSchemaを宣言します。<br> |
safe-files
safe-filesは、gateway.tomlで指定されたcwdをプロセスの作業ディレクトリ兼Workspaceルートとして使います。<br>
主な機能は次のとおりです。<br>
- 固定された
rg --files --hiddenによる再帰一覧 - 固定された
rgによるUTF-8テキスト検索 - UTF-8テキストの読み書きと完全一致置換
- サイズを制限したbase64ファイル転送
- ディレクトリ作成
- 内蔵パーサーまたは固定された
git applyによるパッチ適用<br> 再帰一覧では.git内部を常に除外し、パッチでは.git内部を対象にできません。許可ルート外、シンボリックリンクによる脱出、高確度で資格情報らしい内容なども拒否します。<br>一般シェル、PowerShell、任意コマンド実行ツールは含みません。
safe-images
safe-imagesは読み取り専用です。PNG、JPEG、WebPの拡張子とマジックバイトを照合し、初期状態では8 MiB、50メガピクセルまでに制限します。<br>
SVG、HEIC、空ファイル、許可ルート外、シンボリックリンク、UNCパス、NTFS代替データストリームを拒否します。<br>
safe-download
safe-downloadは読み取り専用で、単一ファイルまたはディレクトリを常にZIPとして返します。safe-filesとは別のcwdと許可リストを設定し、ChatGPTへ渡してよいソースだけを公開します。<br>
ディレクトリは固定されたrg --files --hiddenで列挙し、.git内部、ROM、Save、State、秘密鍵形式、資格情報らしい内容、許可範囲外、シンボリックリンクを拒否します。disallowed_path_globsが設定されている場合は、利用者指定のglobsやexcludePathsを適用する前に対象ディレクトリ全体を確認し、拒否パターンへ一致するファイルまたはフォルダが1件でもあればZIP作成全体を拒否します。エラーには一致した設定パターンと対象パスを含めます。<br>
gitmcp
gitmcpは、許可されたディレクトリ内のGitリポジトリに対して、固定されたGitサブコマンドとオプションだけを実行します。一般シェルや任意Git引数は受け取らず、.gitの直接編集、フック追加、force push、任意refspecには対応しません。<br>
status、追跡ファイル一覧、ブランチ・remote・履歴の確認、作業ツリーまたはstaged差分、ブランチ切り替え、git add --all -- .、commitを利用できます。push、pull、cloneは起動引数で個別に無効化でき、設定例ではpullとcloneを無効にしています。cloneでは固定の--recurse-submodulesを選択できます。<br>
repositoryPathへサブモジュールや入れ子のGitリポジトリを直接指定すると、そのリポジトリ自身のstatus、diff、logなどを取得できます。親リポジトリ配下を再帰探索して、すべての入れ子リポジトリを自動列挙するツールは含みません。<br>
gh-workflow
gh-workflowは、起動引数--repository=OWNER/REPOで明示的に許可したGitHubリポジトリについて、GitHub Actionsの実行状況だけを読み取ります。--repository=は複数回指定でき、指定されていないリポジトリは選択できません。許可リポジトリが1件なら各ツールで省略でき、複数なら対象リポジトリの指定が必須です。設定例ではDaisukeDaisuke/desmume_webassemblyを指定し、MCP自体はデフォルト無効です。<br>
gh run list --branch main --limit 3、gh run watch RUN_ID --exit-status、gh run view RUN_IDに相当するツールに加え、job一覧、全ログ、失敗ログ、workflow一覧、workflow概要、workflow YAMLを取得できます。workflow dispatch、rerun、cancel、delete、artifact download、gh apiは公開しません。<br>
ghはspawnからshell=falseで直接起動し、サブコマンドとオプションを固定しています。run ID、branch、workflow識別子は個別に検証し、標準入力を閉じ、出力サイズを制限します。子プロセスのcwdは必ずgateway.tomlで明示してください。認証にはローカルのgh auth loginで保存されたGitHub CLI設定を利用できます。<br>
任意のstdio MCPを追加する
接続するMCPの起動コマンドや引数は、Gateway本体ではなくconfig/gateway.tomlの[mcp_servers.<name>]へ記述します。<br>
private_use_only = true
[mcp_servers.example]
command = "py"
args = ['C:\path\to\server.py']
cwd = 'C:\path\to'
enabled = true
prefix = "example"
startup_timeout_sec = 30
tool_timeout_sec = 1800
allowed_directories = ['C:\work\project']
allowed_files = ['C:\Users\owner\Downloads\one-upload-file.png']
[mcp_servers.example.env]
EXAMPLE_CONFIG = 'C:\path\to\config.json'
有効なstdio MCPだけが子プロセスとして起動し、元のツール名tool_nameはChatGPT側でexample__tool_nameとして公開されます。enabled = falseのエントリは起動しません。<br>
Codex設定からコピーしたtool_output_token_limit、ツール別の承認設定、Gatewayが認識しない項目は無視されます。このGateway上では効果を持ちません。<br>
Gateway設定
ユーザーの決定は尊重されます
Gatewayの動作は、利用者がconfig/gateway.tomlへ明示した設定によって決まります。MCPを自動検出して勝手に登録することや、設定ファイルを自動的に書き換えることはありません。<br>
接続するMCP、その起動コマンド、引数、作業ディレクトリ、環境変数、有効・無効、公開しないツール、パスの許可・拒否範囲、直列実行、遅延起動は、すべて利用者が選択します。<br>
Gatewayはその設定を読み取り、検証して適用しますが、利用者の代わりに安全性や用途を推測して設定を追加したり、許可範囲を広げたりしません。<br>
config/gateway.example.tomlは設定例であり、そのまま適用される「魔法のスクリプト」ではありません。必要な項目だけを確認してconfig/gateway.tomlへ記述し、実際に起動するプログラムと公開する機能を利用者自身が把握できる構成にしています。<br>
任意コード実行はこのリポジトリでは提供しません。
このリポジトリは、一般シェル、PowerShell、コマンドプロンプト、任意スクリプト、任意プロセス起動など、ChatGPTからWindows PC上で任意コードを実行するための同梱ツールを提供しません。今後も実装しません。<br>
任意コード実行を公開すると、Tunnel IDやruntime API keyなどの接続情報が意図せず流出し、不正利用された場合、攻撃者は許可されたパスの読み書きにとどまらず、Windowsユーザー権限で任意の操作を実行できる可能性があります。<br>
パス許可やツール名の除外だけでは、任意コードの内部動作を安全に制限できません。<br>
コードの生成、変換、ビルド確認、単体テストなどは、まずChatGPTのサンドボックス内で行ってください。<br>
ローカルのソースが必要な場合は、safe-downloadで許可したファイルだけをZIP化し、ChatGPTにサンドボックスへダウンロードさせてください。<br>
利用者が外部の任意コード実行MCPをgateway.tomlへ追加すること自体はGatewayの仕様上可能ですが、それはこのリポジトリが提供、推奨、保護する機能ではありません。<br>
接続したMCPは実際のPC上でWindowsユーザーの権限を使って動作します。<br>
パス許可
allowed_directoriesは指定したディレクトリとその配下を許可し、allowed_filesは指定したファイルだけを完全一致で許可します。<br>
Gatewayはすべての子MCPのツール引数を再帰的に検査し、path、filePath、files、directoryなどのキーや絶対パスらしい文字列を許可リストへ照合します。相対パスは対象MCPのcwdから解決します。<br>
allowed_directories = ['C:\work\project']
allowed_files = ['C:\Users\owner\Downloads\upload.png']
disallowed_directories = ['C:\work\project\private']
disallowed_files = ['C:\work\project\.env']
disallowed_path_globs = ['**.ssh**']
disallowed_path_globsは、ファイルとフォルダの両方を対象に、正規化されたパス全体へ適用する拒否globです。<br>
*はパス区切りをまたがない任意文字列、**はパス区切りを含む任意文字列、?はパス区切り以外の任意の1文字に一致します。<br>
たとえば'**.ssh**'は、パスのどこかに.sshを含む場合に一律拒否します。Windowsでは\と/を同じ区切りとして扱い、大文字小文字を区別しません。<br>
macOSとLinuxでは/を区切りとして扱い、大文字小文字を区別します。<br>
拒否時のエラーには、disallowed_path_globsで拒否されたこと、一致したglob、正規化された対象パスが表示されます。<br>
Gateway側の検査は、ChatGPTから子MCPへ渡るツール引数のガードです。<br>
同梱のsafe-files、safe-images、safe-download、gitmcpは同じ設定を子プロセス内でも検査しますが、任意に接続した第三者MCPの内部アクセスをOSレベルで防ぐ機能ではありません。<br>
公開ツールの除外
ツール名の完全一致はblocked_tools、大文字小文字を区別しない部分一致はblocked_tool_substringsで非公開にできます。
blocked_tools = ["dangerous_tool"]
blocked_tool_substrings = ["script", "shell", "execute"]
blocked_tool_substringsはglobや正規表現ではありません。<br>
たとえば"script"はevaluate_script、runScript、SCRIPT_debugをすべて対象にします。<br>
直列実行と遅延起動
同じ資源を同時操作させたくないMCPは、同じserial_groupへ所属させられます。<br>
deferred = trueにしたMCPは初期化時に起動せず、別MCPの指定ツールが成功した後にstart_afterで起動できます。<br>
stop_afterでは同様に停止できます。<br>
[mcp_servers.browser]
command = "node"
args = ["browser-server.mjs"]
cwd = ".."
enabled = true
prefix = "browser"
deferred = true
serial_group = "browser"
[mcp_servers.browser.start_after]
server = "controller"
tool = "prepare_browser"
[mcp_servers.browser.stop_after]
server = "controller"
tool = "stop_browser"
セキュリティ上の前提
[!WARNING]
gateway.tomlのcommandはローカルプログラムを実行します。信頼できるMCPだけを登録してください。<br> コマンドによっては、インターネット上のMCPプログラムを直接取得して実行するものもあります。<br>gateway.tomlで指定したコマンドは、サンドボックス内ではなく、実際のPC上でWindowsユーザーの権限を使って実行されます。<br> 信頼できないMCPを指定しないでください。<br>
Gatewayは管理者権限での起動を拒否し、子MCPへ親プロセスの秘密情報らしい環境変数をそのまま継承しません。ただし、同じWindowsユーザーが読めるファイルをOSレベルで隔離するものではありません。<br>
Tunnelは自分のPlatform Organizationと自分のChatGPT Workspaceだけへ関連付け、runtime API keyにはTunnels Read + Use以外の権限を与えない構成を推奨します。詳細はSECURITY.mdとINSTALL.mdを確認してください。<br>
診断とテスト
必要なコマンドの検出とバージョン確認を行います。インストールや設定変更は行いません。<br>
node app\doctor.mjs
リポジトリのテストは次で実行できます。<br>
npm test
外部npm依存はありません。<br>
ライセンス
このリポジトリ本体はMIT Licenseです。<br>公式tunnel-client.exeなど第三者コンポーネントについてはTHIRD_PARTY_NOTICES.mdを確認してください。<br>
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.