Skip to main content
Glama
KietDev-JS

redpanda-console-mcp

by KietDev-JS

redpanda-console-mcp

CI Python License: MIT

An MCP server that lets an AI assistant read and search Kafka messages through the Redpanda Console HTTP API.

It talks to the Console you already run, over HTTPS — so it works from a laptop or CI runner that has no route to the Kafka broker port, inherits whatever authentication sits in front of the Console, and needs no Kafka client library.

"Find the order-service messages mentioning trace 0f9573db from yesterday"
   └── search_messages(topic=…, text="0f9573db", start_timestamp_ms=…)

Contents

Related MCP server: Kafka MCP Server

Why this exists

Most Kafka MCP servers speak the native Kafka protocol on port 9092. That is a poor fit when the broker sits behind a VPC boundary and the only thing exposed is the Console UI. This server uses the Console's own API, which means:

Native Kafka client

This server

Network requirement

Broker port (9092)

Console HTTPS port

Auth

SASL/mTLS config

Console's existing auth

Deserialisation

Client-side

Console (Avro/Protobuf/JSON registry-aware)

Content search

Fetch everything, filter locally

Server-side, only matches transferred

Because deserialisation happens in the Console, messages come back as the same text a human sees in the web UI, including schema-registry-decoded payloads.

Requirements

  • Python 3.10+

  • Network access to a Redpanda Console instance (tested against Console v3.x fronting Apache Kafka 3.4)

Install

git clone https://github.com/KietDev-JS/redpanda-console-mcp.git
cd redpanda-console-mcp
pip install .

For an isolated install that still exposes the command globally:

pipx install .

Verify the entry point resolves. The server communicates over stdio and takes no command-line flags, so check that the executable exists rather than running it bare:

which redpanda-console-mcp      # macOS / Linux
where.exe redpanda-console-mcp  # Windows

Configuration

All configuration is environment-driven. No hostname or credential is baked into the codeCONSOLE_BASE_URL is required and the server refuses to start without it.

Variable

Required

Default

Description

CONSOLE_BASE_URL

yes

Console base URL, e.g. https://console.example.com

CONSOLE_API_KEY

no

empty

Sent as Authorization: Bearer <key>

CONSOLE_TIMEOUT

no

60

HTTP timeout in seconds

CONSOLE_VERIFY_TLS

no

true

Set false only for trusted self-signed hosts

Copy .env.example to .env as a starting point. .env is gitignored.

Client setup

Claude Desktop

%APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "redpanda-console": {
      "command": "redpanda-console-mcp",
      "env": {
        "CONSOLE_BASE_URL": "https://console.example.com"
      }
    }
  }
}

Claude Code

claude mcp add redpanda-console \
  --env CONSOLE_BASE_URL=https://console.example.com \
  -- redpanda-console-mcp

opencode

~/.config/opencode/opencode.json:

{
  "mcp": {
    "redpanda-console": {
      "type": "local",
      "command": ["redpanda-console-mcp"],
      "enabled": true,
      "environment": {
        "CONSOLE_BASE_URL": "https://console.example.com"
      }
    }
  }
}

Cursor / Windsurf / other MCP clients

Any stdio-capable client works. If the client cannot resolve the installed script, invoke the module directly:

{
  "command": "python",
  "args": ["-m", "redpanda_console_mcp"],
  "env": { "CONSOLE_BASE_URL": "https://console.example.com" }
}

See docs/SETUP.md for a step-by-step walkthrough, including verification and a connectivity checklist.

Tools

Tool

Purpose

list_topics

List topics with partition count and replication factor

cluster_info

Cluster status, version, broker and partition counts

describe_topic

Effective configuration for one topic

fetch_latest

Most recent N messages

fetch_by_offset

N messages starting at an offset, reading forwards

fetch_by_time

N messages from the first offset at/after a timestamp

search_messages

Messages whose key or value contains a substring

Common parameters:

  • partition_id-1 (default) reads every partition; pass a number to target one. Paging with fetch_by_offset is only deterministic against a single partition, because an offset means different things per partition.

  • max_results — capped at 500. The Console aborts the response stream above that, so the limit is enforced client-side with a clear error rather than surfacing as a truncated read.

  • start_offset (search only) — -1 recent, -2 oldest (default), -3 newest/live, or an explicit offset.

