使用说明
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传输) |
认证
支持两种身份验证方法(至少需要一种):
- 用户名和密码 -通过基本身份验证的标准Graylog凭据
- 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百分位数”
许可证
麻省理工学院