{"_id":"mcpli","_rev":"6-8f54902054c240fe309fae867a990bff","name":"mcpli","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"mcpli","version":"0.1.0","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","_id":"mcpli@0.1.0","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"dist":{"shasum":"9710f85b6d57588a4268c8baa89eb1d57a6ca08e","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.1.0.tgz","fileCount":9,"integrity":"sha512-P2GjQMOh2+Oi1DkZ5gcMb85H3M774iGlljrv2+qLnpExbcrPJ4N9iFweIOSBys71oXEuqYR94hLOkGKJ95qoTA==","signatures":[{"sig":"MEUCIQCUxxvPKemATSREmSZf+AHYElmtaKzdzXFYw0FGIvxbOQIgaqqCCGOAKLdsV80aIgbGQhK3zBOtyZhvcry/FkXMiX0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":381287},"type":"module","_from":"file:mcpli-0.1.0.tgz","engines":{"node":">=22.0.0"},"scripts":{"dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","test":"vitest --run","build":"npx tsup","format":"prettier --write 'src/**/*.{js,ts}'","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","test:e2e":"vitest --run tests/e2e","test:unit":"vitest --run tests/unit","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.{js,ts}'","test:integration":"vitest --run tests/integration"},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.1.0.tgz","_integrity":"sha512-P2GjQMOh2+Oi1DkZ5gcMb85H3M774iGlljrv2+qLnpExbcrPJ4N9iFweIOSBys71oXEuqYR94hLOkGKJ95qoTA==","repository":{"url":"git+https://github.com/cameroncooke/mcpli.git","type":"git"},"_npmVersion":"11.5.1","description":"Transform stdio-based MCP servers into a first‑class CLI tool","directories":{},"_nodeVersion":"24.7.0","dependencies":{"zod":"^3.23.8","socket-activation":"^3.2.0","@modelcontextprotocol/sdk":"^1.12.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","execa":"^9.4.0","eslint":"^9.23.0","vitest":"^2.0.5","prettier":"^3.5.3","@eslint/js":"^9.23.0","typescript":"^5.7.2","@types/node":"^22.10.2","typescript-eslint":"^8.28.0","@vitest/coverage-v8":"^2.0.5","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpli_0.1.0_1756851773848_0.5352156359031766","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"mcpli","version":"0.1.1","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","_id":"mcpli@0.1.1","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"dist":{"shasum":"8b77a2f661c5c8aa9c4ded95853a38fe9a19d6b2","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.1.1.tgz","fileCount":9,"integrity":"sha512-oGgkYI1tCFw7Z1XLGigQCJnhfKOZS5P3T+ZEf3moPs4KceKTKUjhf//uVWj4C9mgjmP8jMo/6FZIh0Oad7/BUQ==","signatures":[{"sig":"MEYCIQCdt4VbInDuEuWE94sr3th9JcU5GW2qwKs0xDWcx533LAIhAL0s8dvdDlPLCIXJZirLdrB4Nrf32yS74srL26Ra65Jb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":384068},"type":"module","_from":"file:mcpli-0.1.1.tgz","engines":{"node":">=22.0.0"},"scripts":{"dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","test":"vitest --run","build":"npx tsup","format":"prettier --write 'src/**/*.{js,ts}'","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","test:e2e":"vitest --run tests/e2e","test:unit":"vitest --run tests/unit","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.{js,ts}'","test:integration":"vitest --run tests/integration"},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.1.1.tgz","_integrity":"sha512-oGgkYI1tCFw7Z1XLGigQCJnhfKOZS5P3T+ZEf3moPs4KceKTKUjhf//uVWj4C9mgjmP8jMo/6FZIh0Oad7/BUQ==","repository":{"url":"git+https://github.com/cameroncooke/mcpli.git","type":"git"},"_npmVersion":"11.5.1","description":"Transform stdio-based MCP servers into a first‑class CLI tool","directories":{},"_nodeVersion":"24.7.0","dependencies":{"zod":"^3.23.8","socket-activation":"^3.2.0","@modelcontextprotocol/sdk":"^1.12.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","execa":"^9.4.0","eslint":"^9.23.0","vitest":"^2.0.5","prettier":"^3.5.3","@eslint/js":"^9.23.0","typescript":"^5.7.2","@types/node":"^22.10.2","typescript-eslint":"^8.28.0","@vitest/coverage-v8":"^2.0.5","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpli_0.1.1_1756892761397_0.04578681684754704","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"mcpli","version":"0.1.2","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","_id":"mcpli@0.1.2","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"dist":{"shasum":"0b414f0d6571b1506205910869896146d60a67c2","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.1.2.tgz","fileCount":9,"integrity":"sha512-2mlKXER4LxtHYGObo17EmX1qvh2jYIZnDP/c+i2N+nGKJxMo20y0PFcLuL0ALOLwo4m1bex7AWZyT/KlvSwJ1A==","signatures":[{"sig":"MEUCIQDVkuLr4dTGDoB9PUnkbdG/ioIjg6fbcgZ8Ls1VVH7+lgIgGcgCkRiT+JqXnDefJUWLds4WNRPCUhfRpblw05XvrmA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":384068},"type":"module","_from":"file:mcpli-0.1.2.tgz","engines":{"node":">=22.0.0"},"scripts":{"dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","test":"vitest --run","build":"npx tsup","format":"prettier --write 'src/**/*.{js,ts}'","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","test:e2e":"vitest --run tests/e2e","test:unit":"vitest --run tests/unit","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.{js,ts}'","test:integration":"vitest --run tests/integration"},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.1.2.tgz","_integrity":"sha512-2mlKXER4LxtHYGObo17EmX1qvh2jYIZnDP/c+i2N+nGKJxMo20y0PFcLuL0ALOLwo4m1bex7AWZyT/KlvSwJ1A==","repository":{"url":"git+https://github.com/cameroncooke/mcpli.git","type":"git"},"_npmVersion":"11.5.1","description":"Transform stdio-based MCP servers into a first‑class CLI tool","directories":{},"_nodeVersion":"24.7.0","dependencies":{"zod":"^3.23.8","socket-activation":"^3.2.0","@modelcontextprotocol/sdk":"^1.12.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","execa":"^9.4.0","eslint":"^9.23.0","vitest":"^2.0.5","prettier":"^3.5.3","@eslint/js":"^9.23.0","typescript":"^5.7.2","@types/node":"^22.10.2","typescript-eslint":"^8.28.0","@vitest/coverage-v8":"^2.0.5","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpli_0.1.2_1756892762625_0.9353785611148207","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"mcpli","version":"0.1.3","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","_id":"mcpli@0.1.3","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"dist":{"shasum":"6dc9fcba639c8b4243faa5cbeffe13eb9ac8fa63","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.1.3.tgz","fileCount":9,"integrity":"sha512-bNmk9VUQLlQM+gChNmIpLZ9ccUWEOtFjTje4+CO2gNhnOSPWBKSG2GphpcBJ8D1H3J9xcA8ZCnSXSQdBjoQKEw==","signatures":[{"sig":"MEUCIQDPbHJNyV+W5PPtI6QlretjnwkqjjQs9LRzmluGkidCFwIgWlqv040r4eqOfYigDaoRC3uMJipGyEwDlbpnqxwaFRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":384478},"type":"module","_from":"file:mcpli-0.1.3.tgz","engines":{"node":">=22.0.0"},"scripts":{"dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","test":"vitest --run","build":"npx tsup","format":"prettier --write 'src/**/*.{js,ts}'","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","test:e2e":"vitest --run tests/e2e","test:unit":"vitest --run tests/unit","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.{js,ts}'","test:integration":"vitest --run tests/integration"},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.1.3.tgz","_integrity":"sha512-bNmk9VUQLlQM+gChNmIpLZ9ccUWEOtFjTje4+CO2gNhnOSPWBKSG2GphpcBJ8D1H3J9xcA8ZCnSXSQdBjoQKEw==","repository":{"url":"git+https://github.com/cameroncooke/mcpli.git","type":"git"},"_npmVersion":"11.5.1","description":"Transform stdio-based MCP servers into a first‑class CLI tool","directories":{},"_nodeVersion":"24.7.0","dependencies":{"zod":"^3.23.8","socket-activation":"^3.2.0","@modelcontextprotocol/sdk":"^1.12.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","execa":"^9.4.0","eslint":"^9.23.0","vitest":"^2.0.5","prettier":"^3.5.3","@eslint/js":"^9.23.0","typescript":"^5.7.2","@types/node":"^22.10.2","typescript-eslint":"^8.28.0","@vitest/coverage-v8":"^2.0.5","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpli_0.1.3_1757018938371_0.9967751956144852","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"mcpli","version":"0.2.0","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","_id":"mcpli@0.2.0","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"dist":{"shasum":"8142641174cd68c11994ba6fb1fa65e4edaf24fc","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.2.0.tgz","fileCount":9,"integrity":"sha512-lfas366FTaUM/+Rn5cqM1Ev6R9COgpFGcajJM5UESsuMkT6jJt/jnPQU00VoOitvjG5jaxcgsd/a2hvQ3akMvw==","signatures":[{"sig":"MEQCIB81927s934n4QaE5syVV2XMpirsTZMxc80Sh77hLdryAiB38w9Ls7wu8ZGeDc4eZH3Nj1cIKpqyBAlH0EZPcQWEaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":435058},"type":"module","_from":"file:mcpli-0.2.0.tgz","engines":{"node":">=22.0.0"},"scripts":{"dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","test":"vitest --run","build":"npx tsup","format":"prettier --write 'src/**/*.{js,ts}'","coverage":"vitest run --coverage","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","test:e2e":"vitest --run tests/e2e","test:unit":"vitest --run tests/unit","typecheck":"tsc --noEmit","format:check":"prettier --check 'src/**/*.{js,ts}'","test:integration":"vitest --run tests/integration"},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.2.0.tgz","_integrity":"sha512-lfas366FTaUM/+Rn5cqM1Ev6R9COgpFGcajJM5UESsuMkT6jJt/jnPQU00VoOitvjG5jaxcgsd/a2hvQ3akMvw==","repository":{"url":"git+https://github.com/cameroncooke/mcpli.git","type":"git"},"_npmVersion":"11.5.1","description":"Transform stdio-based MCP servers into a first‑class CLI tool","directories":{},"_nodeVersion":"24.7.0","dependencies":{"zod":"^3.23.8","socket-activation":"^3.2.0","@modelcontextprotocol/sdk":"^1.12.3"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","execa":"^9.4.0","eslint":"^9.23.0","vitest":"^2.0.5","prettier":"^3.5.3","@eslint/js":"^9.23.0","typescript":"^5.7.2","@types/node":"^22.10.2","typescript-eslint":"^8.28.0","@vitest/coverage-v8":"^2.0.5","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/mcpli_0.2.0_1757355127969_0.39888697110729376","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"mcpli","version":"0.3.0","type":"module","description":"Transform stdio-based MCP servers into a first‑class CLI tool","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"author":{"name":"Cameron Cooke"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/cameroncooke/mcpli.git"},"homepage":"https://github.com/cameroncooke/mcpli","bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"bin":{"mcpli":"dist/mcpli.js"},"scripts":{"build":"npx tsup","dev":"npm run build","lint":"eslint 'src/**/*.{js,ts}'","lint:fix":"eslint 'src/**/*.{js,ts}' --fix","format":"prettier --write 'src/**/*.{js,ts}'","format:check":"prettier --check 'src/**/*.{js,ts}'","typecheck":"tsc --noEmit","test":"vitest --run","test:unit":"vitest --run tests/unit","test:integration":"vitest --run tests/integration","test:e2e":"vitest --run tests/e2e","coverage":"vitest run --coverage"},"dependencies":{"@modelcontextprotocol/sdk":"^1.12.3","socket-activation":"^3.2.0","zod":"^3.23.8"},"devDependencies":{"@eslint/js":"^9.23.0","@types/node":"^22.10.2","@typescript-eslint/eslint-plugin":"^8.28.0","@typescript-eslint/parser":"^8.28.0","@vitest/coverage-v8":"^3.2.4","eslint":"^9.23.0","eslint-config-prettier":"^10.1.1","eslint-plugin-prettier":"^5.2.5","execa":"^9.4.0","prettier":"^3.5.3","tsup":"^8.5.0","typescript":"^5.7.2","typescript-eslint":"^8.28.0","vitest":"^3.2.4"},"engines":{"node":">=22.0.0"},"_id":"mcpli@0.3.0","_integrity":"sha512-o5c/LAJfSingIdPqC4UxexJu2mc6Ad9N1vS8Z8DROedwlb9q2O1UBx4B0ks9A6c95oIfmV8mbd7tokX4R3/H6Q==","_resolved":"/home/runner/work/mcpli/mcpli/mcpli-0.3.0.tgz","_from":"file:mcpli-0.3.0.tgz","_nodeVersion":"24.8.0","_npmVersion":"11.6.0","dist":{"integrity":"sha512-o5c/LAJfSingIdPqC4UxexJu2mc6Ad9N1vS8Z8DROedwlb9q2O1UBx4B0ks9A6c95oIfmV8mbd7tokX4R3/H6Q==","shasum":"059d2d24023eef1a21ec6ef8d6a4e187b47f5bc5","tarball":"https://registry.npmjs.org/mcpli/-/mcpli-0.3.0.tgz","fileCount":9,"unpackedSize":448902,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/mcpli@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFiERUo4JmlGFqNyTlL6HsxaM1yP0k59iBPZkfG2uWPgAiEAgt8CZwmcdOgqxUXXRRAQXUs8xEwL1DHmJgDp/7O6nNQ="}]},"_npmUser":{"name":"camsoft","email":"web@cameroncooke.com"},"directories":{},"maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcpli_0.3.0_1757765084641_0.3386925955004809"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-02T22:22:53.738Z","modified":"2025-09-13T12:04:45.254Z","0.1.0":"2025-09-02T22:22:54.063Z","0.1.1":"2025-09-03T09:46:01.600Z","0.1.2":"2025-09-03T09:46:02.789Z","0.1.3":"2025-09-04T20:48:58.567Z","0.2.0":"2025-09-08T18:12:08.153Z","0.3.0":"2025-09-13T12:04:44.820Z"},"bugs":{"url":"https://github.com/cameroncooke/mcpli/issues"},"author":{"name":"Cameron Cooke"},"license":"MIT","homepage":"https://github.com/cameroncooke/mcpli","keywords":["mcp","modelcontextprotocol","cli","tools","agent","command-line"],"repository":{"type":"git","url":"git+https://github.com/cameroncooke/mcpli.git"},"description":"Transform stdio-based MCP servers into a first‑class CLI tool","maintainers":[{"name":"camsoft","email":"web@cameroncooke.com"}],"readme":"![MCPLI Logo](banner.png)\n\n[![CI](https://github.com/cameroncooke/mcpli/actions/workflows/ci.yml/badge.svg)](https://github.com/cameroncooke/mcpli/actions/workflows/ci.yml)\n[![npm version](https://badge.fury.io/js/mcpli.svg)](https://badge.fury.io/js/mcpli)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![macOS](https://img.shields.io/badge/platform-macOS-lightgrey.svg)](https://www.apple.com/macos/)\n[![pkg.pr.new](https://pkg.pr.new/badge/cameroncooke/mcpli)](https://pkg.pr.new/~/cameroncooke/mcpli)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cameroncooke/mcpli)\n\n# MCPLI\n\nTransform stdio-based MCP servers into a first‑class CLI tool.\n\nMCPLI turns any stdio-based MCP server into a discoverable, script‑friendly, agent-friendly CLI. Run tools as natural commands, compose the output using standard bash tools.\n\n## Table of contents\n\n- [Quick Start](#quick-start)\n- [Features](#features)\n- [Why MCPLI?](#why-mcpli)\n- [Installation](#installation)\n  - [Requirements](#requirements)\n  - [Global Installation](#global-installation)\n  - [Direct Usage (No Installation)](#direct-usage-no-installation)\n- [Usage](#usage)\n  - [Discover and Run Tools](#discover-and-run-tools)\n  - [Output Modes](#output-modes)\n  - [Examples](#examples)\n- [Advanced Features](#advanced-features)\n  - [Process Management](#process-management)\n    - [Multiple Daemons](#multiple-daemons)\n    - [Daemon Timeouts](#daemon-timeouts)\n  - [Environment Variables](#environment-variables)\n  - [Debugging](#debugging)\n- [Tool Parameter Syntax](#tool-parameter-syntax)\n- [Contributing](#contributing)\n- [Security](#security)\n- [License](#license)\n\n## Quick Start\n\n```bash\n# Install globally via npm\nnpm install -g mcpli\n\n# View help\nmcpli --help -- node weather-server.js\n\n# View tool help\nmcpli get-weather --help -- node weather-server.js\n\n# Run a tool\nmcpli get-weather --location \"San Francisco\" -- node weather-server.js\n```\n\n## Features\n\n- Zero setup – Point at any stdio-based MCP server, get instant CLI access\n- Maintains a persistent daemon to ensure MCP is stateful and same instance is reused for repeated calls\n- Natural syntax – Tools become commands: `mcpli get-weather --location \"NYC\" -- node weather-server.js`\n- Auto‑generated help – `mcpli --help -- <server>` lists tools; `mcpli <tool> --help -- <server>` shows parameters\n- Clean output – Structured JSON that’s great for shell pipelines\n- Flexible parameters – Supports `--key value` and `--key=value`, plus JSON for arrays/objects\n - Cancellation – Ctrl+C cancels the active tool request; the daemon remains running\n\n\n## Why MCPLI?\n\nMCP gives us a standard way for agents to talk to tools. But at scale it hits a hard limit: context and composability. Each MCP server brings tool descriptions, schemas, and metadata that the agent needs to ingest. Install a few servers with dozens of tools and you're burning tens of thousands of tokens before you've processed a single user prompt. That cost isn't just financial—it steals headroom for reasoning and hurts reliability.\n\nThis creates a false choice for developers:\n- Use MCP \"as intended\" and accept huge, inference‑time context overhead and limited shell‑level composition.\n- Abandon MCP and wrap CLI tools instead, curating concise AGENTS.md examples that are efficient, predictable, and composable—but give up MCP's standardisation.\n\nMCPLI bridges that gap. It turns any stdio‑based MCP server into a first‑class CLI tool, so you get:\n- The best of both worlds: keep your MCP servers and their capability model, but exercise them as predictable CLI commands.\n- Composability by default: pipe results to jq, grep, awk, curl, or anything else your workflow demands.\n- Control over context: stop auto‑injecting large tool schemas; instead provide tight, example‑driven prompts just like you would for any other CLI.\n- Standard help and discoverability: mcpli auto‑generates tool help from MCP schemas, so your CLI stays self‑documenting and consistent.\n- Preservation of existing investments: no server changes required—MCPLI instantly upgrades what you already have.\n\nWhat changes in practice\n- Your agent no longer has to ingest every tool schema up front. You feed it small, curated examples: `mcpli get-weather --location 'NYC' -- node weather-server.js`.\n- You regain the shell: `mcpli get-weather ... | jq .temperature` is now trivial and reliable.\n- You keep state and speed with a persistent daemon behind the scenes, but you interact through a simple, composable CLI surface.\n\nBottom line\nMCPLI doesn't replace MCP. It completes it. Keep the standard, ditch the token bloat, and gain the composability and predictability of the command line without rewriting your servers or your workflows.\n\n## Installation\n\n### Requirements\n\n- Node.js 18+\n- Any MCP‑compliant server that uses stdio-based transport\n- macOS (launchd) for daemon orchestration\n\n### Global Installation\n```bash\nnpm install -g mcpli\n```\n\n### Direct Usage (No Installation)\n```bash\nnpx mcpli@latest <tool-command> -- <mcp-server-command> [args...]\n```\n\n## Usage\n\nAlways include the MCP server command after -- on every invocation. MCPLI does the rest for you.\n\n### Discover and Run Tools\n\nView tools:\n\n```bash\nmcpli --help -- <mcp-server-command> [args...]\n```\n\nView tool help:\n\n```bash\nmcpli <tool-command> --help -- <mcp-server-command> [args...]\n```\n\nBasic tool call:\n\n```bash\nnpx mcpli@latest <tool-command> [tool-options...] -- <mcp-server-command> [args...]\n```\n\n### Output Modes\n\n```bash\n# Default: Friendly extraction of tool result content\nmcpli get-weather --location \"NYC\" -- node weather-server.js\n\n# Raw MCP response for debugging\nmcpli get-weather --location \"NYC\" --raw -- node weather-server.js\n```\n\n### Examples\n\n```bash\n# Discover available tools from a server\n> mcpli --help -- node weather-server.js\n\nUsage:\n  mcpli <tool> [tool-options...] -- <mcp-server-command> [args...]\n  mcpli <tool> --help -- <mcp-server-command> [args...]\n  mcpli --help -- <mcp-server-command> [args...]\n  mcpli daemon <subcommand> [options]\n\nGlobal Options:\n  --help, -h     Show this help and list all available tools\n  --verbose      Show MCP server output (stderr/logs)\n  --raw          Print raw MCP response\n  --debug        Enable debug output\n  --timeout=<seconds> Set daemon inactivity timeout (default: 1800)\n\nAvailable Tools:\n  get-weather          Get current weather information for any location\n  get-forecast         Get weather forecast for multiple days\n\nTool Help:\n  mcpli <tool> --help -- <mcp-server-command>    Show detailed help for specific tool\n\nDaemon Commands:\n  daemon start   Start long-lived daemon process\n  daemon stop    Stop daemon process\n  daemon status  Show daemon status\n  daemon restart Restart daemon process\n  daemon logs    Show daemon logs\n  daemon log     Show recent daemon logs (non-interactive)\n  daemon clean   Clean up daemon files\n\nExamples:\n  mcpli get-weather --help -- node weather-server.js\n  mcpli get-weather --option value -- node weather-server.js\n```\n\n```bash\n# Get tool-specific help\n> mcpli get-weather --help -- node weather-server.js\n\nMCPLI Tool: get-weather\n\nDescription: Get current weather information for any location\n\nUsage: mcpli get-weather [options] -- <mcp-server-command> [args...]\n\nOptions:\n  --location             (string) [required] City name (e.g., \"New York\", \"London, UK\") or coordinates as \"lat,lon\"\n  --units                (string) Temperature units (default: \"fahrenheit\")\n\nExamples:\n  mcpli get-weather --help -- node weather-server.js\n  mcpli get-weather --location \"example-value\" -- node weather-server.js\n```\n\n```bash\n# Run a tool\n> mcpli get-weather --location \"San Francisco\" -- node weather-server.js\n\n{\n  \"location\": \"San Francisco, California, United States\",\n  \"coordinates\": {\n    \"latitude\": 37.77493,\n    \"longitude\": -122.41942\n  },\n  \"temperature\": \"63°F\",\n  \"feels_like\": \"64°F\",\n  \"humidity\": \"86%\",\n  \"wind\": \"4 mph WSW\",\n  \"condition\": \"Partly cloudy\",\n  \"precipitation\": \"0\\\" rain\",\n  \"timestamp\": \"2025-08-24T10:00\"\n}\n```\n\n```bash\n# Compose the output\n> mcpli get-weather --location \"San Francisco\" -- node weather-server.js | jq -r '.temperature'\n\n63°F\n```\n\n## Advanced Features\n\nFor advanced users who want more control, you can control the behavior of MCPLI with the following commands.\n\n### Process Management\n\nMCPLI automatically maintains a persistent daemon to ensure your MCP server is stateful and that the same instance is reused for repeated calls.\n\nYou can manually manage the daemon with the following commands.\n\n```bash\n# Start explicitly\nmcpli daemon start -- node weather-server.js\n\n# Show status (current directory)\nmcpli daemon status\n\n# Stop a specific configuration\nmcpli daemon stop -- node weather-server.js\n\n# Stop everything in this directory\nmcpli daemon stop\n\n# Restart one or all\nmcpli daemon restart -- node weather-server.js\nmcpli daemon restart\n\n# View logs (live stream)\nmcpli daemon logs\n\n# Show recent logs (non-interactive; default 2 minutes)\nmcpli daemon log --since=2m\n# Filter to specific daemon by passing the server command after --\nmcpli daemon log --since=2m -- node weather-server.js\n\n# Clean up files and stale sockets\nmcpli daemon clean\n```\n\n#### Multiple Daemons\n\nMCPLI creates separate daemon processes for each unique combination of command + arguments + environment variables. Each daemon gets its own identity based on a hash of these components.\n\n```bash\n# These create different daemons (different commands)\nmcpli daemon start -- node weather-server.js\nmcpli daemon start -- python weather.py\n\n# These create different daemons (different args)\nmcpli daemon start -- node weather-server.js --port 3000\nmcpli daemon start -- node weather-server.js --port 4000\n\n# These create different daemons (different env)\nmcpli daemon start -- API_KEY=dev node weather-server.js\nmcpli daemon start -- API_KEY=prod node weather-server.js\n```\n\nEach daemon exposes a Unix socket at `$TMPDIR/mcpli/<cwdHash>/<daemonId>.sock` (printed by `mcpli daemon status`):\n- **Socket file**: `$TMPDIR/mcpli/<cwdHash>/<daemonId>.sock` — Unix socket for IPC communication\n\nThe hash ensures that identical configurations reuse the same daemon, while different configurations get separate processes. This allows you to run multiple MCP servers simultaneously without conflicts.\n\nDaemon lifecycle is managed by macOS launchd — no lock files are used.\n\n> [!NOTE]\n> It's recommended to add `.mcpli/` to your `.gitignore` file to avoid committing launchd plist metadata and diagnostics. Socket files live under `$TMPDIR` and are not part of your repository.\n\n**Shell environment does not affect daemon identity**\n- Only environment variables provided after -- as KEY=VALUE tokens (CommandSpec env) are considered when computing the daemon ID.\n- Setting env before mcpli runs does not create a distinct daemon.\n\nExamples:\n```bash\n# Different daemons (different CommandSpec env)\nmcpli daemon start -- API_KEY=dev node weather-server.js\nmcpli daemon start -- API_KEY=prod node weather-server.js\n\n# Same daemon (shell env not considered for identity)\nAPI_KEY=dev mcpli daemon start -- node weather-server.js\nmcpli daemon start -- node weather-server.js\n```\n\n#### Timeouts Overview\n\nMCPLI uses two primary user-facing timeouts:\n\n- Daemon inactivity timeout: how long an idle daemon stays alive.\n- Tool execution timeout: how long a single MCP tool call may run.\n\nIPC is managed automatically and will be set to at least tool timeout + 60 seconds to avoid premature disconnections.\n\n#### Daemon Timeouts\n\nDaemons automatically shut down after a period of inactivity to free up resources (default: 30 minutes). You can customize this timeout:\n\n```bash\n# Set a 5-minute timeout (300 seconds)\nmcpli get-weather --timeout=300 --location \"NYC\" -- node weather-server.js\n\n# Set a 1-hour timeout (3600 seconds) for long-running sessions\nmcpli daemon start --timeout=3600 -- node weather-server.js\n```\n\nThe timeout resets every time you make a request to the daemon. Once the timeout period passes without any activity, the daemon gracefully shuts down and cleans up its files.\n\nNote on preserving timeouts:\n- When you do not pass `--timeout`, MCPLI preserves the daemon's existing inactivity timeout across ensures and restarts (avoids unnecessary plist reloads).\n- Passing `--timeout=<seconds>` explicitly overrides the preserved value for that daemon.\n\n#### Tool Timeouts\n\nControl how long a single MCP tool call may run (default: 10 minutes).\n\n```bash\n# Per-invocation: set tool timeout to 15 minutes (900 seconds)\nmcpli get-weather --tool-timeout=900 --location \"NYC\" -- node weather-server.js\n\n# Global default via env (milliseconds)\nexport MCPLI_TOOL_TIMEOUT_MS=900000\n```\n\nNotes:\n- `--tool-timeout` uses seconds, matching `--timeout` for consistency.\n- `MCPLI_TOOL_TIMEOUT_MS` is the env for defaults.\n- IPC timeout automatically adjusts to ≥ tool timeout + 60s for tool calls.\n\n### Environment Variables\n\nYou can set default timeouts using environment variables instead of passing `--timeout` on every command:\n\n```bash\n# Set default daemon timeout to 10 minutes (600 seconds)\nexport MCPLI_DEFAULT_TIMEOUT=600\n\n# Now all commands use this timeout by default\nmcpli get-weather --location \"NYC\" -- node weather-server.js\n\n# You can still override with --timeout argument\nmcpli get-weather --timeout=1200 --location \"NYC\" -- node weather-server.js\n```\n\nAvailable environment variables:\n- `MCPLI_DEFAULT_TIMEOUT`: Daemon inactivity timeout in seconds (default: 1800)\n- `MCPLI_TOOL_TIMEOUT_MS`: Default tool execution timeout in milliseconds (default: 600000)\n- `MCPLI_IPC_TIMEOUT`: IPC connection timeout in milliseconds (default: 660000). For advanced tuning; generally unnecessary due to auto-buffering.\n- `MCPLI_IPC_CONNECT_RETRY_BUDGET_MS`: Advanced — total time budget for retrying the initial socket connect after `orchestrator.ensure()` (default: 3000). The client automatically raises the effective budget to ~8000ms on the first connection after a launchd plist update (job `loaded`/`reloaded`) to ride out transient socket rebinds. In steady‑state, this env sets the baseline.\n- `MCPLI_TIMEOUT`: Internal wrapper inactivity timeout (ms); derived from CLI `--timeout` or `MCPLI_DEFAULT_TIMEOUT` (default: 1800000). Typically not set directly.\n\nDeprecated/unused:\n- `MCPLI_CLI_TIMEOUT`: Reserved for future use; not currently enforced.\n\n### Debugging\n\n- `--debug` enables MCPLI diagnostics (structured, concise)\n- `--verbose` shows MCP server stderr/logs\n- `mcpli daemon log [--since=2m] [-- <server>]` prints recent logs without streaming\n  - Default window can be configured via `MCPLI_LOG_SINCE` (e.g., `export MCPLI_LOG_SINCE=10m`)\n\n## Tool Parameter Syntax\n\n- Strings: `--location \"San Francisco\"`\n- Numbers: `--count 42` or `--rating -123.456`\n- Booleans: `--enabled` or `--debug false`\n- Arrays: `--tags='[\"web\",\"api\"]'`\n- Objects: `--config='{\"timeout\":5000}'`\n\nBoth `--key value` and `--key=value` work for all types.\n\n## Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details on:\n\n- Setting up the development environment\n- Understanding the codebase architecture\n- Making changes and submitting pull requests\n- Code quality standards and testing guidelines\n\nWhether you're fixing bugs, adding features, improving documentation, or enhancing performance, your contributions help make MCPLI better for everyone.\n\n## Security\n\nFor a high‑level overview of MCPLI’s security posture, see the [Security Overview](security.md).\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}