MCP server that integrates with Argo Workflows to launch, monitor, and retrieve results from Kubernetes workflows
This server has three tools with visible schemas and basic descriptions, but significant quality gaps. Naming follows verb conventions (launch, status, result) but descriptions are minimal (16-51 chars, below the 50-200 char baseline for LLM optimization). Parameter descriptions are present but terse. No output schemas are documented. Error handling is basic (errorResult() calls visible in launch_tool.go but recovery guidance is absent). The 'wait' parameter in launch tool has a boolean default (false) which is safe, but conditional parameter relationships are underdocumented. No tool annotations (readOnlyHint, destructiveHint) are present. The 'launch' tool is marked WRITE risk but the schema lacks explicit mutation guidance in the description. Tool composition is reasonable (three separate tools, no compound operations), but chaining is not optimized, status and result tools require 'name' parameter, but launch only returns the workflow name in a nested TextContent structure, not a well-documented response schema.
Submits a new Argo workflow
Fetches output parameters (and artifacts) from a completed workflow
Gets the status of a workflow by name
Tool descriptions are below LLM-optimization baseline. 'Submits a new Argo workflow' (32 chars) and 'Gets the status of a workflow by name' (35 chars) lack context on WHEN to use each tool, prerequisites (e.g., 'requires Kubernetes cluster access'), and expected behavior (e.g., 'launch' with wait=true blocks until completion). Baseline: 50-200 chars.
Output schemas are not documented. launch_tool.go shows successResult() and errorResult() return *mcp.CallToolResult with TextContent, but the exact structure, field names, and data types are not visible in the provided code. LLMs cannot plan downstream calls without knowing what fields to expect (e.g., does the response include workflow_id, workflow_name, status, timestamps?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 33 | - | v1 |
Parameter descriptions lack constraint details. 'namespace' is described as 'Kubernetes namespace (optional)' but does not specify format (e.g., alphanumeric, max length, pattern). 'manifest' for launch is 'Argo Workflow YAML manifest' but lacks guidance on valid YAML structure, required fields, or examples of what makes a valid manifest. Baseline: full format, range, and validation rules in description text.
launch tool marked WRITE risk but description does not indicate mutation. 'Submits a new Argo workflow' does not explicitly state 'This creates a new workflow in Kubernetes' or 'This operation cannot be undone.' Agents need clear mutation semantics to reason about side effects and idempotency.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). status and result tools should be marked readOnlyHint=true; launch should be marked destructiveHint=true. This metadata helps LLMs classify tools and reason about safe vs. unsafe execution order.
Error handling provides no recovery guidance. errorResult(fmt.Sprintf(...)) in launch_tool.go returns error messages like 'Invalid workflow YAML' or 'Failed to submit workflow: <error>' but does not guide the agent: 'Try validating with kubectl apply --dry-run' or 'Check namespace permissions.' Baseline: categorize errors as retryable/user-fixable/fatal and suggest next steps.
Chaining between tools is not optimized. launch returns workflow name nested in TextContent (res.Content = append(res.Content, mcp.TextContent{Type: "text", Text: json_outputs})), but status and result tools require a 'name' parameter. There is no documented return schema showing workflow_name, workflow_id, or other fields that downstream tools need. This forces the agent to infer the workflow name from unstructured output.