Industrial-grade MCP server for Jenkins integration
The server has 6 tools with mostly clear names and basic descriptions, but critical gaps in parameter documentation and output schema specification prevent a higher score. Tool names follow verb_noun pattern well (list_jobs, search_jobs, get_job_info, list_builds, get_build_status, trigger_build). Descriptions are present but lack depth, they state WHAT the tool does but not WHEN to use it or what structures are returned. Parameter schemas use Zod for basic type validation, but descriptions are often minimal (e.g., 'The name of the Jenkins job' lacks clarity about naming conventions or case sensitivity). Most tools lack documented output schemas, responses are constructed as ad-hoc text blocks rather than structured payloads. Error handling returns isError flags but lacks actionable recovery guidance. The trigger_build tool has a concerning design: it accepts a 'confirmed' parameter defaulting to false, which partially mitigates risk but forces the agent to make two calls (one dry-run, one confirmed), wasting tokens.
Get the status and details of a specific Jenkins build
Get detailed configuration and build summary for a job
List recent builds for a specific Jenkins job
List all available jobs from the connected Jenkins instance
Search for jobs by name pattern
Trigger a new build for a Jenkins job. Requires confirmation.
Output schemas not documented. Tools return ad-hoc text responses (e.g., 'content: [{type: "text", text: "..."}]') rather than structured, typed objects. LLMs cannot reliably extract fields for downstream tool calls.
Parameter descriptions lack constraint information. 'jobName' is described only as 'The name of the Jenkins job', no hint about case sensitivity, character restrictions, or URL encoding. LLMs may pass names with spaces or special chars that fail silently.
Error responses are not actionable. When a job is not found or a build fails, tools return 'Error: ...' text without recovery guidance. Pattern prescribes 'User not found. Try search_users() with a partial name.' This server should return 'Job not found. Try search_jobs() with a partial pattern.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 45 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 43 | - | v1 |
trigger_build uses a 'confirmed' boolean parameter defaulting to false, requiring two calls (dry-run + confirmed). Better pattern: implement a true confirmation mechanism or describe the destructive operation and rely on agent planning.
list_builds and list_jobs return unbounded results. The code accepts 'limit' parameter but does not enforce a reasonable maximum (e.g., 100). An agent could request 10,000 builds, exhausting context and causing API timeouts. No pagination cursor or total_count documented.
Tool descriptions lack WHEN-to-use context. 'Get detailed configuration and build summary for a job' does not explain: When should the agent call this vs. list_builds? What fields does it return? How does the output differ from list_builds response? LLMs cannot disambiguate without this.