Aller au contenu principal

Nouveaux workflows avec MCP et agents

Du ticket à la PR : automatisation complète

La nouvelle réalité : L'IA pilote maintenant tout le workflow de développement.

Avant : Lire ticket → Coder → Tests → PR → Review

Maintenant : Ticket → Agent IA fait tout → Review humain → Merge

Votre nouveau rôle : Se concentrer sur la qualité, la cohérence et la robustesse. Pas sur le code bas niveau.


Le workflow "Ticket to PR"

Workflow du ticket à la PR

Voilà ce qui se passe concrètement :

1. User crée ticket (📝)

Un ticket Jira ou GitHub issue décrit une feature ou un bug :

Title: Add CSV export for sales reports

Description:
Users need to export sales data to CSV.
- GET /api/reports/sales/export?start_date=X&end_date=Y
- Returns CSV with columns: date, product, quantity, revenue
- Filename: sales_YYYY-MM-DD_to_YYYY-MM-DD.csv

2. Fetch via MCP (🔌)

MCP = Model Context Protocol. Un standard pour connecter l'IA à vos outils (Jira, GitHub, databases, etc.).

Le dev utilise un agent MCP dans son IDE pour récupérer les tickets :

# Dans Claude Code
"Liste les tickets Jira assignés à moi avec statut 'To Do'"

# L'agent MCP se connecte à Jira API et récupère les infos

Installation d'un MCP server (exemple Jira) :

npm install -g @modelcontextprotocol/server-jira

Configuration dans ~/.config/claude/config.json :

{
"mcpServers": {
"jira": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-jira"],
"env": {
"JIRA_URL": "https://your-company.atlassian.net",
"JIRA_EMAIL": "you@company.com",
"JIRA_API_TOKEN": "your-token"
}
}
}
}

Résultat : Claude peut maintenant lire vos tickets Jira directement.


3. Sélection ticket (👆)

Le dev choisit le ticket à traiter en 4 étapes :

3.1 Authentification

Connecter le serveur MCP Jira avec son token :

claude mcp add --transport sse atlassian https://mcp.atlassian.com/v1/sse

Le token Jira est configuré dans l'environnement. Claude peut maintenant accéder aux tickets.

3.2 Lister les projets

"Liste mes projets Jira"

→ Affiche les projets accessibles avec le token

3.3 Filtrer les tickets

"Tickets assignés à moi, statut 'To Do', projet X"

→ Liste des tickets filtrés avec priorité et labels

3.4 Choisir un ticket

"Je prends le ticket ABC-123"

→ Claude récupère description complète, requirements, acceptance criteria

Résultat : Contexte complet du ticket dans l'IDE, pas besoin d'ouvrir Jira.


4. Planification multi-agents (🧠)

L'IA utilise plusieurs personas/subagents pour analyser le besoin :

  • Persona Architecte : "Quelle structure ? Où placer le code ?"
  • Persona Sécurité : "Quels risques ? Injection SQL ? Rate limiting ?"
  • Persona Testeur : "Quels tests écrire ? Quels cas limites ?"

Chaque persona donne son avis. L'IA synthétise un plan d'action.

Exemple de plan généré :

1. Ajouter endpoint GET /api/reports/sales/export dans src/api/reports.ts
2. Utiliser csv-writer pour générer le CSV
3. Ajouter header Content-Type: text/csv et attachment
4. Tester avec données réelles + données vides + dates invalides
5. Vérifier sécurité : pas d'injection, validation des dates

5. Production code (TDD) (⚙️)

L'agent autonome génère le code en suivant le cycle TDD :

Spec → Tests → Code → Tests pass

Cadrage par les instructions : L'agent suit les directives du projet (fichier CLAUDE.md, conventions, stack technique). Plus les instructions sont claires, meilleur est le code généré.

Qualité des inputs : L'agent a besoin de tickets bien structurés. Utiliser des templates d'issues (GitHub, Jira) garantit que toutes les infos nécessaires sont présentes : critères d'acceptation, contraintes techniques, exemples de résultats attendus.

GitHub Issue Templates

L'agent écrit d'abord les tests, puis le code pour les faire passer. Si les tests échouent, il corrige. Boucle jusqu'au vert.


6. Contrôle qualité (✅)

Les personas vérifient le résultat :

  • Persona Sécurité : "Vérifie qu'il n'y a pas d'injection, que les dates sont validées"
  • Persona Testeur : "Vérifie que la couverture est > 80%, que tous les tests passent"
  • Persona Architecte : "Vérifie que ça respecte les conventions du projet, la cohérence globale"
  • Persona Documentation : "Vérifie que les changements n'ont pas créé d'incohérences dans la doc (README, API spec, guides)"

