MCP server for SpeedPy OpenAPI schema with auto-generated tool wrappers for API endpoints
12 tools with consistent naming (verb_noun pattern: get_, list_) and reasonable descriptions (100-200 chars). All tools are READ_ONLY, reducing risk. However, parameter descriptions are sparse or missing entirely, most params lack explanations of what they control or their constraints. Input schemas present but minimal (only type and required flag, no enums or ranges). No output schemas documented. Error handling guidance absent. Pagination parameters (page) lack description of valid ranges or behavior. No tool annotations (readOnlyHint, idempotentHint) despite all being read-only operations.
Get the authenticated user Return the profile of the currently authenticated user. Requires the `read:profile` scope.
Machine-readable integration manifest Returns public metadata about this SpeedPy installation: API schema URL, auth methods, scopes, endpoints, and capabilities. No authentication required. Agents, CLIs, and MCP servers should use this endpoint to discover available features and URLs.
Get a product Return a single product by its primary key. Requires the `read:products` scope.
Get a team Return details of a single team including its member count. The caller must be an active member of the team. Requires the `read:teams` scope.
Get a webhook delivery Return full details of a delivery attempt, including the request payload and response body. Requires the `read:webhooks` scope.
Parameter descriptions missing or trivial. 'page' parameter appears in 6 tools with no description of valid range, default, or pagination behavior. 'id' and 'team_id' parameters lack context on format or how to obtain them.
No output schemas documented. LLMs cannot infer what fields to expect from responses (e.g., does list_products return 'id', 'name', 'price'? Does it include pagination metadata?). This forces agents to guess field names for downstream tool calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Get a webhook endpoint Return a single webhook endpoint by ID. Requires team membership and the `read:webhooks` scope.
List products Return a paginated list of all products. Requires the `read:products` scope.
List team members Return all members of the specified team, ordered by role then join date. The caller must be an active member. Requires the `read:teams` scope.
List deliveries for a webhook endpoint Return a paginated list of delivery attempts for the specified webhook endpoint, ordered by most recent first. Requires the `read:webhooks` scope.
List webhook endpoints for a team Return a paginated list of webhook endpoints belonging to the team. Requires team membership and the `read:webhooks` scope.
List teams for the authenticated user Return all active teams the authenticated user is a member of. Expired memberships are excluded. Requires the `read:teams` scope. Returns 404 if the teams feature is disabled.
List webhook endpoints across all user's teams Return a combined list of webhook endpoints from every active team the authenticated user belongs to. Read-only. Requires the `read:webhooks` scope.
No error handling guidance. Tools lack descriptions of what errors can occur, when they are retryable, and what the LLM should do next. E.g., 'get_team' says 'caller must be an active member' but does not explain what error is returned if not, or how to recover.
No tool annotations despite all tools being read-only. FastMCP supports readOnlyHint annotation to signal to LLMs that these tools are safe to call without confirmation. This would improve agent confidence and reduce unnecessary confirmation requests.
Pagination parameters lack constraints. 'page' parameter in list_* tools has no documented minimum, maximum, or default. LLMs may pass invalid page numbers (0, negative, or extremely large values) without guidance on valid ranges.