mcpField
L
Loki MCP Server

Loki MCP Server

本地服务
github.com数据与分析04 周前更新

关于 Loki MCP Server

Loki MCP Server 是用于查询 Grafana Loki 日志的本地只读 MCP 服务,面向调查日志数据的 Agent 和运维人员。它提供标签发现、有界 LogQL 查询与计数,以及本地文件导出。

主要功能

  1. 01发现标签及流标签组合
  2. 02执行有界 LogQL 查询
  3. 03统计匹配行数和时间分桶
  4. 04将日志导出到本地文件
  5. 05配置连接级限制和提示

适用场景

  1. 01查询前查找相关标签
  2. 02检查较新或较早的错误日志页面
  3. 03统计一段时间内的日志量
  4. 04保存匹配的日志行以供分析

MCP 相关

通过 stdio 为已配置的 Loki 连接提供五种文本工具:连接列表、发现、查询、计数和本地导出。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"igorolv-loki": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/igorolv/loki-mcp-server:0.1.0"
]
}
}
}
启动命令docker run -i --rm ghcr.io/igorolv/loki-mcp-server:0.1.0

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/igorolv/loki-mcp-server:0.1.0

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Loki MCP Server

build Release License Java 21 MCP Glama score Listed on mcpservers.org

一个本地 stdio MCP 服务,可让 Agent 读取 Grafana Loki。它提供五种文本工具,支持 Loki 2.6.1 和 3.x。Loki 本身只读;唯一的写入操作是将 exportLogs 保存到本地文件。

工具用途
listConnections显示已配置的环境、运维提示和生效的工具限制
discoverLogs列出标签名称、某个标签的值、匹配的流标签集,或这些标签集中的值
queryLogs以紧凑文本形式读取 LogQL 日志查询的最新或最早的有界分页;raw=true 可预览返回的日志行和流标签
countLogs统计 Loki 上的匹配行数,可按标签、与时钟对齐的时间桶或两者统计
exportLogs将匹配的日志行保存到本地文件,可保存原始内容或使用模板渲染

每个数据工具都需要显式指定连接。queryLogs、countLogs 和 exportLogs 需要 LogQL 日志查询,例如 {app="backend"} |= "ERROR"。使用 discoverLogs 查找标签名称、标签值,以及流标签集中的实际组合。服务只会为 countLogs 构建 count_over_time 表达式;它不会推断筛选条件或解释原因。工具响应是易读文本,不包含输出架构。

构建和运行

需要 JDK 21 或更高版本;项目使用 Java 21 工具链和 Gradle 包装器。

.\gradlew.bat bootJar
java -jar build/libs/loki-mcp-server.jar

在 Linux/macOS 上使用 ./gradlew。进程会等待从 stdin 输入 MCP JSON-RPC。stdout 专用于 JSON-RPC;诊断信息会写入 stderr 和 ~/.loki-mcp-server/logs/loki-mcp-server.log。

每个版本都附带预构建的 loki-mcp-server.jar,因此构建并非必需。

对于 Claude Code,注册该 jar 只需一条命令:

claude mcp add --scope user loki -- java -jar /path/to/loki-mcp-server.jar
Docker

每次发布版本时,都会将镜像发布到 GHCR。将存放 connections.json 的目录挂载到 /data;服务也会在此处写入日志和默认导出文件:

docker run -i --rm -v ~/.loki-mcp-server:/data ghcr.io/igorolv/loki-mcp-server:latest

MCP 客户端应启动的也是这条命令;-i 会保持 stdin 打开,以供 stdio 传输使用。connections.json 中的 Loki URL 必须能从容器内部访问:请使用 Loki 主机名而不是 localhost,或者在 Linux 上添加 --network host。位于 /data 之外的 exportLogs 目录是容器内的路径,因此也需要挂载。若要在本地构建镜像:docker build -t loki-mcp-server .

连接

服务会读取 ~/.loki-mcp-server/connections.json,或 LOKI_MCP_CONNECTIONS_FILE 中指定的路径。最精简的文件如下:

{
  "connections": {
    "dev": {
      "description": "Development",
      "hint": "Start with {app=\"backend\"}; inspect app values with discoverLogs.",
      "url": "http://localhost:3100",
      "timezone": "Europe/Moscow",
      "serviceLabels": ["app", "container"]
    }
  }
}

完整示例使用环境变量配置非本地 URL。hint 为模型提供 stand 专用选择器和字段建议。serviceLabels 指定用于在紧凑行中显示服务的标签。可选的 formatFile 用于指定一个包含 JSON 配置文件、纯文本行模式和可选 framePattern 的 JSON 文件;请参阅 log-formats.json。可选的 exportFormat 用于设置 exportLogs 的默认模板,前提是工具调用未提供 format。连接文件可以设置 exportRoots 以限制导出目标位置,并设置每个连接的限制。身份验证和租户标头按连接配置;工具响应或诊断信息中不会出现 URL 和凭据。完整格式请参阅 docs/connections.md。

服务会在启动时严格加载配置,不会探测 Loki。字段未知、键重复、环境变量缺失或格式文件无效,都会导致启动失败并显示安全的配置错误。配置变更需要重启。

