An OAuth 2.1 resource server toolkit for MCP (Model Context Protocol) written in Go. Provides bearer-token verification, per-tool scope enforcement, audit logging, and RFC 9728 protected resource metadata for HTTP-based MCP servers.
Three tools with clear verb-noun naming (list_notes, add_note, delete_note) and descriptions stating scope requirements. However, descriptions are minimal (20-50 chars) and lack actionable context for LLM selection. Input schemas present but sparse: list_notes has empty object (no params), add_note has two string params with descriptions, delete_note has one string param. No output schemas documented. Missing error handling guidance, pagination support, and idempotency hints for write operations. Scope enforcement is implemented server-side via toolscope middleware, which is good security practice, but not surfaced in tool definitions.
Add a note. Requires the notes:write scope.
Delete a note by id. Requires the notes:write scope.
List all notes. Requires the notes:read scope.
Descriptions are too brief (20-50 chars) and lack context for LLM tool selection. 'List all notes. Requires the notes:read scope.' does not explain when to call this vs other discovery tools or what structure is returned.
No output schemas documented. LLMs cannot plan downstream calls or extract fields without knowing what list_notes returns (array of note objects with which fields?) or what add_note returns (created note ID? full object?).
list_notes has empty input schema ({}). While correct for a no-param tool, no pagination support (limit, offset, cursor) means large note collections will blow context windows. Baseline: 94% of A+ tools support pagination.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Destructive tool (delete_note) lacks confirmation or dry-run pattern. No guidance on error recovery or what happens if the note ID does not exist. Agents need explicit recovery paths.
Scope requirements ('notes:read', 'notes:write') are stated in descriptions but not exposed as tool annotations (readOnlyHint, destructiveHint). LLMs cannot infer permission requirements from text alone.