Kibana Bridge MCP
Enables searching and analyzing logs in Kibana through the user's logged-in browser session, with tools for summarizing, filtering, and inspecting log entries.
Enables searching and analyzing logs in OpenSearch Dashboards through the user's logged-in browser session, with tools for summarizing, filtering, and inspecting log entries.
Supports searching logs in SAP BTP Cloud Logging via its Kibana/OpenSearch Dashboards interface.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Kibana Bridge MCPSummarize the errors in our logs over the last 24 hours, then dig into the most common one."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Kibana Bridge MCP
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.

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.

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-extensionThis 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.

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.
Check
node --versionis 18 or newer, then register the server with the client you're running in (commands; use thecmd /cform on Windows).Run
npx -y kibana-bridge-mcp@latest install-extension. It prints the folder path (--no-openskips opening the browser,--browser <name>picks one).Ask the user to turn on Developer mode, click Load unpacked and paste that path. Wait for them to confirm.
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.
Ask the user to restart the client or reconnect MCP servers (
/mcpin Claude Code) so the tools load.Verify with
curl -s http://localhost:47822/health. You want"connected":trueand at least one name in"environments". No answer means the client hasn't started the server yet. Finish with a broadsummarize_logscall.
Tools
Tool | What it does |
| Cheap overview: hit count, time histogram, top values per field. Start here. |
| Lists every field in matching docs, with types. Learns the schema. |
| Full search with include/exclude filters and custom display fields. |
| Everything around a timestamp, optionally limited to one trace. |
| 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_idonget_log_contextto follow one trace.full: trueoninspect_logto 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 |
Results show empty messages | Your logs use a different text field. Ask the AI to run |
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 |
|
| HTTP port for MCP clients |
|
| WebSocket port for the extension (also change it in the extension settings) |
|
| Bind address |
|
| Fields used as each hit's message text, in order |
|
| Default fields |
|
| Fields searched by |
|
| Field |
|
| Field |
|
|
|
|
| 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
Available Tools
5 toolsavailable_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.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Filter 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. | |
| query | Yes | Same 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_to | No | Absolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this. | |
| query_dsl | No | Raw 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_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now. | |
| environment | No | Which 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_type | No | ||
| exclude_filters | No | ||
| include_filters | No | ||
| minutes_lookback | No | Window 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max hits in window (must be ≥ 1). Default 200. | |
| level | No | Filter 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. | |
| query | No | Optional 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_id | No | Scope the window to one trace: adds an include filter on `logs.contextMap.traceId` (override the field with the TRACE_ID_FIELD env var). | |
| query_dsl | No | Raw 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. | |
| timestamp | Yes | The pivot ISO 8601 timestamp (e.g. '2026-05-06T06:49:57.647Z'). Take this from a previous search hit's @timestamp. | |
| environment | No | Which 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_message | No | ||
| display_fields | No | Same fallback chain as search_logs. | |
| window_seconds | No | Half-window size in seconds. Default 60 (so total span = ±60s = 120s). | |
| exclude_filters | No | ||
| include_filters | No | Highly recommended: scope by traceId, pod_name, or service to avoid drowning in unrelated traffic. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | If true, return the complete `_source` with no truncation (stack traces, annotations, duplicate raw `log`). Default false. | |
| timestamp | Yes | Exact ISO 8601 timestamp to match (e.g. '2026-05-06T06:49:57.647250Z'). | |
| environment | No | Which 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_filters | No | Optional disambiguation if multiple docs share the timestamp. |
TDQS
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.
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.
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.
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.
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.
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:
Start with
summarize_logsover 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).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.
Call
search_logswithexclude_filterslisting those noisy {field, value} pairs to narrow the result set.Iterate: if the remaining hits render empty messages, the docs likely keep their text under a different field. Call
available_log_fieldsand pass a matchingdisplay_fieldsfallback chain.Add more excludes or change
display_fieldsuntil results are signal, not noise. Pin a specific row withtimestamp_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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max hits to return (must be ≥ 1). Default 500. For counts only, use summarize_logs. | |
| level | No | Filter 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. | |
| query | Yes | The 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_to | No | Absolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this. | |
| query_dsl | No | Raw 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_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now. | |
| environment | No | Which 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_type | No | 'phrase' (default) for exact phrase, 'best_fields' for fuzzy. | |
| full_message | No | If true, messages are shown in full without truncation/compacting. Use when you need complete response bodies. | |
| display_fields | No | Fallback 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_filters | No | Drop 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_filters | No | Require 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_match | No | Pin results to a specific @timestamp (e.g. '2026-02-14T14:58:02.793Z'). | |
| minutes_lookback | No | Window 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Filter 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. | |
| query | Yes | Same 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_n | No | Top values per field. Default 10. | |
| time_to | No | Absolute end time, ISO 8601. Without time_from, the window starts minutes_lookback before this. | |
| query_dsl | No | Raw 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_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). Without time_to, the window runs from here to now. | |
| environment | No | Which 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_type | No | ||
| exclude_filters | No | Same as search_logs: apply prior excludes so the summary reflects the narrowed set. | |
| include_filters | No | ||
| aggregate_fields | No | Dotted 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_lookback | No | Window 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
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.
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.
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.
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.
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.
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.
5 tool updates
v1.0.2- First observed
available_log_fields - First observed
get_log_context - First observed
inspect_log - First observed
search_logs - First observed
summarize_logs
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Connect LLM tools to your Algolia account with user-scoped access for internal workflows.
Read-only access to Auralogs production logs: search logs, inspect errors, review AI analyses.
Context and control for any AI. Agent identity, scoped access, and proof across tools.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables 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.720 npm3MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables querying Elasticsearch logs from AI assistants using natural language, with optional SSH tunnel support.-
- AlicenseAqualityDmaintenanceEnables AI assistants to search Elasticsearch logs, retrieve log details, analyze service health, scan local codebases for APIs, and create Kibana dashboards.520 npmMIT
- AlicenseAqualityAmaintenanceEnables 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.3MIT