# MCP (Model Context Protocol) server

Glances can expose its system monitoring data through a Model Context Protocol (MCP) server, allowing AI assistants (Claude, Cursor, VS Code Copilot, …) to query real-time metrics and generate structured analyses directly from their chat interface.

The MCP server is mounted alongside the standard RESTful API when the web server is started with the `--enable-mcp` flag. It uses Server-Sent Events (SSE) as its transport layer, which means any MCP-compatible client that supports SSE can connect to it.

## Requirements

The `mcp` Python package must be installed:

    pip install 'glances[mcp]'

## Start the MCP server

Add `--enable-mcp` to any Glances web-server command:

    glances -w --enable-mcp

The MCP server is then reachable at `http://localhost:61208/mcp`.

The SSE endpoint used by MCP clients is:

    http://localhost:61208/mcp/sse

To change the mount path (default: `/mcp`):

    glances -w --enable-mcp --mcp-path /monitoring/mcp

## Authentication

The MCP endpoint inherits the authentication policy of the web server. When Glances is started with `--password`, every MCP request must carry valid credentials — either HTTP Basic Auth or a JWT Bearer token (see Restful/JSON API documentation for how to obtain a JWT token).

When no password is configured the MCP endpoint is open.

## Resources

MCP resources are read-only data sources that a client can list and read.

### Static resources

URI | Description
--- | ---
`glances://plugins` | JSON list of all active plugin names
`glances://stats` | JSON object of all plugins’ current statistics
`glances://limits` | JSON object of alert thresholds for all plugins

### Resource templates (parameterised)

URI template | Description
--- | ---
`glances://stats/{plugin}` | Current statistics for one plugin
`glances://stats/{plugin}/history` | Historical time-series for one plugin
`glances://limits/{plugin}` | Alert thresholds for one plugin

Replace `{plugin}` with any name returned by `glances://plugins` (e.g. `cpu`, `mem`, `network`, `processlist`, …).

## Prompts

MCP prompts are pre-built analysis templates that embed live Glances data into a system prompt ready to be sent to an LLM.

Prompt name | Description | Parameters
--- | --- | ---
`system_health_summary` | Overall health report: CPU, memory, swap, load, filesystems, network | (none)
`alert_analysis` | Analysis of active alerts with remediation steps | `level` (`warning` / `critical` / `all`)
`top_processes_report` | Report on the most CPU-intensive processes | `nb` (integer, default `10`)
`storage_health` | Disk usage and I/O statistics analysis | (none)

## Connect an MCP client

### Claude Desktop

Configure Glances MCP from Claude command line:

    claude mcp add --transport sse glances http://localhost:61208/mcp/sse

Or add the following entry to your `claude_desktop_config.json` (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS, `%APPDATA%\Claude\claude_desktop_config.json` on Windows):

    {
      "mcpServers": {
        "glances": {
          "url": "http://localhost:61208/mcp/sse"
        }
      }
    }

For a password-protected server, use the `headers` field:

    {
      "mcpServers": {
        "glances": {
          "url": "http://localhost:61208/mcp/sse",
          "headers": {
            "Authorization": "Basic <base64(user:password)>"
          }
        }
      }
    }

### Python MCP client (programmatic access)

    import asyncio
    from mcp.client.sse import sse_client
    from mcp import ClientSession

    async def main():
        async with sse_client("http://localhost:61208/mcp/sse") as (read, write):
            async with ClientSession(read, write) as session:
                await session.initialize()

                # List available resources
                resources = await session.list_resources()
                print([str(r.uri) for r in resources.resources])

                # Read CPU stats
                from pydantic import AnyUrl
                result = await session.read_resource(AnyUrl("glances://stats/cpu"))
                print(result.contents[0].text)

                # Run a health-summary prompt
                prompt = await session.get_prompt("system_health_summary")
                print(prompt.messages[0].content.text[:200])

    asyncio.run(main())

See also

Restful/JSON API documentation — RESTful/JSON API documentation

Command Reference — full command-line reference