A personal, self-hosted MCP server for discussing GitHub pull request reviews in ChatGPT and publishing the final text through a chosen GitHub account. Developer preview, version 0.6.0. No model API key or browser extension is required; the server does not run a model.
- Read PR diffs, prepare immutable previews, and publish summary and inline review comments.
- Say explicitly in the conversation to publish a specific preview without approval, or use the local confirmation page.
- Select among locally authenticated GitHub accounts without changing the global
ghaccount. - Append the actual review model, configurable bot name, and human contact to every review.
- Bind previews to the publishing identity and reviewed commit. Reconcile uncertain submissions before trying anything else.
The launcher and local page now default to Simplified Chinese. Use the language selector at the top of the page to switch to English. Switching preserves imported text, selected previews, and the exact review body. For an English launcher, run powershell -NoProfile -ExecutionPolicy Bypass -File ./launcher.ps1 -Language en.
Download this repository with Code → Download ZIP, extract it completely, and open the extracted folder. This is a source distribution with an automatic launcher, not an offline executable. Do not run the launcher from inside the ZIP viewer.
Extract the whole ZIP to a writable folder, then double-click Start Review Publisher.cmd. Keep the other files beside it. The launcher checks dependencies, starts the service in the background, verifies the public MCP endpoint, and opens the connection page. Copy Name and Server URL into the form shown by ChatGPT and select No authentication. The description is optional.
On a new installation, choose allowed owner/repository names once and authorize GitHub in your browser if needed. Existing local settings and authorized accounts are reused. Missing Node.js or GitHub CLI are downloaded as portable programs from their official sources with pinned SHA-256 checksums; no administrator installation is required. First startup needs network access and may take a few minutes.
Close the page to leave the service running; click Stop service to stop it. Double-clicking again reopens a healthy instance. Configure Review Publisher.cmd changes the saved repositories or demo/live mode and restarts the service. Temporary tunnel URLs can change on restart: copy the new URL to ChatGPT. The default launcher transport is Tunnelmole. Settings and logs stay in .data/; do not distribute that directory.
Requires macOS 13.5 or newer. Download the macos.zip attachment from this repository's Releases, extract the whole folder, and double-click Start Review Publisher.command. On first start, the terminal downloads and verifies pinned native Node.js and GitHub CLI, then prompts in Chinese for live/demo mode and allowed repositories. Enter one owner/repository or GitHub repository URL per line, then an empty line. Authorize your own GitHub account if prompted. The verified connection page opens automatically; copy its Server URL into ChatGPT and choose No authentication.
Later starts reuse your settings and reopen a healthy background service. Close the terminal after it reports ready; use Stop service on the local page to shut down. Configure Review Publisher.command changes settings. Authorize GitHub Account.command adds an account, then refresh and select it on the local page. For English prompts, run bash "Start Review Publisher.command" --language en. Initial downloads and GitHub CLI messages may be in English.
The package is not Apple-signed or notarized. If macOS blocks opening it, verify its source and use the per-file Open Anyway option in Privacy & Security. Use the built-in Archive Utility to preserve executable permissions. See MACOS.md for Chinese instructions and troubleshooting. No Homebrew, Python, Xcode or administrator install is required; first startup requires network access.
- For real reviews, leave Demo mode unchecked on Windows or choose 1 in the macOS terminal. Enter one
owner/repositoryper line, for exampleyour-account/your-project. The Windows settings field accepts repository names, not full GitHub links or PR numbers; the macOS launcher also accepts repository URLs. It is an allowlist for repositories to review; it does not create a repository. - Click Save and start on Windows or finish with an empty line on macOS. Complete GitHub browser authorization if prompted. On the local page, check the selected publishing account; an existing CLI login may belong to a different account.
- Enable developer mode in ChatGPT and add a personal MCP connection using the fields below.
- In your Chat conversation, enable or select Review Publisher and request a connection check before reviewing a PR. This project targets reviewing in Chat; changing to Work is not a prerequisite imposed by this server. Client availability and tool permissions are controlled by ChatGPT.
| ChatGPT field | Value |
|---|---|
| Name | Review Publisher |
| Description | Optional; copy it from the local connection page |
| Server URL | Copy the complete HTTPS MCP URL from the local page, including its random path |
| Authentication | No authentication |
The repository name in launcher settings, the local browser page, and the public MCP URL serve different purposes. Only the public MCP URL belongs in ChatGPT's Server URL field. Keep that URL private.
Start with: "Use Review Publisher to check the service status, list allowed repositories and publishing accounts, and do not publish anything yet." A successful tool result verifies the Chat connection; a visible plugin name alone does not.
Run these commands in this project's directory (tools/review-publisher when developing inside open-code-review). Requires Node.js 24.14.0+; live mode also requires GitHub CLI.
npm ci --ignore-scripts
npm startOpen the local URL printed by the server. Load the demo example, prepare it, and simulate publication. The demo makes no GitHub writes.
To connect ChatGPT on Windows, run ./setup-connect.ps1. On macOS or Linux, install cloudflared using Cloudflare's instructions, then run npm run connect. For an HTTP proxy, install npm ci --prefix tunnel --ignore-scripts and run npm run connect -- --tunnel tunnelmole. Windows bootstrap selects that option automatically when it detects a proxy.
For real reviews, authorize your GitHub account and allow specific repositories:
gh auth login --hostname github.com --web
npm run connect -- --live --repo owner/repositoryThe process prints the HTTPS MCP URL and saves private connection details under .data/. Use that complete URL in your ChatGPT developer-mode MCP connection. Select No authentication: the random URL path itself is the access credential. Keep the process running. A temporary tunnel usually changes its hostname after restarting.
Copy config.example.json to .data/config.json, edit bot_name and human_contact, then restart. Alternatively use --config path/to/config.json (PowerShell bootstrap: -Config path). Without a config, both fields derive from the publishing account. The actual reviewer_model is supplied for each review and must not be guessed. Changing configuration affects newly prepared previews; existing previews keep their disclosure snapshot.
Add another account with gh auth login --hostname github.com --web, authorize the intended account in the browser, then ask ChatGPT to list publishing accounts and select its login. No MCP reconnection is needed. Login can change the global CLI default; gh auth switch --hostname github.com --user LOGIN restores it if needed. Publisher account selection remains separate. Re-create previews after switching the publishing account.
If the Windows launcher installed a portable GitHub CLI and gh is unavailable in your terminal, run the following from the extracted project folder, then refresh the account list on the local page:
$publisherGh = Get-ChildItem -LiteralPath .data/bin -Filter gh.exe -Recurse | Select-Object -First 1
& $publisherGh.FullName auth login --hostname github.com --webflowchart LR
Chat[ChatGPT conversation] --> HTTPS[HTTPS endpoint]
HTTPS --> MCP[MCP: read / prepare / publish / reconcile]
MCP --> Store[(SQLite previews and state)]
User[User] --> UI[Local confirmation page]
UI --> Store
MCP --> Checks[Identity / commit / duplicate checks]
Checks --> CLI[Local GitHub CLI]
CLI --> GitHub[GitHub Review]
Example request: "Read owner/repository PR 123, review its current head, and prepare a review with the actual model name. Publish that preview without local approval after we finish discussing it."
The MCP listener supports Streamable HTTP JSON. The local page uses a separate listener and session token. Only the MCP port should be forwarded.
| Symptom | Check |
|---|---|
| First-time settings reject the input | Use owner/repository, one per line; do not paste a full URL |
| Plugin was connected before a restart or a move to another extracted folder | Compare the saved ChatGPT URL with the current connection page; a fresh folder has separate local data and may create a new MCP key |
Chat reports This conversation does not support developer MCPs |
Check developer mode and the enabled connection, refresh its tools, then test a new Chat conversation. This message alone does not establish a GitHub authorization failure or a need to switch to Work |
| Launcher opens the page but Chat still cannot use tools | The startup check only verifies public MCP initialization; run the read-only connection prompt in Chat to verify actual tool access |
| Startup fails | Inspect .data/launcher-error.log and .data/tunnel.log; keep the computer awake and the service running |
| APPROVE is rejected for your own PR | Select a different authorized publishing account or use a COMMENT review |
Publication state is unknown |
Ask for reconcile_review before another publication attempt |
Do not post connection files, complete MCP URLs, session tokens, databases, or unredacted logs in an issue. The exact conversation error above was reported during a local Chat test and later cleared according to the user; its cause was not established.
This preview is designed for one trusted local operator. Anyone holding the complete MCP URL can read allowed repositories, choose an available publishing account, and request publication without local confirmation. The client must honor the conversation's authorization; the server cannot independently prove who spoke a natural-language instruction. See SECURITY.md for this boundary and secret rotation.
The server neither implements multi-user OAuth nor verifies the claimed model identity. Third-party tunnel operators can handle transmitted code and review content. A fixed HTTPS reverse proxy forwarding only port 8766 can be used with npm run connect -- --public-url YOUR_HTTPS_ORIGIN --live --repo owner/repository. Account permissions still apply.
npm test
npm ci --prefix tunnel --ignore-scripts
npm test --prefix tunnel
npm audit --omit=dev
npm audit --prefix tunnel --omit=dev
npm run export:sourceAutomated tests use simulated GitHub responses and enforce 90% server-module line, branch, and function coverage. They do not cover browser rendering or send real reviews. CI runs on Windows, Linux, and macOS; local verification is recorded in RELEASE_CHECKLIST.md. Export copies an explicit file list to a fresh directory under .data/releases/, excludes local data and credentials, and records SHA-256 checksums.
See USAGE.md for review input and state semantics, MCP_CONNECT.md for Chinese connection instructions, and RELEASE_CHECKLIST.md for release status.
Developed in an isolated worktree of alibaba/open-code-review. This is an independent integration, not an official Alibaba or OpenAI product. Existing source notices are retained. Apache-2.0; see NOTICE. AI-assisted development used Codex (GPT-6); contributors must review generated work and disclose AI assistance in issues and pull requests.