A Windows-based MCP server that provides ambient context about the user's system state, including foreground application, media playback, power state, and activity status, with privacy-aware transmission policies.
Four well-named tools with comprehensive descriptions (194 - 392 chars, above baseline 194 avg). All parameters have type definitions and descriptions. Tool annotations present (ReadOnly, Destructive, Idempotent flags). However, output schemas are not documented in the source, responses are serialized JSON strings without explicit schema declarations. Error handling is minimal; no recovery guidance or actionable error messages visible. Parameter constraints (e.g., scope enum values, limit bounds) are documented in descriptions but not enforced via JSON Schema enums. The ambient_context_poll_events tool is marked Idempotent=false correctly (stateful cursor), but no confirmation pattern for sensitive operations.
Returns the static event schema catalog: every event name the server can emit, its event-level sensitivity, a human description, and the list of payload keys with their per-key sensitivity and example values. Use this once to learn what to expect from ambient_context_poll_events instead of sniffing live samples. The catalog only changes between releases; cache the result.
Returns diagnostic metadata about Ambient Context MCP privacy classifications and effective transmission policy. This does not return sensitive context values; it explains which paths are allowed outbound by default or by user override.
Returns the latest ambient context states. The response only includes items that satisfy BOTH (a) the user's transmission policy and (b) the client-supplied scope filter. The scope is the maximum sensitivity the client declares it can handle; raising it never bypasses the user's opt-in policy. The response includes a 'policyVersion' hash — clients can skip calling ambient_context_get_policy until that value changes. Use 'context.all:read' as a shorthand for 'I can handle anything the user permits'.
Returns ambient context transition events such as idle/return, AC connect/disconnect, foreground app changes. By default this is a subscription-style call that returns events newer than the client's stored cursor and advances the cursor. When 'since' or 'until' is provided it becomes a stateless history query within that time range and the client cursor is NOT advanced, so the same range can be re-fetched. Each event also reports per-payload-key sensitivity ('payloadSensitivity') and the worst-case 'maxFieldSensitivity', so a client can tell at a glance whether raising its scope would reveal more fields. The response includes a 'policyVersion' hash — clients can skip calling ambient_context_get_policy until that value changes.
Output schemas not documented. Tools return JsonSerializer.Serialize() strings with no declared response structure. LLMs cannot plan downstream calls or extract fields without reverse-engineering the JSON.
Parameter constraints (e.g., scopes enum: context.low:read, context.medium:read, context.high:read, context.all:read) documented in descriptions but not enforced via JSON Schema enum. LLMs may hallucinate invalid scope values.
No error handling guidance visible. If ParseOptionalTimestamp fails or hub methods throw, no recovery hints provided to LLM. Errors should guide next steps (e.g., 'Invalid timestamp format. Use ISO 8601: 2026-05-10T00:00:00+09:00').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Numeric parameter 'limit' in ambient_context_poll_events lacks min/max bounds in schema. Description states 'Default is 50; server caps at 1000' but no JSON Schema minValue/maxValue enforced.
Tool descriptions are excellent (85 - 95 chars above baseline), but parameter descriptions could be more concise. Some exceed 200 chars (e.g., ambient_context_poll_events 'scopes' param). Trim to 50 - 100 chars per param.