Last updated: 2026-04-06

MCP Tool Integration — Model Context Protocol Setup & Tools

The Model Context Protocol (MCP) is an open standard for connecting AI models to external tools and data sources. Hermes v1.0 ships with native MCP support — tools are discovered automatically, authorised once, and available to any task. This guide covers what MCP is, how to connect MCP servers to Hermes, and what tools are available today.

Native MCP support lands in v1.0 — adapter needed for v0.9.x

Hermes v0.9.x (the current stable release as of April 2026) includes an MCP adapter layer that works for most use cases but has limitations: tool discovery is manual, and stateful MCP connections are not preserved across task steps. Full native support — including auto-discovery and persistent connections — is in v1.0, expected Q2 2026. This guide covers both the adapter approach (now) and native MCP (v1.0 preview).

What Is MCP?

Model Context Protocol is Anthropic's open standard for giving AI models a consistent way to call external tools. An MCP server exposes a set of tools (functions with typed inputs and outputs) over a standard transport (stdio, HTTP, or WebSocket). The model calls tools by name; the MCP server executes them and returns structured results.

For Hermes, MCP tools serve the same purpose as OpenClaw skills — but with a richer protocol: tools can have streaming responses, resource subscriptions, and stateful sessions. Because MCP is an open standard, tools built for Claude Desktop, Cursor, or any MCP-compatible client also work in Hermes.

Hermes native toolsMCP tools
StandardHermes-specificOpen standard — works across clients
DiscoveryExplicit configAuto-discovery from MCP server manifest
StreamingNoYes (in v1.0)
Stateful sessionsNoYes (in v1.0)
Available toolsLimited (Hermes ecosystem)Growing open ecosystem (100+ servers)

Connecting MCP Servers — v0.9.x (Current)

In v0.9.x, MCP servers are connected via the adapter layer. Each server is defined in hermes.json under tools.mcp:

{
  "tools": {
    "mcp": {
      "servers": [
        {
          "name":      "filesystem",
          "transport": "stdio",
          "command":   "npx",
          "args":      ["-y", "@modelcontextprotocol/server-filesystem", "~/.hermes/workspace"]
        },
        {
          "name":      "github",
          "transport": "stdio",
          "command":   "npx",
          "args":      ["-y", "@modelcontextprotocol/server-github"],
          "env": {
            "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
          }
        },
        {
          "name":      "brave-search",
          "transport": "stdio",
          "command":   "npx",
          "args":      ["-y", "@modelcontextprotocol/server-brave-search"],
          "env": {
            "BRAVE_API_KEY": "${BRAVE_API_KEY}"
          }
        }
      ]
    }
  }
}

After updating the config, reload Hermes:

hermes config reload

# Verify tools are available
hermes tools list
# filesystem   mcp    read_file, write_file, list_directory, search_files
# github       mcp    get_issue, list_issues, create_issue, get_pr, list_prs
# brave-search mcp    search, local_search

Native MCP — v1.0 Preview

If you're running a v1.0 preview build, the config is simpler — MCP servers are discovered automatically once connected:

{
  "tools": {
    "mcp": {
      "autoDiscover": true,
      "servers": [
        {
          "name":      "github",
          "transport": "stdio",
          "command":   "npx",
          "args":      ["-y", "@modelcontextprotocol/server-github"],
          "env":       { "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}" }
        }
      ]
    }
  }
}
# In v1.0, tools are auto-discovered and listed:
hermes tools list --verbose
# github  mcp  [auto-discovered]
#   get_file_contents     — Read file content from GitHub repo
#   push_files            — Push multiple files in a single commit
#   create_issue          — Create a GitHub issue
#   list_issues           — List issues with filtering
#   create_pull_request   — Open a new PR
#   ... (28 more tools)

MCP Tool Authorisation

Before Hermes can use MCP tools in tasks, you must authorise them. This prevents a task description from accidentally triggering destructive tool calls:

# Authorise all tools from a server (grants read + write)
hermes tools authorise github

# Authorise specific tools only (recommended for write/delete operations)
hermes tools authorise github --tools "get_issue,list_issues,get_file_contents"
# Write and delete operations remain unauthorised — must be added explicitly

# View current authorisations
hermes tools authorise list
# github      mcp    get_issue ✓  list_issues ✓  get_file_contents ✓
#                    push_files ✗  create_issue ✗  (not authorised)

# Revoke a tool
hermes tools authorise revoke github --tool "push_files"
Authorise write tools individually — not in bulk

