← Tous les projets

Projet IA

Agent de recherche de stage

Un agent qui cherche chaque jour des offres de stage et d'alternance, les note selon mes critères et rédige un rapport des 12 meilleures. Conçu pour lire du texte non fiable du web sans jamais fuiter mon CV ni se faire piéger.

  • Python
  • Agents IA
  • Claude Code
  • MCP
  • Docker
  • SQLite
  • Sécurité

Le projet

Chercher un stage, c’est relire chaque jour des dizaines d’offres sur plusieurs sites. Cet agent le fait pour moi : il cherche les offres de stage et d’alternance, écarte celles qu’il a déjà vues, note les nouvelles selon mes critères et écrit un rapport en français des 12 meilleures.

Il peut aussi préparer un brouillon d’e-mail de candidature pour une offre. Mais il n’envoie jamais rien : il ne postule pas, n’envoie aucun message et ne crée aucun compte. Je relis et j’envoie moi-même.

C’est un projet personnel, en dehors du cursus. Le code est public sur GitHub (licence MIT).

Comment ça marche

  • L’agent est Claude Code, lancé sans interface par un script.
  • Ses outils sont des serveurs MCP écrits en Python, un par source : l’API officielle de La bonne alternance, les pages carrières des entreprises (les API publiques de leurs logiciels de recrutement) et un connecteur Indeed.
  • Une mémoire SQLite retient chaque offre déjà notée. Elle repère aussi les offres republiées sous un autre identifiant, et signale les « offres fantômes », republiées depuis plus de 60 jours.
  • L’affichage en direct montre chaque étape dans le terminal : sources connectées, appels d’outils, nombre d’offres trouvées.

La sécurité, le cœur du projet

Un agent qui lit des offres d’emploi lit du texte écrit par des inconnus. Une offre peut contenir une injection de prompt : des instructions cachées pour tromper l’agent. Le projet est construit pour que ça ne serve à rien :

  • L’agent qui lit les offres n’a pas accès à mon CV, ni aux brouillons, ni aux secrets. Il ne peut pas fuiter ce qu’il ne voit pas.
  • Chaque agent tourne dans un conteneur Docker qui ne voit que les fichiers de sa tâche : système en lecture seule, sans droits.
  • Liste blanche d’outils : pas de shell, pas de navigation web libre, pas d’écriture en dehors du dossier des rapports.
  • Chaque lien du rapport est vérifié par du code : un lien qu’aucun serveur n’a renvoyé (inventé, ou copié depuis une offre piégée) est marqué DANGER, et le script s’arrête.
  • Les serveurs MCP vérifient chaque identifiant avant de l’utiliser dans une URL, limitent leurs requêtes et ne montrent jamais la réponse brute d’une API dans leurs erreurs.
  • Chaîne d’approvisionnement verrouillée : images Docker et paquets Python figés par empreinte.

Le mode test utilise de fausses offres, dont une avec une injection de prompt, pour vérifier que l’agent ne se laisse pas piéger.

Ce que j’ai appris

  • Concevoir un agent en partant de ce qu’il ne doit jamais pouvoir faire.
  • Séparer les rôles : l’agent qui lit le web n’est pas celui qui connaît mes données.
  • Contrôler la sortie d’un LLM avec du code, plutôt que de lui faire confiance.