Read-only MCP tool provider for Teams call-quality history analysis. Exposes call records, user statistics, network diagnostics, and quality metrics from a MongoDB backend via conversational LLM interface.
Strong tool definitions with comprehensive descriptions (avg 180+ chars) and well-structured schemas. All 13 tools have clear verb-noun naming and detailed parameter documentation. Schemas use proper JSON Schema with types and descriptions. However, output schemas are not explicitly documented in the visible code, and error handling guidance is minimal. No tool annotations (readOnlyHint/destructiveHint) despite all tools being READ_ONLY. Composition is excellent, tools chain logically (list_calls → get_call → summarize_call; list_users → list_user_calls → user_health_report). Parameter constraints use enums where appropriate (verdict, group_by). Defaults are sensible (limit=20, window=7d). No security issues detected, no credentials in parameters, all operations are read-only.
Per-day quality trend: call counts by verdict, lossMax distribution (streams >30%/>60%/>90%), peak lossMax. Default last 7 days, max 30 days.
Find (subnet, relay) pairs with concentrated bad calls in a time window. Complements user_health_report: instead of asking 'is this user broken?', asks 'which office wifi or TURN relay is broken?'. Group by subnet (default), relay, or subnet+relay. Returns pairs sorted by bad ratio with distinct-user counts, avg RTT/jitter/loss, and top-5 affected users. Default window last 7d, min 5 calls, min 30% bad ratio.
Detect cascade patterns in a call: one participant's bad send stream that correlates with multiple other participants' bad receive streams in the same time window. Surfaces the likely source of a call-wide issue (e.g. one user's bad wifi uplink tanking everyone else's download audio). Returns suspected cascade events sorted by severity and blast radius.
Find users with chronically flaky microphones over a time window. Aggregates send-audio streams by (user, captureDevice) and flags devices whose concealedPct repeatedly exceeds a threshold across multiple calls. Use to distinguish bad hardware from bad network: cascade patterns imply network, flaky microphones imply device. Default window is the last 7 days.
Output schemas not documented in visible code. Tools return structured data but LLMs cannot see field definitions, types, or required fields. Forces LLMs to infer response structure from descriptions alone.
No tool annotations despite all tools being READ_ONLY. Missing readOnlyHint metadata prevents agents from understanding safety properties and optimizing caching/retry strategies.
Error handling guidance absent. No recovery hints in tool descriptions (e.g., 'If call_id not found, try list_calls first'). Agents cannot self-correct on failures.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Get full detail for a specific call: metadata + per-stream quality metrics. Use after list_calls to investigate one call's streams. By default omits Good streams to save tokens; set include_good=true for full detail.
Fetch the operator-maintained annotation card for a user: location hint, tags (vip, remote-only, mobile-heavy, escalated...), and free-form notes. Use to surface context when answering questions about a specific user. Returns an empty-card message when no annotation exists. Read-only — card writes happen via CLI or HTTP.
Check liveness of the teams_con backend: last crawl timestamp, last crawl error, and MongoDB connectivity. Use this first to confirm data is fresh before answering questions about recent calls.
List calls over an optional time window, filtered by verdict and/or user UPN. Most recent first. Use this to find candidate calls to investigate. Default limit 20.
List all configured subnet labels (CIDR → friendly office/kind). Use to understand the operator's network taxonomy when interpreting user_health_report subnet entries — a row labelled "Xpanceo Dubai HQ wired" is meaningfully different from a home wifi block. Read-only.
List a specific user's calls over a time window. Use after list_users to drill into one person.
List per-user call statistics (total/good/poor/bad counts) over an optional time window. Use to find chronically affected users.
Compact natural-language summary of a call's quality issues: worst user, worst streams, top metric violations, likely root cause (loss vs jitter vs rtt). Cheaper than get_call when you only need 'what was wrong?'.
Comprehensive per-user call-quality dossier over a time window: total calls by verdict, subnets used, capture devices with concealedPct averages, Teams client versions, platforms, average jitter/loss/rtt by direction, and a coarse problem-pattern classification. Pattern values: chronic_mic (one device dominates bad calls), wifi_only_issue (wifi is bad AND wired baseline is clean), wifi_suspected (no wired baseline, but wifi dominates and bad ratio is high — try wired), remote_path (sustained high RTT, jitter, or loss on bad/poor-verdict streams), healthy, mixed, insufficient_data. Use this when a user reports a call-quality complaint — one call instead of chaining list_users, list_user_calls, and get_call. Default window is the last 7 days.
Pagination documented but no explicit 'total_count' or 'has_more' guidance in descriptions. Agents may not know when to stop iterating or how many results exist.
Parameter 'min_concealed_pct' and 'min_bad_ratio' use numeric types without explicit range documentation in descriptions. LLMs may pass invalid values (e.g., >100 for percentage).