使用工具

  1. 调用 listConnections,选择一个环境,并根据其显示的时间窗口、queryLogs 行数上限和请求超时来规划调用。
  2. 调用 discoverLogs(connection="dev") 获取标签名称,然后调用 discoverLogs(connection="dev", label="app") 获取值。需要查看组合时,使用 discoverLogs(connection="dev", match="{app="backend"}") 获取完整的流标签集合,或添加 label="namespace" 获取这些集合中的命名空间值。保持 match 和时间窗口范围较窄;这些是流标签,而不是日志行数。在日志较少的环境中,可以适当扩大时间窗口。
  3. 使用 LogQL 日志查询,通过 countLogs 检查日志量,通过 queryLogs 读取日志行。例如,{app="backend"} |= "ERROR";groupBy="time", step="1d" 会生成按 UTC 对齐的 24 小时分桶,groupBy="app,time" 会按应用和时间统计数量。命名的 | regexp 捕获可以提供 groupBy 标签。日期标记可区分午夜前后的分桶。
  4. 如果页面内容过多,请缩小查询范围。queryLogs 默认显示最新一页;order="oldest" 会从时间窗口的开头开始。页脚会提供更早日志的结束位置或更新日志的起始位置。边界行可能重复;如果同一时间戳包含的日志行数超过一页所需数量,请缩小查询范围。
  5. 用户要求生成文件时,调用 exportLogs。将用户指定的目标位置作为 directory 传入,例如 C:\tmp\logs;也可以省略该参数以使用默认导出目录。省略 format 时,会使用连接配置的 exportFormat 模板(如果操作员已设置),否则使用原始格式。format="raw" 会写入 Loki 返回的日志行,包括查询中 | line_format 的转换结果;format="{time} {level} {service} {message}" 会在本地进行格式化。响应会提供路径、数量和实际使用的格式,不包含日志内容。

queryLogs 会按时间顺序打印时间窗口的一端。默认视图会缩短消息和堆栈跟踪,以节省模型令牌。在连接的 formatFile 中,可选的 framePattern 会在紧凑视图中折叠相邻的独立堆栈帧行。raw=true 会显示每一条返回的日志行及其流标签,最多显示 4000 个代码点;这是预览。如需获取完整日志行,请使用 exportLogs。导出会逐页向前读取,且绝不会覆盖已有文件。如果同一纳秒内的日志行数超过 Loki 单页可返回的数量,导出会报告可能有部分日志缺失。

默认时间窗口为 now-1h 到 now。可接受的时间格式包括 now-15m、带偏移量的 RFC3339、连接所在时区的本地时间以及纪元纳秒。queryLogs 和 exportLogs 默认允许一天的时间范围。countLogs 对总数、标签分组或标签与时间组合分组允许一天,对仅按时间分桶允许七天;discoverLogs 不带 match 时允许七天,带 match 时允许一天。Loki 请求的默认超时时间为 30 秒,queryLogs 默认每页最多允许 1000 行。listConnections 会显示每个环境的有效值。默认情况下,导出会在 25 秒后停止;如果已写入日志行,则会报告部分文件及其续传信息。计数超时后,请重试一天的子时间窗口或缩小查询范围。可按连接设置限制;请参阅 docs/queries.md 和 docs/discovery.md。

MCP 客户端配置

Claude Code:

claude mcp add --scope user loki -e LOKI_MCP_CONNECTIONS_FILE=C:/path/connections.json -- java -jar C:/path/loki-mcp-server.jar

Codex (~/.codex/config.toml):

[mcp_servers.loki]
command = "java"
args = ["-jar", "C:/path/loki-mcp-server.jar"]
env = { LOKI_MCP_CONNECTIONS_FILE = "C:/path/connections.json" }

其他客户端可以通过 stdio 启动 jar。请将 stderr 与 stdout 分开。

错误与诊断

工具失败时会返回文本 Error : ,并设置 isError=true;Spring AI 目前会在第二行重复该文本。缺少参数或参数类型错误时,MCP SDK 会进行输入验证并返回错误。Loki HTTP 400 LogQL 解析错误会被返回,以便模型修正查询。其他上游响应正文、URL、凭据、租户信息和完整日志行不会出现在响应和诊断信息中。404 适用于被调用的端点,而非整个连接。传输详情见 docs/http-client.md。

服务器日志会在启动时记录连接名称和认证类型,随后为每次工具调用和 Loki 请求记录一条有长度限制的日志,包含状态、字节数和耗时。日志内容始终视为数据,包括看起来像指令的文本。

验证

.\gradlew.bat build
.\gradlew.bat integrationTest --console=plain
python scripts/live_smoke/run_smoke.py --connection dev

build 会运行单元测试,以及针对环回模拟 Loki 的独立进程 stdio 冒烟测试。integrationTest 需要 Docker 和固定版本的 Loki 2.6.1/3.6.0 镜像;测试数据只会写入这些容器。线上冒烟测试使用示例配置文件和已配置的只读站点 URL。贡献者规则见 AGENTS.md;设计历史和待办事项见 docs/decisions.md。从 mcp-loki 迁移的用户可阅读迁移指南。

许可证

Apache License 2.0;详见 LICENSE。第三方声明见 THIRD-PARTY-NOTICES.md。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。