Authorising an entire MCP server with read+write+delete permissions means any task Hermes runs can use those tools. That's fine for read-only tools. For write operations (push files, create issues, send messages), authorise them individually and only when you've tested the task with read-only access first.

Popular MCP Servers for Hermes

ServerInstallKey toolsAPI key needed
Filesystem@modelcontextprotocol/server-filesystemread_file, write_file, search_files, list_directoryNo
GitHub@modelcontextprotocol/server-githubIssues, PRs, file contents, commits, branchesGitHub PAT
Brave Search@modelcontextprotocol/server-brave-searchWeb search, local searchBrave API key
Puppeteer (browser)@modelcontextprotocol/server-puppeteernavigate, screenshot, click, fill, evaluateNo
Fetch (HTTP)@modelcontextprotocol/server-fetchfetch (GET any URL, returns content)No
PostgreSQL@modelcontextprotocol/server-postgresquery, list_tables, describe_tableDB connection string
SQLite@modelcontextprotocol/server-sqlitequery, list_tables, create_tableNo
Google Drive@modelcontextprotocol/server-gdrivelist files, read docs, create docsGoogle OAuth
Slack@modelcontextprotocol/server-slacklist channels, post message, read historySlack Bot token

Install them all with npx — no global install needed:

# They're run on-demand by Hermes; npx fetches automatically
# Just add the server to your hermes.json and reload

The full MCP server registry: modelcontextprotocol.io/servers

Using MCP Tools in Tasks

Once authorised, MCP tools are available automatically — Hermes decides when to use them based on the task description. You don't call tools explicitly in most cases:

# Hermes will use the github MCP server automatically:
hermes run "List all open issues in my Atlas repo that are labelled 'bug' and summarise them"

# Hermes will use brave-search automatically:
hermes run "Research the top 5 vector database options in 2026, compare on cost and query latency"

# Hermes will use filesystem automatically:
hermes run "Read all .md files in my workspace/notes/ directory and create a table of contents"

For tasks where you want to specify which tools to use:

hermes run \
  --tools "github,filesystem" \
  "Pull all open PRs from the Atlas repo, read the diff for each, and write a review summary to workspace/pr-review.md"

Writing a Custom MCP Server for Hermes

Any MCP server works with Hermes. Here's a minimal custom server in Node.js that exposes a tool to check a website's status:

// ~/my-mcp-tools/status-check.js
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server(
  { name: "status-check", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler("tools/list", async () => ({
  tools: [{
    name: "check_status",
    description: "Check if a URL returns HTTP 200",
    inputSchema: {
      type: "object",
      properties: {
        url: { type: "string", description: "URL to check" }
      },
      required: ["url"]
    }
  }]
}));

server.setRequestHandler("tools/call", async (request) => {
  const { url } = request.params.arguments;
  try {
    const res = await fetch(url, { method: "HEAD", signal: AbortSignal.timeout(5000) });
    return {
      content: [{ type: "text", text: `${url} — ${res.status} ${res.statusText}` }]
    };
  } catch (e) {
    return {
      content: [{ type: "text", text: `${url} — UNREACHABLE: ${e.message}` }],
      isError: true
    };
  }
});

const transport = new StdioServerTransport();
await server.connect(transport);

Register it in Hermes:

{
  "tools": {
    "mcp": {
      "servers": [
        {
          "name":      "status-check",
          "transport": "stdio",
          "command":   "node",
          "args":      ["/home/YOU/my-mcp-tools/status-check.js"]
        }
      ]
    }
  }
}
hermes config reload
hermes tools authorise status-check
hermes run "Check if these URLs are up: https://example.com, https://api.example.com/health"

MCP Tools Inside Long-Running Tasks

MCP tools work across the full lifecycle of a long-running task. At each step, Hermes spins up the required MCP servers, executes the step, and the servers shut down until the next step. In v0.9.x this spin-up adds ~1–2 seconds per step. In v1.0, server connections are persistent across steps (much faster).

Tool outputs from one step are stored in episode memory and available to all subsequent steps in the same task — Hermes doesn't call the same tool twice for the same data unless the task explicitly requires a fresh fetch.

# Example: a multi-step task that uses tools at each step
hermes run --deadline "friday 5pm" "$(cat <<'EOF'
1. Use GitHub to list all open issues in Atlas repo
2. Use brave-search to research solutions for the top 3 bugs
3. For each bug, write a draft fix plan to workspace/fix-plans/
4. Use GitHub to create a comment on each issue with a link to the plan file
EOF
)"

← Back to Hermes hub · See also: Long-Running Tasks & Scheduling · Hermes vs OpenClaw