Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/superradcompany/tool-cli/llms.txt

Use this file to discover all available pages before exploring further.

Most MCP tools are pure JavaScript or Python and work everywhere with a single bundle. But some tools include code that must be compiled for a specific OS and CPU architecture.

When you need it

Multi-platform publishing is required when your tool contains:
  • Native binaries — tools written in Rust, Go, C++, or any compiled language
  • Node.js with native addons — packages like better-sqlite3, sharp, or canvas
  • Python with compiled extensions — packages like numpy, pandas, or anything that ships .so/.pyd files
Reference-mode .mcpbx bundles that point to remote servers, npx, or uvx do not need multi-platform publishing. They contain no compiled code, so a single manifest works everywhere.

Supported platforms

Platform keyDescription
darwin-arm64macOS on Apple Silicon (M1/M2/M3)
darwin-x64macOS on Intel
linux-x64Linux on x86-64
linux-arm64Linux on ARM64
win32-x64Windows on x86-64
win32-arm64Windows on ARM64
Users always get the bundle that matches their system automatically — they just run tool install namespace/toolname and the right one is selected.

Configure platform_overrides in manifest.json

For native binary tools, declare the per-platform command in server.mcp_config.platform_overrides. Each key is a platform string; each value can override command, args, env, url, and headers.
{
  "manifest_version": "0.3",
  "name": "my-binary-tool",
  "version": "1.0.0",
  "server": {
    "type": "binary",
    "entry_point": "dist/my-binary-tool",
    "mcp_config": {
      "command": "${__dirname}/dist/my-binary-tool",
      "args": [],
      "platform_overrides": {
        "darwin-arm64": {
          "command": "${__dirname}/dist/my-binary-tool-darwin-arm64"
        },
        "darwin-x64": {
          "command": "${__dirname}/dist/my-binary-tool-darwin-x64"
        },
        "linux-x64": {
          "command": "${__dirname}/dist/my-binary-tool-linux-x64"
        },
        "linux-arm64": {
          "command": "${__dirname}/dist/my-binary-tool-linux-arm64"
        },
        "win32-x64": {
          "command": "${__dirname}/dist/my-binary-tool-win32-x64.exe"
        },
        "win32-arm64": {
          "command": "${__dirname}/dist/my-binary-tool-win32-arm64.exe"
        }
      }
    }
  }
}
Each platform_overrides entry is merged with the base mcp_config fields — you only need to override the fields that differ per platform.

Publishing multi-platform bundles

Auto-detect from manifest

If all platform binaries are already built and present locally in the paths your manifest expects, a single command packs and publishes all variants:
tool publish --multi-platform
tool-cli reads platform_overrides from your manifest, packs one bundle per platform, and uploads them together.

Pre-built bundles per platform

In CI you typically build each platform on its native runner. Collect the .mcpb files and publish them all in one step from any machine:
tool publish --multi-platform \
  --darwin-arm64 ./dist/my-tool-darwin-arm64.mcpb \
  --darwin-x64   ./dist/my-tool-darwin-x64.mcpb \
  --linux-arm64  ./dist/my-tool-linux-arm64.mcpb \
  --linux-x64    ./dist/my-tool-linux-x64.mcpb \
  --win32-arm64  ./dist/my-tool-win32-arm64.mcpb \
  --win32-x64    ./dist/my-tool-win32-x64.mcpb
You can also supply a pre-built universal bundle that covers all platforms:
tool publish --multi-platform --universal ./dist/my-tool-universal.mcpb
You do not need to provide every platform — only include the platforms you support.

GitHub Actions workflow

Use zerocore-ai/tool-action to automate multi-platform builds. The recommended pattern is a matrix build across runners followed by a single publish step.
name: Publish

on:
  push:
    tags: ["v*"]

jobs:
  build:
    strategy:
      matrix:
        include:
          - os: macos-latest
            target: darwin-arm64
          - os: macos-13
            target: darwin-x64
          - os: ubuntu-latest
            target: linux-x64
          - os: ubuntu-24.04-arm
            target: linux-arm64
          - os: windows-latest
            target: win32-x64

    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: zerocore-ai/tool-action/setup@v1
      - uses: zerocore-ai/tool-action/pack@v1
        with:
          target: ${{ matrix.target }}
      - uses: actions/upload-artifact@v4
        with:
          name: bundle-${{ matrix.target }}
          path: "*.mcpb"

  publish:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          path: dist
          merge-multiple: true
      - uses: zerocore-ai/tool-action/setup@v1
      - run: |
          tool publish --multi-platform \
            --darwin-arm64 dist/my-tool-darwin-arm64.mcpb \
            --darwin-x64   dist/my-tool-darwin-x64.mcpb \
            --linux-x64    dist/my-tool-linux-x64.mcpb \
            --linux-arm64  dist/my-tool-linux-arm64.mcpb \
            --win32-x64    dist/my-tool-win32-x64.mcpb
        env:
          TOOL_TOKEN: ${{ secrets.TOOL_TOKEN }}
zerocore-ai/tool-action/setup@v1 installs tool-cli on the runner. zerocore-ai/tool-action/pack@v1 packs the bundle for the specified target platform.

Installing platform-specific tools

Users don’t need to do anything special. tool install automatically selects the bundle for their system:
tool install library/my-binary-tool        # Auto-detects darwin-arm64, linux-x64, etc.
tool install library/my-binary-tool --platform=darwin-arm64  # Force a specific platform
tool install library/my-binary-tool --platform=universal     # Install universal bundle

Build docs developers (and LLMs) love