MCP server for Azure Sentinel integration, enabling KQL query execution, incident management, comments, and alerts retrieval
Sentinel-MCP has 7 tools with basic verb-noun naming and descriptions, but significant gaps in parameter documentation and output schema specification. Tool descriptions are present (average ~120 chars) but lack depth on when/why to use each tool and what they return. Parameter schemas are inferred from Python type hints in the source code rather than explicitly defined JSON schemas, making validation and LLM guidance weak. No input validation hints, error handling guidance, or output schema documentation visible. The server handles both read-only and write operations but provides no confirmation patterns or destructive operation warnings.
Adds a comment to a specific incident.
Gets all alerts for a given incident.
Fetches a single Sentinel incident by its ID.
Retrieves all comments for a given incident.
Fetches Sentinel incidents. Returns a list of incidents with title, severity, status, and description.
Execute a KQL query against the Sentinel Log Analytics workspace. Returns rows as JSON objects. Example query: 'SecurityIncident | take 5'.
Parameter schemas lack explicit JSON Schema definitions with type, description, and constraints. Parameters are typed via Python hints but LLMs cannot read Python type hints, they need JSON Schema with full descriptions for each param.
Output schemas are completely undocumented. Tools like run_kql_query return 'rows as JSON objects' but LLMs don't know the structure: are fields typed? What columns exist? What is total count for pagination?
No pagination support visible. get_incidents() accepts a 'days' parameter but no limit/offset. Large result sets will blow context windows with no way to fetch incrementally.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
Updates an existing incident. Allows modifying status, severity, and owner.
update_incident is a write operation but has no confirmation/dry-run pattern. Agents can accidentally update incident status or severity without explicit confirmation, risking data integrity.
Tool descriptions lack clear guidance on dependencies and error recovery. E.g., 'Fetches Sentinel incidents' doesn't explain when to call this vs get_incident_by_id, or what to do if authentication fails.
Parameter 'owner' in update_incident is documented as 'object' but no schema for its structure. Is it {id}, {name}, {email}? LLMs cannot construct valid payloads.
No error handling guidance. If a KQL query fails or incident doesn't exist, the return is {error: str(e)}, no hint to LLM whether to retry, try a different query, or abort.
Azure credentials are loaded from environment variables (AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_SUBSCRIPTION_ID). These are not exposed as tool parameters (good), but ensure they are never logged or included in tool responses.
Tool descriptions do not declare what permissions/scopes each tool requires. LLMs need to know 'read:incidents', 'write:incidents', 'read:alerts' etc. for least-privilege agent configuration.
Input validation is absent. get_incidents(days=1) accepts any int. What if days is 0 or negative? What is the max? incident_id parameters accept any string with no format validation.