Skip to main content
Glama
yunusemregul

Kibana Bridge MCP

by yunusemregul

Kibana Bridge MCP

npm CI node license

English | Türkçe

Let your AI assistant search Kibana / OpenSearch Dashboards logs through your logged-in browser tab. No API keys, no service accounts.

The dashboard during an AI search: a green pill in the header reads AI summarized "timeout" · 65 hits, and its popover shows the query, time range, index pattern, a hit histogram and the previous AI searches

Log platforms behind corporate SSO rarely hand out API tokens. Your browser session is the one credential you always have, so a small extension runs the searches inside your dashboard tab and an MCP server hands the results to Claude Code, Cursor, Codex or any other MCP client.

Architecture: the MCP client (Claude Code, Cursor, Codex, …) connects over Streamable HTTP / SSE on localhost:47822 to the MCP server, which connects over a WebSocket on localhost:47821 to the browser extension in your logged-in dashboard tab. All three run on your machine. The extension then sends authenticated requests to /internal/search/… on Kibana / OpenSearch, using your existing login.

Works with Kibana and OpenSearch Dashboards (including SAP BTP Cloud Logging).

Setup

Takes about two minutes. Using an AI agent with a terminal? Let it do the setup.

1. Add it to your AI client

claude mcp add --scope user kibana-logs -- npx -y kibana-bridge-mcp@latest

--scope user makes it available in all your projects (leave it out to add it to the current project only). Your client starts the server by itself whenever it needs it, and @latest keeps it up to date.

JSON config (Claude Desktop, Cursor and most other clients):

{
  "mcpServers": {
    "kibana-logs": {
      "command": "npx",
      "args": ["-y", "kibana-bridge-mcp@latest"]
    }
  }
}

Config files: Claude Desktop ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows). Cursor ~/.cursor/mcp.json.

codex mcp add kibana-logs -- npx -y kibana-bridge-mcp@latest
gemini mcp add kibana-logs npx kibana-bridge-mcp@latest
code --add-mcp '{"name":"kibana-logs","command":"npx","args":["-y","kibana-bridge-mcp@latest"]}'

Windows: many clients can't find npx on their own, so run it through cmd /c. For example claude mcp add --scope user kibana-logs -- cmd /c npx -y kibana-bridge-mcp@latest, or "command": "cmd", "args": ["/c", "npx", "-y", "kibana-bridge-mcp@latest"] in JSON.

Standalone server: run npx -y kibana-bridge-mcp@latest in a terminal and connect clients to http://localhost:47822/mcp (or /sse for older clients).

2. Install the browser extension

npx -y kibana-bridge-mcp@latest install-extension

This copies the extension folder path to your clipboard and opens your browser's extensions page. There, turn on Developer mode, click Load unpacked and paste the path.

Works in Chrome, Edge, Brave, Arc, Vivaldi and Opera. Install it in the browser you use for your dashboard.

Turn on Developer mode Click Load unpacked Kibana Log Bridge installed

In Edge, Developer mode is in the left sidebar. In the folder picker, press ⌘⇧G on macOS or use the address bar on Windows to paste the path. Add --browser brave (or chrome, edge, …) to the command to pick a browser other than your default, or --lang tr|en to set the output language.

3. Add your dashboard

Open your Kibana / OpenSearch Dashboards site, log in, click the extension icon and press ➕ Add this dashboard. The name and index pattern are detected for you. Repeat for other environments (stage, prod, …).

A small pill then appears in the dashboard header showing whether the AI is connected, and what it's searching for while it works.

4. Try it

Summarize the errors in our logs over the last 24 hours, then dig into the most common one.

Updating

The server updates by itself. When the extension is out of date, the AI tells you: re-run the install-extension command, then click reload ↻ on Kibana Log Bridge in the extensions page.

Related MCP server: es-mcp

Let your AI do the setup

Paste this into Claude Code, Codex, Cursor or any agent with a terminal:

