Footics MCP server: a thin client of footics-api /v1 that verifies Supabase JWTs locally (JWKS/HS256 modes), serves RFC 9728 protected-resource metadata for OAuth discovery, and exposes 10 frozen tools over Streamable HTTP (stateless). Every read relays the caller's Bearer to footics-api; there is no database access here.
Footics-MCP demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive parameter schemas, and clear descriptions in French. All 10 tools are explicitly registered with InputSchema definitions. However, output schemas are not documented in the visible code, parameter descriptions lack constraint details (ranges, enums, formats), and error handling guidance is minimal. The server follows good composition patterns (single responsibility per tool) and includes rate limiting. Descriptions average ~150 chars, meeting baseline expectations, but lack dependency hints and recovery guidance.
Mon stock de jokers par bucket (poules, 8es, …) pour une compétition : utilisés / quota / restants. Le joker double les points d'un match.
Classement général d'une compétition, ou d'un de mes groupes (via groupId). Trié par points puis scores exacts.
Renvoie un match par son id : équipes, coup d'envoi, statut, score, timeline des buts/cartons (si commencé) et mon prono.
Mes pronostics pour une compétition. `when` = upcoming (à venir), past (terminés) ou all (tous, défaut).
Mes points, scores exacts, mon rang et le nombre total de joueurs pour une compétition.
Liste les matchs d'une compétition (avec mon prono, le statut, le score live/final). Filtrable par statut. Pour voir le calendrier, les matchs à venir, en cours ou terminés.
Output schemas not documented. Code shows tools return JSON via jsonOK() but no schema definitions visible for response structures (outMatch, outWhoami, etc.). LLMs cannot plan downstream tool calls without knowing response field names and types.
Parameter descriptions lack constraint details. 'limit' params state 'clamped to 200' but no min/max in schema. 'status' and 'when' params accept enums but no enum constraint visible in InputSchema definitions. LLMs cannot validate inputs without formal constraints.
Error handling lacks recovery guidance. Code returns jsonErr() with messages like 'Non authentifié' and rate-limit errors, but no actionable next steps. E.g., 'User not found. Try search_users()' pattern absent. Agents cannot self-correct.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Les groupes dont je suis membre, avec mon rang et mes points dans chacun pour la compétition donnée.
Recherche transverse : matchs (par équipe/poule), mes groupes (par nom), joueurs (par pseudo).
Pose ou modifie MON pronostic sur un match (scores 0-20, joker optionnel). Refusé si le coup d'envoi est passé ou si je n'ai plus de joker pour ce bucket. Sur un match à élimination directe : le prono porte sur le score à la fin du temps réglementaire (90'), et si tu prédis un NUL, précise winnerTeamCode (l'équipe qui se qualifie) pour le +1 bonus. Confirme toujours avec l'utilisateur avant d'écrire.
Renvoie l'identité Footics de l'utilisateur connecté (id, email). Utile pour vérifier la connexion.
submit_prediction description is long (280+ chars) and mixes multiple concerns (validation rules, bonus scoring, confirmation requirement). Should split into separate parameter descriptions and add a dry-run/confirmation pattern.
Pagination not visible in tool definitions. list_matches and get_my_predictions accept 'limit' but no 'offset', 'page', or 'next_cursor' parameters. Large result sets could exhaust context. No total_count or has_more in response schema.