MCP Clients

Rocannon works with any MCP client. All use the same command: rocannon mcp serve --profile <path>. Use an absolute path. Clients spawn the server from their own working directory, not yours.

ClientConfig location
Claude Code.mcp.json at project root, or claude mcp add
Claude DesktopmacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Cursor.cursor/mcp.json or ~/.cursor/mcp.json
mcphost~/.mcphost.yml or --config <path>
IBM Bob.bob/mcp.json or ~/.bob/mcp_settings.json

Claude Code

One-shot setup via the CLI:

claude mcp add rocannon -- rocannon mcp serve --profile /absolute/path/to/profile.yml

Or add to .mcp.json at your project root:

{
  "mcpServers": {
    "rocannon": {
      "command": "rocannon",
      "args": ["mcp", "serve", "--profile", "/absolute/path/to/profile.yml"],
      "env": {
        "ROCANNON_LOG_FORMAT": "json"
      }
    }
  }
}

Verify the connection:

claude mcp get rocannon

Claude Desktop

{
  "mcpServers": {
    "rocannon": {
      "command": "rocannon",
      "args": ["mcp", "serve", "--profile", "/absolute/path/to/profile.yml"]
    }
  }
}

Restart Claude Desktop after editing the config.

Cursor

{
  "mcpServers": {
    "rocannon": {
      "command": "rocannon",
      "args": ["mcp", "serve", "--profile", "/absolute/path/to/profile.yml"]
    }
  }
}

mcphost

servers:
  rocannon:
    command: rocannon
    args:
      - mcp
      - serve
      - --profile
      - /absolute/path/to/profile.yml

mcphost env field. mcphost ignores the env field in its config. To pass environment variables, use the command: env workaround:

servers:
  rocannon:
    command: env
    args:
      - ROCANNON_TIMEOUT=120
      - rocannon
      - mcp
      - serve
      - --profile
      - /absolute/path/to/profile.yml

IBM Bob

{
  "mcpServers": {
    "rocannon": {
      "command": "rocannon",
      "args": ["mcp", "serve", "--profile", "/absolute/path/to/profile.yml"],
      "alwaysAllow": [
        "ansible_builtin_ping",
        "ansible_builtin_setup"
      ]
    }
  }
}

The alwaysAllow field pre-approves specific tools so Bob does not prompt on every safe read-only call.

HTTP transport

For long-lived sessions or multi-client scenarios, run Rocannon over HTTP instead of stdio:

rocannon mcp serve --profile profile.yml --transport http

The server starts on port 8000 by default (configurable via FastMCP's standard env vars). HTTP transport enables the Ping middleware and suits containerised deployments. A working deploy/rocannon.service systemd unit is included in the repo.

Running as a service

[Unit]
Description=Rocannon MCP Server
After=network.target

[Service]
ExecStart=rocannon mcp serve --profile /etc/rocannon/profile.yml --transport http
Environment=ROCANNON_LOG_FORMAT=json
Restart=on-failure

[Install]
WantedBy=multi-user.target

See deploy/rocannon.service in the repo for the full unit file.

Verifying the connection

Check tool count from the project root after wiring any client:

rocannon mcp doctor --profile profile.yml

Or from the health endpoint when running in HTTP mode:

curl http://localhost:8000/health
{
  "status": "ok",
  "tools": 142,
  "hosts": 8,
  "groups": 3,
  "profiles": ["dev", "staging", "prod"],
  "active_profile": "dev"
}

MCP resources

Rocannon exposes several read-only resources alongside the tools:

Resource URIContents
rocannon://inventoryHosts and groups for the active profile
rocannon://module/{fqcn}Parsed schema for a registered module
rocannon://collectionsCollections exposed and their module lists
rocannon://profilesAll loaded profiles and which is active
rocannon://playbooksSaved playbooks (name, description, step count)
rocannon://runsRecent tool call records (last 50)
rocannon://runs/{request_id}Full record for a single call by ID