Endpoints

Complete API endpoint reference for the Argus MCP management API.

All endpoints are relative to /manage/v1/.


GET /health

Liveness and readiness probe. Always public -- no token required.

Response

{
  "status": "healthy",
  "uptime_seconds": 3600.5,
  "version": "0.8.0",
  "backends": {
    "total": 3,
    "connected": 3,
    "healthy": 2
  }
}
FieldTypeDescription
statusstring"healthy", "degraded", or "unhealthy"
uptime_secondsfloatSeconds since server start
versionstringServer version
backends.totalintTotal configured backends
backends.connectedintCurrently connected backends
backends.healthyintBackends passing health checks

Status logic:

  • healthy -- all backends connected and healthy
  • degraded -- some backends unhealthy or disconnected
  • unhealthy -- no backends connected

GET /ready

Readiness probe. Returns 200 when the gateway is accepting traffic. Returns 503 when backends are not yet connected. Always public -- no token required.

Response

200 OK (gateway ready):

{
  "ready": true,
  "reason": "accepting traffic"
}

503 Service Unavailable (not ready):

{
  "ready": false,
  "reason": "backends not connected"
}
FieldTypeDescription
readybooleanWhether the gateway is ready to serve traffic
reasonstringHuman-readable readiness status message

GET /status

Full service status including config and transport info.

Response

{
  "service": {
    "name": "Argus MCP",
    "version": "0.8.0",
    "state": "running",
    "uptime_seconds": 3600.5,
    "started_at": "2026-02-23T12:00:00Z"
  },
  "config": {
    "file_path": "/path/to/config.yaml",
    "loaded_at": "2026-02-23T12:00:00Z",
    "backend_count": 3
  },
  "transport": {
    "sse_url": "http://127.0.0.1:9000/sse",
    "streamable_http_url": "http://127.0.0.1:9000/mcp",
    "host": "127.0.0.1",
    "port": 9000
  },
  "feature_flags": {
    "optimizer": false,
    "hot_reload": true,
    "outgoing_auth": true,
    "session_management": true,
    "yaml_config": true
  }
}

GET /backends

List all backend connections with state, health, and capabilities.

Response

{
  "backends": [
    {
      "name": "my-server",
      "type": "stdio",
      "group": "default",
      "phase": "Ready",
      "state": "connected",
      "error": null,
      "capabilities": {
        "tools": 5,
        "resources": 2,
        "prompts": 1
      },
      "health": {
        "status": "healthy",
        "last_check": null,
        "latency_ms": null
      },
      "conditions": [
        {
          "type": "Ready",
          "status": true,
          "reason": "Connected",
          "message": "Backend initialized successfully",
          "last_transition": "2026-02-23T12:00:00Z"
        }
      ],
      "labels": {}
    }
  ]
}
FieldTypeDescription
namestringBackend identifier (from config key)
typestring"stdio", "sse", or "streamable-http"
groupstringLogical server group
phasestringLifecycle phase (see below)
statestringConnection state
errorstring?Error message if failed
capabilitiesobjectCapability counts
healthobjectHealth check (status, last_check, latency_ms)
conditionsarrayStructured conditions

Lifecycle phases: Pending, Initializing, Ready, Degraded, Failed, ShuttingDown


GET /groups

List logical server groups and their members.

Query Parameters

ParamTypeDescription
groupstringFilter by group name (optional)

Response

{
  "groups": {
    "default": {
      "servers": ["server-a", "server-b"],
      "count": 2
    },
    "search-tools": {
      "servers": ["search-server"],
      "count": 1
    }
  },
  "total_groups": 2,
  "total_servers": 3
}

GET /capabilities

Aggregated tools, resources, and prompts from all connected backends.

Query Parameters

ParamTypeDescription
typestringFilter by type: tools, resources, prompts
backendstringFilter by backend name
searchstringSearch capability names

Response