Set up kibana-bridge-mcp for me by following https://github.com/yunusemregul/kibana-mcp#for-ai-agents

For AI agents

You can run steps 1 and 2. The browser steps need the user, because browsers don't let scripts enable Developer mode, load extensions or grant site access.

  1. Check node --version is 18 or newer, then register the server with the client you're running in (commands; use the cmd /c form on Windows).

  2. Run npx -y kibana-bridge-mcp@latest install-extension. It prints the folder path (--no-open skips opening the browser, --browser <name> picks one).

  3. Ask the user to turn on Developer mode, click Load unpacked and paste that path. Wait for them to confirm.

  4. Ask the user to open their dashboard, log in, click the Kibana Log Bridge icon (in the puzzle-piece menu if not pinned) and press ➕ Add this dashboard.

  5. Ask the user to restart the client or reconnect MCP servers (/mcp in Claude Code) so the tools load.

  6. Verify with curl -s http://localhost:47822/health. You want "connected":true and at least one name in "environments". No answer means the client hasn't started the server yet. Finish with a broad summarize_logs call.

Tools

Tool

What it does

summarize_logs

Cheap overview: hit count, time histogram, top values per field. Start here.

available_log_fields

Lists every field in matching docs, with types. Learns the schema.

search_logs

Full search with include/exclude filters and custom display fields.

get_log_context

Everything around a timestamp, optionally limited to one trace.

inspect_log

One log entry in full, as YAML.

The tools teach the AI to investigate like an engineer (summarize wide, find the noise, exclude it, narrow down), and results are compacted to keep token usage low.

  • environment: which configured dashboard to search. Defaults to the first one.

  • level: filter by log level, e.g. 'ERROR' or ['ERROR','WARN'].

  • query_dsl: a raw OpenSearch / Elasticsearch query clause for anything plain text can't express, e.g. {range: {status: {gte: 500}}}.

  • match: "wildcard" on an include/exclude filter for * and ? patterns.

  • trace_id on get_log_context to follow one trace.

  • full: true on inspect_log to skip trimming of long stack traces and annotations.

Troubleshooting

Problem

Fix

"No active browser extension connected"

Check the extension is loaded and enabled, and that your AI client is running.

"Redirected to a login page" / HTTP 401 or 403

Your dashboard session expired. Log in again in that tab and retry.

"No environments configured"

Open your dashboard and press ➕ Add this dashboard in the extension.

"Port 47821 (or 47822) is in use"

Another program has the port. Free it or set WS_PORT / MCP_PORT (see below).

Results show empty messages

Your logs use a different text field. Ask the AI to run available_log_fields.

Configuration

You don't need this for normal use. It's for tuning the server to an unusual log schema or changing ports.

Set these in the env block of your MCP client config.

Variable

Default

Purpose

MCP_PORT

47822

HTTP port for MCP clients

WS_PORT

47821

WebSocket port for the extension (also change it in the extension settings)

HOST

127.0.0.1

Bind address

DISPLAY_FIELDS

message,logs.message,msg,log,logs.request,logs.requestFirstLine

Fields used as each hit's message text, in order

SUMMARY_FIELDS

logs.level,logs.loggerName,logs.thrown.name,kubernetes.pod_name

Default fields summarize_logs counts

QUERY_FIELDS

message,logs.message,msg,log,logs.loggerName,logs.thread,logs.thrown.name,logs.thrown.message,logs.request,logs.requestFirstLine

Fields searched by query. Empty means the index defaults

LEVEL_FIELD

logs.level

Field level filters on

TRACE_ID_FIELD

logs.contextMap.traceId

Field trace_id filters on

FIELDS_STRATIFY_FIELD

kubernetes.container_name

available_log_fields samples across this field's values

SOURCE_TAG_FIELDS

kubernetes.labels.ccv2_cx_sap_com_platform-aspect,kubernetes.container_name

Source tag shown before each hit

