OpenTelemetry observability server for AI agents. Captures OTLP traces, logs, and metrics in memory with snapshot-first querying.
otlp-mcp demonstrates a well-intentioned design focused on snapshot-centric observability, but suffers from incomplete schema documentation, inconsistent parameter descriptions, and missing guidance on tool interactions. The tool naming is clear and verb-driven (get_, create_, add_, remove_, query, manage_, clear_), which is excellent. However, the source code excerpt is truncated at a critical point, the actual parameter schemas and output types are cut off mid-sentence ('OTLP gRPC endpoint address (accepts traces, logs, and metr'). This prevents full assessment of schema quality. Based on visible code: 6 of 9 tools have descriptions; input schemas are declared in Go struct types but not fully visible in the excerpt; parameter types are strongly-typed in Go but descriptions are sparse or missing. Error handling and recovery guidance are absent. The 'query' tool has the most complex schema (12+ parameters) but lacks clear documentation on mutually exclusive fields or how attribute filtering interacts. The destructive 'clear_data' tool has no confirmation pattern.
Add listening ports dynamically (multi-port support)
Nuclear reset (wipes everything)
Bookmark current state across all buffers
Get the unified OTLP endpoint (one for all signals)
Get all signals between two snapshots
Buffer health dashboard
List and delete snapshots
Output schemas completely undocumented for all 9 tools. The source code excerpt is truncated mid-sentence, preventing full assessment. From the visible code, no @result or output type documentation is shown for any tool. This forces LLMs to guess what fields to expect, breaking downstream tool chaining.
query tool conflates 12+ parameters for three signal types (traces, logs, metrics) with undocumented interdependencies. 'errors_only' is a shortcut for 'span_status=ERROR' but the conflict is only documented in English, not enforced. 'attribute_equals' is an object with no internal schema. Filters are AND-ed or OR-ed? Unknown. This violates single-responsibility and composition principles.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Multi-signal query with optional snapshot time range
Remove ports when no longer needed
manage_snapshots conflates two actions (list, delete) into one tool via an 'action' enum parameter. This violates the single-responsibility principle. 'name' is conditionally required (only for delete) but no JSON Schema mechanism enforces this. Output schemas differ by action but are not documented. Split into 'list_snapshots' and 'delete_snapshot'.
clear_data is a destructive tool (DESTRUCTIVE risk level) with no confirmation pattern, dry-run option, or audit trail guidance. Description warns 'Nuclear reset (wipes everything)' but offers no way for the LLM to confirm before executing. An agent in a confused state could irreversibly delete all data.
Parameter descriptions use example values that LLMs may reuse literally. 'create_snapshot' documents name examples ('before-deploy', 'test-start'). 'query' lists log_severity examples ('INFO, WARN, ERROR, etc') as free-form strings instead of enums. LLMs tend to hallucinate new examples like 'VERBOSE' or 'DEBUG' which may not be valid.
No error handling guidance. What does the LLM do if add_otlp_port fails because the port is already in use? If query returns 0 results, is that success or should it suggest refining filters? If create_snapshot fails (disk full?), how should the agent recover? Every tool lacks recovery patterns.
Tool dependencies and composition are implicit. The agent must understand: call get_otlp_endpoint first to learn where to send OTLP data; create_snapshot before a deployment; query to investigate; manage_snapshots to clean up. No tool descriptions explain these workflows or dependencies.