mcpField
M
MCP Server for Perses

MCP Server for Perses

Local
github.com/persesData & Analytics32Updated 3w ago

About MCP Server for Perses

MCP Server for Perses is a local MCP server that lets LLM hosts such as OpenCode, Claude Desktop, VS Code and Cursor interact with a Perses application in a standardized way. It is aimed at teams managing dashboards and datasources in Perses.

Key features

  1. 01Supports stdio and Streamable HTTP transports
  2. 02Manages projects, dashboards and ephemeral dashboards
  3. 03Manages global and project datasources with proxied queries
  4. 04Read-only mode disables write operations
  5. 05Basic and bearer token authentication

Use cases

  1. 01Querying and editing Perses dashboards from an AI client or editor
  2. 02Sending queries to datasource backends through the Perses proxy
  3. 03Migrating Grafana dashboards to Perses

MCP support

This project is an MCP server that exposes tools for managing Perses projects, dashboards, datasources and roles to MCP clients. Individual resource groups can be selected through the resources configuration field.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

No install method listed yet

We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.

Repository

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README
Perses

MCP Server for Perses

Overview

The Perses MCP Server is a local Model Context Protocol (MCP) Server that enables the LLM hosts (OpenCode, Claude Desktop, VS Code, Cursor) to interact with the Perses Application in a standardized way.

Demo

OpenCode

https://github.com/user-attachments/assets/03706209-abef-47f2-8067-67c723537750

Getting Started

Prerequisites
  • A running Perses instance
  • The MCP server binary — download from the releases page, extract it, and make it executable:
    chmod +x /path/to/perses-mcp-server
    
1. Create a configuration file

Create a YAML configuration file (e.g., perses-mcp-config.yaml). See Authentication for details on each auth method.

# MCP transport mode: "stdio" or "http"
transport: stdio

# Address to listen on for HTTP transport (e.g., ":8000")
listen_address: ":8000"

# Restrict the server to read-only operations
read_only: false

# Comma-separated list of resources to register (if empty, all resources are registered)
resources: ""

# Perses server connection configuration
perses_server:
  url: "http://localhost:8080"

  # Authentication (choose one method):
  # It is recommended to use environment variables for sensitive values.
  # Refer the "Environment Variables" section.

  # Option 1: Basic authentication (login/password)
  # native_auth:
  #   login: "admin"
  #   password: "password"

  # Option 2: Bearer token (e.g., from `percli whoami --show-token`)
  # authorization:
  #   type: Bearer
  #   credentials: "<YOUR_TOKEN>"
  #   # credentials_file: "/path/to/token/file"  # Alternative: read token from file

  # TLS configuration (optional)
  # tls_config:
  #   ca_file: "/path/to/ca.pem"
  #   insecure_skip_verify: false

Note

Configuration values are resolved in this order (later wins): built-in defaults < YAML configuration file < environment variables.

Available Resources

The resources field accepts the following resource names (case-insensitive, comma-separated):

ResourceDescription
dashboardDashboard management tools
ephemeraldashboardEphemeral dashboard management tools
projectProject management tools
datasourceProject-level datasource tools
globaldatasourceGlobal datasource tools
roleProject-level role tools
globalroleGlobal role tools
rolebindingProject-level role binding tools
globalrolebindingGlobal role binding tools
variableProject-level variable tools
globalvariableGlobal variable tools
pluginPlugin tools
migrateGrafana → Perses dashboard migration tool
Environment Variables

Configuration values in the YAML file can be overridden using environment variables with the PERMCP_ prefix. The variable name is derived by uppercasing each YAML key and joining nested keys with _.

For example, the YAML path perses_server.native_auth.password becomes PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD.

This is particularly useful for sensitive values like passwords and tokens that should not be stored in the config file.

