Documentation complète · de zéro à un agent IA qui interroge Oracle

Laisser une IA interroger Oracle — sans jamais lui donner le mot de passe de la base.

Ce site documente le dépôt jpic/ords-mcp-example : Oracle Free, ORDS (le serveur REST d’Oracle) exposé en serveur MCP, Auth0 pour l’identité, et OpenCode comme client IA. La pièce centrale — la moins connue — est la séquence OAuth 2.0 + PKCE. Elle est expliquée ici pas à pas, comme si on n’avait jamais vu OAuth.

🟠 Oracle Free + ORDS 🔐 Auth0 (OAuth2 + PKCE) 🤖 OpenCode (client MCP) ⚡ « ords-mcp connected (OAuth) »

Le projet

Qu’est-ce que ça fait ?

C’est un « lab » qui reproduit une configuration de bureau réaliste : des données Oracle d’exemple (RH HR et finance FIN), protégées par des rôles. Un assistant de code (OpenCode) peut poser des questions en langage naturel (« liste les factures ») et reçoit les résultats — mais uniquement sur les bases que son compte Auth0 l’autorise à voir, sans jamais manipuler les mots de passe de la base.

Données

Oracle Free

Une base gratuite FREEPDB1 avec deux schémas d’exemple : HR (employés) et FIN (factures), créés au premier démarrage par sql/01_lab_schemas.sql.

Pont API

ORDS 26.2+

Le serveur REST d’Oracle, monté en serveur MCP streamé sur /mcp. Il valide les jetons, filtre les pools, exécute le SQL.

Identité

Auth0

Connexion (Google ou compte local), rôles, permissions API et signature des JWT. C’est le « portier ».

Client IA

OpenCode

L’agent de code : client MCP qui fait le login OAuth dans le navigateur et appelle ORDS.

✅ L’idée d’ensemble L’IA n’a jamais le mot de passe d’Oracle. Elle reçoit un jeton signé par Auth0 qui dit « ce compte a le rôle POOL.FIN ». ORDS valide la signature, lit le rôle dans le jeton, et n’expose que la base correspondante. Trois acteurs (OpenCode, Auth0, ORDS), chacun un rôle précis — c’est l’essence d’OAuth.

Sommaire

Les pages de cette documentation

Chaque page reprend, en français et enrichie, l’une des docs du dépôt — pour couvrir toute la plage, de la théorie OAuth au runbook de production.

Données d’exemple

Les pools (base FREEPDB1)

Chaque « base logique » est un pool ORDS, relié à un rôle Auth0 (roles2) et à un utilisateur Oracle en lecture seule.

Pool ORDSRôle Auth0 (roles2)Utilisateur DBSQL d’exemple
mcp-hrPOOL.HRHR_MCP_ROSELECT * FROM employees
mcp-finPOOL.FINFIN_MCP_ROSELECT * FROM invoices

Vue d’ensemble

L’architecture d’ensemble

  Utilisateur humain                    Auth0 (portier, signe les jetons)
  ┌─────────────┐                       ┌───────────────────────────────┐
  │ login Google│                       │ API Identifier =              │
  │ / compte DB │                       │  http://127.0.0.1:8080/mcp    │
  └──────┬──────┘                       │ rôles POOL.HR / POOL.FIN     │
         │                              │ permission mcpserver:all      │
         │  ┌───────────────────────────│ Action post-login → roles2    │
         │  ▼                           └──────────────┬────────────────┘
  ┌──────────────┐      access token (JWT RS256)       │
  │   OpenCode   │◄────────────────────────────────────┘
  │  (client MCP)│   Authorization: Bearer <jwt>
  │  port 19876  │──────────────────────────────► ┌──────────────────────┐
  └──────────────┘        appels MCP /mcp         │ ORDS standalone      │
                                                 │  :8080/mcp           │
                                                 │  valide signature &  │
                                                 │  claims, filtre pools │
                                                 └──────┬────────┬───────┘
                                                        ▼        ▼
                                                 pool mcp-hr  pool mcp-fin
                                                 role POOL.HR role POOL.FIN
                                                 user HR_MCP_RO user FIN_MCP_RO
                                                        │        │
                                                        └───┬────┘
                                                            ▼
                                                    Oracle Free FREEPDB1
                                                    (schémas HR + FIN)

Ce qui vit où

ÉlémentOù
Issuer, audience, JWKS URL, claim des rôlesConfig ORDS (volume /etc/ords/config)
Hôte/identifiants pool, mcp.role, mcp.scopeConfig ORDS + wallet
Utilisateurs, rôles, permissions APIAuth0
Noms de rôles sur le JWT (roles2)Action Auth0 (post-login)
Tables d’exempleSchémas Oracle HR, FIN
Jetons OpenCodeFichier local ~/.local/share/opencode/mcp-auth.json (jamais dans git)

Le modèle d’autorisation : deux étages (à retenir)

1 · Accès MCP global Le JWT doit être valide : signature via la JWKS d’Auth0, iss = https://<domaine>/ (avec le slash final), aud = l’API Identifier (http://127.0.0.1:8080/mcp), et le jeton porte la permission urn:oracle:dbtools:ords:mcpserver:all (dans permissions et/ou scope).
2 · Accès par pool ORDS lit la claim roles2 (JSON pointer /roles2) et la compare au mcp.role de chaque pool. Ex. : roles2: ["POOL.FIN"] → l’utilisateur ne voit/peut utiliser que mcp-fin. Pas de rôle pour un pool → 403.
⚠️ Pourquoi roles2 et pas roles ? Auth0 réserve le nom de claim roles et n’y mettra jamais une liste personnalisée. Le lab copie donc les rôles dans roles2 via l’Action post-login, et ORDS pointe dessus avec MCP_ROLE_CLAIM=/roles2.
⚠️ Pourquoi l’API Identifier doit être l’URL MCP ? OpenCode envoie resource=http://127.0.0.1:8080/mcp dans sa requête d’authorize. Auth0 fait correspondre ce resource à un API Identifier — il faut donc qu’une API Auth0 ait exactement cet Identifier (schéma, hôte, port, chemin). Une autre URL (https://ords.lab/mcp) ne satisferait pas la requête d’OpenCode.

Aperçu

Lab vs travail

LabTravail
BasesUn Oracle Free, deux schémas en guise de « bases »Un pool MCP par vraie base/service
IdPTenant Auth0 gratuitEntra / Okta / Auth0 Enterprise (même forme de JWT)
URL MCP / audiencehttp://127.0.0.1:8080 en HTTPURL publique HTTPS = API Identifier = aud (hôte dédié /mcp, voir reverse proxy)
ExécutionDocker ComposeKubernetes + secrets

Aller plus loin

🗂️ Dépôt source

jpic/ords-mcp-example (MIT) : code, SQL, compose, scripts et les docs originales.

🌐 Références officielles

ORDS MCP (Oracle) · MCP dans OpenCode · billet de Jeff Smith sur ORDS en serveur MCP.

🚀 Par où commencer ?

Lire la page OAuth pas à pas, suivre le setup Auth0 puis le démarrage.

🚀 Démarrer le lab 🔐 Comprendre OAuth