Si tout est OK, on passe à l'étape suivante. Sinon, retour à l'étape 5.


7. Pull Request prête → Review humain (👤)

L'agent crée automatiquement la PR avec :

Title: feat(reports): add CSV export for sales data

Closes #123

## Implementation
- Added GET /api/reports/sales/export endpoint
- Uses csv-writer for CSV generation
- Returns file with attachment header

## Tests
✓ 15/15 tests passing
✓ Coverage: 87%

## Security
✓ Input validation on dates
✓ No SQL injection risk

## Files changed
- src/api/reports.ts (+28 lines)
- tests/api/reports.test.ts (+24 lines)
- package.json (added csv-writer dependency)

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>

Le dev review : vérifie la logique métier, teste manuellement, puis merge.


MCP : Connecter l'IA à vos outils

MCP = Model Context Protocol. Standard ouvert pour connecter les LLM à des sources de données externes.

Architecture simple

┌─────────────────┐
│ Claude Code │
│ (MCP Client) │
└────────┬────────┘
│ MCP Protocol

┌────────▼────────┐
│ MCP Server │
│ (ex: Jira) │
└────────┬────────┘

┌────────▼────────┐
│ Jira API │
└─────────────────┘

MCP Servers disponibles

  • @modelcontextprotocol/server-jira : Tickets Jira
  • @modelcontextprotocol/server-github : Issues, PRs GitHub
  • @modelcontextprotocol/server-postgres : Bases de données
  • @modelcontextprotocol/server-slack : Messages Slack
  • Et plein d'autres : https://github.com/modelcontextprotocol/servers

Créer votre propre MCP server

Si vous avez une API interne, créez un MCP server custom :

import { Server } from '@modelcontextprotocol/sdk/server/index.js';

const server = new Server({
name: 'my-api-server',
version: '1.0.0',
});

// Définir un tool
server.setRequestHandler('tools/list', async () => ({
tools: [
{
name: 'get_sales_data',
description: 'Query internal sales database',
inputSchema: {
type: 'object',
properties: {
start_date: { type: 'string' },
end_date: { type: 'string' }
}
}
}
]
}));

// Implémenter le tool
server.setRequestHandler('tools/call', async (request) => {
if (request.params.name === 'get_sales_data') {
const { start_date, end_date } = request.params.arguments;
const results = await myInternalAPI.getSales(start_date, end_date);
return { content: [{ type: 'text', text: JSON.stringify(results) }] };
}
});

Résultat : Claude peut maintenant interroger votre API interne.


Architectures agentiques avec LangChain

LangChain = Framework pour créer des agents autonomes qui utilisent des outils pour atteindre un objectif.

Agent simple avec outils

from langchain.agents import initialize_agent, Tool
from langchain.llms import Anthropic

# Définir les outils disponibles
tools = [
Tool(
name="search_code",
func=search_codebase,
description="Search for functions/classes in codebase"
),
Tool(
name="run_tests",
func=run_pytest,
description="Execute pytest and return results"
),
]

# Créer l'agent
llm = Anthropic(model="claude-3-5-sonnet-20241022")
agent = initialize_agent(
tools=tools,
llm=llm,
agent="zero-shot-react-description",
)

# Utiliser l'agent
result = agent.run("""
Find all authentication functions,
check if they have tests,
and report coverage gaps.
""")

L'agent va :

  1. Utiliser search_code pour trouver les fonctions auth
  2. Utiliser run_tests pour vérifier la couverture
  3. Générer un rapport

Multi-agents avec CrewAI

CrewAI = Plusieurs agents spécialisés qui collaborent.

from crewai import Agent, Task, Crew

# Agents spécialisés
analyst = Agent(
role='Requirements Analyst',
goal='Understand ticket and create plan',
tools=[jira_tool, search_tool]
)

developer = Agent(
role='Developer',
goal='Implement code following plan',
tools=[code_tool, git_tool]
)

tester = Agent(
role='QA Tester',
goal='Write comprehensive tests',
tools=[test_tool, coverage_tool]
)

# Tâches
task1 = Task(description='Analyze ticket PROJ-123', agent=analyst)
task2 = Task(description='Implement the feature', agent=developer, context=[task1])
task3 = Task(description='Write tests', agent=tester, context=[task2])

# Créer l'équipe et lancer
crew = Crew(agents=[analyst, developer, tester], tasks=[task1, task2, task3])
result = crew.kickoff()

Résultat : Ticket → Analyse → Code → Tests, entièrement automatisé.


Ressources :