Grafana Loki MCP Repository
A FastMCP server that allows querying Loki logs from Grafana.
{
"mcpServers": {
"loki": {
"command": "uvx",
"args": [
"grafana-loki-mcp",
"-u",
"GRAFANA_URL",
"-k",
"GRAFANA_API_KEY"
]
}
}
}
GRAFANA_URL
: URL of your Grafana instanceGRAFANA_API_KEY
: Grafana API key with appropriate permissionspip install grafana-loki-mcp
# Install uv
pip install uv
# Create and activate virtual environment
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
uv pip install -e ".[dev]"
Set the following environment variables:
GRAFANA_URL
: URL of your Grafana instanceGRAFANA_API_KEY
: Grafana API key with appropriate permissionsYou can also provide these values as command line arguments:
grafana-loki-mcp -u https://your-grafana-instance.com -k your-api-key
Additional options:
--transport
: Transport protocol to use (stdio
or sse
, default: stdio
)# Using environment variables
export GRAFANA_URL=https://your-grafana-instance.com
export GRAFANA_API_KEY=your-api-key
grafana-loki-mcp
# Using command line arguments
grafana-loki-mcp -u https://your-grafana-instance.com -k your-api-key
# Using SSE transport
grafana-loki-mcp --transport sse
Run the test suite:
pytest
Run with coverage:
pytest --cov=. --cov-report=term
# Run ruff linter
ruff check .
# Run black formatter
black .
# Run type checking
mypy .
Query Loki logs through Grafana.
Parameters:
query
: Loki query stringstart
: Start time (ISO format, Unix timestamp, or Grafana-style relative time like 'now-1h', default: 1 hour ago)end
: End time (ISO format, Unix timestamp, or Grafana-style relative time like 'now', default: now)limit
: Maximum number of log lines to return (default: 100)direction
: Query direction ('forward' or 'backward', default: 'backward')max_per_line
: Maximum characters per log line (0 for unlimited, default: 100)Get all label names from Loki.
Get values for a specific label from Loki.
Parameters:
label
: Label nameFormat Loki query results in a more readable format.
Parameters:
results
: Loki query results from query_lokiformat_type
: Output format ('text', 'json', or 'markdown', default: 'text')max_per_line
: Maximum characters per log line (0 for unlimited, default: 0)# Example client code
from mcp.client import Client
async with Client() as client:
# Query Loki logs with max_per_line limit
results = await client.call_tool(
"query_loki",
{
"query": '{app="my-app"} |= "error"',
"limit": 50,
"max_per_line": 100, # Limit log lines to 100 characters
"start": "now-6h", # Grafana-style relative time: 6 hours ago
"end": "now" # Current time
}
)
# Format the results
formatted = await client.call_tool(
"format_loki_results",
{
"results": results,
"format_type": "markdown",
"max_per_line": 100 # Can also limit at formatting time
}
)
print(formatted)
This project is licensed under the MIT License - see the LICENSE file for details.