{"_id":"@donghae0414/codex-gemini-mcp","name":"@donghae0414/codex-gemini-mcp","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@donghae0414/codex-gemini-mcp","version":"0.1.0","description":"Minimal TypeScript MCP server that proxies prompts to Codex and Gemini CLI","type":"module","bin":{"codex-mcp":"dist/mcp/codex-stdio-entry.js","gemini-mcp":"dist/mcp/gemini-stdio-entry.js"},"repository":{"type":"git","url":"git+https://github.com/donghae0414/codex-gemini-mcp.git"},"bugs":{"url":"https://github.com/donghae0414/codex-gemini-mcp/issues"},"homepage":"https://github.com/donghae0414/codex-gemini-mcp#readme","scripts":{"clean":"node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"","build":"npm run clean && tsc -p tsconfig.json","start":"node dist/mcp/codex-stdio-entry.js","start:codex":"node dist/mcp/codex-stdio-entry.js","start:gemini":"node dist/mcp/gemini-stdio-entry.js","dev":"tsx src/mcp/codex-stdio-entry.ts","dev:codex":"tsx src/mcp/codex-stdio-entry.ts","dev:gemini":"tsx src/mcp/gemini-stdio-entry.ts","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm run typecheck && npm run build"},"keywords":["mcp","typescript","codex","gemini"],"engines":{"node":">=20"},"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"^1.27.0","zod":"^3.24.1"},"devDependencies":{"@types/node":"^25.3.0","tsx":"^4.19.2","typescript":"^5.7.2"},"gitHead":"4d04344ea2871e206a06ae72685262d691f92097","_id":"@donghae0414/codex-gemini-mcp@0.1.0","_nodeVersion":"22.17.1","_npmVersion":"11.10.1","dist":{"integrity":"sha512-cKCJhRlGGpr7ZuxGMc+VJhtQ9MHvD0wCVVDepNH8U5PY1gBJqM62rHc5LSD7PKtzr3hDwM9RIloWl+ZN1Fs+8g==","shasum":"bdac864ef72e79bae76aecb448248fdc4282b876","tarball":"https://registry.npmjs.org/@donghae0414/codex-gemini-mcp/-/codex-gemini-mcp-0.1.0.tgz","fileCount":23,"unpackedSize":58617,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICV4ptM0mtARN/TkvtvKtIIeN6joRsAaRk1qInkTeK4jAiEAi4vS643y4Ij4pEtCP9ab1rdlHAw2LtFaAoxrjfP2uF0="}]},"_npmUser":{"name":"donghae0414","email":"donghae0414@naver.com"},"directories":{},"maintainers":[{"name":"donghae0414","email":"donghae0414@naver.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/codex-gemini-mcp_0.1.0_1772039028187_0.192612049186617"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-25T17:03:48.088Z","0.1.0":"2026-02-25T17:03:48.359Z","modified":"2026-02-25T17:03:48.566Z"},"maintainers":[{"name":"donghae0414","email":"donghae0414@naver.com"}],"description":"Minimal TypeScript MCP server that proxies prompts to Codex and Gemini CLI","homepage":"https://github.com/donghae0414/codex-gemini-mcp#readme","keywords":["mcp","typescript","codex","gemini"],"repository":{"type":"git","url":"git+https://github.com/donghae0414/codex-gemini-mcp.git"},"bugs":{"url":"https://github.com/donghae0414/codex-gemini-mcp/issues"},"license":"MIT","readme":"**🌐 Language: 한국어 | [English](README.en.md)**\r\n\r\n# codex-gemini-mcp\r\n\r\nAI 에이전트(Claude, Cursor 등)가 **OpenAI Codex CLI**와 **Google Gemini CLI**를 MCP 도구로 직접 호출할 수 있게 해주는 프록시 서버입니다.\r\n\r\n## 주요 기능\r\n\r\n- **`ask_codex`** — 에이전트가 Codex에게 코드 생성·리팩터링·디버깅을 요청\r\n- **`ask_gemini`** — 에이전트가 Gemini에게 분석·요약·코드 리뷰를 요청\r\n- **백그라운드 실행** — 오래 걸리는 작업을 백그라운드로 돌리고, 상태 확인(`check_job_status`)·대기(`wait_for_job`)·중단(`kill_job`)·목록 조회(`list_jobs`)로 관리\r\n- **멀티모델 오케스트레이션** — 하나의 에이전트가 Codex와 Gemini를 동시에 활용하여 작업 분담 가능\r\n\r\n하나의 패키지에서 `codex-mcp`와 `gemini-mcp` 두 개의 MCP 서버 바이너리를 제공하며, stdio transport 기반으로 동작합니다.\r\n\r\n\r\n## Requirements\r\n\r\n- Node.js 20+\r\n- `codex` CLI 설치 (`npm i -g @openai/codex`)\r\n- `gemini` CLI 설치 (`npm i -g @google/gemini-cli`)\r\n\r\nMCP 서버는 각각의 CLI를 그대로 실행하므로, 먼저 로컬 터미널에서 로그인/인증이 완료되어 `codex` / `gemini` CLI를 바로 실행할 수 있는 상태인지 확인하세요.\r\n\r\n## Install\r\n\r\nnpm에서 설치(배포된 경우):\r\n\r\n```bash\r\nnpm i -g @donghae0414/codex-gemini-mcp\r\n```\r\n\r\n전역 설치 없이 npx 사용:\r\n\r\n```bash\r\nnpx -y -p @donghae0414/codex-gemini-mcp codex-mcp\r\nnpx -y -p @donghae0414/codex-gemini-mcp gemini-mcp\r\n```\r\n\r\n소스에서 설치(개발/테스트):\r\n\r\n```bash\r\nnpm install\r\nnpm run build\r\nnpm link\r\n```\r\n\r\n## Example `.mcp.json`\r\n\r\n전역 설치 기준:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"codex-mcp\": {\r\n      \"command\": \"codex-mcp\",\r\n      \"args\": []\r\n    },\r\n    \"gemini-mcp\": {\r\n      \"command\": \"gemini-mcp\",\r\n      \"args\": []\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n전역 설치 없이 npx 기준:\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"codex-mcp\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"-p\", \"@donghae0414/codex-gemini-mcp\", \"codex-mcp\"]\r\n    },\r\n    \"gemini-mcp\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"-p\", \"@donghae0414/codex-gemini-mcp\", \"gemini-mcp\"]\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n클라이언트별 설정 파일 위치(참고):\r\n\r\n- Claude Desktop (macOS): `~/Library/Application Support/Claude/claude_desktop_config.json`\r\n- Claude Desktop (Windows): `%APPDATA%\\Claude\\claude_desktop_config.json`\r\n\r\n환경 변수는 셸 프로필(`.zshrc` 등)에서 자동으로 주입되지 않을 수 있으므로, 가능하면 설정 파일의 `env` 블록으로 전달하세요.\r\n\r\n## Default Models\r\n\r\n기본 모델은 `src/config.ts`에 하드코딩되어 있으며, 환경 변수로 override할 수 있습니다.\r\n\r\n| Provider | 기본 모델 | 환경 변수 override |\r\n|----------|-----------|-------------------|\r\n| codex | `gpt-5.3-codex` | `MCP_CODEX_DEFAULT_MODEL` |\r\n| gemini | `gemini-3-pro-preview` | `MCP_GEMINI_DEFAULT_MODEL` |\r\n\r\n모델 선택 우선순위: **요청 파라미터 `model`** > **환경 변수** > **하드코딩 기본값**\r\n\r\n## Local development\r\n\r\n```bash\r\nnpm install\r\nnpm run build\r\nnpm run start:codex\r\nnpm run start:gemini\r\n```\r\n\r\n개발 모드:\r\n\r\n```bash\r\nnpm run dev:codex\r\nnpm run dev:gemini\r\n```\r\n\r\n## Runtime Files\r\n\r\n- 기본 런타임 디렉토리: `<cwd>/.codex-gemini-mcp/`\r\n  - background job 상태: `jobs/`\r\n  - background job 입출력(content): `prompts/`\r\n  - 구조화 로깅(JSONL): `logs/`\r\n- 런타임 경로 override:\r\n  - `MCP_RUNTIME_DIR`: 런타임 루트 디렉토리\r\n  - `MCP_LOG_DIR`: 로그 디렉토리\r\n\r\n정리(기본 경로 사용 시):\r\n\r\n```bash\r\nrm -rf .codex-gemini-mcp\r\n```\r\n\r\n## Security / Privacy Notes\r\n\r\n- `background: true`(기본값) 요청은 `.codex-gemini-mcp/prompts/*content*.json`에 prompt/response를 저장합니다.\r\n- 프롬프트에 시크릿(토큰, 비밀번호, 개인 정보 등)을 넣으면 로컬 파일에 남을 수 있습니다.\r\n- 로깅은 기본적으로 본문 미저장이지만, 아래 플래그를 켜면 로그에 텍스트가 포함될 수 있습니다:\r\n  - `MCP_LOG_PREVIEW=1`\r\n  - `MCP_LOG_FULL_TEXT=1`\r\n\r\n## Tool Schemas\r\n\r\n### ask_codex\r\n\r\n- `prompt` (string, required)\r\n- `model` (string, optional)\r\n- `model`은 `[A-Za-z0-9][A-Za-z0-9._:-]*` 패턴(최대 128자)만 허용\r\n- `working_directory` (string, optional): CLI 프로세스의 실행 디렉토리(cwd)\r\n- `background` (boolean, optional, default `true`)\r\n- `reasoning_effort` (string, optional: `minimal` | `low` | `medium` | `high` | `xhigh`)\r\n\r\n### ask_gemini\r\n\r\n- `prompt` (string, required)\r\n- `model` (string, optional)\r\n- `model`은 `[A-Za-z0-9][A-Za-z0-9._:-]*` 패턴(최대 128자)만 허용\r\n- `working_directory` (string, optional): CLI 프로세스의 실행 디렉토리(cwd)\r\n- `background` (boolean, optional, default `true`)\r\n\r\n### wait_for_job\r\n\r\n- `job_id` (string, required, 8자리 hex)\r\n- `timeout_ms` (number, optional, default 3600000, max 3600000; 3600000 초과 값은 3600000으로 cap)\r\n\r\n### check_job_status\r\n\r\n- `job_id` (string, required, 8자리 hex)\r\n\r\n### kill_job\r\n\r\n- `job_id` (string, required, 8자리 hex)\r\n- `signal` (string, optional: `SIGTERM` | `SIGINT`, default `SIGTERM`)\r\n\r\n### list_jobs\r\n\r\n- `status_filter` (string, optional: `active`(spawned/running) | `completed` | `failed`(failed/timeout) | `all`, default `active`)\r\n- `limit` (number, optional, default `50`)\r\n\r\n## Runtime Notes\r\n\r\n- `ask_codex`: `codex exec --ephemeral` 호출 (`reasoning_effort` 지정 시 `-c model_reasoning_effort=...` 추가)\r\n- `ask_gemini`: `gemini --prompt <text>` 호출\r\n- `ask_*`는 `background` 미지정 시 기본 `true`로 실행\r\n- `background: true` 호출 시 `.codex-gemini-mcp/jobs`, `.codex-gemini-mcp/prompts`에 상태/입출력(content) 파일 저장\r\n- 구조화 로깅(JSONL): `.codex-gemini-mcp/logs/mcp-YYYY-MM-DD.jsonl`\r\n  - 기본: 메타데이터만 저장 (본문 미저장)\r\n  - `MCP_LOG_PREVIEW=1`: preview 저장\r\n  - `MCP_LOG_FULL_TEXT=1`: full text 저장\r\n  - 로그 이벤트는 JSONL 파일 저장과 함께 `stderr`에도 미러링됨\r\n- 모델 선택 우선순위: `request.model > env default > hardcoded default`\r\n  - codex env: `MCP_CODEX_DEFAULT_MODEL` (기본값: `gpt-5.3-codex`)\r\n  - gemini env: `MCP_GEMINI_DEFAULT_MODEL` (기본값: `gemini-3-pro-preview`)\r\n- CLI timeout 기본값은 `MCP_CLI_TIMEOUT_MS` 또는 3600000ms(60분)\r\n- `stdout + stderr` 합산 출력이 `MCP_MAX_OUTPUT_BYTES`를 넘으면 `CLI_OUTPUT_LIMIT_EXCEEDED`로 종료\r\n- 출력은 안정적인 텍스트 파이프를 위해 색상/TTY를 비활성화하여 실행합니다 (`NO_COLOR=1`, `FORCE_COLOR=0`, `TERM=dumb`)\r\n\r\n## Logging by `background`\r\n\r\n- 공통(`background` true/false 모두): JSONL에 `request` 이벤트와 terminal(`response` 또는 `error`) 이벤트가 기록되고, `request_id`로 1차 추적 가능\r\n- `background: false` (foreground): 로그 이벤트에 `job_id`가 없음. `jobs/`, `prompts/` 파일은 생성되지 않음\r\n- `background: true` (background):\r\n  - MCP 응답에 `jobId`, `contentFile`, `statusFile` 반환\r\n  - JSONL `response`/`error` 이벤트에 `job_id` 기록\r\n  - `jobs/*status*.json`, `prompts/*content*.json`에 `requestId` 저장\r\n  - 따라서 `request_id` <-> `job_id`를 로그/상태파일 양방향으로 매핑 가능\r\n\r\n## Environment Variables\r\n\r\n- `MCP_CODEX_DEFAULT_MODEL`: codex 기본 모델\r\n- `MCP_GEMINI_DEFAULT_MODEL`: gemini 기본 모델\r\n- `MCP_CLI_TIMEOUT_MS`: 기본 CLI timeout(ms)\r\n- `MCP_MAX_OUTPUT_BYTES`: 최대 출력 바이트(cap, 기본 1048576 = 1MiB)\r\n- `MCP_RUNTIME_DIR`: 런타임 파일 기본 루트(`.codex-gemini-mcp`)\r\n- `MCP_LOG_DIR`: 로그 경로 override\r\n- `MCP_LOG_PREVIEW`: 로그 preview 저장 여부 (`1`이면 활성화)\r\n- `MCP_LOG_FULL_TEXT`: 전체 텍스트 로그 여부 (`1`이면 활성화)\r\n\r\n## Current Status\r\n\r\n- 바이너리 엔트리: `codex-mcp`, `gemini-mcp`\r\n- 검증 완료: `ask_codex`, `ask_gemini` foreground/background 실호출 성공\r\n- 검증 완료: `wait_for_job`, `check_job_status`, `kill_job`, `list_jobs` 실호출 성공\r\n- 구현 완료: 구조화 로깅(Phase D)\r\n- 구현 완료: output cap 강제 + model regex validation\r\n\r\n## Scope (deliberately minimal)\r\n\r\n이 샘플에는 아래 기능이 없습니다:\r\n\r\n- 모델 fallback chain\r\n- standalone bridge 번들링\r\n\r\n## Troubleshooting\r\n\r\n- `CLI_NOT_FOUND`:\r\n  - `codex` 또는 `gemini` CLI가 PATH에 없을 때 발생합니다.\r\n  - `npm i -g @openai/codex` / `npm i -g @google/gemini-cli` 설치 후 재시도하세요.\r\n- output이 잘림(`CLI_OUTPUT_LIMIT_EXCEEDED`):\r\n  - `MCP_MAX_OUTPUT_BYTES`를 늘리거나, 프롬프트/출력을 줄이세요.\r\n- background 파일이 너무 쌓임:\r\n  - 필요 시 `.codex-gemini-mcp/`를 직접 정리하세요.\r\n\r\n## Acknowledgements\r\n\r\n이 프로젝트는 [oh-my-claudecode](https://github.com/Yeachan-Heo/oh-my-claudecode)에 구현된 Codex/Gemini MCP 서버를 참고하여 재구현한 것입니다.\r\n\r\n## License\r\n\r\n[MIT](LICENSE)\r\n","readmeFilename":"README.md","_rev":"1-b4b8c93ac06aad8035d6f84371830d07"}