日志查询服务

MCP Loki是一个用于查询Grafana Loki日志的服务,支持通过Model Context Protocol使LLMs能够搜索和分析日志。

  • by lexfrei
  • Go
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 lexfrei/mcp-loki

使用说明

MCP洛基

用于查询Grafana Loki日志的MCP服务器。使LLM能够通过模型上下文协议搜索和分析日志。

特性

  • LogQL查询 --执行具有灵活时间范围的范围查询
  • 标签发现 --列出用于构建查询的标签及其值
  • 系列探索 --查找与标签选择器匹配的日志流
  • 索引统计 --获取基数和大小指标
  • 提示模板 --用于常见日志分析任务的现成LogQL模式
  • 多种身份验证方法 --基本身份验证、承载令牌、多租户(X-Scope-ArgID)
  • 多拱形图像 — linux/amd64 和 linux/arm64
  • 签名图像 --通过联合签名无密钥签名进行验证

快速开始

容器(Podman/Docker)

添加到MCP客户端配置中:

{
  "mcpServers": {
    "loki": {
      "command": "podman",
      "args": [
        "run", "--rm", "-i",
        "-e", "LOKI_URL=http://loki:3100",
        "ghcr.io/lexfrei/mcp-loki:latest"
      ]
    }
  }
}

去安装

go install github.com/lexfrei/mcp-loki/cmd/mcp-loki@latest

MCP客户端配置:

{
  "mcpServers": {
    "loki": {
      "command": "mcp-loki",
      "env": {
        "LOKI_URL": "http://loki:3100"
      }
    }
  }
}

配置

所有配置都是通过环境变量完成的:

变量 必填 默认 描述
LOKI_URL 没有 http://localhost:3100 洛基服务器URL
LOKI_USERNAME 否 -- 基本身份验证用户名
LOKI_PASSWORD 否 -- 基本身份验证密码
LOKI_TOKEN 无 -- 承载令牌(基本身份验证的替代方案)
LOKI_ORG_ID 多租户Loki没有 -- X-Scope-ArgID标头
MCP_HTTP_PORT 否 -- 在此端口上启用HTTP SSE传输

身份验证示例

无身份验证(本地Loki):

{
  "command": "podman",
  "args": [
    "run", "--rm", "-i",
    "-e", "LOKI_URL=http://loki:3100",
    "ghcr.io/lexfrei/mcp-loki:latest"
  ]
}

基本身份验证:

{
  "command": "podman",
  "args": [
    "run", "--rm", "-i",
    "-e", "LOKI_URL=https://loki.example.com",
    "-e", "LOKI_USERNAME=admin",
    "-e", "LOKI_PASSWORD=secret",
    "ghcr.io/lexfrei/mcp-loki:latest"
  ]
}

承载令牌(Grafana Cloud):

{
  "command": "podman",
  "args": [
    "run", "--rm", "-i",
    "-e", "LOKI_URL=https://logs-prod-us-central1.grafana.net",
    "-e", "LOKI_TOKEN=glc_xxx",
    "-e", "LOKI_ORG_ID=123456",
    "ghcr.io/lexfrei/mcp-loki:latest"
  ]
}

可用工具

loki_query

对Loki执行LogQL查询。

参数 类型 必填 说明
query string 是 LogQL查询字符串
start string 否 开始时间(RFC3339,相对类似 1h,或 now)
end string 否 结束时间(RFC3339,相对或 now)
limit int 否 返回的最大条目数(默认值:100)
direction string 否 forward 或 backward (默认值: backward)

例子:

Query the last hour of nginx error logs:
- query: {app="nginx"} |= "error"
- start: 1h
- limit: 50

loki标签

获取特定标签的标签名称或值。

参数 类型 必填 说明
name string 否 要获取值的标签名称(对所有标签省略)
start string 否 开始时间
end string 否 结束时间

例子:

Get all label names: (no parameters)
Get values for "app" label: name=app

loki系列

查找与标签选择器匹配的日志流。

参数 类型 必填 说明
match []string Yes 标签选择器,例如。, {app="nginx"}
start string 否 开始时间
end string 否 结束时间

例子:

Find all nginx streams: match=["{app=\"nginx\"}"]

loki_stats

获取查询的索引统计信息。

参数 类型 必填 说明
query string 是 LogQL选择器
start string 否 开始时间
end string 否 结束时间

例子:

Get stats for nginx logs: query={app="nginx"}

lokiready

检查Loki是否已准备好接受请求。无需参数。

loki_config

获取YAML格式的Loki服务器配置。无需参数。

可用提示

错误日志

查找特定应用程序的错误日志。

参数 必需 默认值 描述
app 是 -- 要搜索错误的应用程序名称
timerange 没有 1h 时间范围(例如。 1h, 30m, 7d)

rate_query

计算与选择器匹配的日志行的比率。

参数 必需 默认值 描述
selector 是 -- LogQL流选择器(例如。 {app="nginx"})
interval 没有 5m 速率间隔(例如。 5m, 1h)

top_label_values

按日志量查找标签的前N个值。

参数 必需 默认值 描述
selector 是 -- LogQL流选择器(例如。 {app="nginx"})
label 是 -- 要分组的标签名称
n 没有 10 要返回的顶级值的数量
interval 没有 5m 速率间隔(例如。 5m, 1h)

时间格式

所有时间参数均接受:

  • RFC3339: 2024-01-15T10:30:00Z
  • 相对的: 30s, 5m, 1h, 7d (秒、分钟、小时、天前)
  • 关键词: now

验证

容器图像使用共同签名无密钥签名进行签名:

cosign verify ghcr.io/lexfrei/mcp-loki:latest \
  --certificate-identity-regexp=https://github.com/lexfrei/mcp-loki \
  --certificate-oidc-issuer=https://token.actions.githubusercontent.com

许可证

BSD-3条款