Skip to content

Claude Desktop (macOS): an "Install Unpacked" type: binary extension is never launched — host falls back to "basic execution" and fails with ENOENT #282

Description

@David-BS

mcpb-binary-spawn.log

Preflight

Environment

  • Claude Desktop (macOS), Apple Intel x86_64 host.

  • Extension: a single MCP server frozen with PyInstaller (onedir), server.type: "binary", entry_point: server/, mcp_config.command: "${__dirname}/server/".

  • The extension is spec-valid: mcpb validate passes; the launcher is a Mach-O 64-bit executable x86_64; the onedir tree server/_internal/ with the bundled Python, libssllibcrypto, native .sos) is complete.

  • Per the repository README and the MCPB blog post, binary is a documented, supported server type.

Steps to reproduce

  1. Extract the bundle, preserving the executable bit, and confirm +x:

    
    ditto -x -k bundle.mcpb unpacked/
    
    chmod +x unpacked/server/<launcher>
    
    
  2. Claude Desktop → Settings → Extensions → Install Unpacked Extension → select unpacked/.

  3. Install succeeds: Successfully installed extension local.unpacked.<...>.

  4. The server fails to start immediately and on every retry.

Expected

The host launches the binary server (it does so when the same command is configured manually — see "What works").

Actual

The extension log shows the host fail to recognize the binary server type, fall back to "basic execution", and then fail to spawn the process:


[info] Launching MCP Server: <name>

[info] Using basic execution for extension <name>: not a Node.js server or a Python server or no entry point specified

[info] Using MCP server command: server/<launcher> with args and path: { ... paths: [ /usr/local/bin, /usr/bin, ... ] }

[info] Server started and connected successfully

Failed to spawn process: No such file or directory

[error] Server disconnected.

The spawn fails with *No such file or directory (ENOENT)**, not Permission denied (EACCES). The launcher exists and is executable (it runs when invoked directly), so this is a path/handler-resolution failure, not a missing exec bit.

Editing the installed manifest to an absolute command does not help

Rewriting mcp_config.command in the installed manifest to an absolute path changes nothing: the host then stops logging Using MCP server command: … entirely and goes straight to Using basic execution …. So this is not merely a working-directory problem for a relative command — the unpacked install path appears to have no working handler for server.type: "binary": it is treated as "no entry point specified" and routed to a generic exec that never launches the declared binary.

What works — the artifact is sound

  • Run directly from the extraction dir, the launcher starts and speaks MCP over stdio and exits cleanly exit 0).

  • Wired manually via claude_desktop_config.json with an absolute command (the developer path, shown as LOCAL DEV), the server spawns and its tools are usable. Confirmed repeatedly.

So the failure is in the host's unpacked-launch path for type: binary, not in the binary, the manifest, or permissions.

Scope note

This report covers the Install Unpacked Extension path specifically. I could not separately exercise the one-click .mcpb install path for a binary bundle: a signed bundle is rejected at unzip (see #278), and the unsigned bundle's install preview did not engage. So whether the non-unpacked install path has a working binary handler is untested here.

Suggested direction

In the unpacked/dev install path, route server.type: "binary" to the same binary launch handler used for installed bundles — resolve ${__dirname}, set the working directory to the extension root, and spawn the declared launcher — instead of falling back to "basic execution".

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions