redpanda-console-mcp
Provides tools for reading and searching Kafka messages through a Redpanda Console HTTP API, including listing topics, viewing cluster info, describing topic configurations, fetching messages by offset or timestamp, and searching message contents.
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., "@redpanda-console-mcpShow me the latest messages from the orders topic"
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.
redpanda-console-mcp
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 # WindowsConfiguration
All configuration is environment-driven. No hostname or credential is baked
into the code — CONSOLE_BASE_URL is required and the server refuses to start
without it.
Variable | Required | Default | Description |
| yes | — | Console base URL, e.g. |
| no | empty | Sent as |
| no |
| HTTP timeout in seconds |
| no |
| Set |
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-mcpopencode
~/.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 with partition count and replication factor |
| Cluster status, version, broker and partition counts |
| Effective configuration for one topic |
| Most recent N messages |
| N messages starting at an offset, reading forwards |
| N messages from the first offset at/after a timestamp |
| Messages whose key or value contains a substring |
Common parameters:
partition_id—-1(default) reads every partition; pass a number to target one. Paging withfetch_by_offsetis 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) —-1recent,-2oldest (default),-3newest/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:
valueis 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_msis kept alongside the ISO string so it can be fed straight back intofetch_by_time.
How it works
The Console exposes two HTTP surfaces, and this server speaks both:
Dataplane REST (
/v1/...) — ordinary JSON, used for topics and configs.Connect RPC (
/<package>.<Service>/<Method>) — Buf's Connect protocol. Unary methods use plain JSON;ListMessagesis 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+jsonto a unary method returns HTTP 415.proto3 omits zero values.
partitionId: 0andoffset: 0are absent from the JSON entirely, so they are defaulted to0, notnull. 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
ConsoleConfigmarks the API keyrepr=Falseso 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 |
| Set it in the MCP client's |
| The URL resolves to an SSO login page or proxy error. Confirm |
| A proxy is rewriting the |
| The topic does not exist, or the credential cannot see it. Check |
| A Console-side limit. Page with |
Search returns nothing on a busy topic | The scan reached |
Timeouts on large fetches | Raise |
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 modeThe 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 definitionsContributions are welcome — please keep ruff, mypy and the test suite green.
License
Available Tools
7 toolscluster_infoA
Get cluster health: status, version, broker and partition counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Kafka topic name. |
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. '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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Kafka topic name. | |
| offset | Yes | Starting offset, inclusive. | |
| max_results | No | ||
| partition_id | No | Partition to read from, or -1 for all partitions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Kafka topic name. | |
| max_results | No | ||
| partition_id | No | Partition to read from, or -1 for all partitions. | |
| timestamp_ms | Yes | Unix epoch time in milliseconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Kafka topic name. | |
| max_results | No | ||
| partition_id | No | Partition to read from, or -1 for all partitions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Max topics to return. | |
| name_contains | No | Case-sensitive substring filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Substring to find. | |
| topic | Yes | Kafka topic name. | |
| max_results | No | ||
| partition_id | No | Partition to read from, or -1 for all partitions. | |
| start_offset | No | Where to start scanning: -1 recent, -2 oldest (default), -3 newest/live, or an explicit offset. | |
| case_sensitive | No | ||
| start_timestamp_ms | No | Scan from this time instead of an offset. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
7 tool updates
v0.1.0- First observed
cluster_info - First observed
describe_topic - First observed
fetch_by_offset - First observed
fetch_by_time - First observed
fetch_latest - First observed
list_topics - First observed
search_messages
TDQS
Scored across 7 tools
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.
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.
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.
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
Related MCP Connectors
Get authoritative answers about Redpanda documentation and search API references.
Read-only Reddit search API for AI agents: posts, comments, comment trees, subreddit rules.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Apache Kafka topics, allowing users to publish messages to and read messages from Kafka instances through natural language.1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables 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.1MIT
- AlicenseNot gradedqualityAmaintenanceAn 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.3MIT
- FlicenseCqualityDmaintenanceExposes Kafka administration operations as MCP tools, enabling AI agents to inspect Kafka clusters using natural language.1-