Read-only MCP server exposing Azure Monitor / App Insights / App Service investigation tools
Strong foundation with 11 well-named, read-only tools covering Azure observability. All tools have clear descriptions (avg 180 chars, within 10-1024 baseline) and explicit input schemas with typed parameters. Tool names follow verb_noun pattern (get_*, all action-oriented). Descriptions clearly state immutability and read-only nature, aiding LLM safety reasoning. However, output schemas are not documented in the source, LLMs cannot see what fields to expect from responses. Parameter descriptions are present but lack format constraints (e.g., time_range accepts '1h', '24h', '7d' but no regex/enum). Error handling and recovery guidance are absent. No tool annotations visible (readOnlyHint, etc.) despite all being read-only.
Control-plane activity log for the App Service (what changed: deployments, config updates, restarts, etc.), newest first. Each entry includes the operation name, the caller identity, and the timestamp. Activity is immutable once logged; this is a read-only query. LIMITATION: activity log entries have no operation_Id and are NOT part of the App Insights tables, so you cannot join them to requests/exceptions/dependencies by id — correlate by timestamp proximity instead.
App Service Plan platform metrics over a time range as a time series per metric. Defaults to CPU Percentage, Memory Percentage, Http Queue Length. Automatically resolves the app's parent App Service Plan.
Azure Container App platform metrics over a time range, as a time series per metric. Default (GA) metrics: UsageNanoCores (CPU, converted to millicores in the response), WorkingSetBytes (memory), Replicas (replica count), and RestartCount (total replica restarts) — a rising RestartCount is one of the strongest 'something is actively broken' signals available and is distinct from anything in the App Insights tables. Opt-in PREVIEW metrics (pass via `metrics`; treat their stability with caution): CpuPercentage, MemoryPercentage, Requests (has a status-code dimension), ResponseTime (avg response time). Target is per-call (containerAppName + resourceGroupName), unlike the App Service tools' static configured resource.
List an Azure Container App's revisions in a time range, newest first. On Container Apps every change (image, env vars, scale) creates a new immutable revision, so this is BOTH the deployment history and the config-change history — it replaces get_recent_deployments + get_activity_log for Container Apps targets. Each revision includes an `envDiff` against the previous revision: env vars added/removed/changed (with real before/after values for plain values) plus the image tag change. Secret-referenced vars (secretRef) NEVER expose their value — only that the secret *reference* changed. LIMITATION: revisions have no operation_Id and don't join to the App Insights tables; correlate to requests/exceptions by timestamp proximity, not by id. Target resource is passed per-call (containerAppName + resourceGroupName), unlike the App Service tools which use a static configured resource.
Output schemas not documented. LLMs cannot see what fields responses contain (e.g., does get_failed_requests return 'status_code' or 'statusCode'?). This forces agents to guess field names for downstream processing and risks context loss.
Parameter format constraints missing. time_range accepts '1h', '24h', '7d' but no enum or regex pattern is declared. LLMs may hallucinate invalid values like '2 hours' or '1 week'. metrics parameter accepts 'display names' or 'API names' but no enum list provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Failed dependency calls (status >= 400) from App Insights, newest first. Each call includes the target (host), the operation_Id (for joining to requests), the status code, and the timestamp. Dependencies are immutable once logged; this is a read-only query.
Exceptions from App Insights grouped by type, newest first. Each group includes the exception type, count, and a sample of the most recent exception (with its operation_Id for joining to requests). Exceptions are immutable once logged; this is a read-only query.
Failed HTTP requests (status >= 400) from App Insights, newest first. Each request includes the operation_Id (for joining to exceptions/dependencies), the status code, the URL, and the timestamp. Requests are immutable once logged; this is a read-only query.
Full operation trace (all requests, exceptions, dependencies) for a single operation_Id from App Insights. Joins requests, exceptions, and dependencies by operation_Id to show the complete call chain for one user request or background job.
Recent deployment history for the App Service, newest first. Each deployment includes the commit hash (if available from the deployment metadata), the deployer identity, and the timestamp. Deployments are immutable once created; this is a read-only list.
Request volume (count of requests) over a time range as a time series. Aggregated by status code (2xx, 3xx, 4xx, 5xx) so you can see the split between success and failure. This is a read-only query against immutable logged data.
Slow HTTP requests (duration >= threshold) from App Insights, newest first. Each request includes the operation_Id (for joining to exceptions/dependencies), the duration, the URL, and the timestamp. Requests are immutable once logged; this is a read-only query.
No error handling or recovery guidance. If a tool fails (e.g., invalid time_range, missing resource), the source shows no error messages or hints for LLM recovery. Agents will not know whether to retry, adjust parameters, or escalate.
Tool annotations absent. All 11 tools are read-only, but readOnlyHint is not visible in the source. This prevents LLMs from reasoning about safety and idempotency without reading descriptions.
Pagination not visible. Tools like get_failed_requests and get_exceptions_by_type accept a 'limit' parameter but no 'offset', 'page', or 'next_cursor' for pagination. Large result sets may exceed context windows without pagination support.