npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ask149/mcp-orchestrator

v1.1.5

Published

MCP server for spawning parallel Copilot sub-agents with context passing

Downloads

647

Readme

🐙 MCP Orchestrator

npm version License: MIT Node.js Twitter Follow

Turn one AI agent into a team. Cross-platform MCP server for spawning parallel sub-agents with multi-CLI backend support.

Platform Support

  • macOS (Intel & Apple Silicon)
  • Linux (x86-64 & ARM64)
  • Windows (x64 & ARM64)

Windows setup: See WINDOWS_VALIDATION.md

Features

  • Multi-CLI backends — Support for GitHub Copilot CLI and Claude Code CLI
  • Parallel execution — Run multiple sub-agents simultaneously
  • Context passing — Pass file contents (full/summary/grep) to sub-agents
  • MCP server filtering — Specify which MCP servers each sub-agent can use
  • MCP Resources — Expose logs and config as readable MCP resources
  • Timeout handling — Per-task and global timeouts
  • Audit logging — All executions logged to ~/.config/orchestrator/logs/

Quick Demo

Spawn 3 parallel sub-agents for job research:

# Via job-search-automation workspace
cd /path/to/job-search-automation
ma parallel \
  "search LinkedIn for SDE-2 roles" \
  "search Reddit for remote jobs" \
  "research top companies for tech stack"

Expected output:

🐙 SPAWNING PARALLEL TASKS
==========================

Tasks (3 total):
  1. search LinkedIn for SDE-2 roles
  2. search Reddit for remote jobs
  3. research top companies for tech stack

⏳ Spawning sub-agents via Orchestrator...
[Sub-Agent 1] LinkedIn search in progress...
[Sub-Agent 2] Reddit search in progress...
[Sub-Agent 3] Company research in progress...
✅ Parallel execution complete

Installation

For detailed setup instructions, see SETUP.md.

Quick start:

git clone https://github.com/Ask149/orchestrator.git
cd orchestrator
npm install
npm run build

Configuration

Config files live at:

  • macOS/Linux: ~/.config/orchestrator/
  • Windows: %LOCALAPPDATA%\\orchestrator\\ (falls back to %APPDATA%)
<config-dir>/
├── config.json          # CLI backend configuration
├── mcp-subagent.json    # MCP servers available to sub-agents
└── logs/                # Execution audit logs (JSONL)

CLI Backend Configuration (config.json)

{
  "cli": {
    "backend": "copilot",

    "copilot": {
      "command": "copilot",
      "allowAllTools": false,
      "allowAllPaths": false,
      "model": null
    },

    "claude": {
      "command": "claude",
      "allowAllTools": false,
      "maxTurns": 10,
      "model": null
    }
  }
}

Defaults are secure: allowAllTools and allowAllPaths are false. Enable explicitly for unattended runs.

Supported CLI Backends

| Backend | CLI | Description | |---------|-----|-------------| | copilot | GitHub Copilot CLI | copilot -p "prompt" [--allow-all-tools] [--allow-all-paths] | | claude | Claude Code CLI | claude -p "prompt" [--dangerously-skip-permissions] --output-format stream-json |

Note: Sub-agents run without the --agent flag. Custom agents restrict the available toolset (e.g., to only report_intent, update_todo). By omitting --agent, sub-agents get full access to Copilot's built-in tools: bash, view, edit, create, grep.

Environment Variables

| Variable | Default | Description | |----------|---------|-------------| | COPILOT_CLI | copilot | Path to Copilot CLI | | CLAUDE_CLI | claude | Path to Claude Code CLI | | ORCHESTRATOR_DEFAULT_BACKEND | copilot | Default CLI backend (copilot or claude) | | ORCHESTRATOR_WORKSPACE | cwd | Default workspace for tasks | | LOG_LEVEL | INFO | Logging level: DEBUG, INFO, WARN, ERROR |

Smart Timeout Configuration

The orchestrator automatically selects appropriate timeouts based on MCP servers requested:

