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
- Check the tool's platforms list in the error message and run on a supported OS
- Guard with isLocalToolSupported(slug) (or check tool.platforms) before invoking
- Use a remote/cloud equivalent tool instead of the local one
- 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
- Check tool.platforms against process.platform before enabling the tool for agents
- Gate macOS-only tools behind runtime platform detection
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
- Interactive permission prompts are disabled in this environm
- Invalid arguments for local tool ${resolution.finalSlug}: ${
- Bundled binary ${value.bundledBinary} was not found for ${co
- Local command failed for ${context.finalSlug}: ${invocation.
- experimental_subAgent() target must be "claude", "codex", or
AI-assisted analysis of ComposioHQ/composio@64b1b85502 (2026-08-28).
Data as JSON: /api/errors/337fe43e70dea813.
Report an issue: GitHub.