Enterprise-grade MCP server template with OAuth2 authentication, token caching, and production-ready HTTP API client
This template server defines 8 tools with adequate naming and basic descriptions, but falls short of production-grade quality. Tools follow verb_noun naming conventions (health, ping, create_record, get_record, update_record, delete_record, execute_query, get_record_schema), but descriptions are minimal (average ~45 chars) and lack the LLM-optimization guidance for when/why to use each tool. Parameter schemas are present and typed, but descriptions lack constraints, ranges, and format specifications. The 'payload' parameter in create_record and update_record accepts generic objects with no guidance on valid structure, users must infer from get_record_schema. Error handling is not documented. Output schemas are not visible in the provided source. The server is a TEMPLATE, not a fully-fleshed implementation, which explains gaps, but as presented it scores as a mediocre foundation requiring substantial enhancement before production deployment.
create a record in the upstream API
remove a record from the upstream API
run queries against the upstream API
fetch a record by ID from the upstream API
get payload format documentation for a record type
server status checks - health check endpoint
server status checks - ping endpoint
Generic 'payload' parameter lacks schema guidance. create_record and update_record accept object-type 'payload' with no definition of required/optional fields, allowed keys, or nesting. LLMs cannot construct valid payloads without calling get_record_schema first, forcing multi-turn interactions.
Tool descriptions are terse (34 - 60 chars) and lack LLM-optimization guidance. 'create a record in the upstream API' does not explain WHEN to use it, WHAT record types are available, or WHAT the response contains. Average production tools are 194 chars. Descriptions should answer: what does it do, when use it, what does it return?
Parameter 'record_type' is a free-form string with no enum constraint. LLMs may hallucinate invalid record types (e.g. 'customer_v2', 'user-account'). Should declare allowed values as an enum or reference get_record_schema for discovery.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 23 | - | v1 |
modify an existing record in the upstream API
execute_query tool is vague and high-risk. 'run queries against the upstream API' does not specify query language (SQL? GraphQL? proprietary?), parameter types, or expected response format. This tool risks SQL injection if not properly validated server-side. Requires explicit validation documentation and syntax guidance.
No output schema documented for any tool. LLMs do not know what fields to expect (e.g., does get_record return id, type, created_at, updated_at, full object?). This forces LLMs to guess and makes chaining tools unreliable. Pattern:response-shaper requires explicit schema documentation.
No error handling or recovery guidance documented. If create_record fails due to invalid payload or duplicate key, what error is returned? How should the LLM recover? Silence on this forces agents to retry blindly or fail silently.
Destructive tool (delete_record) lacks confirmation/dry-run support. Pattern:confirmation-request recommends requiring explicit confirmation before irreversible operations. Agents can delete records due to misunderstanding, no safeguard in place.
Parameter descriptions lack format/constraint specification. 'record_id' is described as 'The unique identifier of the record' but no format given (UUID? integer? alphanumeric?). LLMs cannot validate values without explicit constraints in the description.
No pagination guidance for potentially large result sets. If execute_query or get_record returns 1000+ items, context window exhaustion is likely. Pattern:paginated-result recommends limit/offset parameters and result count documentation.