| MCP Server | Default Timeout | Reason | |------------|-----------------|--------| | filesystem, memory | 30s | Fast local operations | | github, google-tasks | 60s | API calls + auth overhead | | google-calendar, leetcode | 90s | OAuth + complex APIs | | playwright | 120s | Browser startup + page rendering |

Logic: effective_timeout = max(task.timeout_seconds, recommended_for_servers, default)

Override with explicit timeout_seconds in task definition when needed.

Usage

Tool: spawn_subagents

Spawn parallel sub-agents for complex tasks.

Parameters:

| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | tasks | array | Yes | Array of sub-agent tasks (max 10) | | default_timeout_seconds | number | No | Default timeout (default: 120) | | default_workspace | string | No | Default working directory |

Task Properties:

| Property | Type | Required | Description | |----------|------|----------|-------------| | id | string | Yes | Unique task identifier | | prompt | string | Yes | Task prompt for sub-agent | | context | object | No | File/data context to pass | | mcp_servers | array | No | MCP servers to enable | | workspace | string | No | Working directory | | timeout_seconds | number | No | Task timeout | | cli_backend | string | No | Override CLI backend (copilot or claude) |

Example: Parallel Research

{
  "tasks": [
    {
      "id": "stripe",
      "prompt": "Find SDE-2 roles at Stripe",
      "mcp_servers": ["playwright"]
    },
    {
      "id": "google",
      "prompt": "Find SDE-2 roles at Google",
      "mcp_servers": ["playwright"]
    },
    {
      "id": "meta",
      "prompt": "Find SDE-2 roles at Meta",
      "mcp_servers": ["playwright"],
      "cli_backend": "claude"
    }
  ]
}

Example: Context Passing

{
  "tasks": [
    {
      "id": "analyze",
      "prompt": "Analyze this file and summarize",
      "context": {
        "files": [
          { "path": "src/main.ts", "mode": "full" },
          { "path": "README.md", "mode": "summary" },
          { "path": "src/", "mode": "grep", "pattern": "TODO|FIXME" }
        ]
      }
    }
  ]
}

MCP Server Configuration (mcp-subagent.json)

Define MCP servers available to sub-agents.

⚠️ IMPORTANT: For Copilot CLI in -p (programmatic) mode, MCP servers must be configured in the default config location. The --additional-mcp-config flag only augments (adds to) this default config. Servers not in the default location will not load in -p mode.

Config location:

  • macOS/Linux: ~/.copilot/mcp-config.json
  • Windows: %USERPROFILE%\.copilot\mcp-config.json (e.g., C:\Users\username\.copilot\mcp-config.json)

Required fields for CLI compatibility:

| Field | Copilot CLI | Claude CLI | Description | |-------|-------------|------------|-------------| | type | Required | Optional | "local", "stdio", "http", or "sse" | | tools | Required | Optional | Array of tool names or ["*"] for all | | command | Required | Required | Executable path | | args | Required | Required | Command arguments |

macOS/Linux:

{
  "mcpServers": {
    "playwright": {
      "type": "local",
      "command": "npx",
      "args": ["-y", "@playwright/mcp@latest"],
      "tools": ["*"]
    }
  }
}

Windows (requires cmd /c wrapper for npx):

{
  "mcpServers": {
    "playwright": {
      "type": "local",
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@playwright/mcp@latest"],
      "tools": ["*"]
    }
  }
}

Windows Users: Without cmd /c, you'll encounter "Connection closed" errors because Windows cannot directly execute npx. See WINDOWS_VALIDATION.md for details.

MCP Integration

Job Search Automation (Recommended)

Use the ma CLI for integrated job search workflows:

cd /path/to/job-search-automation
ma parallel "search LinkedIn for SDE-2" "search Reddit for remote jobs"

See automation/ORCHESTRATOR.md in job-search-automation workspace for complete usage guide with workflows and examples.

Standalone: VS Code / Cline

Add to your MCP settings to use as a standalone server:

{
  "mcpServers": {
    "orchestrator": {
      "command": "node",
      "args": ["/path/to/orchestrator/dist/index.js"],
      "env": {
        "ORCHESTRATOR_WORKSPACE": "/path/to/your/workspace"
      }
    }
  }
}

Audit Logs

Execution logs are written to <config-dir>/logs/orchestrator.jsonl:

{"timestamp":"2026-02-01T10:00:00.000Z","level":"INFO","message":"Spawning 3 sub-agents","taskIds":["stripe","google","meta"]}

Production Features

Health Check

Verify CLI backends are available before deployment:

npm run health
# or
npx mcp-orchestrator-health

Returns JSON with backend availability and exit code 0 if at least one backend is available.

Graceful Shutdown

Server waits up to 30 seconds for active tasks to complete on SIGTERM/SIGINT.

Automatic Retry

Transient failures (timeout, connection reset) are automatically retried once with a 2s delay.

Log Rotation

Application logs auto-rotate at 10MB:

  • ~/.config/orchestrator/logs/orchestrator.jsonl

MCP Resources (v1.1.0+)

The orchestrator exposes its logs and configuration as MCP resources:

| Resource URI | Description | |--------------|-------------| | logs://orchestrator/app | Application logs in JSONL format | | logs://orchestrator/recent | Tail of application logs (last ~200 lines) | | config://orchestrator/current | Current CLI and MCP server configuration | | health://orchestrator/status | Health status snapshot (same as check_health) | | state://orchestrator/active_tasks | In-flight task IDs tracked for graceful shutdown |

Use these resources to inspect orchestrator state without direct file access.

Tool: check_health

Verify orchestrator health via MCP (alternative to CLI npm run health):

{
  "healthy": true,
  "timestamp": "2026-02-03T10:00:00.000Z",
  "platform": "darwin-arm64",
  "backends": {
    "copilot": { "available": true, "version": "1.0.0" },
    "claude": { "available": false, "error": "not found" }
  }
}

Development

# Build
npm run build

# Watch mode
npm run watch

# Type check
npx tsc --noEmit

# Run smoke tests
npm test

# Watch tests
npm test:watch

Known Limitations

Playwright MCP & Browser Automation

| Issue | Description | Mitigation | |-------|-------------|------------| | Chrome profile lock | Chrome locks --user-data-dir to one process. If Chrome is already running with the same profile (e.g., VS Code's Playwright MCP), sub-agents cannot use Playwright MCP tools. | The orchestrator auto-generates isolated temp profiles per sub-agent (/tmp/pw-profile-{taskId}). If the MCP still fails, the BROWSER_AUTOMATION_FALLBACK prompt instructs sub-agents to use chromium.launch({ headless: true }) via the Playwright npm package directly. | | Parallel browser concurrency | Multiple sub-agents requesting Playwright spawn separate browser instances, which increases memory/CPU usage. | Limit parallel Playwright tasks to 2-3 at a time. | | No headless mode in MCP | Playwright MCP launches a visible browser window by default, which steals focus and fails in CI/CD. | Pass --headless in the Playwright MCP args in mcp-subagent.json, or rely on the npm fallback which uses headless by default. | | No output streaming | Sub-agents buffer all stdout until process exit. For long Playwright tasks, there's no progress indication. | Use shorter, focused prompts. Complex multi-page workflows should be split into separate tasks. |

Claude CLI Backend

| Issue | Description | Mitigation | |-------|-------------|------------| | Auth not auto-detected | claude --version succeeds without auth, but prompts fail with "Invalid API key". | The health check now runs a quick prompt to validate auth. Run claude login to fix. | | Stricter MCP schema | Claude CLI rejects type and tools fields in MCP config. | The orchestrator auto-strips these fields when generating Claude-compatible configs. |

Testing

Cross-platform smoke tests validate:

  • Config path resolution (macOS/Linux/Windows)
  • Temp file handling
  • Secure permission defaults
  • Grep implementation (no Unix deps)
  • Platform-specific spawn behavior

Run tests with: npm test

License

MIT