{
  "tools": [
    {
      "name": "search_web",
      "original_name": "search_web",
      "description": "Search the web",
      "backend": "browser-server",
      "input_schema": { },
      "filtered": false,
      "renamed": false
    }
  ],
  "resources": [
    {
      "uri": "docs://readme",
      "name": "docs://readme",
      "backend": "docs-server",
      "mime_type": "text/markdown"
    }
  ],
  "prompts": [
    {
      "name": "code_review",
      "description": "Review code changes",
      "backend": "review-server",
      "arguments": []
    }
  ],
  "route_map": {
    "search_web": ["browser-server", "search_web"],
    "docs://readme": ["docs-server", "docs://readme"]
  }
}

GET /sessions

List active MCP client sessions.

Response

{
  "active_sessions": 2,
  "sessions": [
    {
      "id": "abc123",
      "transport_type": "sse",
      "tool_count": 15,
      "capability_snapshot": { "tools": 15, "resources": 3, "prompts": 2 },
      "age_seconds": 120.5,
      "idle_seconds": 10.2,
      "ttl": 3600,
      "expired": false
    }
  ]
}

GET /events

Recent events (polling-based).

Query Parameters

ParamTypeDefaultDescription
limitint100Maximum events to return
sinceISO string--Return events after this timestamp
severitystring--Filter by severity level

Response

{
  "events": [
    {
      "id": "evt_abc123",
      "timestamp": "2026-02-23T12:01:00Z",
      "stage": "connected",
      "message": "Backend 'my-server' connected successfully",
      "severity": "info",
      "backend": "my-server",
      "details": {}
    }
  ]
}

GET /events/stream

Real-time event stream via Server-Sent Events (SSE).

Usage

curl -H "Authorization: Bearer $TOKEN" \
     http://localhost:9000/manage/v1/events/stream

Events are sent as SSE data: frames (JSON). A heartbeat comment is sent every 30 seconds to keep the connection alive.

data: {"id": "evt_abc", "timestamp": "...", "stage": "connected", ...}

data: {"id": "evt_def", "timestamp": "...", "stage": "error", ...}

: heartbeat

GET /batch

Combined status, backends, capabilities, and recent events in a single round-trip. Designed for polling clients (TUI) to eliminate per-poll multi-request overhead.

Query Parameters

ParamTypeDefaultDescription
events_limitint20Maximum events to include in the response

Response

{
  "status": { ... },
  "backends": { ... },
  "capabilities": { ... },
  "events": { ... }
}
FieldTypeDescription
statusobjectService status (same schema as GET /status)
backendsobjectBackend list (same schema as GET /backends)
capabilitiesobjectAggregated capabilities (same schema as GET /capabilities)
eventsobjectRecent events (same schema as GET /events)

Note:

The status, backends, capabilities, and events objects have the same schemas as the respective individual endpoints.


POST /reload

Hot-reload the configuration file. Detects changes and reconnects affected backends.

Note:

Requires feature_flags.hot_reload: true in config.

Response

{
  "reloaded": true,
  "backends_added": ["new-server"],
  "backends_removed": ["old-server"],
  "backends_changed": ["modified-server"],
  "errors": []
}

POST /reconnect/{name}

Reconnect a specific backend by name.

Path Parameters

ParamTypeDescription
namestringBackend name (from config)

Response

{
  "name": "my-server",
  "reconnected": true,
  "error": null
}

Returns 404 if the backend name is not found.


POST /reauth/{name}

Trigger interactive re-authentication for a backend using PKCE or OAuth2. Initiates the browser-based auth flow for the named backend.

Path Parameters

ParamTypeDescription
namestringBackend name from config

Response

{
  "name": "my-server",
  "reauth_initiated": true,
  "error": null
}
FieldTypeDescription
namestringBackend name
reauth_initiatedbooleanWhether the re-auth flow was started
errorstring?Error message if initiation failed

Returns 404 if the backend name is not found. Returns 503 if the service is not running.


POST /shutdown

Initiate graceful server shutdown.

Request Body (optional)

{
  "timeout_seconds": 30
}

Response

{
  "shutting_down": true
}

The server will:

  1. Stop accepting new connections
  2. Complete in-flight requests
  3. Disconnect all backends
  4. Exit the process

GET /registry/search

Search external MCP server registries (Glama, Smithery, etc.) for available servers.