search_messages scans from the oldest message by default so matches are not silently missed. On a high-volume topic, narrow the range with start_timestamp_ms or start_offset to keep the scan cheap.

Message shape

Every fetch tool returns a list of objects with a stable schema:

{
  "partition": 0,
  "offset": 107260,
  "timestamp": "2026-09-21T08:56:27.720000+00:00",
  "timestamp_ms": 1789980987720,
  "key": null,
  "value": "{\"ActionName\":\"HideFlightStaff\"}",
  "headers": [{ "key": "trace-id", "value": "0f9573db", "binary": false }],
  "key_encoding": "PAYLOAD_ENCODING_NULL",
  "value_encoding": "PAYLOAD_ENCODING_JSON",
  "value_size_bytes": 513,
  "compression": "COMPRESSION_TYPE_ZSTD",
  "value_is_binary": false
}

Notes:

  • value is the Console's deserialised payload, so Avro and Protobuf messages arrive as readable JSON.

  • Payloads that are not valid UTF-8 are returned base64-encoded with value_is_binary: true, rather than being corrupted by lossy decoding.

  • timestamp_ms is kept alongside the ISO string so it can be fed straight back into fetch_by_time.

How it works

The Console exposes two HTTP surfaces, and this server speaks both:

  1. Dataplane REST (/v1/...) — ordinary JSON, used for topics and configs.

  2. Connect RPC (/<package>.<Service>/<Method>) — Buf's Connect protocol. Unary methods use plain JSON; ListMessages is server-streaming and frames each JSON payload behind a 5-byte prefix (1 flag byte + 4-byte big-endian length).

Two details are easy to get wrong and are handled explicitly:

  • Unary calls must not use the streaming content type. Sending application/connect+json to a unary method returns HTTP 415.

  • proto3 omits zero values. partitionId: 0 and offset: 0 are absent from the JSON entirely, so they are defaulted to 0, not null. Treating a missing field as unknown mislabels every message on partition 0.

Message search is executed by the Console's sandboxed JavaScript interpreter (goja), so filtering happens next to the data and only matches cross the wire.

Security

  • No credentials in the repository. Configuration is environment-only, and ConsoleConfig marks the API key repr=False so an accidental log or traceback will not print it.

  • JavaScript injection is blocked. The search term is embedded in the server-side filter via json.dumps, which emits a properly escaped string literal. Quotes, backslashes, newlines and the JS-specific U+2028/U+2029 separators cannot break out into executable code — this is covered by dedicated tests.

  • Path injection is blocked. Topic names are percent-encoded before being placed in a URL path.

  • TLS verification is on by default and must be disabled explicitly.

  • The server is read-only. It exposes no produce, delete, or config-write operation; it cannot modify your cluster.

Access control is inherited from the Console: this server can read exactly what the supplied credential can read. Scope the token accordingly, and remember that topic contents will be sent to whichever model backs your MCP client.

Troubleshooting

Symptom

Cause and fix

Configuration error: CONSOLE_BASE_URL is not set

Set it in the MCP client's env block, not just your shell — MCP servers do not inherit an interactive shell profile.

Expected JSON … check that CONSOLE_BASE_URL points at a Redpanda Console API root

The URL resolves to an SSO login page or proxy error. Confirm curl $CONSOLE_BASE_URL/v1/topics returns JSON.

HTTP 415

A proxy is rewriting the Content-Type header.

UNKNOWN_TOPIC_OR_PARTITION

The topic does not exist, or the credential cannot see it. Check list_topics.

max_results must not exceed 500

A Console-side limit. Page with fetch_by_offset against a single partition.

Search returns nothing on a busy topic

The scan reached max_results of consumed messages before finding matches. Narrow with start_timestamp_ms.

Timeouts on large fetches

Raise CONSOLE_TIMEOUT.

Development

pip install -e ".[dev]"

pytest                 # test suite (runs on asyncio and trio)
pytest --cov=redpanda_console_mcp --cov-report=term-missing
ruff check . && ruff format --check .
mypy                   # strict mode

The test suite runs entirely against an in-memory httpx transport, so it needs no Kafka cluster, no Console, and no network. CI covers Python 3.10–3.13 on Linux, macOS and Windows.

Layout:

