日志搜索分析服务器

Graylog MCP Server是一个基于模型上下文协议(MCP)的服务器,使LLMs能够搜索和分析来自Graylog的日志,适用于日志管理和分析场景。

  • by n0madic
  • Go
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 n0madic/graylog-mcp

使用说明

Graylog MCP服务器

一 主控程序 (模型上下文协议)服务器,使LLM能够从以下位置搜索和分析日志 Graylog.适用于Claude Desktop、Claude Code、Cursor和任何兼容MCP的客户端。

单一二进制,零运行时依赖关系。用Go写的。

特性

  • 搜索日志 使用Lucene查询语法、时间范围、分页和排序
  • 聚合日志 具有统计函数(计数、平均值、最小值、最大值、百分位数等)和分组
  • 流过滤 将搜索范围限定到特定Graylog流
  • 日志重复数据删除 折叠重复的消息并显示计数
  • 日志模板提取 使用ULP模式挖掘发现常见模式
  • 上下文检索 查看围绕特定日志条目的消息
  • 现场发现 探索可用的日志字段
  • 流列表 浏览可用的Graylog流
  • 自动响应拟合 将结果保持在LLM上下文限制内

安装

去安装

需要Go 1.23+。

go install github.com/n0madic/graylog-mcp@latest

二进制文件将被放置在 $GOPATH/bin (或 $HOME/go/bin 默认情况下)。

从源代码构建

git clone https://github.com/n0madic/graylog-mcp.git
cd graylog-mcp
go build -o graylog-mcp .

码头工人

容器图像以以下形式发布到GHCR ghcr.io/n0madic/graylog-mcp.

docker pull ghcr.io/n0madic/graylog-mcp:latest
docker run --rm -p 8090:8090 ghcr.io/n0madic/graylog-mcp:latest

容器默认为 GRAYLOG_MCP_TRANSPORT=http 并继续收听 0.0.0.0:8090. 以(权力)否决 GRAYLOG_MCP_TRANSPORT=stdio 如果你需要容器内的stdio模式。

配置

服务器是通过环境变量或CLI标志配置的。CLI标志优先于环境变量。

环境变量 CLI标志 必填 默认 说明
GRAYLOG_URL --url stdio:是的;http:无 - Graylog基本URL(http模式:可以通过以下方式为每个请求传递 X-Graylog-URL 标题代替)
GRAYLOG_USERNAME --username 如果没有令牌 - 基本身份验证的用户名
GRAYLOG_PASSWORD --password 如果没有令牌 - 基本身份验证密码
GRAYLOG_TOKEN --token 如果没有凭据 - neneneba API访问令牌
GRAYLOG_TLS_SKIP_VERIFY --tls-skip-verify 没有 false 跳过TLS证书验证
GRAYLOG_TIMEOUT --timeout 没有 30s HTTP请求超时
GRAYLOG_MCP_TRANSPORT --transport 没有 stdio 运输: stdio 或 http
GRAYLOG_MCP_HTTP_BIND --bind 没有 0.0.0.0:8090 HTTP侦听地址(仅限HTTP传输)

认证

支持两种身份验证方法(至少需要一种):

  1. 用户名和密码 -通过基本身份验证的标准Graylog凭据
  2. API访问令牌 -Graylog访问令牌(使用基本身份验证 your_token:token 公约)

如果两者都提供,则令牌优先。

运输方式

stdio(默认)

该二进制文件由MCP客户端作为子进程生成。启动时通过环境变量配置凭据。这是Claude Desktop、Claude Code和Cursor使用的模式。

http(流式http)

服务器使用 MCP可流式HTTP传输 (规范2025-03-26)。专为容器化部署和通过网络连接到MCP服务器的工具(如n8n)而设计。

在http模式下, GRAYLOG_URL 在服务器上是可选的,可以通过 X-Graylog-URL HTTP标头。同样,凭据可以通过以下方式按请求转发 Authorization 头球这允许单个服务器实例为多个管道提供服务,每个管道都有自己的Graylog目标和凭据。MCP服务器只会将工具结果返回给LLM——凭据永远不会公开。

使用Claude Desktop

将服务器添加到Claude Desktop配置文件中(claude_desktop_config.json):

{
  "mcpServers": {
    "graylog": {
      "command": "/path/to/graylog-mcp",
      "env": {
        "GRAYLOG_URL": "https://graylog.example.com",
        "GRAYLOG_TOKEN": "your_access_token_here"
      }
    }
  }
}

或者使用用户名/密码:

{
  "mcpServers": {
    "graylog": {
      "command": "/path/to/graylog-mcp",
      "env": {
        "GRAYLOG_URL": "https://graylog.example.com",
        "GRAYLOG_USERNAME": "admin",
        "GRAYLOG_PASSWORD": "secret"
      }
    }
  }
}

使用Claude代码

claude mcp add graylog \
  --env GRAYLOG_URL=https://graylog.example.com \
  --env GRAYLOG_TOKEN=your_access_token_here \
  -- graylog-mcp

与n8n一起使用

使用Docker Compose以http模式运行服务器。如果您通过n8n的每个请求传递凭据,则服务器上不需要Graylog特定的配置:

