Skip to main content
Glama
README.md
# Highway MCP

The MCP front door for **Highway Agents**. It lets any MCP host (Claude
Desktop/Code, opencode, Cursor, Claude mobile) drive durable, always-on agents
that run server-side on the Highway Workflow Engine — the user runs no
infrastructure, just an MCP client and a Highway API key.

It exposes three tools, each a thin wrapper over the Highway REST API:

| Tool | What it does | REST call |
|------|--------------|-----------|
| `run_goal(goal)` | Start a durable agent run; returns `workflow_run_id`. The agent keeps running even if the client disconnects. | `POST /api/v1/workflows` |
| `get_status(workflow_run_id)` | Status, progress, result, and `pending_approvals`. | `GET /api/v1/workflows/<id>` + `GET /api/v1/approvals` |
| `approve(approval_key, approved, comment)` | Resolve a human-in-the-loop approval to resume the run (works across devices/sessions). | `POST /api/v1/approvals/<key>/approve\|reject` |

The agent loop itself is the engine tool `tools.agent.run_goal` driven by the
`agent_run_goal` workflow (one durable model turn per iteration, HITL approval
before outbound actions). See the engine repo (`enterprise/tools/agent.py`,
`api/dsl_templates/agent_run_goal.py`) and issue #749.

## Prerequisites

- The Highway stack running and reachable (default `http://localhost:7822`).
- A Highway API key (`hw_k1_...`) with permissions `submit_workflows`,
  `view_workflows`, `view_approvals`, `approve_workflows`. Mint one via
  `POST /api/v1/admin/api-keys` (see engine docs).

## Run

```bash
pip install -e .

# stdio (for a local host like opencode/Claude Desktop)
HIGHWAY_BASE_URL=http://localhost:7822 HIGHWAY_API_KEY=hw_k1_xxx highway-mcp

# remote / streamable-http (reachable by laptop + mobile clients)
TRANSPORT=http PORT=8848 HIGHWAY_BASE_URL=https://highway.rodmena.app \
  HIGHWAY_API_KEY=hw_k1_xxx highway-mcp
```

## Connect from opencode (dogfood)

Add to the host's MCP config (stdio example):

```json
{
  "mcpServers": {
    "highway-agents": {
      "command": "highway-mcp",
      "env": {
        "HIGHWAY_BASE_URL": "http://localhost:7822",
        "HIGHWAY_API_KEY": "hw_k1_xxx"
      }
    }
  }
}
```

Then: `run_goal("summarise what files are in /tmp")` → the agent asks to run a
shell command → `get_status(<id>)` shows a pending approval → `approve(<key>)` →
the run resumes and completes; `get_status` returns the result.

## Configuration

| Env var | Default | Purpose |
|---------|---------|---------|
| `HIGHWAY_BASE_URL` | `http://localhost:7822` | Engine base URL |
| `HIGHWAY_API_KEY` | (required) | `hw_k1_...` key, forwarded as Bearer |
| `TRANSPORT` | `stdio` | `stdio` or `http`/`streamable-http` |
| `PORT` | `8848` | HTTP port when `TRANSPORT=http` |

## Status / follow-ups (Phase 0 spike)

- **Auth is single-key from env.** Production needs per-connection auth so each
  customer's own key (from the MCP session/OAuth) is forwarded — not one shared
  server key.
- **Tool surface is a placeholder** (`shell_run` → `tools.shell.run`, approval
  required). Validate the argument contract live and replace with the real
  connector tools (Gmail etc.) in Phase 1.
- **Long-running calls** already use the start→poll pattern (`run_goal` returns
  a handle; `get_status` polls). Progress-notification/resource streaming is a
  later nicety.
- Engine-side durability caveat for side-effecting tools: issue #750.

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: 'approve' handles pending actions, 'get_status' tracks run progress, 'run_goal' starts a new run, and 'schedule_goal' sets up recurring runs. No overlap or ambiguity.

Naming Consistency4/5

Three tools follow a clear verb_noun pattern (get_status, run_goal, schedule_goal), but 'approve' omits the noun. The pattern is mostly consistent and readable, with a minor deviation.

Tool Count5/5

Four tools is well-scoped for the server's purpose of managing durable agent runs with approvals. Each tool is essential and the set is concise without being sparse.

Completeness3/5

The tools cover starting, scheduling, checking status, and approving runs, but missing cancellation or deletion capabilities (e.g., cancel_run, delete_schedule) are notable gaps that agents may need.

Maintenance

ActivityInactive
ResponsivenessNo issues