Skip to content

expect-cli crashes on launch: ERR_UNSUPPORTED_DIR_IMPORT (ink → es-toolkit/compat) #104

Open

Description

@hckhanh

Expect MCP Server — Connection Failure Context

Summary

The expect MCP server is configured and approved in this repo, but it does not connect because the upstream expect-cli package crashes on launch under Node.js with an ERR_UNSUPPORTED_DIR_IMPORT error originating from ink → es-toolkit/compat.

Repository

  • Path: /home/user/untab
  • Branch: claude/test-expect-mcp-connection-HA1mw

Configuration (correct, no changes needed)

.mcp.json:

{
  "mcpServers": {
    "expect": {
      "command": "npx",
      "args": ["-y", "expect-cli@latest", "mcp"]
    }
  }
}

.claude/settings.json:

{
  "enabledMcpjsonServers": ["expect"],
  "enabledPlugins": {
    "chrome-devtools-mcp@chrome-devtools-plugins": true
  },
  "extraKnownMarketplaces": {
    "chrome-devtools-plugins": {
      "source": {
        "source": "git",
        "url": "https://github.com/ChromeDevTools/chrome-devtools-mcp.git"
      },
      "autoUpdate": true
    }
  }
}

The server is declared and explicitly enabled. The Claude Code session lists no mcp__expect__* tools, confirming the server failed to start.

Reproduction

npx -y expect-cli@latest --version

Same failure with both:

  • Node.js v22.22.2 (system)
  • Node.js v24.15.0 (Vite+ runtime via vp env print → /root/.vite-plus/js_runtime/node/24.15.0/bin)

Error

Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import
'/root/.npm/_npx/015c9764bdd64143/node_modules/es-toolkit/compat'
is not supported resolving ES modules imported from
/root/.npm/_npx/015c9764bdd64143/node_modules/ink/build/ink.js
Did you mean to import "es-toolkit/compat.js"?
    at finalizeResolution (node:internal/modules/esm/resolve:259:11)
    at moduleResolve (node:internal/modules/esm/resolve:861:10)
    at defaultResolve (node:internal/modules/esm/resolve:988:11)
    ...
  code: 'ERR_UNSUPPORTED_DIR_IMPORT',
  url: 'file:///.../node_modules/es-toolkit/compat'

Root Cause Hypothesis

ink (transitive dependency of expect-cli) imports from 'es-toolkit/compat' — a bare directory specifier. Node's strict ESM resolver rejects this unless the target package's exports map declares the subpath, or the import points at a real file (es-toolkit/compat.js). The version of es-toolkit that gets hoisted in the npx resolution does not expose ./compat as a subpath, so resolution fails before any CLI code runs.

Upstream

Possible Fixes (any of)

  1. Pin ink in expect-cli to a version whose es-toolkit import targets a file path (es-toolkit/compat.js), or one that uses a subpath supported by the es-toolkit exports map.
  2. Pin es-toolkit (via expect-cli's lockfile/overrides) to a version that exposes ./compat as a directory subpath in exports.
  3. Add an overrides / resolutions block to expect-cli's package.json so the transitive resolution stays aligned with what ink expects.
  4. As a temporary workaround for users: pin to a known-good earlier expect-cli version in .mcp.json:
    "args": ["-y", "expect-cli@<known-good-version>", "mcp"]

Impact

  • expect-cli is unusable as a CLI (--version, --help, etc. all fail at module resolution).
  • The expect MCP server cannot start, so Claude Code sessions in this repo have no mcp__expect__* tools available.
  • Affects both Node 22 and Node 24, so a Node downgrade is not a viable workaround.

Suggested Next Steps

  1. File the upstream issue at https://github.com/millionco/expect/issues using the body in this document.
  2. While waiting on a fix, optionally pin expect-cli to the latest known-working version in .mcp.json and re-approve the server.
  3. Re-run a Claude Code session and confirm mcp__expect__* tools appear.

Activity

  1. hckhanh commented on Apr 28, 2026

    @hckhanh
    Author

    Scope clarification: I believes this only reproduces inside the Claude Cloud / cloud-sandbox environment where Claude Code agents run — a restricted Linux container. Two details in the original report are consistent with that: npx writes its cache to /root/.npm/_npx/... (root user inside a container), and the Vite+ runtime path is /root/.vite-plus/.... On a normal local workstation install the failure may not appear, presumably because npm/npx hoists a different es-toolkit version that does expose ./compat as a directory subpath in its exports map.

    This doesn't change the fix recommendations — pinning ink/es-toolkit via overrides (or upgrading ink to a version that imports 'es-toolkit/compat.js' instead of the bare directory) would make the package robust against either resolution outcome. But it does explain why a local reproduction attempt may not surface the error.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions