Commit Graph

28 Commits

Author SHA1 Message Date
Colin Maudry d2fa17761d feat(mcp): durcir le consentement OAuth (remember-cookie SameSite + CSRF) (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:07:59 +02:00
Colin Maudry 03afb8347c feat(mcp): instructions OAuth Claude.ai/ChatGPT sur /compte/mcp (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:43:01 +02:00
Colin Maudry 34a8470792 feat(mcp): migrations OAuth/usage + câblage app.py (#114)
Ajoute les migrations 0008-0011 (oauth_clients, oauth_codes,
oauth_tokens, mcp_usage) et câble le serveur d'autorisation OAuth 2.1
dans le bloc DASH_MCP_ENABLED de app.py : init des schémas oauth/usage,
purge périodique, enregistrement des routes /oauth et /.well-known, et
exemption CSRF de ces routes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:38:33 +02:00
Colin Maudry 8258b92f98 feat(mcp): garde /_mcp unifié statique+OAuth, audience & usage (#114)
Le garde before_request de /_mcp accepte désormais les jetons OAuth
opaques (store.get_token_by_access) en plus des jetons statiques
colibre_*, avec vérification d'audience (resource == mcp_resource)
et d'expiration. Le 401 porte resource_metadata pour le découverte
RFC 9728. Sur succès, incrémente le compteur du bon store et
journalise dans mcp_usage (best-effort).

Corrige aussi une régression d'assertion stricte sur le header
WWW-Authenticate dans test_app_wiring.py, cassée par le nouveau
suffixe resource_metadata.
2026-07-13 14:32:49 +02:00
Colin Maudry 4e3c8517ad feat(mcp): flux OAuth authorize+token avec gate abonnement (#114)
Remplace le stub 501 de src/mcp/oauth/authorize.py par le flux réel
authlib (GET consentement, POST émission de code, échange de token),
avec gate d'abonnement avant tout affichage du consentement.

Deux ajustements de compatibilité authlib 1.7.2 dans server.py,
découverts en exécutant le flux bout-en-bout pour la première fois :
AUTHLIB_INSECURE_TRANSPORT en mode DEVELOPMENT (le client de test
Flask ne sert pas en HTTPS) et OAUTH2_REFRESH_TOKEN_GENERATOR (off
par défaut côté Flask, requis pour émettre les refresh_token du scope
offline_access). Détails dans .superpowers/sdd/task-9-report.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:27:58 +02:00
Colin Maudry 633462f18b feat(mcp): routes découverte + DCR + révocation OAuth (#114) 2026-07-13 14:19:49 +02:00
Colin Maudry 0970803e5e feat(mcp): configuration authlib (grants + PKCE + DCR, #114)
- AuthorizationCodeGrant avec PKCE requis (CodeChallenge), RefreshTokenGrant
  avec rotation + re-vérification d'abonnement, DCR (ClientRegistrationEndpoint)
  et révocation (RevocationEndpoint) câblés sur le store sqlite (Tasks 1-3),
  metadata (Task 5) et consent.subscription_ok (Task 6).
- _Token (dict + check_client/get_scope) fait le pont entre les rows sqlite
  bruts et le protocole TokenMixin qu'authlib 1.7.2 attend pour le refresh
  et la révocation.
2026-07-13 14:12:03 +02:00
Colin Maudry 7dea07a30f feat(mcp): gate abonnement + écrans de consentement OAuth (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:04:22 +02:00
Colin Maudry c693992041 feat(mcp): documents de découverte OAuth (RFC 9728/8414, #114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 14:00:30 +02:00
Colin Maudry db0550a170 feat(mcp): journal d'usage mcp_usage (détection niveau 1, #114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 13:56:08 +02:00
Colin Maudry 13538a4f41 feat(mcp): store OAuth — tokens access/refresh + usage (#114)
Implements OAuth token management functions for Task 3:
- save_token: persists access/refresh tokens with hashing
- get_token_by_access/refresh: retrieves tokens by their hashes
- increment_usage: tracks token usage count and last_used_at
- revoke_token: sets revoked_at timestamp

All 3 tests passing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 13:51:55 +02:00
Colin Maudry adbaffe545 feat(mcp): store OAuth — codes d'autorisation (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 13:48:42 +02:00
Colin Maudry f6132d41a2 feat(mcp): store OAuth — schéma + clients DCR (#114)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 13:45:12 +02:00
Colin Maudry 10c1e45d71 Update version de Dash dans CLAUDE.md 2026-07-13 12:01:00 +02:00
Colin Maudry ea6998ac11 fix(mcp): isole le reload de src.app dans test_app_wiring (pollution inter-tests avec AG-Grid, #111) 2026-07-10 16:27:05 +02:00
Colin Maudry ff78b86ad0 feat(mcp): page compte Connecteur MCP + instructions clients (scope B #111)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-10 15:16:36 +02:00
Colin Maudry 4dbe986310 feat(mcp): blueprint création/révocation de jetons MCP (scope B #111) 2026-07-10 15:08:24 +02:00
Colin Maudry 4f18cc07f2 feat(mcp): câble le garde /_mcp + exemption CSRF dans l'app (scope B #111) 2026-07-10 15:00:53 +02:00
Colin Maudry 697711f676 feat(mcp): garde d'abonnement sur /_mcp (scope B #111) 2026-07-10 14:46:50 +02:00
Colin Maudry 24bc1c08c1 test(mcp): combler les lacunes de couverture relevées par la revue finale
Ajoute des tests de bout en bout pour les filtres montant/date/cpv, le
chemin titulaire de search_organisations, et la pagination (page>1,
clamping page=0). Normalise montant_total en float dans les deux
branches de compute_org_stats.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 21:43:26 +02:00
Colin Maudry 5a6bd59297 feat(mcp): expose les 4 fonctions métier via @mcp_enabled
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:35:24 +02:00
Colin Maudry ee98aa8186 feat(mcp): tools stats_acheteur / stats_titulaire (agrégations) 2026-07-09 20:30:16 +02:00
Colin Maudry 11da1e9d8d feat(mcp): tool rechercher_marches (filtres hybrides + pagination) 2026-07-09 20:23:05 +02:00
Colin Maudry 47694f2e5d test(mcp): vérifier l'extraction HTML->texte plain du nom (revue Task 4) 2026-07-09 20:18:28 +02:00
Colin Maudry e2d1082e92 feat(mcp): tool search_organisations (résolution nom -> id)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:13:17 +02:00
Colin Maudry 9303c5e206 feat(mcp): search_org accepte track=False pour ne pas polluer Matomo
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 20:04:55 +02:00
Colin Maudry 571c56ef71 feat(mcp): helper track_mcp_tool pour tracer les appels MCP dans Matomo 2026-07-09 19:57:09 +02:00
Colin Maudry e407f87529 feat(mcp): sérialisation Polars -> JSON pour les tools MCP
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-09 19:53:08 +02:00