Environment VariableConfig PathDescription
PERMCP_TRANSPORTtransportTransport mode
PERMCP_LISTEN_ADDRESSlisten_addressHTTP listen address
PERMCP_READ_ONLYread_onlyRead-only mode
PERMCP_RESOURCESresourcesResources to register
PERMCP_PERSES_SERVER_URLperses_server.urlPerses server URL
PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGINperses_server.native_auth.loginBasic auth username
PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORDperses_server.native_auth.passwordBasic auth password
PERMCP_PERSES_SERVER_AUTHORIZATION_TYPEperses_server.authorization.typeAuthorization type (e.g., Bearer)
PERMCP_PERSES_SERVER_AUTHORIZATION_CREDENTIALSperses_server.authorization.credentialsAuthorization token

For more details about how environment variables override the configuration file, see the Perses Configuration docs.

2. Add the MCP server to your client

Standard config works in most clients:

{
  "mcpServers": {
    "perses-mcp": {
      "command": "<ABSOLUTE_PATH_TO_PERSES_MCP_BINARY>",
      "args": [
        "--config",
        "<ABSOLUTE_PATH_TO_CONFIG_YAML>"
      ]
    }
  }
}

Tip

Pass sensitive auth values as environment variables instead of storing them in the config file:

Basic auth: PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN and PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD

Bearer token: PERMCP_PERSES_SERVER_AUTHORIZATION_CREDENTIALS

See Environment Variables for the full list.

OpenCode

Add the following to your OpenCode config under mcp. See OpenCode MCP documentation for more details.

{
  "mcp": {
    "perses": {
      "command": [
        "<ABSOLUTE_PATH_TO_PERSES_MCP_BINARY>",
        "--config",
        "<ABSOLUTE_PATH_TO_CONFIG_YAML>"
      ],
      "environment": {
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN": "{env:PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN}",
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD": "{env:PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD}"
      },
      "enabled": true,
      "type": "local"
    }
  }
}
Claude Code

Use the Claude Code CLI to add the Perses MCP server. See Claude Code MCP documentation for more details.

claude mcp add --transport stdio \
  --env PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN=<YOUR_LOGIN> \
  --env PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD=<YOUR_PASSWORD> \
  perses-mcp -- <ABSOLUTE_PATH_TO_PERSES_MCP_BINARY> --config <ABSOLUTE_PATH_TO_CONFIG_YAML>
Claude Desktop

Create or edit the Claude Desktop configuration file at:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

You can also access this file via Claude > Settings > Developer > Edit Config.

{
  "mcpServers": {
    "perses-mcp": {
      "command": "<ABSOLUTE_PATH_TO_PERSES_MCP_BINARY>",
      "args": [
        "--config",
        "<ABSOLUTE_PATH_TO_CONFIG_YAML>"
      ],
      "env": {
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN": "<YOUR_LOGIN>",
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD": "<YOUR_PASSWORD>"
      }
    }
  }
}

Restart Claude Desktop for the changes to take effect.

VS Code

Add the following to your VS Code MCP config file. See VS Code MCP documentation for more details.

{
  "servers": {
    "perses-mcp": {
      "command": "<ABSOLUTE_PATH_TO_PERSES_MCP_BINARY>",
      "args": [
        "--config",
        "<ABSOLUTE_PATH_TO_CONFIG_YAML>"
      ],
      "env": {
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_LOGIN": "<YOUR_LOGIN>",
        "PERMCP_PERSES_SERVER_NATIVE_AUTH_PASSWORD": "<YOUR_PASSWORD>"
      }
    }
  }
}

Streamable HTTP Mode

The Streamable HTTP mode allows the MCP server to communicate with LLM hosts over HTTP. This is useful for remote hosting or allowing multiple clients to connect to the same server instance.

For more details, see the MCP Protocol Specification docs.

Set transport: http in your configuration file:

transport: http
listen_address: ":8000"
perses_server:
  url: "http://localhost:8080"
  native_auth:
    login: "admin"
    password: "password"

Then point your MCP client to the HTTP endpoint:

