ComposioHQ/composio · error · Error

Local tool ${resolution.finalSlug} is not supported on ${res

Error message

Local tool ${resolution.finalSlug} is not supported on ${resolution.currentPlatform}. Supported platforms: ${formatSupportedPlatforms(resolution.tool.platforms)}.

What it means

Thrown by executeLocalToolBySlug when the resolved local tool is declared as platform-restricted and the current OS/platform is not in its supported list. Resolution is done with includeUnsupported: true so the tool can be found, then explicitly rejected before execution. The message lists the tool's supported platforms.

Source

Thrown at ts/packages/cli-local-tools/src/registry.ts:233

  });
  if (!resolution) return null;
  return {
    finalSlug: resolution.finalSlug,
    toolkit: resolution.toolkit.slug,
    schema: toCustomTool(resolution.toolkit, resolution.tool, resolution.currentPlatform)
      .inputSchema,
    version: 'local',
  };
};

export const executeLocalToolBySlug = async (
  slug: string,
  args: Record<string, unknown>
): Promise<Record<string, unknown> | null> => {
  const resolution = resolveLocalTool(slug, { includeUnsupported: true });
  if (!resolution) return null;
  if (!resolution.supported) {
    throw new Error(
      `Local tool ${resolution.finalSlug} is not supported on ${resolution.currentPlatform}. Supported platforms: ${formatSupportedPlatforms(resolution.tool.platforms)}.`
    );
  }

  const parsed = resolution.tool.inputParams.safeParse(args);
  if (!parsed.success) {
    throw new Error(
      `Invalid arguments for local tool ${resolution.finalSlug}: ${parsed.error.issues
        .map(issue => `${issue.path.join('.') || '<root>'}: ${issue.message}`)
        .join('; ')}`
    );
  }

  return executeLocalTool(resolution.tool.execution, parsed.data as Record<string, unknown>, {
    toolkit: resolution.toolkit,
    tool: resolution.tool,
    finalSlug: resolution.finalSlug,
    platform: resolution.currentPlatform,

View on GitHub (pinned to 64b1b85502)

Solutions

  1. Check the tool's platforms list in the error message and run on a supported OS
  2. Guard with isLocalToolSupported(slug) (or check tool.platforms) before invoking
  3. Use a remote/cloud equivalent tool instead of the local one
  4. Skip the tool conditionally based on process.platform

Example fix

// before
await executeLocalToolBySlug('imessage__send', args);
// after
const resolution = resolveLocalTool('imessage__send');
if (resolution?.supported) {
  await executeLocalToolBySlug('imessage__send', args);
} else {
  console.log(`unsupported on ${process.platform}`);
}
Defensive patterns

Strategy: type-guard

Validate before calling

import { resolveLocalTool } from '@composio/cli-local-tools';
const ok = resolveLocalTool(slug)?.supported === true;

Type guard

const isSupportedHere = (slug: string) =>
  resolveLocalTool(slug, { includeUnsupported: true })?.supported === true;

Try / catch

try { await executeLocalToolBySlug(slug, args); } catch (e) { if (e instanceof Error && e.message.includes('is not supported on')) { /* skip or fallback */ } }

Prevention

When it happens

Trigger: Calling a Composio CLI local tool (e.g. an iMessage/Beeper tool that only supports darwin) on an unsupported OS such as Linux or Windows; calling executeLocalToolBySlug('beeper-imessage__send_message', ...) from a non-macOS environment.

Common situations: Developing on Linux/Windows but running a macOS-only toolkit; CI pipelines running CLI local tools; Docker containers without platform-matching binaries.

Related errors


AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28). Data as JSON: /api/errors/337fe43e70dea813. Report an issue: GitHub.