Query Parameters

ParamTypeDefaultDescription
qstringrequiredSearch query -- alphanumeric and spaces only
limitint20Maximum results to return (max 100)
registrystring--Filter to a specific registry by name (optional)

Response

{
  "servers": [
    {
      "name": "brave-search",
      "description": "Web search via Brave Search API",
      "transport": "stdio",
      "url": "",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-brave-search"],
      "version": "1.0.0",
      "categories": ["search", "web"]
    }
  ],
  "registry": "glama",
  "total": 1
}
FieldTypeDescription
serversarrayList of matching registry entries
registrystringName of the registry that returned results
totalintTotal number of results returned

RegistryServerEntry fields:

FieldTypeDescription
namestringServer identifier
descriptionstringServer description
transportstringTransport type (stdio, sse, etc.)
urlstringServer URL (for HTTP transports)
commandstringLaunch command (for stdio)
argsarrayCommand arguments
versionstringServer version
categoriesarrayCategory tags

Returns 400 if q is missing or invalid. Returns 404 if no registries are configured or the specified registry is not found.


GET /skills

List all installed skills and their enabled/disabled status.

Response

{
  "skills": [
    {
      "name": "my-skill",
      "version": "1.0.0",
      "description": "A skill that provides extra tools",
      "status": "enabled",
      "tools": 3,
      "workflows": 1,
      "author": "Alice"
    }
  ]
}
FieldTypeDescription
namestringSkill identifier
versionstringSkill version
descriptionstringSkill description
statusstring"enabled" or "disabled"
toolsintNumber of tools provided by the skill
workflowsintNumber of workflows provided by the skill
authorstringSkill author

Returns 503 if the skill manager is not initialized.


POST /skills/{name}/enable

Enable an installed skill by name.

Path Parameters

ParamTypeDescription
namestringSkill name

Response

{
  "name": "my-skill",
  "action": "enabled",
  "ok": true
}
FieldTypeDescription
namestringSkill name
actionstringAction performed ("enabled")
okbooleanWhether the action succeeded

Returns 404 if the skill is not found. Returns 503 if the skill manager is not initialized.


POST /skills/{name}/disable

Disable an installed skill by name.

Path Parameters

ParamTypeDescription
namestringSkill name

Response

{
  "name": "my-skill",
  "action": "disabled",
  "ok": true
}
FieldTypeDescription
namestringSkill name
actionstringAction performed ("disabled")
okbooleanWhether the action succeeded

Returns 404 if the skill is not found. Returns 503 if the skill manager is not initialized.


POST /tools/call

Proxy an MCP tools/call request to the correct backend. Routes the call using the internal capability registry and returns the backend's response.

Request Body

{
  "tool": "search_web",
  "arguments": { "query": "MCP servers" }
}
FieldTypeDescription
toolstringRequired. Tool name as exposed by the gateway
argumentsobjectRequired. Tool arguments -- use {} for no args

Response

{
  "tool": "search_web",
  "backend": "browser-server",
  "content": [
    { "type": "text", "text": "Search results..." }
  ],
  "isError": false
}
FieldTypeDescription
toolstringTool name that was called
backendstringBackend that handled the call
contentarrayResult content items (type, text)
isErrorbooleanWhether the tool returned an error result

Returns 404 if the tool is not found. Returns 503 if the backend session is unavailable. Returns 502 if the call fails.


POST /resources/read

Proxy an MCP resources/read request to the correct backend. Routes by URI using the internal capability registry.

Request Body

{
  "uri": "docs://readme"
}
FieldTypeDescription
uristringRequired. Resource URI as exposed by the gateway

Response

{
  "uri": "docs://readme",
  "backend": "docs-server",
  "contents": [
    {
      "uri": "docs://readme",
      "text": "# Readme\n...",
      "mimeType": "text/markdown"
    }
  ]
}
FieldTypeDescription
uristringResource URI that was read
backendstringBackend that handled the read
contentsarrayResource content items (uri, text, mimeType)

Returns 404 if the resource is not found. Returns 503 if the backend is unavailable. Returns 502 if the read fails.