Creates or fetches an Azure API Management subscription tied to a product and prints the subscription's primary/secondary keys. Optionally provisions the owning user first.
Three tools with complete input schemas and descriptions, but significant quality gaps. Tool names lack action verbs (ensureUser, createOrFetchSubscription, listSecrets are acceptable but not ideal). Descriptions are present (40-80 chars) but lack WHEN/WHY context and recovery guidance. Parameters have types and descriptions, meeting baseline requirements. No output schemas documented, LLMs cannot plan downstream calls. No error handling guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Security concern: token parameter exposed in all tools (should be server-side injected). Composition is reasonable (three distinct operations), but tools lack idempotency guarantees and confirmation patterns for destructive operations.
PUT the subscription. 201 = newly created, 200 = already subscribed.
Optionally create the owning user (idempotent PUT). Returns the /users/{id} ownerId path.
Keys are blank on PUT/GET — read them via POST /listSecrets.
No output schemas documented. LLMs cannot infer what fields to expect from tool responses, blocking downstream tool chaining and forcing exploratory calls.
Azure AD bearer token exposed as tool parameter. Credentials must be server-side injected via environment variables or vault. Agent traces log all parameters, tokens in params leak into logs and prompt history.
Descriptions lack WHEN/WHY context and recovery guidance. 'PUT the subscription. 201 = newly created, 200 = already subscribed' is implementation detail, not user intent. Should explain: when to call this, what it does, what to do if it fails.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). createOrFetchSubscription and ensureUser are idempotent PUTs but lack idempotentHint. listSecrets is read-only but lacks readOnlyHint.
No error handling guidance. Code throws generic errors ('Create user failed: ...') without recovery hints. LLMs cannot determine if error is retryable, user-fixable, or fatal.