docs/LAB_WALKTHROUGH.md · le chemin validé
Le parcours de bout en bout qui correspond à une installation validée. Suivre les phases dans l’ordre : A (Auth0), B (fichiers), C (infra), D (OAuth), E (usage), F (scripts).
Prérequis
opencode --version)python3 + éventuellement python-jose pour inspecter le jetonPhase A
Compléter la page configuration Auth0, en insistant sur :
http://127.0.0.1:8080/mcpurn:oracle:dbtools:ords:mcpserver:all sur l’APIPOOL.HR / POOL.FIN avec cette permission sur chaque rôlehttp://127.0.0.1:19876/mcp/oauth/callbackroles2Phase B
# depuis le dépôt cloné
cp .env.example .env
# remplir AUTH0_DOMAIN, AUTH0_AUDIENCE, AUTH0_CLIENT_ID
# AUTH0_AUDIENCE=http://127.0.0.1:8080/mcp
# MCP_ROLE_CLAIM=/roles2
cp opencode.json.example opencode.json
Phase C
docker compose up -d --build
docker compose ps
Attendre que ords et ords-oracle soient healthy.
La création du premier volume Oracle exécute sql/01_lab_schemas.sql (HR/FIN + utilisateurs MCP).
docker exec -i ords-oracle sqlplus -s sys/${ORACLE_PWD:-OracleFree123}@//localhost/FREEPDB1 as sysdba <<'SQL'
SELECT username FROM dba_users
WHERE username IN ('HR','FIN','HR_MCP_RO','FIN_MCP_RO')
ORDER BY 1;
SQL
curl -sI http://127.0.0.1:8080/mcp | head -10
curl -s http://127.0.0.1:8080/.well-known/oauth-protected-resource/mcp
docker exec ords ords --config /etc/ords/config config list | grep -iE 'audience|issuer|role.claim|feature.mcp'
Phase D
# le port de callback doit être libre (une seule auth à la fois)
ss -ltnp | grep 19876 || echo "callback port free"
set -a && source .env && set +a
opencode mcp logout ords-mcp 2>/dev/null
opencode mcp auth ords-mcp
Terminer le login navigateur. Puis :
opencode mcp list
Terminé quand :
✓ ords-mcp connected (OAuth)
Comprendre chaque étape de ce login sur la page OAuth pas à pas.
Phase E
opencode
| Rôles de l’utilisateur | Prompt | Résultat attendu |
|---|---|---|
POOL.FIN seul | « Using ords-mcp, list databases I can access. » | mcp-fin seulement |
POOL.FIN | « On mcp-fin run: select * from invoices » | des lignes |
POOL.FIN | « On mcp-hr run: select 1 from dual » | refusé / pool absent |
POOL.HR seul | list databases | mcp-hr seulement |
Phase F
# récupérer le token depuis le fichier OpenCode, puis lancer le smoke curl
export MCP_ACCESS_TOKEN=$(python3 - <<'PY'
import json
from pathlib import Path
print(json.loads(Path.home().joinpath(".local/share/opencode/mcp-auth.json").read_text())["ords-mcp"]["tokens"]["accessToken"])
PY
)
./scripts/mcp-curl-smoke.sh
Réinitialisations
| Objectif | Commande |
|---|---|
| Redémarrer ORDS seul | docker compose restart ords |
| Reconstruire la config JWT/pools ORDS | docker compose stop ords && docker compose rm -f ords && docker volume rm ords_ords-config && docker compose up -d ords |
| Tout effacer (base + config ORDS) | docker compose down -v && docker compose up -d --build |
| Effacer les jetons OpenCode | opencode mcp logout ords-mcp |
Critères de succès
/mcp renvoie 401 sans jetonresource = http://127.0.0.1:8080/mcproles2 et permissions incluant le scope MCPopencode mcp list → connected (OAuth)database_list correspond aux rôles (FIN → mcp-fin uniquement)Un souci ? Voir le dépannage Comprendre ce qui s’est passé (OAuth)