VS Code
{
  "servers": {
    "perses-http": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Authentication

There are two ways to authenticate the MCP server with your Perses instance. Add the relevant block under perses_server in your configuration file.

Basic Authentication (Username/Password)

Use your Perses username and password directly:

native_auth:
  login: "your-username"
  password: "your-password"
Bearer Token (via percli)
  1. Install percli and login to your Perses server:
percli login <PERSES_SERVER_URL>

For example, percli login https://demo.perses.dev

  1. After successful login, retrieve your token:
percli whoami --show-token
  1. Use the token in your configuration file:
authorization:
  type: Bearer
  credentials: "<YOUR_TOKEN>"

Warning

The bearer token automatically expires based on the access_token_ttl setting (default: 15 minutes) of the Perses server. You can change this in the Perses app configuration.

Command-Line Usage

perses-mcp-server --config /path/to/config.yaml
FlagDefaultDescription
--config""Path to the YAML configuration file
-log.levelinfoLog level (options: panic, fatal, error, warning, info, debug, trace)
-log.formattextLog format (options: text, json)
-log.method-tracefalseInclude the calling method as a field in the log

Tools

Note


When running in read-only mode (read_only: true in config), only tools that retrieve information are available. All write operations (create, update, delete) are disabled in read-only mode.

Projects
ToolDescriptionRequired Parameters
perses_list_projectsList all projects-
perses_get_project_by_nameGet a project by namename
perses_create_projectCreate a new projectproject
perses_update_projectUpdate an existing projectname
perses_delete_projectDelete a projectname
Dashboards
ToolDescriptionRequired Parameters
perses_list_dashboardsList all dashboards for a specific projectproject
perses_get_dashboard_by_nameGet a dashboard by name for a projectproject, name
perses_create_dashboardCreate a dashboard given a project and dashboard configurationproject, dashboard
perses_update_dashboardUpdate an existing dashboard in a projectproject, dashboard
perses_delete_dashboardDelete a dashboard from a projectproject, name

For dashboard configuration, see Perses Dashboards

Ephemeral Dashboards

Ephemeral dashboards are temporary dashboards with a TTL (time-to-live). They are automatically cleaned up after expiry.

ToolDescriptionRequired Parameters
perses_list_ephemeral_dashboardsList all ephemeral dashboards for a specific projectproject
perses_get_ephemeral_dashboard_by_nameGet an ephemeral dashboard by name for a projectproject, name
perses_create_ephemeral_dashboardCreate an ephemeral dashboard given a project and dashboard configurationproject, dashboard
perses_update_ephemeral_dashboardUpdate an existing ephemeral dashboard in a projectproject, dashboard
perses_delete_ephemeral_dashboardDelete an ephemeral dashboard from a projectproject, name

For ephemeral dashboard configuration, see Perses EphemeralDashboard

Datasources
ToolDescriptionRequired ParametersOptional Parameters
perses_list_global_datasourcesList all global datasources--
perses_get_global_datasource_by_nameGet a global datasource by namename-
perses_query_global_datasourceSend an HTTP request to a global datasource backend through the Perses proxydatasource_namemethod, path, query_params, body, headers
perses_create_global_datasourceCreate a new global datasourcename, type, urldisplay_name, proxy_type
perses_update_global_datasourceUpdate an existing global datasourcename, type, urldisplay_name, proxy_type
perses_delete_global_datasourceDelete a global datasourcename-
perses_list_project_datasourcesList all datasources for a specific projectproject-
perses_get_project_datasource_by_nameGet a project datasource by nameproject, name-
perses_query_project_datasourceSend an HTTP request to a project datasource backend through the Perses proxyproject, datasource_namemethod, path, query_params, body, headers
perses_create_project_datasourceCreate a new datasource in a projectproject, datasource-
perses_update_project_datasourceUpdate an existing datasource in a projectproject, datasource-
perses_delete_project_datasourceDelete a datasource from a projectproject, name-
Querying Datasources

perses_query_project_datasource and perses_query_global_datasource forward HTTP requests to a configured datasource backend through the Perses proxy. This means:

  • Credentials are automatically injected — datasource secrets configured in Perses (Bearer tokens, Basic auth, OAuth) are applied server-side; they are never exposed to the tool caller.
  • Allowed endpoints are enforced — only endpoints permitted by the datasource's allowedEndpoints configuration are reachable.
  • method defaults to GET. Only GET and POST are accepted.
  • path is the datasource-relative endpoint path, e.g. /api/v1/query_range for Prometheus or /loki/api/v1/query_range for Loki.
  • query_params is an object of key/value string pairs appended as query string parameters.
  • body is a raw string body (JSON or application/x-www-form-urlencoded). Content-Type defaults to application/json when a body is provided.
  • headers allows passing additional request headers. The Authorization header is always blocked in tool input; use Perses secrets for authentication.
  • Response bodies are capped at 1 MiB to avoid exceeding LLM context limits.

Example — Prometheus instant query via a global datasource:

{
  "datasource_name": "my-prometheus",
  "method": "POST",
  "path": "/api/v1/query",
  "query_params": {
    "query": "up",
    "time": "2024-01-01T00:00:00Z"
  }
}

Example — Prometheus range query via a project datasource:

{
  "project": "my-project",
  "datasource_name": "my-prometheus",
  "method": "POST",
  "path": "/api/v1/query_range",
  "query_params": {
    "query": "rate(http_requests_total[5m])",
    "start": "2024-01-01T00:00:00Z",
    "end": "2024-01-01T01:00:00Z",
    "step": "60"
  }
}
Roles
ToolDescriptionRequired Parameters
perses_list_global_rolesList all global roles-
perses_get_global_role_by_nameGet a global role by namename
perses_create_global_roleCreate a new global rolename, actions, scopes
perses_update_global_roleUpdate an existing global rolename, actions, scopes
perses_delete_global_roleDelete a global rolename
perses_list_global_role_bindingsList all global role bindings-
perses_get_global_role_binding_by_nameGet a global role binding by namename
perses_create_global_role_bindingCreate a new global role bindingname, role, subjects
perses_update_global_role_bindingUpdate an existing global role bindingname, role, subjects
perses_delete_global_role_bindingDelete a global role bindingname
perses_list_project_rolesList all roles for a specific projectproject
perses_get_project_role_by_nameGet a project role by nameproject, name
perses_create_project_roleCreate a new project roleproject, name, actions, scopes
perses_update_project_roleUpdate an existing project roleproject, name, actions, scopes
perses_delete_project_roleDelete a project roleproject, name
perses_list_project_role_bindingsList all role bindings for a projectproject
perses_get_project_role_binding_by_nameGet a project role binding by nameproject, name
perses_create_project_role_bindingCreate a new project role bindingproject, name, role, subjects
perses_update_project_role_bindingUpdate an existing project role bindingproject, name, role, subjects
perses_delete_project_role_bindingDelete a project role bindingproject, name
Plugins
ToolDescriptionRequired Parameters
perses_list_pluginsList all plugins-
Variables
ToolDescriptionRequired Parameters
perses_list_global_variablesList all global variables-
perses_get_global_variable_by_nameGet a global variable by namename
perses_create_global_variableCreate a new global variablename, value
perses_update_global_variableUpdate an existing global variablename, value
perses_delete_global_variableDelete a global variablename
perses_list_project_variablesList all variables for a specific projectproject
perses_get_project_variable_by_nameGet a project variable by nameproject, name
perses_create_project_variableCreate a project level variablename, project
perses_update_project_variableUpdate an existing project variableproject, name, value
perses_delete_project_variableDelete a project variableproject, name

Local Development

Build from Source

If you want to build the MCP server from source code (for development or contribution purposes), run the following command from the source code root directory:

make build

This creates a bin directory containing the binary named mcp-server. Copy the absolute path to the binary to use in your MCP server configuration.

License

The code is licensed under an Apache 2.0 license.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.