Freeing a port: lsof -ti:47821 | xargs kill on macOS / Linux, or netstat -ano | findstr :47821 then taskkill /PID <pid> /F on Windows.

Security

  • Everything runs on your machine. Searches go only to your own dashboard, using your existing session and permissions.

  • The extension only accesses dashboards you add, and only reads.

  • The local server rejects connections from web pages. Its MCP port has no authentication, so don't expose port 47822 to other machines.

License

MIT

Available Tools

5 tools
available_log_fieldsA

Returns every populated field path (dotted) found in a sample of matching log docs, annotated with each field's type and aggregatability from the dashboard's field-caps API when available. Call this ONCE at the start of a fresh investigation to learn the schema: what aggregate_fields and display_fields paths are valid in this data. The tool samples hits stratified across kubernetes.container_name values (FIELDS_STRATIFY_FIELD env) so rare container types still contribute their fields, walks each doc's _source, and returns a deduplicated list grouped to keep kubernetes.annotations.* collapsed.

Use the result to decide which fields to summarize, exclude, include, or display. Subsequent investigation turns rarely need to re-call this because the schema is stable across queries.

Tip: pair it on the very first turn with a summarize_logs call (in parallel) so you get distributions and schema in one shot.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoFilter on the level field (LEVEL_FIELD env, default logs.level; currently `logs.level`), e.g. 'ERROR' or ['ERROR','WARN']. Prefer this over putting ERROR in query, which also matches INFO messages containing the word error.
queryYesSame as search_logs: picks docs to sample. An empty string or '*' matches all documents. The text is matched against these fields: message, logs.message, msg, log, logs.loggerName, logs.thread, logs.thrown.name, logs.thrown.message, logs.request, logs.requestFirstLine (override with the QUERY_FIELDS env var).
time_toNoAbsolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this.
query_dslNoRaw OpenSearch/Elasticsearch query DSL clause, AND-ed into the bool filter alongside `query` and the time range. Use for anything the plain text query can't express: numeric ranges ({range: {status: {gte: 500}}}), wildcards ({wildcard: {'url.keyword': '/api/*'}}), OR logic ({bool: {should: [...], minimum_should_match: 1}}), exists checks, etc.
time_fromNoAbsolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now.
environmentNoWhich dashboard environment to search, as configured in the extension popup. The extension has not reported any environments yet, so omit this unless the user names one.
search_typeNo
exclude_filtersNo
include_filtersNo
minutes_lookbackNoWindow length in minutes. Default 60. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and discharges it: it discloses the sampling strategy (stratified across `kubernetes.container_name` via FIELDS_STRATIFY_FIELD so rare container types contribute), the extraction method (walks each doc's `_source`), deduplication, and result grouping that collapses `kubernetes.annotations.*`. It also notes enrichment from the field-caps API when available. These details materially affect how the agent should interpret the returned field list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by usage guidance and a closing tip; every paragraph carries information. The one redundancy is restating the 'call once / rarely re-call' point in two separate sentences, which costs a little tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, no-output-schema tool, the description covers the essentials: what is returned (deduplicated, type-annotated, aggregatability-annotated field paths), how it is shaped (grouped/collapsed), and when to invoke it. It does not describe response envelope details or any bound on the sampled document count, which is a minor gap given there is no output schema to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 70% and the schema already documents each parameter in detail (level, query, query_dsl, include/exclude_filters, time windows). The description only gestures at parameter behavior ('found in a sample of matching log docs', the stratify env var) without adding syntax or semantics beyond what the schema states, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a precise verb and resource: 'Returns every populated field path (dotted) found in a sample of matching log docs,' plus the schema-discovery intent ('learn the schema: what `aggregate_fields` and `display_fields` paths are valid'). This is unmistakably distinct from the sibling search/inspect/summarize tools, which operate on log content rather than on the field inventory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call it ('Call this ONCE at the start of a fresh investigation'), when not to ('Subsequent investigation turns rarely need to re-call this because the schema is stable across queries'), and how to pair it ('pair it on the very first turn with a `summarize_logs` call (in parallel)'). This is a textbook when/when-not/alternative instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_log_contextA

Returns the log entries within a time window around a specific timestamp. Use this when you've found a suspicious entry (an error, a state change, etc.) and need to see what happened immediately before and after (the human equivalent of clicking 'view surrounding documents' in Kibana/Discover).

Default window is ±60 seconds (so 120s total). Narrow it with window_seconds for noisy services, widen for sparse logs.

Use trace_id (filters on logs.contextMap.traceId, TRACE_ID_FIELD env) or include_filters to scope to the same trace, pod, or service. Otherwise you'll see ALL traffic in the window, which is often too much.

Pass query only if you also want to constrain by a search term in the window; usually leave it empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoMax hits in window (must be ≥ 1). Default 200.
levelNoFilter on the level field (LEVEL_FIELD env, default logs.level; currently `logs.level`), e.g. 'ERROR' or ['ERROR','WARN']. Prefer this over putting ERROR in query, which also matches INFO messages containing the word error.
queryNoOptional text search applied within the window. Leave empty to see ALL logs around the timestamp (most common usage). An empty string or '*' matches all documents. The text is matched against these fields: message, logs.message, msg, log, logs.loggerName, logs.thread, logs.thrown.name, logs.thrown.message, logs.request, logs.requestFirstLine (override with the QUERY_FIELDS env var).
trace_idNoScope the window to one trace: adds an include filter on `logs.contextMap.traceId` (override the field with the TRACE_ID_FIELD env var).
query_dslNoRaw OpenSearch/Elasticsearch query DSL clause, AND-ed into the bool filter alongside `query` and the time range. Use for anything the plain text query can't express: numeric ranges ({range: {status: {gte: 500}}}), wildcards ({wildcard: {'url.keyword': '/api/*'}}), OR logic ({bool: {should: [...], minimum_should_match: 1}}), exists checks, etc.
timestampYesThe pivot ISO 8601 timestamp (e.g. '2026-05-06T06:49:57.647Z'). Take this from a previous search hit's @timestamp.
environmentNoWhich dashboard environment to search, as configured in the extension popup. The extension has not reported any environments yet, so omit this unless the user names one.
full_messageNo
display_fieldsNoSame fallback chain as search_logs.
window_secondsNoHalf-window size in seconds. Default 60 (so total span = ±60s = 120s).
exclude_filtersNo
include_filtersNoHighly recommended: scope by traceId, pod_name, or service to avoid drowning in unrelated traffic.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It discloses the default window (±60s total 120s), the scoping default (all traffic unless filtered), and a real pitfall (putting ERROR in query also matches INFO messages containing the word). It does not state read-only status or the query cost of a wide window, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then progressively refines tuning and scoping advice. Four short paragraphs, each earning its place, though the default-window value is stated twice (once in prose, once implicitly via window_seconds) and the parenthetical about the 120s total is slightly redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested-object tool with no output schema, the description covers the operationally critical parameters (timestamp, window_seconds, trace_id, include_filters, query, level) well. It leaves full_message and display_fields (answered only by a cross-reference to search_logs) largely unexplained, which is a modest gap given the high schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the baseline is 3. The description adds genuine semantics beyond the schema: window_seconds is a half-window (±60s), trace_id overrides a configurable field, query should usually be empty, and include_filters is 'highly recommended' to avoid drowning in unrelated traffic.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (returns) and resource (log entries in a time window around a timestamp), and the Kibana 'view surrounding documents' analogy pins down the exact behavior. The framing 'when you've found a suspicious entry... see what happened immediately before and after' distinguishes it from sibling search_logs (broad search) and inspect_log (single-entry detail).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit about when to use it, how to tune the window (narrow for noisy services, widen for sparse logs), how to scope via trace_id or include_filters, and the consequence of not scoping ('you'll see ALL traffic in the window, which is often too much'). It even advises when to leave query empty.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_logA

Returns the _source of one log entry as YAML. Use this when search shows a tantalizing single message and you need the full metadata: traceId, kubernetes labels, exception stack, request body, etc.

By default the output is trimmed to stay readable: the raw log string is dropped when its parsed logs.* object is present, every extendedStackTrace keeps its first 5 frames, kubernetes.annotations is collapsed to a count, and strings over 4000 chars are cut. Pass full: true to get the untouched _source.

Identifies the doc by timestamp (ISO with millisecond precision is usually unique). If multiple docs share the timestamp, pass include_filters (e.g. pod_name) to disambiguate. Only the first match is returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoIf true, return the complete `_source` with no truncation (stack traces, annotations, duplicate raw `log`). Default false.
timestampYesExact ISO 8601 timestamp to match (e.g. '2026-05-06T06:49:57.647250Z').
environmentNoWhich dashboard environment to search, as configured in the extension popup. The extension has not reported any environments yet, so omit this unless the user names one.
include_filtersNoOptional disambiguation if multiple docs share the timestamp.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it enumerates exactly what default trimming destroys (raw `log` dropped, stack traces cut to 5 frames, annotations collapsed, strings over 4000 chars cut), how to opt out with `full: true`, that only the first match is returned, and that the extension has no configured environments. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, front-loaded with purpose then behavior then identification strategy; every sentence earns its place. The trimming details are somewhat restated between the body and the `full` parameter description, a minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations exist, yet the description specifies the return format (YAML `_source`), the default trimming behavior, the escape hatch, and the match-selection semantics. Nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains why `timestamp` is the primary key and when it is insufficient, and frames `include_filters` as a disambiguation mechanism rather than a generic filter. It does not add syntax beyond the schema, keeping it below 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns the `_source` of one log entry as YAML') and immediately contrasts it with search by framing the trigger as 'when search shows a tantalizing single message and you need the full metadata.' An agent can distinguish this from search_logs and get_log_context without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use condition (after a search surfaces one interesting message) and explains the disambiguation path when the timestamp is not unique. It never explicitly names a sibling tool or states when-not-to-use, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_logsA

Searches logs in Kibana / OpenSearch Dashboards via the active browser tab and returns hits.

Workflow: investigate the same way a human does in Discover:

  1. Start with summarize_logs over a wide window (e.g. 7 days) to see total hit count, time histogram, and the top values for noisy dimensions (logger, component, pod, level).

  2. Identify noise dimensions: loggers that dominate the result set with irrelevant chatter, pod tiers that don't match the service you're investigating (e.g. frontend when chasing a backend bug), etc.

  3. Call search_logs with exclude_filters listing those noisy {field, value} pairs to narrow the result set.

  4. Iterate: if the remaining hits render empty messages, the docs likely keep their text under a different field. Call available_log_fields and pass a matching display_fields fallback chain.

  5. Add more excludes or change display_fields until results are signal, not noise. Pin a specific row with timestamp_match.

Boolean AND in query: 'term1 AND term2' requires both terms.

IMPORTANT: This tool relies on a Chrome extension bridge. Do NOT attempt to open browser tabs, navigate to URLs, or use any browser automation tools if this fails. If it errors, just report the error to the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNoMax hits to return (must be ≥ 1). Default 500. For counts only, use summarize_logs.
levelNoFilter on the level field (LEVEL_FIELD env, default logs.level; currently `logs.level`), e.g. 'ERROR' or ['ERROR','WARN']. Prefer this over putting ERROR in query, which also matches INFO messages containing the word error.
queryYesThe text to search for. Single term (e.g. 'OrderConfirmationJob') or multiple terms with AND (e.g. 'ORD-12345 AND payment'). An empty string or '*' matches all documents. The text is matched against these fields: message, logs.message, msg, log, logs.loggerName, logs.thread, logs.thrown.name, logs.thrown.message, logs.request, logs.requestFirstLine (override with the QUERY_FIELDS env var).
time_toNoAbsolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this.
query_dslNoRaw OpenSearch/Elasticsearch query DSL clause, AND-ed into the bool filter alongside `query` and the time range. Use for anything the plain text query can't express: numeric ranges ({range: {status: {gte: 500}}}), wildcards ({wildcard: {'url.keyword': '/api/*'}}), OR logic ({bool: {should: [...], minimum_should_match: 1}}), exists checks, etc.
time_fromNoAbsolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now.
environmentNoWhich dashboard environment to search, as configured in the extension popup. The extension has not reported any environments yet, so omit this unless the user names one.
search_typeNo'phrase' (default) for exact phrase, 'best_fields' for fuzzy.
full_messageNoIf true, messages are shown in full without truncation/compacting. Use when you need complete response bodies.
display_fieldsNoFallback chain of dotted field paths used to render each hit's message. The first non-empty value wins per hit. Default ["message","logs.message","msg","log","logs.request","logs.requestFirstLine"]. Use available_log_fields to discover which paths exist in your data.
exclude_filtersNoDrop hits that match any of these {field, value} pairs (must_not + match_phrase). Use to silence noisy loggers, components, pods, etc. Example: [{field: 'logger', value: 'com.example.cache.CacheUtil'}, {field: 'kubernetes.labels.app', value: 'frontend'}].
include_filtersNoRequire hits to match all of these {field, value} pairs (OpenSearch filter + match_phrase). Use to scope to a specific service, pod, or status code.
timestamp_matchNoPin results to a specific @timestamp (e.g. '2026-02-14T14:58:02.793Z').
minutes_lookbackNoWindow length in minutes. Default 15. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden, and it does disclose key non-obvious traits: dependency on a Chrome extension bridge, the correct failure behavior (report the error rather than improvising browser automation), the fallback-chain rendering behavior, and that no environments are currently configured so 'environment' should be omitted. It stops short of disclosing rate limits, latency, or result-shape details, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then numbers the workflow, then flags the browser-automation caveat in caps — good information architecture for a 14-parameter tool. It runs long and duplicates some schema content (e.g. the available_log_fields / display_fields guidance appears in both the workflow and the parameter descriptions).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, 14-parameter tool with no output schema, the description supplies workflow, dependency, failure handling, and rendering behavior. It omits what a returned hit looks like and roughly how expensive a search is, but nothing critical to calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds cross-parameter semantics the schema can't: the exclude_filters narrowing loop, the display_fields fallback rationale tied to empty renders, and the level-vs-query trade-off. Concrete example filter pairs are given, though several parameter details are still restated rather than extended.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+transport ('Searches logs in Kibana / OpenSearch Dashboards via the active browser tab and returns hits'). It also implicitly demarcates itself from siblings by defining search_logs as the narrowing step after summarize_logs, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 5-step investigative workflow that names alternatives and the condition that selects each: start with summarize_logs for counts, use available_log_fields when messages render empty, pin a row with timestamp_match. It also states a when-not (do not attempt browser automation on failure) — unusually complete routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarize_logsA

Returns a cheap summary of a log query: total hits, time histogram, and top-N values for chosen dimensions. Use this BEFORE search_logs to see the shape of the data and decide which exclude_filters to apply. No hits are returned (size=0), so this is very cheap on tokens even over 7-day windows.

Typical first call for an investigation: summarize_logs(query, minutes_lookback: 10080). It gives you total hits per day and the noisy dimensions to exclude in the follow-up search.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNoFilter on the level field (LEVEL_FIELD env, default logs.level; currently `logs.level`), e.g. 'ERROR' or ['ERROR','WARN']. Prefer this over putting ERROR in query, which also matches INFO messages containing the word error.
queryYesSame as search_logs. An empty string or '*' matches all documents. The text is matched against these fields: message, logs.message, msg, log, logs.loggerName, logs.thread, logs.thrown.name, logs.thrown.message, logs.request, logs.requestFirstLine (override with the QUERY_FIELDS env var).
top_nNoTop values per field. Default 10.
time_toNoAbsolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this.
query_dslNoRaw OpenSearch/Elasticsearch query DSL clause, AND-ed into the bool filter alongside `query` and the time range. Use for anything the plain text query can't express: numeric ranges ({range: {status: {gte: 500}}}), wildcards ({wildcard: {'url.keyword': '/api/*'}}), OR logic ({bool: {should: [...], minimum_should_match: 1}}), exists checks, etc.
time_fromNoAbsolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now.
environmentNoWhich dashboard environment to search, as configured in the extension popup. The extension has not reported any environments yet, so omit this unless the user names one.
search_typeNo
exclude_filtersNoSame as search_logs: apply prior excludes so the summary reflects the narrowed set.
include_filtersNo
aggregate_fieldsNoDotted field paths to bucket by. Default ["logs.level","logs.loggerName","logs.thrown.name","kubernetes.pod_name"]. The server appends '.keyword' automatically when needed. Discover valid paths with available_log_fields.
minutes_lookbackNoWindow length in minutes. Default 15. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the key behavioral traits: size=0 means no hits are returned, cost is cheap on tokens even over 7-day windows, defaults for aggregates, and that the response header shows the resolved UTC window. It does not cover permissions or rate limits, but the cost/shape disclosure is genuinely useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the return shape, then the routing rule, then a concrete example call. The second paragraph largely restates the first ('typical first call' repeats 'use before search_logs'), which is mild redundancy but keeps the guidance actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested-object tool with no output schema, the description states what is returned (hits total, histogram, top-N) and the cost profile, and defers field discovery to available_log_fields. It is complete enough to call correctly, though it does not warn about the interplay between time_from/minutes_lookback beyond what the schema states.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, so the schema already documents most parameters in detail. The description adds workflow meaning (exclude_filters should carry prior excludes so the summary reflects the narrowed set) but no syntax or format detail beyond what the schema provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb (Returns), resource (a log query summary) and the exact payload (total hits, time histogram, top-N dimension values). It is immediately distinguishable from search_logs, which returns actual hits.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: 'Use this BEFORE `search_logs` to see the shape of the data and decide which `exclude_filters` to apply,' and repeats the workflow in the typical-first-call example. Both the when and the alternative are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv1.0.2
    • First observedavailable_log_fields
    • First observedget_log_context
    • First observedinspect_log
    • First observedsearch_logs
    • First observedsummarize_logs

TDQS

A4.5/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct stage of log investigation: summarize_logs returns summary statistics only, search_logs returns matching hits, get_log_context returns surrounding entries, inspect_log returns full metadata for one entry, and available_log_fields returns schema information. There is little to no functional overlap.

Naming Consistency4/5

Most names follow a snake_case verb_noun pattern (search_logs, get_log_context, inspect_log, summarize_logs), but available_log_fields starts with an adjective/noun rather than a verb, which is a minor inconsistency.

Tool Count5/5

Five tools cleanly cover schema discovery, high-level summary, targeted search, contextual viewing, and single-document inspection without redundancy. This is a well-scoped set for the server's purpose.

Completeness5/5

For a read-only log investigation bridge, the tools cover the full Discover-style workflow: learn fields, summarize data shape, search with filters, inspect surrounding context, and drill into a single entry. No obvious missing read operations for the domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to interact with Kibana dashboards, visualizations, and Elasticsearch data through read-only resources and executable tools for searching logs, exporting dashboards, and querying data.
    7
    20 npm
    3
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables querying Elasticsearch logs from AI assistants using natural language, with optional SSH tunnel support.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search and analyze SAP Commerce Cloud (CCv2) runtime logs via OpenSearch Dashboards using a session cookie, providing read-only tools for full-text search and error aggregation.
    3
    MIT