src/redpanda_console_mcp/
  console.py   # HTTP + Connect RPC transport
  models.py    # proto3 JSON normalisation
  filters.py   # server-side JS filter construction
  service.py   # Console semantics and validation
  server.py    # MCP tool definitions

Contributions are welcome — please keep ruff, mypy and the test suite green.

License

MIT

Available Tools

7 tools
cluster_infoA

Get cluster health: status, version, broker and partition counts.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It indicates a read-only 'Get' operation and lists informational fields, which implies safe, non-mutating behavior. However, it does not disclose potential authorization requirements, rate limits, or behavior under unhealthy cluster states.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that wastes no words. It states the operation and the key output categories immediately, making it easy for an agent to parse.

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 zero-parameter health-check tool, the description provides adequate context by naming the return categories. It is slightly incomplete in not specifying exact output types or value formats, but given the simple nature and absent output schema, this is a minor gap.

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?

There are zero parameters, so parameter semantics are not a concern. The schema coverage is 100%, and there is nothing for the description to clarify about inputs; the baseline of 4 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 uses a specific verb and resource combination ('Get cluster health') and enumerates the concrete data points returned (status, version, broker and partition counts). This clearly distinguishes it from sibling tools that operate on topics and messages rather than the cluster as a whole.

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

Usage Guidelines3/5

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

The description implies its use case through the phrase 'cluster health' and the listed return fields, but it does not explicitly state when to prefer this over siblings like list_topics or describe_topic. No exclusions or alternative recommendations are provided, so an agent must infer the appropriate context.

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

describe_topicA

Get the effective configuration of a topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesKafka topic name.

TDQS

A3.8/5.0
Behavior3/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. 'Get' signals a read operation, but the description does not disclose how 'effective configuration' is computed, what permissions are needed, or any error behavior. It is not misleading, but it is minimal.

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

Conciseness5/5

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

A single, direct sentence with no filler. The core verb and object are front-loaded, making the definition easy to scan and understand.

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?

The tool is low complexity with one required, well-documented parameter. The description is sufficient for invocation, though it does not describe the shape or contents of the returned configuration, which would be a minor completeness improvement.

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?

The schema already fully documents the only parameter as 'Kafka topic name.' The description adds no extra meaning beyond identifying the resource being queried, 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 uses a specific verb ('Get') and resource ('effective configuration of a topic'), making the tool's purpose immediately clear. It also distinguishes itself from siblings such as list_topics, fetch_latest, and cluster_info, which cover different concerns.

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

Usage Guidelines3/5

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

There is no explicit guidance about when to use this tool versus alternatives. The intended context is implied by the word 'configuration', but an agent must infer that this is for topic configuration rather than message fetching or cluster-level details.

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

fetch_by_offsetB

Fetch messages starting at an offset, reading forwards.

With partition_id=-1 the offset is applied to every partition, so pass an explicit partition to page deterministically through a topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesKafka topic name.
offsetYesStarting offset, inclusive.
max_resultsNo
partition_idNoPartition to read from, or -1 for all partitions.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It adds context about partition_id behavior ('offset applied to every partition') beyond the schema, and clarifies the direction of reading ('forwards'). However, it does not mention read-only status, error handling, or what happens when the offset is out of range.

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 description is two sentences: the first clearly states the purpose, and the second provides a targeted usage tip. It is front-loaded and free of fluff, achieving efficiency without sacrificing key information.

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

Completeness3/5

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

The tool has an output schema, so return format is presumably covered. The description addresses the critical partition_id behavior for deterministic paging. However, it omits details about max_results semantics and potential edge cases like offset out of range, which may be relevant for an agent to call correctly. Overall, it is adequate but not comprehensive.

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 75% (3 of 4 params). The description adds semantic value for partition_id by explaining the offset application behavior, but provides no additional detail for max_results, which lacks a schema description. The contribution is marginal and does not fully compensate for the missing max_results semantics.

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

Purpose4/5

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

The description clearly states the tool fetches messages starting at a specific offset and reads forwards. It implies a distinction from siblings like fetch_latest and fetch_by_time by focusing on offset-based retrieval, though it doesn't name them explicitly.

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

Usage Guidelines3/5

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

