Context7
Up-to-date docs for AI agents
作者による説明(英語の原文)
Query logs from Graylog: get streams, search messages, aggregate, and get full data.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
GRAYLOG_BASE_URL_INSTANCE_1, GRAYLOG_API_TOKEN_INSTANCE_1, GRAYLOG_LABEL_INSTANCE_1「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"graylog": {
"command": "npx",
"args": [
"-y",
"@jperelli/graylog-mcp"
],
"env": {
"GRAYLOG_BASE_URL_INSTANCE_1": "your-value",
"GRAYLOG_API_TOKEN_INSTANCE_1": "your-value",
"GRAYLOG_LABEL_INSTANCE_1": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add graylog --env GRAYLOG_BASE_URL_INSTANCE_1=your-value --env GRAYLOG_API_TOKEN_INSTANCE_1=your-value --env GRAYLOG_LABEL_INSTANCE_1=your-value -- npx -y @jperelli/graylog-mcp動かす前に、空欄の値を入力してください。
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"graylog": {
"command": "npx",
"args": [
"-y",
"@jperelli/graylog-mcp"
],
"env": {
"GRAYLOG_BASE_URL_INSTANCE_1": "your-value",
"GRAYLOG_API_TOKEN_INSTANCE_1": "your-value",
"GRAYLOG_LABEL_INSTANCE_1": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"graylog": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@jperelli/graylog-mcp"
],
"env": {
"GRAYLOG_BASE_URL_INSTANCE_1": "your-value",
"GRAYLOG_API_TOKEN_INSTANCE_1": "your-value",
"GRAYLOG_LABEL_INSTANCE_1": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
GRAYLOG_LABEL_INSTANCE_1 envこの設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント jperelli で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:GRAYLOG_BASE_URL_INSTANCE_1, GRAYLOG_API_TOKEN_INSTANCE_1
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(1.3.0)がレジストリに届いたのは4 か月前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
同じカテゴリには:Context7, Codebase Memory, Exa
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Up-to-date docs for AI agents
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
A minimal MCP (Model Context Protocol) server in JavaScript that integrates with Graylog.
search (read matching log lines across multiple streams), analyze (aggregate matches by a field, with an optional time histogram), list_fields (which fields exist), list_streams (discover readable streams), and get_message (fetch one full document)list_fields and analyze's valueContains let an agent look up real field names and values instead of inventing them, since a wrong guess returns 0 hits and reads as "no logs exist"search returns a concise projection of high-signal fields by default; opt into full documents with verboseConfigure one or more Graylog instances using numbered env vars:
| Variable | Required | Description |
|---|---|---|
GRAYLOG_BASE_URL_INSTANCE_N | yes | Graylog base URL for instance N |
GRAYLOG_API_TOKEN_INSTANCE_N | yes | API token for instance N |
GRAYLOG_LABEL_INSTANCE_N | no | Human-readable label (default: instance_N) |
Replace N with 1, 2, 3, … to register as many instances as needed. Only instances with both BASE_URL and API_TOKEN set will be active.
No installation needed, npx downloads and runs the server automatically.
claude mcp add graylog-mcp \
-e GRAYLOG_BASE_URL_INSTANCE_1=http://your-graylog-production.example.com:9000 \ -e GRAYLOG_API_TOKEN_INSTANCE_1=your_production_token \ -e GRAYLOG_LABEL_INSTANCE_1=production \ -e GRAYLOG_BASE_URL_INSTANCE_2=http://your-graylog-staging.example.com:9000 \ -e GRAYLOG_API_TOKEN_INSTANCE_2=your_staging_token \ -e GRAYLOG_LABEL_INSTANCE_2=staging \ -- npx -y @jperelli/graylog-mcp@latest
Or add it manually to ~/.claude.json:
{
"mcpServers": { "graylog-mcp": { "command": "npx", "args": ["-y", "@jperelli/graylog-mcp@latest"], "env": { "GRAYLOG_BASE_URL_INSTANCE_1": "http://your-graylog-production.example.com:9000", "GRAYLOG_API_TOKEN_INSTANCE_1": "your_production_token", "GRAYLOG_LABEL_INSTANCE_1": "production",
"GRAYLOG_BASE_URL_INSTANCE_2": "http://your-graylog-staging.example.com:9000", "GRAYLOG_API_TOKEN_INSTANCE_2": "your_staging_token", "GRAYLOG_LABEL_INSTANCE_2": "staging" } } } }
Add to ~/.cursor/mcp.json:
{
"mcpServers": { "graylog-mcp": { "command": "npx", "args": ["-y", "@jperelli/graylog-mcp@latest"], "env": { "GRAYLOG_BASE_URL_INSTANCE_1": "http://your-graylog-production.example.com:9000", "GRAYLOG_API_TOKEN_INSTANCE_1": "your_production_token", "GRAYLOG_LABEL_INSTANCE_1": "production",
"GRAYLOG_BASE_URL_INSTANCE_2": "http://your-graylog-staging.example.com:9000", "GRAYLOG_API_TOKEN_INSTANCE_2": "your_staging_token", "GRAYLOG_LABEL_INSTANCE_2": "staging" } } } }
Config file locations:
~/Library/Application Support/Claude/claude_desktop_config.json~/.config/claude-desktop/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonUse the same JSON structure shown above for Cursor.
Once configured, the tools become available and are called automatically when needed. The usual flow is to search the Default Stream (000000000000000000000001), which covers everything the token can read, then analyze to spot patterns, search to read individual lines, and get_message to inspect one hit in full. Reach for list_streams only to scope to a specific named stream. Example prompts:
Search Graylog for errors in the payments namespace in the last 15 minutes.
Query the "staging" instance.
Which containers produced the most errors in the last hour?
Which namespaces have "payments" in the name?
Don't let the agent guess field names or values. A query on a field or value that doesn't exist matches nothing, which looks exactly like "there are no logs". list_fields answers which fields exist, and analyze with valueContains answers which values a field actually has.
List the streams the configured API token can read (id + title). Only readable ones are returned.
You usually don't need this: pass the Default Stream id 000000000000000000000001 to search/analyze to cover everything the token can read. A cluster can hold thousands of streams (the author's has 1,205), so output is capped — use titleContains when you want one specific named stream.
Parameters:
instance (string, optional): Label of the Graylog instance to query. Defaults to the first configured instance.titleContains (string, optional): Case-insensitive substring filter on the stream title (e.g. catalogue).limit (number, optional): Max streams to return. Default: 50. The Default Stream is always included and never counts against the cap.List the message fields that actually exist in the index. Use it before searching on a field you haven't seen in a result, so you never guess a field name.
A cluster indexes thousands of fields (the author's: 3,269), and near-duplicates are common — namespace_name, Pod_namespace, pod_namespace and Namespace may all exist while only one is populated by your shipper. Pass contains to narrow.
Parameters:
contains (string, optional): Case-insensitive substring filter on the field name, e.g. namespace, pod, level.limit (number, optional): Max field names to return. Default: 100.instance (string, optional): Instance label. Defaults to the first configured instance.Read matching log lines across one or more streams, merged newest-first. By default it returns a concise projection of high-signal fields (timestamp, source, level, container_name, pod_name, namespace_name, application_name, service, logger_name, name, msg, err, stack, message) plus each hit's _id/_index, with the raw message body truncated to 500 chars, this keeps the agent's context small. Set verbose: true (or pass explicit fields) to get every populated field, untruncated. Stream IDs are required, an all-streams search is not performed implicitly, because a limited-permission token would be rejected with 403 Not authorized.
name/msg/err/stack are there because a shipper that parses a JSON log line (pino, bunyan, structlog) extracts its keys into real fields. Those fields *are* the summary of the event, and they're cheap — the raw message body that contains them is neither, which is why it's truncated hard by default.
Reach for `analyze` before `search`. Raw lines are the most expensive thing this server returns. A hundred repetitions of one error cost a hundred times as much via
searchas one aggregated row viaanalyze, and tell you less. Usesearchonce you know which line you want.
Tip: to search everything the token can see (including messages not routed to a named stream), pass the Default Stream id
000000000000000000000001.list_streamsalso surfaces it.
Parameters:
query (string, required): Search query, using Graylog/Elasticsearch syntax. Examples: msg:Error, namespace_name:app-payments-qa AND error, source:api-*, *.streams (string, required): Comma-separated stream IDs to search. Get them from list_streams.instance (string, optional): Label of the Graylog instance to query. Defaults to the first configured instance.searchTimeRangeInSeconds (number, optional): Relative time range in seconds. Default: 900 (15 minutes).from / to (string, optional): Absolute window in ISO-8601 UTC (e.g. 2026-07-11 14:00:00). When both are set they override the relative range, use them to investigate a known incident window.searchCountLimit (number, optional): Max number of messages. Default: 50.messageChars (number, optional): Max characters of the raw message body per hit. Default: 500. Raise it only when the detail you need lives in the raw body rather than the parsed fields.verbose (boolean, optional): Return every populated field, untruncated, instead of the concise projection. Default: false.fields (string, optional): Comma-separated explicit field list to return. Overrides the concise projection.The response is { returned, total_matched, streams, messages, note?, projection?, why_no_results? }, where total_matched is the total number of hits across the streams (may exceed returned, which is capped by searchCountLimit); when it does, note explains how to see more.
When a search matches nothing, it tells you why. A bare total_matched: 0 is ambiguous, and the three causes need opposite responses, so why_no_results names the one that applies:
list_fields / analyze.That last case is easy to misread as "this service produced no logs", and it's the reason this project exists in its current shape: the pipeline can lag ingestion by hours under load.
Note on log levels — severity must be discovered, not guessed. Some services emit a top-level Graylog
level(syslog: 3=error, 4=warn). Others log JSON, and the shipper extracts its keys into their *own* fields: pino's{"level":50,"msg":"Error","name":"SvcX"}typically becomes fieldsmsgandname, while its numericlevelis lost — it collides with the container's ownlevel(often7), solevel:50andlevel:ERRORboth match nothing even though the errors are plainly there. Guessing a disjunction likelevel:ERROR OR level:50 OR error OR exception OR fatalis how agents waste turns. Instead runlist_fields(contains: "level","msg","err"), thenanalyzeonmsgto see the actual values. Free-texterrorworks as a fallback; don't assumeexceptionorfatalexist. And avoid"level":50as a query, a quoted string before:is invalid Lucene.
Aggregate matching messages by the top values of a field instead of returning raw lines, e.g. which source, container_name, or level dominates the errors in a window. Optionally add a time histogram of total
冒頭だけを表示しています。続きはリポジトリで読めます