services:
  graylog-mcp:
    image: ghcr.io/n0madic/graylog-mcp:latest
    ports:
      - "8090:8090"

或者,如果所有管道都指向同一Graylog实例,则设置服务器级默认URL:

services:
  graylog-mcp:
    image: ghcr.io/n0madic/graylog-mcp:latest
    environment:
      GRAYLOG_URL: https://graylog.internal
    ports:
      - "8090:8090"

n8n MCP凭证配置:

字段 值
MCP服务器URL http://graylog-mcp:8090/mcp
头球 X-Graylog-URL https://graylog.example.com (覆盖服务器 GRAYLOG_URL;如果已在服务器上设置,则省略)
头球 Authorization Bearer <graylog_api_token> 或 Basic base64(username:password)

每个n8n管道都使用自己的凭证和自己的令牌或用户名——Graylog在其一侧强制执行每个用户的访问权限。LLM只看到工具结果。

工具

search_logs

使用Lucene查询语法搜索Graylog日志。

参数:

名称 类型 必填 描述
query string Yes Lucene查询(例如。 level:ERROR AND service:auth)
stream_id string 否 将搜索限制到特定流
range number No 相对时间范围(秒)(默认值:300)
from string 否 ISO 8601格式的绝对开始时间
to string 否 ISO 8601格式的绝对结束时间
limit number 否 要返回的最大消息数(默认值:50,最大值:10000)
offset number 否 分页时要跳过的消息
fields string 否 要返回的逗号分隔的字段列表
sort string 否 排序顺序(例如。 timestamp:desc)
deduplicate boolean 否 折叠重复消息并显示计数
extract_templates boolean 否 使用ULP模式挖掘提取日志模板

from 和 to 必须一起使用。如果两者都没有设置,则使用相对时间范围。

当 deduplicate=true, limit 应用于返回的重复数据消除组的数量。

extract_templates 和 deduplicate 是相互排斥的。当 extract_templates=true,类似的消息被分组到模板中,动态部分被替换为 <*> 通配符(例如。 "Connection to <*> failed: timeout").返回按频率排序的模板,包括计数和示例消息ID。

list_streams

列出可用的Graylog流(不包括已禁用的流)。

参数:

名称 类型 必填 描述
title_filter string 否 流标题的子字符串筛选器(不区分大小写)

list_fields

列出可用的日志字段。注:Graylog的API不返回字段类型。

参数:

名称 类型 必填 描述
name_filter string 否 字段名的子字符串筛选器(不区分大小写)

aggregate_logs

使用带分组的统计函数聚合日志。使用Graylog的脚本API。

参数:

名称 类型 必填 描述
query string Yes Lucene查询(例如。 level:ERROR AND service:auth)
metrics string 是 逗号分隔的指标(例如。 count, avg:took_ms, percentile:took_ms:95)
group_by string Yes 逗号分隔的分组字段(例如。 source, source,level)
group_limit number No 每个字段的最大组数(默认值:10)
stream_id string 否 将聚合限制到特定流
range number No 相对时间范围(秒)(默认值:300)
from string 否 ISO 8601格式的绝对开始时间
to string 否 ISO 8601格式的绝对结束时间
sort string 否 第一个指标的排序方向: asc 或 desc

支持的度量函数: count, avg, min, max, sum, stddev, variance, card, percentile, latest, sumofsquares.

from/to 和 range 是相互排斥的。如果两者都没有设置,则使用300秒的相对范围。

get_log_context

检索特定日志条目周围的消息。有助于理解事件周围的事件顺序。

参数:

名称 类型 必填 描述
message_id string 是 _id 目标消息的
index string Yes 目标消息的Elasticsearch索引
before number 否 要在目标之前获取的消息(默认值:5)
after number 否 目标后要获取的消息(默认值:5)
fields string 否 要返回的逗号分隔的字段列表
stream_id string 否 将上下文搜索限制到特定流

响应包括 context_incomplete: true 当发现的消息少于请求的消息时(例如,在日志流的开始/结束处或由于响应大小限制)。消息会根据ID自动进行重复数据消除,并通过超量提取来填充上下文窗口。

响应拟合

所有工具都会自动将响应限制在50000字节以内。当响应超过此限制时,服务器会逐步截断消息文本并减少消息计数。A. response_truncated: true 当发生任何截断时,都会添加标记。使用 fields 参数,用于选择特定字段并减小有效载荷大小。

示例提示

连接后,您可以问您的法学硕士以下问题:

  • “显示最近一小时的所有错误日志”
  • “在身份验证服务流中搜索身份验证失败”
  • “查找过去24小时内包含'OutOfMemoryError'的日志”
  • “显示此日志消息的上下文:[message_id]”
  • “我的Graylog实例中有哪些字段可用?”
  • “列出与付款相关的所有流”
  • “显示生产中的重复数据消除错误日志,以查找最常见的问题”
  • “提取最后一小时的日志模板,查看最常见的日志模式”
  • “统计过去一小时每个源的日志,并显示前5个”
  • “过去30分钟内按服务分组的平均响应时间是多少?”
  • “显示按端点分组的请求持续时间的第95百分位数”

许可证

麻省理工学院