{"id":46258580,"url":"https://github.com/osanoai/multicli","last_synced_at":"2026-04-18T11:10:52.198Z","repository":{"id":341910983,"uuid":"1171960121","full_name":"osanoai/multicli","owner":"osanoai","description":"Gemini, Codex, Claude, and OpenCode all in a single MCP tool for use by any coding agent.","archived":false,"fork":false,"pushed_at":"2026-04-16T22:56:34.000Z","size":1041,"stargazers_count":42,"open_issues_count":0,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-17T00:38:53.907Z","etag":null,"topics":["ai","cli","mcp"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/osanoai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-03T19:54:09.000Z","updated_at":"2026-04-16T22:54:31.000Z","dependencies_parsed_at":"2026-03-15T18:01:27.771Z","dependency_job_id":null,"html_url":"https://github.com/osanoai/multicli","commit_stats":null,"previous_names":["osanoai/multicli"],"tags_count":39,"template":false,"template_full_name":null,"purl":"pkg:github/osanoai/multicli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osanoai%2Fmulticli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osanoai%2Fmulticli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osanoai%2Fmulticli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osanoai%2Fmulticli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/osanoai","download_url":"https://codeload.github.com/osanoai/multicli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osanoai%2Fmulticli/sbom","scorecard":{"id":1244322,"data":{"date":"2026-03-04T02:37:07Z","repo":{"name":"github.com/osanoai/multicli","commit":"81f10b4340cbcd6f6dca810015620174a6aca434"},"scorecard":{"version":"v5.3.0","commit":"c22063e786c11f9dd714d777a687ff7c4599b600"},"score":5.8,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#code-review"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#security-policy"}},{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dependency-update-tool"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/refresh-catalog.yml:14","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/release.yml:85","Warn: jobLevel 'security-events' permission set to 'write': .github/workflows/release.yml:69","Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:70","Info: jobLevel 'actions' permission set to 'read': .github/workflows/release.yml:71","Info: jobLevel 'contents' permission set to 'read': .github/workflows/scan.yml:34","Info: jobLevel 'actions' permission set to 'read': .github/workflows/scan.yml:35","Warn: no topLevel permission defined: .github/workflows/refresh-catalog.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/scan.yml:1","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/tests.yml:9"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"project was created within the last 90 days. Please review its contents carefully","details":["Warn: Repository was created within the last 90 days."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":8,"reason":"dependency not pinned by hash detected -- score normalized to 8","details":["Warn: npmCommand not pinned by hash: .github/workflows/refresh-catalog.yml:29","Info:  13 out of  13 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   2 third-party GitHubAction dependencies pinned","Info:   3 out of   4 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#pinned-dependencies"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#license"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#cii-best-practices"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:78"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#packaging"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (5) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#sast"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: branch 'main' does not require approvers","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Warn: 'up-to-date branches' is disabled on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#branch-protection"}},{"name":"CI-Tests","score":10,"reason":"2 out of 2 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#ci-tests"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: osano"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/c22063e786c11f9dd714d777a687ff7c4599b600/docs/checks.md#contributors"}}]},"last_synced_at":"2026-03-04T02:44:56.541Z","repository_id":341910983,"created_at":"2026-03-04T02:44:56.541Z","updated_at":"2026-03-04T02:44:56.541Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31966218,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","cli","mcp"],"created_at":"2026-03-04T00:57:05.322Z","updated_at":"2026-04-18T11:10:52.193Z","avatar_url":"https://github.com/osanoai.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Multi-CLI MCP\n\n[![npm version](https://img.shields.io/npm/v/@osanoai/multicli)](https://www.npmjs.com/package/@osanoai/multicli)\n[![Tests](https://img.shields.io/github/actions/workflow/status/osanoai/multicli/tests.yml?branch=main\u0026label=tests)](https://github.com/osanoai/multicli/actions/workflows/tests.yml)\n[![Scan](https://img.shields.io/github/actions/workflow/status/osanoai/multicli/scan.yml?branch=main\u0026label=security%20scan)](https://github.com/osanoai/multicli/actions/workflows/scan.yml)\n[![GitHub release](https://img.shields.io/github/v/release/osanoai/multicli)](https://github.com/osanoai/multicli/releases/latest)\n[![Node](https://img.shields.io/node/v/@osanoai/multicli)](https://www.npmjs.com/package/@osanoai/multicli)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-3178c6?logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n\n**An MCP server that lets Claude, Gemini, Codex, and OpenCode call each other as tools.**\n\n```\nClaude:   \"Hey Gemini, what do you think about this code?\"\nGemini:   \"It's mass. Let me ask Codex for a second opinion.\"\nCodex:    \"You're both wrong. Here's the fix.\"\nOpenCode: \"I checked with three providers. They all agree with Codex.\"\n```\n\n---\n\n## One-Line Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/osanoai/multicli/main/install.sh | bash\n```\n\nDetects which AI CLIs you have installed and configures Multi-CLI for all of them automatically. No config files, no API keys, no environment variables. If it's on your PATH, it works.\n\n---\n\n## What It Does\n\nMulti-CLI sits between your AI clients and bridges them via the [Model Context Protocol](https://modelcontextprotocol.io/). Install it once, and whichever AI you're talking to gains the ability to call the others.\n\n- **Claude** can ask Gemini, Codex, or OpenCode for help\n- **Gemini** can delegate to Claude, Codex, or OpenCode\n- **Codex** can consult Claude, Gemini, or OpenCode\n- **OpenCode** can call Claude, Gemini, or Codex (across 75+ providers)\n- Each client's own tools are hidden (no talking to yourself, that's weird)\n- Auto-detects which CLIs you have installed — only shows what's available\n\n---\n\n## The Meta Part\n\nThis tool was built by the very AIs it connects.\n\nClaude, Gemini, Codex, and OpenCode wrote the code. Claude, Gemini, Codex, and OpenCode maintain it. Every night, a CI job queries the latest stable release of each CLI for its current model list, diffs the results against what's in the repo, and automatically publishes a new version if anything changed. New model releases get picked up within 24 hours. Deprecated models get cleaned out. The repo stays current without anyone touching it.\n\nBecause all install commands use `@latest`, your MCP client pulls the newest version every time it starts — no manual updates, no stale model lists, no maintenance.\n\nMost MCP tools go stale within weeks. This one is self-maintaining by design.\n\n---\n\n## Prerequisites\n\nYou need **Node.js \u003e= 20** and at least **two** of these CLIs installed:\n\n| CLI | Install |\n|-----|---------|\n| [Claude Code](https://docs.anthropic.com/en/docs/claude-code/overview) | `npm install -g @anthropic-ai/claude-code` |\n| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | `npm install -g @google/gemini-cli` |\n| [Codex CLI](https://github.com/openai/codex) | `npm install -g @openai/codex` |\n| [OpenCode](https://opencode.ai) | `curl -fsSL https://opencode.ai/install | bash` |\n\n\u003e Why two? Because one AI talking to itself is a monologue, not a collaboration.\n\n---\n\n## Manual Installation\n\nPrefer to install per-client yourself? Each command is one line.\n\n### Claude Code\n\n```bash\nclaude mcp add --scope user Multi-CLI -- npx -y @osanoai/multicli@latest\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eClaude Desktop (JSON config)\u003c/summary\u003e\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS:\n\n```json\n{\n  \"mcpServers\": {\n    \"Multi-CLI\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@osanoai/multicli@latest\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop completely after saving.\n\u003c/details\u003e\n\n---\n\n### Gemini CLI\n\n```bash\ngemini mcp add --scope user Multi-CLI npx -y @osanoai/multicli@latest\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eManual config (~/.gemini/settings.json)\u003c/summary\u003e\n\n```json\n{\n  \"mcpServers\": {\n    \"Multi-CLI\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@osanoai/multicli@latest\"]\n    }\n  }\n}\n```\n\u003c/details\u003e\n\n---\n\n### Codex CLI\n\n```bash\ncodex mcp add Multi-CLI -- npx -y @osanoai/multicli@latest\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eManual config (~/.codex/config.toml) or pass --mcp-config\u003c/summary\u003e\n\n```bash\ncodex --mcp-config mcp.json\n```\n\nWhere `mcp.json` contains:\n\n```json\n{\n  \"mcpServers\": {\n    \"Multi-CLI\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@osanoai/multicli@latest\"]\n    }\n  }\n}\n```\n\u003c/details\u003e\n\n---\n\n### OpenCode\n\nOpenCode's `mcp add` command is interactive, so add Multi-CLI to `~/.config/opencode/opencode.json` directly:\n\n```json\n{\n  \"mcp\": {\n    \"Multi-CLI\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@osanoai/multicli@latest\"]\n    }\n  }\n}\n```\n\nIf the file already exists, merge the `\"Multi-CLI\"` entry into the existing `\"mcp\"` object.\n\n---\n\n### Any Other MCP Client\n\nMulti-CLI uses standard stdio transport. If your client supports MCP, point it at:\n\n```\nnpx -y @osanoai/multicli@latest\n```\n\n---\n\n## Available Tools\n\nOnce connected, your AI client gains access to tools for the *other* CLIs (never its own):\n\n| Tool | Description |\n|------|-------------|\n| `List-Gemini-Models` | List available Gemini models and their strengths |\n| `Ask-Gemini` | Ask-Gemini a question or give it a task |\n| `Fetch-Chunk` | Retrieve chunked responses from Gemini |\n| `Gemini-Help` | Get Gemini CLI help info |\n| `List-Codex-Models` | List available Codex models |\n| `Ask-Codex` | Ask-Codex a question or give it a task |\n| `Codex-Help` | Get Codex CLI help info |\n| `List-Claude-Models` | List available Claude models |\n| `Ask-Claude` | Ask-Claude a question or give it a task |\n| `Claude-Help` | Get Claude Code CLI help info |\n| `List-OpenCode-Models` | List available OpenCode models from all configured providers |\n| `Ask-OpenCode` | Ask-OpenCode a question or give it a task |\n| `OpenCode-Help` | Get OpenCode CLI help info |\n\n---\n\n## Task-Capable Ask Tools\n\nThe `Ask-*` tools still work as normal synchronous MCP tools, but they now also advertise optional task-based execution for MCP clients that support tasks.\n\n- Task-capable clients can run long `Ask-*` calls using MCP tasks to avoid long blocking tool requests\n- Older clients keep using the same `Ask-*` tools synchronously with no config changes\n- `List-*`, `*-Help`, and `Fetch-Chunk` remain normal synchronous tools\n\n---\n\n## Usage Examples\n\nOnce installed, just talk naturally to your AI:\n\n```\n\"Ask-Gemini what it thinks about this architecture\"\n\"Have Codex review this function for performance issues\"\n\"Get Claude's opinion on this error message\"\n\"Use OpenCode to get a second opinion from Llama\"\n```\n\nOr get a second opinion on anything:\n\n```\n\"I want three perspectives on how to refactor this module —\n ask Gemini and Codex what they'd do differently\"\n```\n\n---\n\n## How It Works\n\n```\n┌─────────────┐     MCP (stdio)      ┌──────────────┐     CLI calls    ┌─────────────┐\n│  Your AI    │ ◄──────────────────► │  Multi-CLI   │ ───────────────► │ Other AIs   │\n│  Client     │                      │   server     │                  │ (CLI tools) │\n└─────────────┘                      └──────────────┘                  └─────────────┘\n\n1. Your AI client connects to Multi-CLI via MCP\n2. Multi-CLI detects which CLIs are installed on your system\n3. It registers tools for the OTHER clients (hides tools for the calling client)\n4. When a tool is called, Multi-CLI executes the corresponding CLI command\n5. Results flow back through MCP to your AI client\n```\n\n---\n\n## Troubleshooting\n\n**\"No usable AI CLIs detected\"**\nMake sure at least one other CLI is installed and on your PATH:\n```bash\nwhich gemini \u0026\u0026 which codex \u0026\u0026 which claude \u0026\u0026 which opencode\n```\n\n**No tools showing up?**\nIf only your own CLI is installed, Multi-CLI hides it (no self-calls). Install a *different* CLI to enable cross-model collaboration.\n\n**MCP server not responding?**\n1. Check that Node.js \u003e= 20 is installed\n2. Run `npx @osanoai/multicli@latest` directly to see if it starts\n3. Restart your AI client completely\n\n**Need to tune timeouts or cleanup behavior?**\nMulti-CLI supports these optional environment variables:\n\n- `MULTICLI_ASK_TIMEOUT_MS`\n- `MULTICLI_HELP_TIMEOUT_MS`\n- `MULTICLI_CLI_DETECT_TIMEOUT_MS`\n- `MULTICLI_KILL_GRACE_MS`\n- `MULTICLI_LOG_LEVEL` (`error`, `info`, or `debug`)\n\n---\n\n## Development\n\n```bash\ngit clone https://github.com/osanoai/multicli.git\ncd multicli\nnpm install\nnpm run build\nnpm run dev\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosanoai%2Fmulticli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fosanoai%2Fmulticli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosanoai%2Fmulticli/lists"}