Multi-agent MCP server negotiating machine downtime between Production and Maintenance agents using causal P-F curve risk reasoning
Server has 9 tools with explicit schemas and descriptions. Most tools follow verb_noun naming (calculate, convert_temperature, get_machine_signal, propose_window, resolve_negotiation). Schemas are present and typed using Zod. However, descriptions vary in quality, some are domain-specific but lack actionable guidance for LLM selection. Parameter descriptions are present but inconsistent in depth. Error handling is minimal; no recovery guidance or actionable error messages visible in code. Output schemas are not documented. Role-based access control is enforced via caller_role enum, but no permission-gate pattern documentation. Tool composition is reasonable (single responsibility), but some tools like propose_window and resolve_negotiation mix concerns (negotiation state management + decision logic).
Perform basic arithmetic calculations
Check if a proposed maintenance window conflicts with the rolling 2-week plan. Flags technician availability issues.
Convert temperature units based on file content or direct input. Supports Celsius (C) and Fahrenheit (F).
Maintenance-only. Explain risk trajectory for a machine at multiple horizons (now, +24h, +72h, +96h) based on its P-F curve.
Maintenance-only. Retrieve full sensor data and current risk percentage for a machine. Production agents cannot access this.
Retrieve complete negotiation dashboard for a machine: current state, risk trajectory, all proposals, and final arbiter decision.
Output schemas not documented. Tools return complex objects (e.g., negotiation_dashboard, risk_trajectory) but LLMs cannot see expected fields, types, or structure. Forces LLMs to guess at response shape and risks extraction errors.
Error handling absent. No visible error recovery guidance, actionable error messages, or error classification (retryable vs fatal). Code throws generic Error() without context. LLMs cannot self-correct or know whether to retry.
Role-based access control enforced via caller_role enum, but no permission-gate pattern documentation or audit trail. Descriptions state 'Maintenance-only' or 'Production-only' but no clear permission scope declaration or logging of who called what.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2025-06-18+ | v2 |
Production-only. Retrieve coarse urgency tier (Low/Medium/High/Critical) for a machine. Raw risk percentages are never exposed.
Propose a maintenance window for a machine. Both Maintenance and Production can propose. Capped at 2 rounds.
Arbiter-only. Deterministically resolve a negotiation between Maintenance and Production proposals based on cost gap and risk urgency.
convert_temperature tool mixes file upload handling with temperature conversion logic. Accepts optional file_content (base64) OR direct value/from_unit/to_unit parameters. Ambiguous parameter relationships not documented; LLMs may pass both or neither.
propose_window and resolve_negotiation descriptions lack clarity on when to call them vs alternatives. No guidance on multi-round negotiation flow, proposal limits ('Capped at 2 rounds'), or state transitions. LLMs may misuse or call in wrong order.