executor-mcp — Claude Code skill: one MCP endpoint for every integration
Runs a single task against your Executor Cloud tool catalog, where one MCP endpoint proxies every connected integration under allow, approve or block policies.
npx skills add aeonfun/aeon --skill executor-mcp -a claude-codeWhat executor-mcp does
The skill handles one task per run and talks to executor.sh/mcp, a proxy fronting whatever the operator wired up: upstream MCP servers, OpenAPI specs, GraphQL endpoints. Credentials stay in Executor and get attached upstream on each call, so the agent never holds them. Tool discovery happens on every run — the catalog is only as big as what you connected.
You need the OAuth Connect from the dashboard MCP panel, requested with offline_access. Tokens are kept as MCP_EXECUTOR_TOKEN and MCP_EXECUTOR_OAUTH and refreshed by scripts/mcp-oauth-refresh.sh before each run. When that refresh fails and tools answer 401, the skill stops with EXEC_AUTH_STALE and asks you to reconnect the server. With no connection at all there are no mcp__executor__* calls to make, and it exits with EXEC_NOT_CONNECTED.
Each call lands in one of three states. Allowed calls return a result. A call awaiting approval parks until a human clears it in the Executor console — the skill does not retry it, finishes what the remaining tools allow, and reports the pending link. Blocked calls stay blocked; routing around them with another tool is off the table. Writes are real side effects, so an irreversible one is sequenced last. The run caps at 15 calls because the upstreams behind the proxy are rate-limited and may be metered.
What it helps with
- collapse a pile of integrations into one MCP endpoint
- list which integrations are connected right now
- call an external API without handing the agent credentials
- hold a risky write until a human approves it
- report which tools actually ran during the task
Example prompts for the agent
- What integrations are connected in Executor?
- List my open Linear issues and summarize by project.
- Run this through the Executor catalog: pull the open issues and group them by project.
How to install executor-mcp
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill executor-mcp -a claude-code2Manually: put the files in place
~/.claude/skills/executor-mcp/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/executor-mcp/
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill executor-mcp -a codex2Manually: put the files in place
.agents/skills/executor-mcp/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill executor-mcp -a cursor2Manually: put the files in place
.cursor/skills/executor-mcp/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install aeonfun/aeon executor-mcp2Manually: put the files in place
.github/skills/executor-mcp/SKILL.md1Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill executor-mcp -a gemini-cli2Platform CLI
gemini skills install https://github.com/aeonfun/aeon --path skills/executor-mcpManually: put the files in place
.devin/skills/executor-mcp/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add aeonfun/aeon --skill executor-mcp -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about executor-mcp
How do I install executor-mcp in Claude Code?
Run npx skills add aeonfun/aeon --skill executor-mcp -a claude-code. The skill file lands at ~/.claude/skills/executor-mcp/SKILL.md.
What does executor-mcp do?
It runs one task through the Executor Cloud tool catalog. That catalog is whatever the operator connected to the proxy, and every call passes an allow, approve or block policy.
What has to be in place before it works?
A server connection made with the Connect button in the dashboard MCP panel, using OAuth with offline_access. Tokens live as MCP_EXECUTOR_TOKEN and MCP_EXECUTOR_OAUTH, refreshed by scripts/mcp-oauth-refresh.sh.
Source text
SKILL.md · MIT
---
name: executor-mcp
description: Run a task through your Executor Cloud tool catalog - one MCP endpoint proxying every integration you connected (MCP servers, OpenAPI specs, GraphQL APIs), with per-tool allow/approve/block policies. OAuth Connect via the dashboard MCP panel.
metadata:
title: Executor MCP
mode: read-only
category: basics
var: ""
tags:
- tools
- integrations
- mcp
mcp:
- executor
capabilities:
- external_api
- writes_external_host
- sends_notifications
---
> **${var}** — the task to run against the Executor catalog, e.g. `list my open Linear issues and summarize by project` or `what integrations are connected?`. Required. If empty, log `EXEC_NO_TASK` and exit cleanly (no notify).
Execute one task through **Executor Cloud** (`executor.sh/mcp`) — a proxy that fronts every integration the operator connected (upstream MCP servers, OpenAPI specs, GraphQL endpoints) as a single tool catalog. Credentials live in Executor and are attached upstream per call; this agent never sees them. Every call is governed by a per-tool policy: **allow**, **require approval**, or **block**.
## Detection & auth
The server is wired by the dashboard MCP panel's one-click **Connect** (OAuth with `offline_access`; tokens stored as `MCP_EXECUTOR_TOKEN` + `MCP_EXECUTOR_OAUTH`, refreshed each run by `scripts/mcp-oauth-refresh.sh`). Its tools surface as `mcp__executor__*` — the catalog is whatever the operator connected, so **discover it from the server every run**; never assume an integration exists.
- **No `mcp__executor__*` tool callable** → the server isn't connected (or its secrets are missing, in which case the workflow logged a `::warning::` and skipped MCP). Log `EXEC_NOT_CONNECTED`, notify once pointing the operator at the dashboard → MCP → Connect Executor, and exit.
- **Tools exist but return 401/invalid-token** → the OAuth refresh failed (see `docs/mcp-oauth.md`). Log `EXEC_AUTH_STALE`, notify the operator to re-connect the server once in the dashboard, and exit.
## Steps
### 1. Discover the catalog
Enumerate the tools Executor exposes and map `${var}` onto them. If the task is a pure catalog question (`what integrations are connected?`), answer from discovery alone — that's a complete run. If the task needs an integration that isn't in the catalog, log `EXEC_NO_INTEGRATION`, notify which integration is missing (the operator adds it in the Executor console at executor.sh), and exit — don't improvise a substitute.
### 2. Execute
Run the task with the fewest calls that complete it (≤ 15 per run — Executor fronts rate-limited and potentially metered upstreams).
**Policy semantics — expect three outcomes per call:**
- **Allowed** → result comes back; use it.
- **Requires approval** → the call parks until a human approves it in the Executor console. Do **not** retry or wait it out: note the pending approval, finish what the remaining allowed tools can do, and surface the approval link/state in the notify. End state `EXEC_APPROVAL_PENDING` if the core task is blocked on it.
- **Blocked** → policy forbids it. Never work around a block (no alternate tool routes to the same effect); report it as `EXEC_POLICY_BLOCKED`.
Writes through proxied tools are real external side-effects. Only perform a write the task explicitly asks for, and sequence any irreversible one as the run's **final** action, fail-closed — reads and report prep first, so a failure surfaces in this run.
### 3. Notify
Deliver via `./notify -f` (ordinary Markdown): what the task produced, which integrations/tools were used, and any pending approvals or policy blocks with what the operator should do about them. **Exactly one `./notify` call per run** — each call overwrites `$AEON_PENDING_DIR/.pending-<skill>.md` (last-writer-wins), which becomes the chain artifact `output/.chains/executor-mcp.md` that `consume:` steps and the feed read. Everything goes in the single `-f` file.
### 4. Log
This skill is `read-only`, so the workflow's read-only guard writes its `### executor-mcp` log entry from your captured output; a self-written entry would be a duplicate. Don't append to `memory/logs/` yourself - put this record in your **final output**:
```
### executor-mcp
- Task: <${var}, truncated>
- Result: EXEC_OK | EXEC_NO_TASK | EXEC_NOT_CONNECTED | EXEC_AUTH_STALE | EXEC_NO_INTEGRATION | EXEC_APPROVAL_PENDING | EXEC_POLICY_BLOCKED | EXEC_ERROR
- Calls: N (cap 15) | integrations touched: <names>
```
## Constraints
- Policies are the operator's guardrails: a "requires approval" or "blocked" outcome is a *correct* result to report, never an obstacle to engineer around.
- One task per run — `${var}` describing several unrelated tasks gets the first; note the rest as not attempted.
- Every claim in the notify traces to a tool response.
© aeonfun · MIT · aeonfun/aeon