The description provides a useful usage tip about partition_id=-1 behavior for deterministic paging, but it does not explicitly state when to use this tool versus alternatives like fetch_latest or fetch_by_time. The guidance is more about a specific parameter behavior than tool selection.

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

fetch_by_timeA

Fetch messages from the first offset at or after a timestamp.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesKafka topic name.
max_resultsNo
partition_idNoPartition to read from, or -1 for all partitions.
timestamp_msYesUnix epoch time in milliseconds.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description alone must convey behavior. It does disclose the key behavioral nuance that offsets are resolved to the first position at or after the timestamp. But it does not state how this behaves when partition_id is -1, what happens when no offset exists at/after the timestamp, or how max_results bounds the result.

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

Conciseness5/5

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

One sentence, verb-first, with no filler or repeated schema content. The essential semantic is front-loaded and the sentence earns its place.

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

Completeness3/5

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

The description is adequate for a simple fetch tool because required parameters and timestamp semantics are covered by the schema plus the one-line description, and an output schema exists so return values need not be spelled out. However, the lack of sibling differentiation, edge-case behavior, and any behavioral context beyond the core fetch rule leaves it incomplete for agents choosing among the six sibling tools.

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 75%, so the baseline is near 3. The description adds real meaning beyond the schema by explaining that timestamp_ms controls offset selection rather than exact-time filtering; the schema only says 'Unix epoch time in milliseconds.' It does not clarify max_results, but that parameter has a concrete default and bounds in the schema.

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 names a specific operation ('Fetch messages') and a precise selection rule ('first offset at or after a timestamp'), which distinguishes it from fetch_latest, fetch_by_offset, and search_messages without needing the schema. It is not a tautology and identifies the resource as timestamp-anchored Kafka messages.

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

Usage Guidelines3/5

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

The intended use case is implied: call this when messages starting from a given point in time are needed. However, there is no explicit statement of when to prefer fetch_by_time over fetch_by_offset, fetch_latest, or search_messages, and no exclusions or prerequisites.

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

fetch_latestB

Fetch the most recent messages from a topic.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesKafka topic name.
max_resultsNo
partition_idNoPartition to read from, or -1 for all partitions.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only restates the operation without explaining ordering, whether it reads from the end of the topic, error behavior, or what happens with the default partition and max_results settings. The agent is left to infer even basic read semantics.

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 description is a single, front-loaded sentence with no wasted words. It is appropriately concise, though the brevity comes at the cost of missing semantic context that the other dimensions penalize.

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

Completeness2/5

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

Even with an output schema and mostly described parameters, the tool lacks essential context: what 'latest' means in Kafka terms, how it relates to the sibling fetch tools, and any behavioral caveats. The description alone is not enough for an agent to confidently distinguish this from fetch_by_time or fetch_by_offset.

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 67%, covering topic and partition_id, so the baseline is 3. The description adds no parameter-level information beyond the schema, and max_results lacks a schema description, but its default/min/max constraints and the overall tool description provide minimal context.

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

Purpose4/5

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

The description uses a specific verb ('Fetch') and resource ('the most recent messages from a topic'), making the primary action clear. It distinguishes from siblings like list_topics and describe_topic, though 'most recent' is slightly ambiguous about whether it means latest by offset or time relative to fetch_by_time and fetch_by_offset.

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

Usage Guidelines3/5

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

The phrase 'most recent messages' implies the intended context: use this when you want the newest messages rather than a historical range or topic metadata. However, it gives no explicit guidance on when to prefer fetch_by_time, fetch_by_offset, or search_messages instead, and does not mention any exclusions or prerequisites.

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

list_topicsB

List Kafka topics with partition count and replication factor.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoMax topics to return.
name_containsNoCase-sensitive substring filter.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It only states the action and output fields, but does not explicitly confirm it's a read-only operation, mention pagination behavior (though page_size exists), or note any permission requirements. This is a gap for a tool that could imply side effects.

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

Conciseness5/5

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

The description is a single, well-structured sentence that leads with the action and resource, and includes the key output fields. There is no wasted wording, making it easy to scan and understand quickly.

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?

Given the simple nature of the tool and the presence of an output schema, the description is largely sufficient. It captures the essential purpose and output. Minor omissions like explicit read-only confirmation or parameter interaction are mitigated by the schema, so this is adequate but not exhaustive.

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?

