- Nothing yet.
- Fall back to
~/.mcporter/mcporter.json[c]whenXDG_CONFIG_HOMEpoints at an empty mcporter config directory, preventing embedders from accidentally hiding the user server registry. (Issue #184, thanks @ChrisBot2026)
- Add
mcporter list --status,--exit-code, and--quietfor concise server health checks without introducing a separate health command. - Make
generate-cli --bundleartifacts deterministic by removing bundle-only paths/timestamps from embedded metadata and sorting generated tool/schema output. (Issue #180, thanks @imroc) - Let daemon-managed OAuth servers reuse cached credentials for tool calls and tool listing after token expiry. (PR #182 / issue #181, thanks @bradhallett)
- Avoid restarting browser OAuth when an already-connected server has a still-valid cached access token. (Issue #179, thanks @jaigew and @StanAngeloff)
- Add the documented top-level
daemonIdleTimeoutMsconfig to shut down inactive keep-alive daemons. (Issue #174, thanks @jarek083)
- Make
generate-cli --runtime node --bundle <name>.mjsemit an ES module bundle with a localrequireshim, fixing.mjsartifacts that previously crashed at startup. - Classify generated
.mjsand.cjsoutputs as bundle artifacts in embedded metadata instead of reporting them as binaries. - Avoid leaving implicit
<server>.tstemplate files in the current directory when generating bundle-only artifacts without--output. - Print generated CLI help with a trailing newline so subsequent shell output no longer glues onto the help footer.
- Point generated CLI metadata and npm package metadata at
openclaw/mcporter. - Document the existing
generate-cli --timeout,--minify, and--no-minifyflags ingenerate-cli --help. - Suppress expected Rolldown unresolved-import warnings for Node built-ins during successful generated CLI bundling.
- Support
auth: "refreshable_bearer"with explicitrefreshsettings so cached OAuth tokens can be refreshed before HTTP connects or injected into stdio env vars. (Issue #173, thanks @tokyo-s) - Add
httpFetch: "node-http1"for HTTP MCP servers whose providers reject Node's built-infetch, and auto-apply it to Sunsama's endpoint. (Issue #158, thanks @mattash) - Resolve
${VAR}and${VAR:-fallback}placeholders across string-valued server config fields such asbaseUrl,command/args,tokenCacheDir, and pre-registered OAuth fields while keeping headers/env/bearer-token placeholders lazy until runtime. (PR #161 / issue #157, thanks @zxyasfas) - Add
mcporter vault set <server>andmcporter vault clear <server>so headless deployments can seed or clear OAuth vault credentials without reproducing mcporter's internal vault-key format. (Issue #156)
- Add
mcporter serve, exposing daemon-managed keep-alive servers as one MCP bridge with readableserver__toolnames for stdio and Streamable HTTP clients. (PR #172, thanks @zm2231) - Prefer MCP
structuredContentnested inside JSON-RPC result envelopes somcporter call --output jsonstays parseable for dual text/structured tool responses. (Issue #168, thanks @mar-zh) - Serialize read-modify-write config and OAuth vault updates, and write JSON/cache metadata atomically to avoid lost entries under parallel invocations. (Issue #167, thanks @alexminza)
- Patch
chrome-devtools-mcp --autoConnectlaunches at runtime somcporter call chrome-devtools.list_pagescan keep using a logged-in Chrome profile while upstream DevTools-window detection can hang on busy profiles.
- Add headless OAuth login support via
--no-browser,--browser none, andMCPORTER_OAUTH_NO_BROWSER, emitting parseable authorization URLs for remote auth flows. (PR #171 / issue #169, thanks @feniix) - Proactively complete OAuth for configured HTTP servers that allow unauthenticated
initialize/listToolsbut require credentials for tool calls, and close the local callback server promptly after browser authorization. (PR #159, thanks @Spacefish) - Refresh expired cached OAuth access tokens during non-interactive
mcporter listwithout opening a browser or clearing cached credentials when refresh fails. (Issue #166, thanks @chrisabad)
- Keep keep-alive daemon retry diagnostics on stderr so
mcporter call --output jsonstdout stays parseable after a daemon recovery. (PR #163 / issue #160, thanks @clawSean) - Increase the default OAuth browser wait from 60 seconds to 5 minutes so hosted MCP sign-ins have enough time for account and permission review.
- Skip the redundant daemon
statuspreflight for warm keep-alive access, cutting one socket round-trip from each routed list/call/resource request while preserving stale-config and dead-daemon recovery. - Route explicit default keep-alive calls like
chrome-devtools.list_pagesthrough a daemon-only fast path, avoiding full runtime startup on warm calls. - Further reduce warm keep-alive call startup by avoiding runtime/config schema imports on CLI boot and using a narrower daemon call path for simple explicit calls.
- Keep single-server
mcporter listnon-interactive by reusing cached OAuth without launching new auth flows, and clamp oversized OAuth startup errors so HTML responses do not flood stdout/stderr. - Label non-timeout
mcporter list <server>failures as unavailable instead of timed out. - Return concise/structured
mcporter resourceerrors for servers that do not implement MCP resources instead of dumping SDK stack traces. - Refresh Context7 examples for the live
resolve-library-idandquery-docsschemas. - Make
generate-cli --help,inspect-cli --help, andemit-ts --helpprint command help before flag parsing. - Auto-correct near-miss tool names when a server reports an unknown tool as MCP
isErrorcontent instead of throwing. - Keep auto-correct diagnostics on stderr for
mcporter call --output json/rawso stdout stays parseable. - Make generated CLIs keep
--output jsonparseable for plain text MCP results by falling back to the raw JSON envelope.
- Preserve existing stdio executable paths that contain spaces instead of splitting them as inline command strings, so app bundle helpers like Hopper's MCP server can be configured directly.
- Build
dist/once before the Vitest suite instead of letting parallel integration tests rebuild it mid-run.
- Fix Bun-compiled standalone binaries so
generate-cli --compilecan compile generated CLIs from empty directories by staging the matching publishedmcporterpackage dependencies when no local package tree is available.
- Add an opt-in standalone Bun release-binary smoke for the empty-directory generated CLI compile path.
- Return a non-zero exit code when MCP tool results are marked
isError, and preserve that status through the forced-exit cleanup path. (PR #154 / issue #153, thanks @jlapenna) - Give forced-exit cleanup a short stdout/stderr flush window so large JSON output is not truncated when
mcporteris run fromchild_process. (PR #151 / issue #145, thanks @yuhp) - Treat
key:=valueas a compatibility alias forkey=value, avoiding malformed keys such asprice:. (PR #150 / issue #100, thanks @solomonneas) - Restore
mcporter call --key value/--key=valuetool arguments, including JSON array/object coercion,--json -stdin payloads, schema-aware bare string-to-array wrapping, and kebab-case to camelCase field mapping. (Issues #119 and #126) - Quote generated
emit-tsmembers for tool names that are not valid TypeScript identifiers. (PR #149 / issue #30, thanks @solomonneas) - Resolve relative stdio args in generated CLI bundles against the generated script location instead of the caller's current directory. (PR #148 / issue #56, thanks @solomonneas)
- Print OAuth manual-completion URLs at the default warning log level so headless users can copy them. (PR #143 / issue #139, thanks @stainlu)
- Support repeatable
--header KEY=valueflags for ad-hoc HTTP servers and persisted ad-hoc entries. (Issue #117) - Let generated CLIs use
--rawwithout also passing required flags, and parse array flags containing JSON object items. (Issues #102 and #103) - Preserve
auth: "oauth"when an ad-hoc HTTP server is OAuth-promoted and saved with--persist. (Issue #82) - Let non-interactive
mcporter listuse existing OAuth token caches for HTTP servers even when older configs are missingauth: "oauth". (Issue #137) - Fail OAuth flows immediately when the server never creates an authorization URL, instead of waiting for a browser callback that cannot arrive. (Issue #115)
- Support
mcporter list server.tool --schemato print a single tool's schema instead of the whole server. (Issue #116) - Surface MCP server
instructionsfrom the initialize response in single-servermcporter listtext and JSON output. (Issue #76) - Add compact
mcporter list <server> --brief/--signaturesoutput for scanning signatures without doc blocks, examples, or schemas. (PR #144, thanks @yuhp) - Launch Bun-compiled macOS daemon children through
nohupso Homebrew binaries can start keep-alive daemons in the background on macOS 26. (Issue #66) - Let generated CLIs use the keep-alive daemon for embedded servers with
lifecycle: "keep-alive", preserving stdio server state across separate generated-CLI invocations. (Issue #101) - Add
mcporter resource <server> [uri]for listing and reading MCP resources, including keep-alive daemon routing. (Issue #134)
- Honor XDG Base Directory env vars for mcporter-owned config, data, cache, and state paths while preserving the legacy
~/.mcporterfallback when XDG vars are unset.MCPORTER_DAEMON_DIR,MCPORTER_CONFIG,--config, and per-servertokenCacheDirremain explicit overrides. (Issue #155) - Support pre-registered OAuth clients via
oauthClientId/oauthClientSecretEnvand token endpoint auth method overrides for providers without dynamic client registration. (Issue #132) - Respect configured stdio
cwdvalues, including relative paths resolved from the config file and~home expansion. (PR #147 / issue #146, thanks @solomonneas)
- Updated
zodto 4.4.3.
- Add per-server exact-name tool filtering with
allowedToolsandblockedTools, including config serialization and runtime call/list enforcement. (Rebuild of PR #39, thanks @tonylampada) - Escalate stuck stdio child-process shutdowns after close timeouts instead of treating the timeout as a clean exit. (PR #39, thanks @tonylampada)
- Quote OAuth browser URLs when launching
cmd.exeon Windows, preserving query parameters such asredirect_uri. (PR #136, thanks @cosminilie) - Document OAuth-protected server config setup with
mcporter config add --auth oauthandmcporter auth. (PR #34, thanks @prateek) - Respect schema-declared string parameters when coercing numeric-looking
mcporter callkey=value arguments, so Slack timestamps likethread_tsstay strings. (PR #141, thanks @Hamzaa6296)
- Bun-compiled/Homebrew binaries now embed the package version before boot, so
mcporter --versionreports the real release (for example0.8.1) instead of falling back to0.0.0-dev.
- Added regression coverage for the Bun compile wrapper so future release builds keep the embedded runtime version intact.
- npm publishes now use an explicit package allowlist, so local release tarballs/checksum files do not get bundled into the published package.
- Preserve OAuth flow vs post-auth transport failures so invalid OAuth/provider errors surface directly, while real legacy 404/405 transport mismatches still fall back to SSE correctly. (PR #97, thanks @mavam)
- Ignore static
Authorizationheaders once OAuth is active so imported editor configs cannot override fresh OAuth tokens. (PR #123, thanks @ahonn) - Keep
mcporter call --output jsonparseable by emitting valid JSON even when the command falls back to raw output. (PR #128, thanks @armanddp) - Render
resourcecontent blocks in call output helpers instead of dropping them, including markdown resources and JSON text payloads. (PR #124, thanks @mvanhorn) - Preserve full JSON/error payloads when
datais just one field instead of collapsing the response todataalone. (PR #106, thanks @AielloChan) - Generated CLIs now parse object-valued flags as JSON and render object placeholders/examples with JSON-shaped help text, so tools like Jira
fieldsno longer receive raw strings. (PR #114, thanks @v2nic) - Deduplicate concurrent keep-alive daemon restarts per server so repeated fatal errors only force-close the cached daemon transport once before retrying. (PR #125, thanks @zm2231)
mcporter config addnow accepts plural--argsas an alias for repeated stdio arguments, matching common CLI muscle memory. (PR #93, thanks @Jah-yee)- Preserve default imports when
mcporter config addwrites a config file, instead of forcing"imports": []. - OAuth: avoid crashing on headless Linux when
xdg-openis unavailable; clear stale dynamic-port client registrations; close callback server if stale-client persistence reads fail. (PR #72, thanks @mgonto) - Added optional
oauthScope/oauth_scopeconfig override as an escape hatch for providers that require explicit scopes. - OAuth wait/redirect now share one deferred to eliminate authorization race windows and preserve stable close-path errors, including wait-before-redirect and repeated-redirect flows. (PR #70, thanks @monotykamary)
createCallResult().json()now collects all parseable JSON entries from MCP content arrays (single item stays backward-compatible), and raw inspect depth now stays readable without unbounded traversal. (PR #91, thanks @Blankdlh)- Added
--raw-strings(numeric coercion off) and--no-coerce(all coercion off) formcporter callargument parsing so IDs/codes can stay literal strings. (PR #59, thanks @nobrainer-tech) - Added
CallResult.images()plus opt-inmcporter call --save-images <dir>so image content blocks can be persisted without changing existing stdout output contracts. (PR #61, thanks @daniella-11ways) - OAuth transport retries now classify HTTP 405 as HTTP (not auth) and OAuth promotion applies to configured HTTP servers too, so post-auth fallback flows no longer drop credentials on 405-only endpoints. (PR #48, thanks @caseyg)
- Config loading now parses project and explicit config files as JSONC, so
mcporter.json/mcporter.jsonccan include comments and trailing commas. (PR #42, thanks @aryasaatvik) - Added generated
mcporter.schema.jsonpluspnpm generate:schemafor IDE autocomplete/validation, including$schemaandoauthScope/oauth_scopecoverage. (PR #43, thanks @aryasaatvik)
- Updated dependencies to latest releases (including MCP SDK, Rolldown RC, Zod, Biome, Oxlint, Vitest, Bun types).
- Synced
biome.jsonschema URL to Biome2.4.5.
- Fixed generated CLIs to read Commander.js option values via camelCased properties so snake_case tool schemas map correctly. (Thanks @rawwerks, PR #28)
- Coerce generated CLI array arguments based on JSON Schema item types (including integer arrays). (Thanks @rawwerks, PR #27)
mcporter generate-clisupports--include-tools/--exclude-toolsto generate CLIs for a subset of server tools. (Thanks @zackleman, PR #24)
- Added regression coverage for typed array parsing in generated CLIs.
- Added regression coverage for snake_case, camelCase, and numeric option names in generated CLIs.
- Increased the Bun bundler integration-test timeout to reduce flakes on slower runners.
- Updated dependency set (SDK, Rolldown, Zod, Biome, Oxlint, Bun types).
- Synced the Biome schema URL to the current CLI version.
- Track config file mtimes for every loaded layer (home + project or explicit) in daemon metadata and auto-restart when any layer changes, so newly added keep-alive servers are picked up without manual restarts. Includes regression tests for stale-daemon detection.
- Centralized OAuth credentials in a shared vault (
~/.mcporter/credentials.json) while still honoring per-servertokenCacheDirwhen present; legacy per-server caches are migrated automatically. mcporter auth --resetnow clears the vault and legacy caches without crashing on corrupted credential files, making re-auth reliable for servers like Gmail.- StdIO servers that expose a separate auth subcommand (e.g., Gmail MCP) can now declare
oauthCommand.args;mcporter auth <server>will spawn that helper and wait for browser completion, so Gmail auth now works without running npx manually. - Raw output now prints full strings without Node’s 10k-character truncation (
util.inspectusesmaxStringLength: null), so large MCP responses and plans are preserved end-to-end. - Added regression coverage to ensure future raw output changes cannot reintroduce truncation.
- Prevented ENOENT crashes when no config file exists anywhere by only passing an explicit
--config/MCPORTER_CONFIGpath to the runtime; implicit defaults now fall back cleanly across list/config/daemon flows.
mcporter call|auth|list help/--helpnow print the command-specific usage text instead of attempting to run a server, matching the footer’s “mcporter --help” hint.- Added a hidden
list-toolsalias formcporter listto preserve older muscle memory and avoid “Unknown MCP server” errors when copied from legacy docs. - Ad-hoc HTTP flows now accept
--insecureas a hidden synonym for--allow-http, making plain-HTTP testing flags match common intuition.--ssealso aliases--http-urlto keep older examples working.
- Override transitive
body-parserto 2.2.1 (CVE-2025-13466) via pnpm overrides.
mcporter listnow uses cached OAuth access tokens (if present) for the all-servers view without opening browser windows, so previously authorized servers no longer show spurious “auth required” in non-interactive listings.pnpm test --filter <pattern>now works by translating to a Vitest file pattern, avoiding the prior “Unknown option --filter” error.
- Updated to
@modelcontextprotocol/sdk1.22.0; inline stdio test server now uses Zod schemas to remain compatible with the SDK’s JSON Schema conversion path.
listToolsnow follows SDK pagination, looping throughnextCursorso long catalogs return complete tool lists.
- Claude imports now preserve root-fallback parsing for legacy
.claude.jsonand.claude/mcp.jsonfiles while treating.claude/settings*.jsonas container-only configs, preventing metadata fields likestatusLinefrom being misdetected as MCP servers. - Added regression coverage for Claude settings and mcp.json imports to guard the root-fallback behavior.
- Propagate
--timeout/MCPORTER_CALL_TIMEOUTinto MCP tool calls (SDKtimeout,resetTimeoutOnProgress,maxTotalTimeout) so long-running requests are no longer capped by the SDK’s 60s default.
mcporter generate-clionce again treats single-token--commandvalues (e.g.,./scripts/server.ts) as STDIO transports instead of trying to coerce them into HTTP URLs, restoring the pre-0.6.1 behavior for ad-hoc scripts.- Global flag parsing moved into
cli-factoryfor consistent log-level/oauth-timeout handling across commands. daemonhost/client hardened and covered with new tests; idle eviction and restart paths verified.
- Reintroduced support for
OPENCODE_CONFIG_DIRso OpenCode imports continue to honor the documented directory override alongsideOPENCODE_CONFIG. - Platform-aware defaults for Cursor/Claude/Windsurf/VS Code/OpenCode configs now dedupe paths and include Windows-specific locations.
- Added
fs-helpersthat treat chmod/copy failures on NTFS/DrvFs as best-effort so CLI generation keeps working on WSL mounts. - Documented Windows/WSL workflows: install/test from ext4 copies, remount guidance for /mnt/c, and syncing tips.
- Added stdio e2e tests using in-repo filesystem & memory MCP fixtures to ensure list/call works via execPath.
createCallResultnow reads nestedraw.content/raw.structuredContentso tools that wrap responses render text/markdown/json correctly; new unit tests cover text joining, markdown, and JSON.
mcporter list --verbosenow surfaces every config path that registers the target server (primary first, then duplicates) in both text and JSON output, making it easier to trace where a name is coming from.- JSON list payloads include a new
sourcesarray when--verboseis set, mirroring the on-screen path list for programmatic consumers. - Verbose source listings now tag the import kind (cursor/vscode/codex, etc.) and explicitly label the primary entry vs. shadowed duplicates.
- Default config resolution now layers the system config (
~/.mcporter/mcporter.json[c]) before the project config (config/mcporter.json), so globally installed MCP servers remain available inside repos while allowing per-project overrides. --configandMCPORTER_CONFIGcontinue to select a single file without merging for explicit workflows.mcporter config add --scope home|projectlets you choose the write target explicitly (project remains the default;--persist <path>still wins when provided).
- Quick start examples in generated CLIs now derive from actual embedded tools (up to three), showing real command names/flags instead of generic placeholders.
- Generated CLIs now present the canonical kebab-cased tool names in help while accepting underscore aliases at runtime, eliminating the “unknown command” errors when copying names directly from server tool lists.
mcporter listsuppresses raw STDIO stderr dumps when enumerating all configured servers, keeping the summary output readable while still surfacing per-server health statuses.mcporter config <subcommand> --help(andmcporter config help <subcommand>) now display detailed usage, flags, and examples for every config subcommand instead of returning a placeholder message. Inline--helptokens are intercepted before executing the command, so flows likemcporter config add --helpno longer throw usage errors.mcporter config doctorprints the project and system config paths before reporting diagnostics, making it obvious which files were inspected when tracking down configuration issues.
- STDIO transports now interpolate
${VAR}/$env:VARtokens in the configured command and arguments before spawning child processes, so chrome-devtools inherits the liveCHROME_DEVTOOLS_URLvalue instead of receiving the literal placeholder. - Keep-alive detection skips any STDIO server whose command/args reference
CHROME_DEVTOOLS_URL, ensuring daemon mode relaunches chrome-devtools for each Oracle browser session instead of pinning a stale port. - Command arguments that escape placeholders as
\${VAR}(common when usingString.rawin TypeScript config helpers) now trim the backslash after interpolation so downstream servers receive clean URLs.
- Ad-hoc STDIO invocations that start with
npx -y <package>now infer the npm package name (stripping versions and ignoring arguments after--) instead of producing slugs likenpx-y, so repeatedmcporter list|callruns automatically reuse a readable server key without passing--name. - Quoted inline commands such as
mcporter list "npx -y xcodebuildmcp"now auto-detect the ad-hoc STDIO transport, so you can skip--stdioentirely when probing MCP packages vianpx.
- Added
mcporter daemon restart, a stop+start convenience that reuses logging flags so agents can bounce the keep-alive daemon with a single command. - Added
list_toolsas a hidden shortcut formcporter list <server>, sochrome-devtools.list_tools(and similar selectors) print the tool catalog instantly without requiring a real MCP tool. - Warn when colon-style arguments omit a value (e.g.,
command:) and suggest quoting/--argsJSON so agents don’t accidentally sendundefinedto STDIO servers.
- Reset cached keep-alive connections whenever STDIO transports hit fatal errors (timeouts, closed pipes, daemon restarts, etc.), so chrome-devtools automatically recovers after you close Chrome instead of requiring
mcporter daemon stop. - Daemon-routed calls now log a restart notice and automatically retry once after closing the stale transport, providing self-healing behavior when Chrome or other keep-alive servers crash mid-call.
- Added hidden agent shortcuts:
mcporter describe <server>now aliasesmcporter list, and calling<server>.helpautomatically falls back to the list output when a server lacks ahelptool (also wired into the legacypnpm mcp callpath) so agents always get a readable summary.
- Propagate the CLI’s per-call timeout (defaults to 60s or
--timeout) through the keep-alive daemon, so chrome-devtools and other persistent STDIO servers stop as soon as the caller times out. Runtime.callToolnow honorstimeoutMsdirectly, ensuring TanStack MCP clients and the CLI share a single source of truth for cancellation even outside the daemon.- Ad-hoc STDIO servers launched via
mcporter call "npx …"(or--stdio) inherit the same keep-alive heuristics and canonical names as config-defined entries, soMCPORTER_DISABLE_KEEPALIVE=chrome-devtoolsand similar overrides work without passing--name.
- Added regression coverage (
tests/daemon-client-timeout.test.ts,tests/runtime-call-timeout.test.ts, and updated keep-alive suites) to guard timeout propagation and canonical keep-alive detection.
- Fixed Claude imports so
mcporter listmerges project-scoped servers from.claude.json(matching the current workspace) and ignores metadata-only keys liketipsHistory/cachedStatsigGates, resolving GitHub issues #6 and #7. - OpenCode imports now read only the documented
mcpcontainer (no root-level fallback), matching the current OpenCode schema and preventing stray metadata from being misinterpreted as servers.
mcporter call "<stdio command>" ...now auto-detects ad-hoc STDIO servers, so you can skip--stdio/--stdio-argentirely and just quote the command you want to run.- When a server exposes exactly one tool,
mcporter callinfers it automatically (and prints a dim log), letting one-tool servers like Vercel Domains run with only their arguments. - STDIO transports now inherit your current shell environment by default, so ad-hoc commands see the same variables as your terminal; keep
--env KEY=valuefor explicit overrides.
mcporter config listandmcporter config doctorno longer crash when the project config is missing or contains malformed JSON; we log a single warning and keep going, matching the behavior of the top-levelmcporter list.
- Added a per-login daemon that auto-starts when keep-alive MCP servers (e.g., Chrome DevTools, Mobile MCP, Playwright) are invoked. The daemon keeps STDIO transports alive across agents, exposes
mcporter daemon <start|status|stop>, and supports idle shutdown plus manual restarts. - Keep-alive detection now honors the
lifecycleconfig flag/env overrides and also inspects STDIO command signatures, so renamingchrome-devtools(or other stateful servers) no longer disables the daemon accidentally. - Introduced daemon logging controls (
mcporter daemon start --log|--log-file,--log-servers,MCPORTER_DAEMON_LOG*env vars, and per-serverlogging.daemon.enabled).mcporter daemon statusreports the active log path, and a newtests/daemon.integration.test.tssuite keeps the end-to-end flow covered.
mcporter list(and every CLI entry point) once again treats missing project configs as empty instead of throwing ENOENT, matching the 0.4.x behavior when you run the CLI outside a repo.
- Daemonized keep-alive servers. A new per-login daemon automatically spins up whenever keep-alive MCP servers (Chrome DevTools, Mobile MCP, Playwright, etc.) are invoked. It keeps STDIO transports warm across agents, exposes
mcporter daemon <start|status|stop>, supports idle shutdowns/manual restarts, and respects thelifecycleconfig flag plus STDIO command metadata so renamed servers stay eligible. - Fixed
createKeepAliveRuntimeso the daemon wrapper’slistToolsimplementation matches the baseRuntimesignature;pnpm build(and any command that shells out topnpm build) succeeds again. - Cursor imports now cover both workspace and user
.cursor/mcp.jsonfiles plus the platform-specificCursor/User/mcp.jsondirectories, and the VS Code/Windsurf walkers dedupe paths so editor-managed MCP servers are auto-discovered consistently across macOS, Linux, and Windows. - Windows installs now enumerate
.cursor/mcp.json,%USERPROFILE%\\.cursor\\mcp.json,%APPDATA%\\Cursor\\User\\mcp.json,.vscode/mcp.json, and the Windsurf/Codeium directories automatically, while STDIO transports on Windows tear down entire process trees viapowershell.exe Get-CimInstance Win32_Processto avoid orphaned child servers.
- Fixed the npm
binentry so it points todist/cli.jswithout a leading./, keeping the executable in the published tarball and restoringnpx mcporterfunctionality. Also bumped the embedded runtime version to 0.4.4 so the CLI reports the correct release. - Added
MCPORTER_CONFIGplus a home-directory fallback (~/.mcporter/mcporter.json[c]) so the CLI automatically finds your system-wide config when a project file is missing.
- Consolidated the external MCP import matrix into
docs/import.md, removing the short-liveddocs/mcp-import.mdduplication, and clarified the release checklist to stop immediately on failing tests or lint warnings.
- Added OpenCode imports (project
opencode.json[c],OPENCODE_CONFIG_DIR, user config, and theOPENCODE_CONFIGoverride) plus JSONC parsing somcporter list/configcan auto-discover servers defined in OpenCode. - Claude Code imports now honor
.claude/settings.local.jsonand.claude/settings.jsonahead of the legacymcp.json, and we skip entries that lack a URL/command (e.g., permissions blocks) so malformed settings no longer break the merge.
- Documented the full import matrix (including OpenCode + Claude settings hierarchy) directly in
docs/import.mdanddocs/config.md.
mcporter list(and other commands that load imports) now skip empty or malformed Claude Desktop / Cursor / Codex config files instead of throwing, so a blankclaude_desktop_config.jsonno longer blocks the rest of the imports.- Bundled sample config adds the Mobile Next MCP definition, making it available out of the box when you run
mcporter listbefore customizing your own config.
- Fixed the fallback when
config/mcporter.jsonis missing somcporter listcontinues to import Cursor/Claude/Codex/etc. configs even when you run the CLI outside a repo that defines its own config, matching the 0.3.x behavior. - Added regression coverage that exercises the “no config file” path to ensure future changes keep importing user-level MCP servers.
mcporter config listnow displays only local entries by default, appends a color-aware summary of every imported config (path, counts, sample names), and still lets you pass--source import/--jsonfor the merged view.mcporter config get,remove, andlogoutnow use the same fuzzy matching/suggestion logic asmcporter list/call, auto-correcting near-miss names and emitting “Did you mean …?” hints when ambiguity remains.
mcporter listnow prints copy/pasteable examples for ad-hoc servers by repeating the HTTP URL (with quoting) so the commands shown underExamples:actually work before you persist the definition.
- Staged the actual dependency directories (
commander,mcporter) directly into the Bun bundler workspace sonpx mcporter generate-cli "npx -y chrome-devtools-mcp" --compilesucceeds even when npm hoists dependencies outside the package (fixes the regression some users still saw with 0.3.5).
- Ensure the Bun bundler resolves
commander/mcportereven whennpx mcporter generate-cli … --compileruns inside an empty temp directory by symlinking mcporter’s ownnode_modulesinto the staging workspace before invokingbun build. This keeps the “one weird trick” workflow working post-0.3.4 without requiring extra installs.
- Added a global
--oauth-timeout <ms>flag (and the matchingMCPORTER_OAUTH_TIMEOUT_MSoverride) so long-running OAuth handshakes can be shortened during debugging; the runtime now logs a clear warning and tears down the flow once the limit is reached, ensuringmcporter list/call/authalways exit.
- Documented the new OAuth timeout flag/env var across the README and tmux/hang-debug guides so release checklists and manual repro steps call out the faster escape hatch.
- When a server definition omits
description,mcporter generate-clinow asks the MCP server for its owninstructions/serverInfo.titleduring tool discovery and embeds that value, so generated CLIs introduce themselves with the real server description instead of the generic “Standalone CLI…” fallback. - Embedded tool listings inside generated CLIs now show each command’s flag signature (no
usage:prefix) separated by blank lines, and per-command--helpoutput inherits the same colorized usage/option styling as the mainmcporterbinary for readability on rich TTYs. - Added a
--bundler rolldown|bunflag tomcporter generate-cli, defaulting to Rolldown but allowing Bun’s bundler (when paired with--runtime bun) for teams that want to stay entirely inside the Bun toolchain. The generator now records the chosen bundler in artifact metadata and enforces the Bun-only constraint so reproduction via--fromstays deterministic. - When Bun is installed (and therefore selected as the runtime),
mcporter generate-clinow automatically switches the bundler to Bun as well—no need to pass--bundler bunmanually—while keeping Rolldown as the default for Node runtimes. - Bundling with Bun copies the generated template into mcporter’s install tree before invoking
bun build, ensuring localcommander/mcporterdependencies resolve even when the user runs the generator from an empty temp directory.
- Embedded the CLI version so Homebrew/Bun builds respond to
mcporter --versioneven whenpackage.jsonis unavailable. - Revamped
mcporter --helpto mirror the richer list/call formatting (name + summary rows, grouped sections, quick-start examples, and ANSI colors when TTYs are detected). - Fixed
mcporter listso it no longer errors whenconfig/mcporter.jsonis absent—fresh installs now run without creating config files, and a regression test guards the optional-config flow. - Generated standalone CLIs now print the full help menu (same grouped layout as the main CLI) when invoked without arguments, matching the behavior of
mcporteritself.
- Generated binaries now default to the current working directory (using the inferred server name) when
--compileis provided without a path, and automatically append a numeric suffix when the target already exists. - Standalone CLIs inherit the improved help layout (color-aware title, grouped command summaries, embedded tool listings, and quick-start snippets) so generated artifacts read the same way as the main CLI.
- Swapped the bundler from esbuild to Rolldown for both JS and Bun targets, removing the fragile per-architecture esbuild binaries while keeping aliasing for local dependencies and honoring
--minifyvia Rolldown’s native minifier. - Improved
generate-cliso inline stdio commands (e.g.,"npx chrome-devtools-mcp") parse correctly even when invoked from empty directories.
readPackageMetadata()now tolerates missingpackage.jsonfiles; when invoked from a directory without a manifest it falls back to mcporter’s own version string, sogenerate-cliworks even when you call it vianpxin an empty folder.
- Short-circuited global
--help/--versionhandling so these flags no longer fall through command inference and always print immediately, regardless of which command the user typed first. - Added regression coverage for the new shortcuts and kept the existing
runClihelper exported so tests (and downstream tools) can exercise argument parsing without forking the entire process.
- Fixed
mcporter generate-cli --bundle/--compilein empty directories by aliasingcommander/mcporterimports to the CLI’s own installation so esbuild always resolves dependencies. Verified with a new fixture that bundles from temp dirs withoutnode_modules(fixes #1). - Added an end-to-end integration test that runs
node dist/cli.js generate-clitwice—once for bundling and once for--compile—as well as a GitHub Actions step that installs Bun so CI exercises the compiled binary path on every PR.
- Added configurable log levels (
--log-level/MCPORTER_LOG_LEVEL) that default towarn, promoting noisy transport fallbacks to warnings so critical issues still surface. - Forced the CLI to exit cleanly after shutdown (opt out with
MCPORTER_NO_FORCE_EXIT) and patchedStdioClientTransportso stdio MCP servers no longer leave Node handles hanging; stderr from stdio servers is buffered and replayed viaMCPORTER_STDIO_LOGS=1or whenever a server exits with a non-zero status.
- Rebuilt
mcporter list: spinner updates stream live, summaries print only after discovery completes, and single-server views now render TypeScript-style doc blocks, inline examples, inferred return hints, and compact// optional (N): …summaries. The CLI guarantees at least five parameters before truncating, introduced a single--all-parametersswitch (replacing the--required-only/--include-optionalpair), and shares its formatter withmcporter generate-cliso signatures are consistent everywhere. - Verb inference and parser upgrades let bare server names dispatch to
list, dotted invocations jump straight tocall, colon-delimited flags (key:value/key: value) sit alongsidekey=value, and the JavaScript-like call syntax now supports unlabeled positional arguments plus typo correction heuristics when tool names are close but not exact. - Ad-hoc workflows are significantly safer:
--http-url/--stdiodefinitions (with--env,--cwd,--name,--persist) work acrosslist,call, andauth, mcporter reuses existing config entries when a URL matches (preserving OAuth tokens / redirect URIs), andmcporter auth <url>piggybacks on the same resolver to persist entries or retry when a server flips modes mid-flight. - Hardened OAuth detection automatically promotes ad-hoc HTTP servers that return 401/403 to
auth: "oauth", broadens the unauthorized heuristic for Supabase/Vercel/GitHub-style responses, and performs a one-time retry whenever a server switches into OAuth mode while you are connecting.
- Generated CLIs now embed their metadata (generator version, resolved server definition, invocation flags) behind a hidden
__mcporter_inspectcommand.mcporter inspect-cli/mcporter generate-cli --from <artifact>read directly from the artifact, while legacy.metadata.jsonsidecars remain as a fallback for older binaries. - Shared the TypeScript signature formatter between
mcporter listandmcporter generate-cli, ensuring command summaries, CLI hints, and generator help stay pixel-perfect and are backed by new snapshot/unit tests. - Introduced
mcporter emit-ts, a codegen command that emits.d.tstool interfaces or ready-to-run client wrappers (--mode types|client,--include-optional) using the same doc/comment data that powers the CLI, so agents/tests can consume MCP servers with strong TypeScript types. mcporter generate-clinow accepts inline stdio commands via--command "npx -y package@latest"or by quoting the command as the first positional argument, automatically splits the command/args, infers a friendly name from scripts or package scopes, and documents the chrome-devtools one-liner in the README; additional unit tests cover HTTP, stdio, scoped package, and positional shorthand flows.
- Added
docs/tool-calling.md,docs/call-syntax.md, anddocs/call-heuristic.mdto capture every invocation style (flags, function expressions, inferred verbs) plus the typo-correction rules. - Expanded the ad-hoc/OAuth story across
README.md,docs/adhoc.md,docs/local.md,docs/known-issues.md, anddocs/supabase-auth-issue.md, detailing when servers auto-promote to OAuth, how retries behave, and how to persist generated definitions safely. - Updated the README, CLI reference, and generator docs to cover the new
--all-parametersflag, list formatter, metadata embedding, themcporter emit-tsworkflow, and refreshed branding so the CLI and docs consistently introduce the project as MCPorter. - Tightened
docs/RELEASE.mdwith a zero-warning policy sopnpm check,pnpm test,npm pack --dry-run, and friends must run clean before publishing. mcporter callnow rejects unknown long flags like--sourceinstead of silently treating them as positional tool arguments; usekey=value,--args, or--for literal--valuepositionals (PR #35, thanks @beverm2391).
-
Added non-blocking
mcporter listoutput with per-server status and parallel discovery. -
Introduced
mcporter auth <server>helper (and library API support) so OAuth flows don’t hang list calls. -
Set the default list timeout to 30 s (configurable via
MCPORTER_LIST_TIMEOUT). -
Tuned runtime connection handling to avoid launching OAuth flows when auto-authorization is disabled and to reuse cached clients safely.
-
Added
mcporter auth <server> --resetto wipe cached credentials before rerunning OAuth. -
mcporter listnow prints[source: …](andSource:in single-server mode) for servers imported from other configs so you can see whether an entry came from Cursor, Claude, etc. -
Added a
--timeout <ms>flag tomcporter listto override the per-server discovery timeout without touching environment variables. -
Generated CLIs now show full command signatures in help and support
--compilewithout leaving template/bundle intermediates. -
StdIO-backed MCP servers now receive resolved environment overrides, so API keys flow through to launched processes like
obsidian-mcp-server. -
Hardened the CLI generator to surface enum defaults/metadata and added regression tests around the new helper utilities.
-
Generated artifacts now emit
<artifact>.metadata.jsonfiles plusmcporter inspect-cli/mcporter regenerate-cliworkflows (with--dry-runand overrides, now handled viagenerate-cli --from <artifact>) so binaries can be refreshed after upgrading mcporter. -
Fixed
mcporter call <server> <tool>so the second positional is treated as the tool name instead of triggering the "Argument must be key=value" error, acceptedtool=/command=selectors now play nicely with additional key=value payloads, and added a default call timeout (configurable viaMCPORTER_CALL_TIMEOUTor--timeout) that tears down the MCP transport—clearing internal timers and ignoring blank env overrides—so long-running or completed tools can’t leave the CLI hanging open.
- Initial release.
- Added
fs-helpersthat treat chmod/copy failures on NTFS/DrvFs as best-effort so CLI generation keeps working on WSL mounts. - Documented Windows/WSL workflows: install/test from ext4 copies, remount guidance for /mnt/c, and syncing tips.
- Global flag parsing moved into
cli-factoryfor consistent log-level/oauth-timeout handling across commands. daemonhost/client hardened and covered with new tests; idle eviction and restart paths verified.- Imports now include platform-aware defaults for Cursor/Claude/Windsurf/VS Code/OpenCode configs with path dedupe.
- Added stdio e2e tests using in-repo filesystem & memory MCP fixtures to ensure list/call works via execPath.
createCallResultnow reads nestedraw.content/raw.structuredContentso tools that wrap responses render text/markdown/json correctly; new unit tests cover text joining, markdown, and JSON.
- New
docs/windows.mdwith WSL/NTFS tips; added to docs index.