chatgpt-local-coder
by colin-dmme
README.md
<div align="center">
# ChatGPT Local Coder
**Turn ChatGPT web into a local coding agent — files, shell, git, patches, 40+ MCP tools.**
[](https://modelcontextprotocol.io)
[](https://platform.openai.com/docs/guides/developer-mode)
[](https://www.typescriptlang.org/)
[](LICENSE)
[](https://nodejs.org)
[Quick Start](#-quick-start) · [GUI](#-optional-windows-gui) · [Connect ChatGPT](#-connect-chatgpt) · [Tools](#-tools) · [Tunnel](#-tunnel-options) · [Troubleshooting](#-troubleshooting) · [Tiếng Việt](#-tiếng-việt)
</div>
---
ChatGPT Local Coder is a **self-hosted MCP server** that gives ChatGPT (and any MCP client) full access to your machine — read and edit code, run `npm test`, manage git, apply unified diffs, and explore projects with `glob` / `grep`.
The core server is CLI-first with no required desktop app or vendor lock-in. An optional Windows GUI is included for setup and daily start/stop tasks.
```
┌─────────────────┐ HTTPS ┌──────────────────┐ localhost ┌─────────────────────┐
│ ChatGPT Web │ ─────────────► │ Tunnel (opt.) │ ────────────────► │ chatgpt-local-coder │
│ Developer Mode │ │ OpenAI / CF │ :3000/mcp │ 40+ MCP tools │
└─────────────────┘ └──────────────────┘ └──────────┬──────────┘
│
┌──────────────────────────────────────────┼──────────┐
▼ ▼ ▼ ▼
Filesystem Shell + Git Background Project
read/write/patch status/diff/commit processes context
```
## ✨ Why this project
| | ChatGPT alone | **+ ChatGPT Local Coder** |
|---|---|---|
| Edit your repo | ❌ | ✅ `apply_patch`, `edit_file`, `multi_edit` |
| Run tests / builds | ❌ | ✅ `run_command`, `start_process` |
| Git workflow | ❌ | ✅ `git_status`, `git_commit`, `git_push`, … |
| Explore codebase | Limited | ✅ `glob`, `grep`, `list_directory` |
| Full disk access | ❌ | ✅ Any path on your machine |
| Session recovery | — | ✅ Auto-recover after server restart |
| Windows launcher GUI | — | ✅ Manage workspace, profiles, server and tunnel |
Built for **[ChatGPT Developer Mode](https://platform.openai.com/docs/guides/developer-mode)** with optimized tool annotations (fewer permission popups) and **[OpenAI Secure MCP Tunnel](https://platform.openai.com/docs/guides/secure-mcp-tunnel)** support (stable URL, no connector re-wiring every restart).
## 🚀 Quick Start
**Requirements:** [Node.js](https://nodejs.org) 18+, npm, Git (optional, for git tools)
```powershell
git clone https://github.com/colin-dmme/chatgpt-local-coder.git
cd chatgpt-local-coder
copy .env.example .env # edit WORKSPACE_PATH
npm install
npm run build
.\start.ps1
```
Server runs at `http://localhost:3000` — health check: `http://localhost:3000/health`
<details>
<summary><b>macOS / Linux</b></summary>
```bash
git clone https://github.com/colin-dmme/chatgpt-local-coder.git
cd chatgpt-local-coder
cp .env.example .env
npm install && npm run build
npm start
```
</details>
## 🖥️ Optional Windows GUI
The repository includes `chatgpt-local-coder-gui`, a small PySide6 launcher for users who prefer not to edit `.env` or start the server/tunnel manually.
```powershell
cd chatgpt-local-coder-gui
uv sync
uv run python main.py
```
The GUI can:
- choose `WORKSPACE_PATH`
- save local account/profile settings
- configure the OpenAI Tunnel ID and runtime API key
- start/focus the MCP server and tunnel windows
- open the ChatGPT connector settings page
> `chatgpt-local-coder-gui/profiles.json` is intentionally **gitignored** because it may contain account names, tunnel IDs and API keys. Never publish that file.
## 🔌 Connect ChatGPT
### 1. Enable Developer Mode
1. Open [ChatGPT](https://chatgpt.com) → **Settings** → **Apps & Connectors**
2. Under **Advanced**, enable **Developer mode**
### 2. Expose your server (pick one tunnel)
See [Tunnel options](#-tunnel-options) below. You need a **public HTTPS** URL pointing to `http://localhost:3000/mcp`.
### 3. Create a connector
1. **Settings** → **Connectors** → **Create**
2. Fill in:
| Field | Value |
|-------|-------|
| **Name** | `Local Coder` |
| **Description** | `Local coding agent. First call agent_status + project_context. Use glob/grep to explore, apply_patch to edit, run_command for shell.` |
| **URL** | Your tunnel HTTPS URL (e.g. `https://…` or OpenAI Tunnel ID) |
| **Authentication** | None |
3. **Create** → verify tools appear in the list
### 4. Use in chat — **must tag the connector**
Every message that should use local tools **must include the connector**. If you skip this, ChatGPT only uses built-in tools, may show *"Looking for available tools"* / *"Đang tìm các công cụ có sẵn"*, then **"Error in message stream"** / **"Lỗi trong luồng tin nhắn"** — with **no error in server logs** (the MCP server was never called).
**How to tag (pick one):**
1. **Before sending:** **New chat** → **+** (tools) → **More** → enable **Local Coder** (connector stays on for that chat).
2. **In the message:** type **`@`** and choose **Local Coder** (or your connector name) so it appears as a pill/chip above the input.
Then send your prompt. You should see tool permission prompts or MCP activity — not a dead stream with no server log.
Example prompts (after tagging):
- *"Read package.json and explain the dependencies"*
- *"Run npm test and fix any failures"*
- *"Find all TODO comments with grep and summarize"*
> **Tip:** After server updates or restarts → **Refresh** the connector and start a **new chat** (re-tag the connector).
> **Avoid** clicking **"Always allow"** on permission popups — it can reset the MCP session. Configure permissions in **Settings → Apps** instead.
## 🌐 Tunnel options
### Option A — OpenAI Secure MCP Tunnel *(recommended)*
Stable tunnel ID — connector URL never changes.
```powershell
# Terminal 1
.\start.ps1 -Force
# Terminal 2 — first time only
.\openai-tunnel-init.bat # enter tunnel_id + Runtime API key from OpenAI Platform
# Every time after
.\openai-tunnel.bat
```
Get credentials: [OpenAI Platform → Tunnels](https://platform.openai.com/settings/organization/tunnels)
In ChatGPT Connectors: **Connection type → Tunnel** → paste your `tunnel_…` ID.
### Option B — Cloudflare Quick Tunnel
Free, but URL changes on every restart (update connector each time).
```powershell
# Terminal 1
.\start.bat
# Terminal 2
.\tunnel.bat # copy https://….trycloudflare.com into connector URL
```
Install cloudflared: `winget install Cloudflare.cloudflared`
## 🧰 Tools
**40+ tools** with structured JSON responses `{ ok, tool, summary, data }`.
### Onboarding *(call these first)*
| Tool | Description |
|------|-------------|
| `agent_status` | Permissions, workspace roots, audit log |
| `project_context` | Reads AGENTS.md, README, CLAUDE.md, configs |
### Filesystem
| Tool | Description |
|------|-------------|
| `read_text_file` | Read source files (offset + limit) |
| `write_file` | Create or overwrite files |
| `edit_file` | Find-and-replace edits |
| `multi_edit` | Multiple edits in one file |
| `replace_regex` | Regex replace in file |
| `apply_patch` | Unified / Codex-style patches |
| `glob` | Find files by pattern (sorted by mtime) |
| `grep` | Search content (content / files / count modes) |
| `list_directory` | List folder contents |
| `directory_tree` | Recursive tree as JSON |
| `create_directory` | Create folders |
| `delete_file` / `delete_directory` | Remove files or dirs |
| `copy_file` / `move_file` | Copy or rename |
| `read_file_base64` / `write_file_base64` | Binary file support |
### Shell
| Tool | Description |
|------|-------------|
| `run_command` | Run shell commands (`npm test`, builds, …) |
| `shell_status` / `shell_reset` | Persistent shell session |
| `start_process` | Long-running / background commands |
| `process_status` / `process_output` / `stop_process` | Manage background jobs |
### Git
| Tool | Description |
|------|-------------|
| `git_status` / `git_diff` / `git_log` | Inspect repo |
| `git_add` / `git_commit` | Stage and commit |
| `git_branch` / `git_checkout` | Branch list, create, switch (local only) |
| `git_restore` | Restore tracked files to last commit |
| `git_push` / `git_pull` | Sync with configured remote |
| `git_stash` / `git_reset` | Stash and reset |
### Claude Code ↔ MCP mapping
| Claude Code | This server |
|-------------|-------------|
| `Read` | `read_text_file` |
| `Write` | `write_file` |
| `Edit` / `MultiEdit` | `edit_file` / `multi_edit` |
| `Glob` / `Grep` / `LS` | `glob` / `grep` / `list_directory` |
| `Bash` | `run_command` |
| — | `apply_patch`, `git_*`, `project_context` |
## ⚙️ Configuration
Copy `.env.example` → `.env`:
```env
PORT=3000
WORKSPACE_PATH=C:\Users\You\projects\my-app
CHATGPT_AUTO_APPROVE=true
SHELL_TIMEOUT=120
MCP_SESSION_RECOVERY=true
# OpenAI Secure Tunnel (optional)
OPENAI_TUNNEL_ID=
OPENAI_TUNNEL_API_KEY=
```
| Variable | Default | Description |
|----------|---------|-------------|
| `WORKSPACE_PATH` | `cwd` | **Your project root** (like `cd` before `claude`). Auto-loads `CLAUDE.md` / `AGENTS.md` into MCP instructions |
| `CHATGPT_AUTO_APPROVE` | `true` | Tool annotations to reduce ChatGPT popups |
| `MCP_SESSION_RECOVERY` | `true` | Auto-recover stale sessions after restart |
| `SHELL_TIMEOUT` | `120` | Max seconds for `run_command` |
| `FULL_DISK_ACCESS` | `true` | Access any path on the machine |
> **Full machine access** is enabled by default. `WORKSPACE_PATH` only sets the default cwd — absolute paths like `D:\Projects\…` work everywhere.
## 🏗️ Architecture
```
src/
├── index.ts # Express + MCP session manager
├── server-factory.ts # Tool registration
├── lib/
│ ├── mcp-session-manager.ts # Session recovery, TTL
│ ├── patch.ts # apply_patch engine
│ └── persistent-shell.ts # Stateful shell
└── tools/
├── filesystem.ts # 18 tools
├── shell.ts # 8 tools
├── git.ts # 11 tools
└── context.ts # agent_status, project_context
```
- **Transport:** MCP Streamable HTTP (`/mcp` and `/`)
- **Session:** Stateful with auto-recovery when ChatGPT holds a stale session ID
- **Output:** Structured JSON from every tool
## 🧪 Development
```powershell
npm run build # compile TypeScript
npm test # patch + tool unit tests
npm run dev # watch mode (tsx)
node scripts/test-mcp-session.mjs # integration test (server must be running)
```
## 🔒 Security
This server grants **full access to your machine** — files, shell, git. Only expose it through a tunnel you control. Never share your connector URL or tunnel API keys.
- `.env`, GUI profiles, generated tunnel profiles, state/checkpoints, logs and common key/certificate files are gitignored
- Keep real upstream MCP paths/credentials in a local file such as `profiles/mcp-upstream.local.json`; the committed `profiles/mcp-upstream.json` is a safe starter config
- `.env.example` must contain placeholders only — never real tunnel IDs, API keys, usernames or machine-specific paths
- Before publishing a fork, run a secret scan over the files that Git will actually track
- Audit log: `.mcp-audit.log` (optional, configurable)
- Use on a trusted network / personal machine only
## 🩺 Troubleshooting
| Problem | Fix |
|---------|-----|
| **"Error in message stream"** / **"Lỗi trong luồng tin nhắn"** right after *"Looking for tools"* — **no server log** | You did **not tag the connector**. New chat → **+** → **More** → enable connector, or type **`@Local Coder`** in the message. Then retry. |
| **Resource not found** on tool call | Refresh connector + new chat. Server auto-recovers sessions — ensure latest build is running. |
| **Connection failed** | Check `.\start.ps1` + tunnel are both running. URL must be HTTPS. |
| **Permission popup every call** | Settings → Apps → set connector to *Ask before important changes*. Don't use popup "Always allow". |
| **Tool blocked by OpenAI safety** | Not a server bug. Retry with `run_command` (response may include `run_command_fallback`). Affects `git_push`, `git_checkout`, `delete_directory` occasionally. |
| **`stream canceled`** in tunnel log | Server/tunnel restarted mid-session → refresh connector, new chat. |
| **Tunnel URL keeps changing** | Switch to OpenAI Secure Tunnel (`openai-tunnel.bat`). |
| **Access denied** | Wrong path or OS permissions on that file. |
| **git not found** | Install [Git](https://git-scm.com). |
See also [AGENTS.md](AGENTS.md) for agent onboarding and `apply_patch` format.
## 📚 References
- [Model Context Protocol](https://modelcontextprotocol.io)
- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)
- [ChatGPT Apps SDK](https://developers.openai.com/apps-sdk)
- [OpenAI Secure MCP Tunnel](https://platform.openai.com/docs/guides/secure-mcp-tunnel)
## 📄 License
[MIT](LICENSE) — use freely, attribution appreciated.
## ⭐ Support
If this saves you time, **star the repo** — it helps others find it.
---
## 🇻🇳 Tiếng Việt
**ChatGPT Local Coder** biến ChatGPT web thành agent code trên máy bạn qua MCP.
```powershell
git clone https://github.com/colin-dmme/chatgpt-local-coder.git
cd chatgpt-local-coder
copy .env.example .env
npm install && npm run build
.\start.ps1 # terminal 1
.\openai-tunnel.bat # terminal 2 (tunnel cố định)
```
**ChatGPT:** Settings → Connectors → tạo connector → chọn tunnel → Refresh → chat mới.
**Bắt buộc tag connector mỗi chat:** Chat mới → **+** → **More** → bật connector, hoặc gõ **`@`** + tên connector trong ô chat. Nếu không tag, ChatGPT báo *"Đang tìm các công cụ có sẵn"* rồi *"Lỗi trong luồng tin nhắn"* — **server không có log lỗi** vì MCP chưa được gọi.
**WORKSPACE_PATH:** đặt đúng thư mục project (không phải thư mục `chatgpt-local-coder`). Server tự đọc `CLAUDE.md` / `AGENTS.md` giống Claude Code.
**Lưu ý:** Không bấm **"Luôn cho phép"** trên popup — cấu hình quyền ở Settings → Apps. Sau khi restart server: Refresh connector + mở chat mới + tag lại connector.
Chi tiết cho AI agent: [AGENTS.md](AGENTS.md)This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing