Spring AI MCP Server to work with a DataLakehouse, providing tools for Flink, Kafka, and Trino integration
Server has 16 tools with basic descriptions and minimal input schemas. Most tools are simple read-only operations on Flink, Kafka, and Trino. Naming is consistent (verb_noun pattern). However, many tools lack parameter descriptions, output schemas are not documented, and error handling is generic. Parameter types exist but descriptions are sparse. Tool descriptions are adequate in length (70-160 chars) but lack context about when to use them vs similar tools. No tool annotations (readOnlyHint, etc.) present. Security aspects (no secrets in params) are sound. Overall, this is a functional but mediocre community-grade server with significant gaps in production readiness.
Execute a SELECT SQL query on Trino and return the result as rows and columns. Only SELECT queries are allowed.
Get details for a list of Flink jobs by job ID(s), including status, vertices, and configuration. Accepts a 'job_ids' list parameter.
Get Flink JobManager metrics such as heap memory usage, CPU load, and other JVM/process stats from the REST API.
List all Flink jobs running on the cluster, including job IDs, names, and status.
Get Flink cluster overview metrics such as number of task managers, slots available, jobs running, jobs finished, jobs cancelled, and jobs failed from the REST API.
List all Flink TaskManagers and their details from the REST API.
No output schemas documented for any tool. LLMs cannot predict what fields to expect, forcing them to discover structure by trial-and-error or parse freeform responses.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. Protocol 2026-07-28 expects these for agent planning and audit trails.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 5 | - | v1 |
Get Flink TaskManagers metrics such as heap memory usage, network IO, and task slot utilization from the REST API.
Get the schema of an Iceberg table using Trino.
Execute an Iceberg time travel query using Trino. Specify table, timestamp (ISO 8601 format, e.g. '2024-09-12T15:30:45.123456+05:30') or snapshot_id, and a query. The tool rewrites the query to use FOR TIMESTAMP AS OF or FOR SNAPSHOT AS OF syntax.
List all Kafka topics available in the local cluster.
Get the latest N messages from a specified Kafka topic. Handles Avro, JSON, and plain text. If maxMessages is not provided, defaults to 10.
Probe one or more JobManager metrics by name from the Flink REST API. Accepts a list of metric names (can be a single metric in a list).
Probe one or more TaskManager metrics by name from the Flink REST API. Accepts TaskManager ID and a list of metric names (can be a single metric in a list).
List all catalogs available in the Trino cluster.
List all Iceberg tables in the specified Trino catalog and schema.
List all schemas in the specified Trino catalog or multiple catalogs.
Parameter descriptions missing or minimal for most parameters. E.g., 'jobIds' has description 'List of Flink job IDs' but lacks format constraints (UUID? alphanumeric pattern?), required count, or composition guidance.
Generic error handling in FlinkToolService (log.error + return of exception message). No error categorization (retryable vs fatal), no recovery guidance, no invalid value echoing for LLM self-correction.
No pagination support documented or implemented for list tools (flink_jobs, kafka_topics, trino_catalogs). No mention of limit, offset, or page_size parameters. Unbounded results risk context window exhaustion.
Tool naming lacks disambiguating context. 'probe_jobmanager_metrics' vs 'flink_jobmanager_metrics' are confusingly similar, LLMs may conflate them. 'probe_*' is non-standard verb; use 'get_', 'list_', or 'fetch_'.
No timeout handling visible in code samples. Tools calling external REST APIs (Flink, Trino) without explicit timeouts risk hanging indefinitely, blocking agent execution.
No input validation visible. E.g., 'flink_job_details' accepts jobIds as List<String> but does not validate format (regex JOB_ID_PATTERN exists in class but not shown applied at parameter level). Invalid IDs may cause confusing API errors.