The input schema already provides 100% coverage for both parameters (page_size and name_contains) with descriptions. The tool description adds no additional meaning beyond restating the action; it doesn't elaborate on how parameters affect behavior, 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 clearly states the action ('List Kafka topics') and the specific information returned (partition count and replication factor), which distinguishes it from the sibling describe_topic that likely provides more detailed per-topic info. The verb+resource is precise and unambiguous.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus the siblings (e.g., cluster_info, describe_topic, or search_messages). There's no mention of typical use cases, prerequisites, or explicit exclusions, leaving the agent to infer the appropriate context.

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

search_messagesA

Find messages whose key or value contains the given text.

Matching runs server-side in the Console's sandboxed JavaScript interpreter, so only matching messages are transferred. Scanning starts from the oldest message by default; narrow the range with start_offset or start_timestamp_ms on high-volume topics.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesSubstring to find.
topicYesKafka topic name.
max_resultsNo
partition_idNoPartition to read from, or -1 for all partitions.
start_offsetNoWhere to start scanning: -1 recent, -2 oldest (default), -3 newest/live, or an explicit offset.
case_sensitiveNo
start_timestamp_msNoScan from this time instead of an offset.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the burden, and it delivers meaningful behavioral detail: matching runs server-side in the Console's sandboxed JavaScript interpreter, only matching messages are transferred, and scanning starts from the oldest message by default. This explains side effects and performance-relevant behavior beyond the schema.

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

Conciseness5/5

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

Two tightly packed sentences earn their place: the first states the core function, and the second adds behavioral and performance context. No filler or repetition of schema details.

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 7-parameter search tool with an output schema, the description covers the essential behaviors: server-side matching, transfer of only matching messages, default scan origin, and narrowing. The main gaps are omitted guidance on case_sensitive and max_results behavior, but schema defaults and bounds mitigate this.

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?

At 71% schema coverage, the description compensates partially by clarifying that text matches key or value and that start_offset/start_timestamp_ms narrow scanning. However, it does not add meaning for the two undocumented parameters, max_results and case_sensitive, leaving some semantics to be inferred from schema defaults.

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 opens with a specific verb and resource: 'Find messages whose key or value contains the given text.' It clearly differentiates itself from sibling fetch tools by focusing on text-based search rather than offset/time-based retrieval.

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?

It provides clear context for when to use the tool: searching messages by text content in key or value. It also gives practical guidance to narrow the search with start_offset or start_timestamp_ms on high-volume topics, though it does not explicitly name alternatives or exclusions.

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. 7 tool updatesv0.1.0
    • First observedcluster_info
    • First observeddescribe_topic
    • First observedfetch_by_offset
    • First observedfetch_by_time
    • First observedfetch_latest
    • First observedlist_topics
    • First observedsearch_messages

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

Most tools target distinct resources or operations: listing topics, cluster health, topic config, and message retrieval. The four message-fetching tools (fetch_latest, fetch_by_offset, fetch_by_time, search_messages) share a domain but are clearly differentiated by their selection criteria, so an agent can select correctly.

Naming Consistency4/5

Tool names follow a mostly consistent snake_case pattern with action-first verbs like list_, describe_, fetch_, and search_. Minor deviations include cluster_info (noun phrase instead of verb_noun) and fetch_latest (verb_adjective), but the overall style is predictable and readable.

Tool Count5/5

Seven tools is a well-scoped set for a read-only Kafka console interface. Each tool earns its place by covering topic listing, cluster health, topic configuration, and various message retrieval strategies without redundancy or bloat.

Completeness4/5

The surface adequately covers read-only inspection of a Kafka cluster: topics, cluster state, topic configs, and message retrieval by newest, offset, time, or content. Missing consumer group inspection and topic management (create/delete) are notable but likely outside the read-only console scope, so agents can still achieve core monitoring tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with Apache Kafka through natural language, supporting operations like producing/consuming messages, managing topics, and querying brokers, partitions, and consumer group offsets.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    An MCP server that enables AI assistants to safely interact with Apache Kafka clusters, providing tools for topic management, message operations, consumer groups, and cluster information.
    3
    MIT
  • F
    license
    C
    quality
    D
    maintenance
    Exposes Kafka administration operations as MCP tools, enabling AI agents to inspect Kafka clusters using natural language.
    1
    -