mirror of
https://github.com/nicolargo/glances.git
synced 2026-04-17 12:30:11 -04:00
182 lines
6.8 KiB
ReStructuredText
182 lines
6.8 KiB
ReStructuredText
.. _api_mcp:
|
|
|
|
MCP (Model Context Protocol) server
|
|
=====================================
|
|
|
|
Glances can expose its system monitoring data through a
|
|
`Model Context Protocol <https://modelcontextprotocol.io>`_ (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:
|
|
|
|
.. code-block:: bash
|
|
|
|
pip install 'glances[mcp]'
|
|
|
|
Start the MCP server
|
|
--------------------
|
|
|
|
Add ``--enable-mcp`` to any Glances web-server command:
|
|
|
|
.. code-block:: bash
|
|
|
|
glances -w --enable-mcp
|
|
|
|
The MCP server is then reachable at ``http://localhost:61208/mcp``.
|
|
|
|
The SSE endpoint used by MCP clients is:
|
|
|
|
.. code-block:: text
|
|
|
|
http://localhost:61208/mcp/sse
|
|
|
|
To change the mount path (default: ``/mcp``):
|
|
|
|
.. code-block:: bash
|
|
|
|
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 :ref:`api_restful` 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, | *(none)* |
|
|
| | load, filesystems, network | |
|
|
+-----------------------------+-----------------------------------------------------+-------------------+
|
|
| ``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
|
|
~~~~~~~~~~~~~~
|
|
|
|
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):
|
|
|
|
.. code-block:: json
|
|
|
|
{
|
|
"mcpServers": {
|
|
"glances": {
|
|
"url": "http://localhost:61208/mcp/sse"
|
|
}
|
|
}
|
|
}
|
|
|
|
For a password-protected server, use the ``headers`` field:
|
|
|
|
.. code-block:: json
|
|
|
|
{
|
|
"mcpServers": {
|
|
"glances": {
|
|
"url": "http://localhost:61208/mcp/sse",
|
|
"headers": {
|
|
"Authorization": "Basic <base64(user:password)>"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Python MCP client (programmatic access)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
.. code-block:: python
|
|
|
|
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())
|
|
|
|
.. seealso::
|
|
|
|
:ref:`api_restful` — RESTful/JSON API documentation
|
|
|
|
:ref:`cmds` — full command-line reference
|