Docs · static mirror — the interactive version loads with JavaScript.

Hermes Agent

Add Runstack MCP in Hermes Agent (Nous Research) — ~/.hermes/config.yaml mcp_servers with HTTP or stdio, catalog, and deeplink.

Source: https://runstack.engineer/docs/mcp-hermes

hermesAgent

Hermes Agent by Nous Research is a self-improving AI agent with first-class MCP. Connect it to Runstack's MCP tools at https://app.runstack.engineer/mcp with Authorization: Bearer rnsk_…. Get a key at API Keys.

Import from other agents (fastest if migrating)

If you already use Claude Code, Cursor, or similar:

hermes import-agent claude-code   # migrates mcpServers → mcp_servers (claude.json → config.yaml)
# also migrates skills / instructions

This auto-converts mcpServers → mcp_servers for Hermes' YAML config.

Config file

Hermes reads YAML at ~/.hermes/config.yaml under top-level mcp_servers (underscore, not mcpServers):

mcp_servers:
  runstack:
    url: "https://app.runstack.engineer/mcp"
    headers:
      Authorization: "Bearer rnsk_YOUR_API_KEY"

Secrets: put rnsk_… in ~/.hermes/.env; ${VAR} and ${env:VAR} are resolved at connect time (both syntaxes work; Cursor snippets copy-paste). Context vars supported: ${userHome}, ${workspaceFolder}, ${workspaceFolderBasename}, ${/}.

Reload after edit:

# in any Hermes session
/reload-mcp

Gateway also hot-watches config.yaml (add/remove/ enabled:false takes effect ~60s; failed first-connect retries with backoff).

Remote (Streamable HTTP) — recommended

mcp_servers:
  runstack:
    url: "https://app.runstack.engineer/mcp"
    headers:
      Authorization: "Bearer ${RUNSTACK_API_KEY}"
    timeout: 120
    connect_timeout: 60
    enabled: true

Optional HTTP tuning: ssl_verify: true (or CA bundle path), client_cert: "~/secrets/mcp-client.pem" for mTLS, transport: sse to force SSE, keepalive_interval: 180, supports_parallel_tool_calls: false. Credentials in .env: RUNSTACK_API_KEY=rnsk_….

For OAuth servers (not Runstack Bearer), Hermes uses native OAuth 2.1 PKCE+DCR/CIMD:

mcp_servers:
  linear:
    url: "https://mcp.linear.app/mcp"
    auth: oauth
# then in fresh terminal:
# hermes mcp login linear

Runstack uses Bearer headers, not OAuth — no auth: oauth needed.

Local (stdio) — via @rnsk/mcp

mcp_servers:
  runstack:
    command: "npx"
    args: ["-y", "@rnsk/mcp"]
    env:
      RUNSTACK_API_KEY: "rnsk_YOUR_API_KEY"
    timeout: 300
    enabled: true

Hermes sanitizes env to explicit keys + safe baseline; untrusted servers may be marked trust: untrusted (writes require approval).

Catalog one-click (curated, not for Runstack)

Hermes ships a Nous-reviewed catalog (installed disabled by default):

hermes mcp                 # picker
hermes mcp catalog
hermes mcp install linear  # prompts for credentials, probes tools
hermes mcp configure linear  # update tool selection (checklist)

Runstack is not in the default catalog — use manual YAML above. Manifests live at optional-mcps/<name>/manifest.yaml (PR-gated).

Deeplink (Add to Hermes button)

Vendors can offer hermes://mcp/install?name=runstack&config=BASE64URL where config is base64url JSON:

const config = { url: "https://app.runstack.engineer/mcp", headers: { Authorization: "Bearer rnsk_..." } }
const link = `hermes://mcp/install?name=runstack&config=${btoa(JSON.stringify(config))
  .replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/,'')}`

Desktop shows confirmation dialog (pretty-printed config) — install requires user confirm; existing name never overwritten.

Tool naming & filtering

Registered as mcp__runstack__<tool> (double underscore, e.g. mcp__runstack__search_tools). Filter via:

mcp_servers:
  runstack:
    url: "https://app.runstack.engineer/mcp"
    headers: { Authorization: "Bearer ${RUNSTACK_API_KEY}" }
    tools:
      include: [search_tools, execute_tool]   # whitelist (glob aware: "*_dns_*")
      exclude: [delete_*]                     # blacklist
      resources: true
      prompts: true
# include wins over exclude; empty include+no utils = no toolset created.
lazy: true   # register from cache, spawn on first use
idle_timeout_seconds: 900  # recycle heavy stdio after idle

Expose Hermes as MCP server (reverse)

To let Claude/Cursor consume Hermes messaging:

hermes mcp serve   # stdio bridge: mcpServers.hermes {command:"hermes", args:["mcp","serve"]}

Not needed for Runstack consumption.

Verify

After hermes chat or gateway restart:

List the Runstack tools you have and search for GitHub issue tools

Check logs: hermes logs --level debug shows endpoint attempted. Tool call timeout default 300s.

Related