Six mois plus tôt, cela nécessitait un développeur backend, un ingénieur DevOps et deux semaines. Aujourd'hui, une seule phrase et Claude suffisent. Voici l'architecture complète – et pourquoi la plupart des développeurs n'ont pas encore compris cela.
Le modèle mental que la plupart des gens ont de l'IA est erroné.
Ils pensent : Assistant IA → tu poses des questions → il répond.
La réalité en 2026 : Agent IA → tu décris un système → il construit, déploie et connecte ce système à ton environnement. Pas un prototype. Pas un extrait de code. Une application fonctionnelle.
Ce changement a un nom : l'architecture d'application générative. Et la pile qui la rend pratique – Claude + Obsidian + MCP – est disponible pour tout le monde dès maintenant.
1. Ce que signifie réellement l'architecture d'application générative
Développement logiciel traditionnel :
1Idée → Spécification → Conception → Développement frontend → Développement backend2→ Configuration base de données → Intégration API → Tests → Déploiement3Durée : semaines. Coût : milliers.
Architecture d'application générative :
1Idée → Prompt → Système fonctionnel2Durée : minutes. Coût : tokens API.
L'agent IA ne se contente pas d'écrire du code. Il exécute une boucle agentique complète en coulisse :
Étape 1 – Décomposition
Ta demande abstraite ("construis un CRM pour un lavage auto") est décomposée en dizaines de sous-tâches atomiques : schéma de base de données, composants UI, logique de notification, flux d'authentification, points d'accès API.
Étape 2 – Cartographie de l'environnement via MCP
Grâce au Model Context Protocol, l'agent comprend instantanément à quels outils il a accès – ton système de fichiers, les paquets installés, les services en cours d'exécution, les API disponibles.
Étape 3 – Construction et test itératifs
L'agent écrit du code, l'exécute, détecte les erreurs de compilation, les corrige et reteste – de manière autonome – jusqu'à ce que le système fonctionne correctement.
Étape 4 – Déploiement contextuel
Le résultat n'est pas un fichier texte avec du code. C'est un environnement local en direct ou une application web déployable.
C'est la différence entre un outil qui assiste les développeurs et un système qui remplace entièrement la chaîne de construction.
2. Claude comme moteur – trois modes de déploiement
Mode 1 – Artifacts Claude
Le chemin le plus rapide du prompt à l'application fonctionnelle. Quand tu demandes à Claude de construire quelque chose, il ouvre une fenêtre Artifact interactive et assemble, compile et exécute une application web complète en temps réel – React, HTML, JavaScript – pendant que tu regardes.
Tu peux interagir avec l'application en cours d'exécution dans l'Artifact, l'itérer en langage naturel et exporter l'archive complète.
Prompt qui produit un suivi financier prêt pour la production :
1Construis une application de suivi financier personnel avec :23FONCTIONNALITÉS :4- Journal des transactions (ajouter/modifier/supprimer avec catégories)5- Vue budget mensuel avec barres de progression6- Suivi du portefeuille crypto récupérant les prix en direct depuis l'API CoinGecko7- Calcul de la valeur nette mis à jour en temps réel8- Bouton mode sombre910EXIGENCES TECHNIQUES :11- Application React mono-fichier12- useState + useEffect uniquement (pas de gestion d'état externe)13- Tailwind CSS pour le style14- Récupération depuis des API publiques (pas d'authentification requise)15- Responsive mobile1617DONNÉES :18- Persistance dans localStorage entre les sessions19- Export des transactions au format CSV2021Résultat : application complète autonome prête à être déployée.
Ce que Claude Artifacts renvoie – une application React complète :
1import { useState, useEffect } from "react";23const CATEGORIES = ["Housing","Food","Transport","Entertainment","Health","Savings","Income","Crypto","Other"];4const CRYPTO_IDS = { BTC: "bitcoin", ETH: "ethereum", SOL: "solana" };56export default function FinanceTracker() {7 const [transactions, setTransactions] = useState(() =>8 JSON.parse(localStorage.getItem("transactions") || "[]")9 );10 const [cryptoPrices, setCryptoPrices] = useState({});11 const [form, setForm] = useState({ description:"", amount:"", category:"Other", type:"expense", date:"" });12 const [darkMode, setDarkMode] = useState(false);1314 useEffect(() => {15 const ids = Object.values(CRYPTO_IDS).join(",");16 fetch(`https://api.coingecko.com/api/v3/simple/price?ids=${ids}&vs_currencies=usd`)17 .then(r => r.json())18 .then(data => {19 const prices = {};20 Object.entries(CRYPTO_IDS).forEach(([sym, id]) => { prices[sym] = data[id]?.usd || 0; });21 setCryptoPrices(prices);22 });23 }, []);2425 useEffect(() => {26 localStorage.setItem("transactions", JSON.stringify(transactions));27 }, [transactions]);2829 const addTransaction = () => {30 if (!form.description || !form.amount) return;31 setTransactions(prev => [...prev, { ...form, id: Date.now(), amount: parseFloat(form.amount),32 date: form.date || new Date().toISOString().split("T")[0] }]);33 setForm({ description:"", amount:"", category:"Other", type:"expense", date:"" });34 };3536 const totalIncome = transactions.filter(t => t.type === "income").reduce((s,t) => s + t.amount, 0);37 const totalExpenses = transactions.filter(t => t.type === "expense").reduce((s,t) => s + t.amount, 0);38 const netWorth = totalIncome - totalExpenses;3940 const bg = darkMode ? "#0D0D0D" : "#F9F7F4";41 const card = darkMode ? "#1A1A1A" : "#FFF";42 const text = darkMode ? "#F0F0F0" : "#1A1A1A";43 const border = darkMode ? "#2A2A2A" : "#E8E8E8";4445 return (46 <div style={{ minHeight:"100vh", background:bg, color:text, fontFamily:"system-ui, sans-serif" }}>47 <div style={{ maxWidth:800, margin:"0 auto", padding:"24px 16px" }}>4849 <div style={{ display:"flex", justifyContent:"space-between", marginBottom:24 }}>50 <div>51 <h1 style={{ fontSize:22, fontWeight:500, margin:0 }}>Finance Tracker</h1>52 <p style={{ margin:"4px 0 0", fontSize:13, color: netWorth >= 0 ? "#22C55E" : "#EF4444" }}>53 Net worth: ${netWorth.toFixed(2)}54 </p>55 </div>56 <button onClick={() => setDarkMode(!darkMode)}57 style={{ padding:"8px 14px", borderRadius:8, border:`1px solid ${border}`,58 background:card, color:text, cursor:"pointer" }}>59 {darkMode ? "Light" : "Dark"}60 </button>61 </div>6263 <div style={{ display:"grid", gridTemplateColumns:"1fr 1fr", gap:10, marginBottom:20 }}>64 {[["Income","#22C55E",totalIncome],["Expenses","#EF4444",totalExpenses]].map(([label,color,val]) => (65 <div key={label} style={{ background:card, border:`1px solid ${border}`, borderRadius:10, padding:14 }}>66 <p style={{ margin:0, fontSize:12, color:"#999" }}>{label}</p>67 <p style={{ margin:"4px 0 0", fontSize:20, fontWeight:600, color }}>${val.toFixed(2)}</p>68 </div>69 ))}70 </div>7172 <div style={{ background:card, border:`1px solid ${border}`, borderRadius:10, padding:16, marginBottom:20 }}>73 <div style={{ display:"grid", gridTemplateColumns:"2fr 1fr 1fr", gap:8, marginBottom:8 }}>74 <input placeholder="Description" value={form.description}75 onChange={e => setForm(p => ({ ...p, description: e.target.value }))}76 style={{ padding:"9px 12px", borderRadius:8, border:`1px solid ${border}`, background:bg, color:text, fontSize:13 }} />77 <input type="number" placeholder="Amount" value={form.amount}78 onChange={e => setForm(p => ({ ...p, amount: e.target.value }))}79 style={{ padding:"9px 12px", borderRadius:8, border:`1px solid ${border}`, background:bg, color:text, fontSize:13 }} />80 <select value={form.type} onChange={e => setForm(p => ({ ...p, type: e.target.value }))}81 style={{ padding:"9px 12px", borderRadius:8, border:`1px solid ${border}`, background:bg, color:text, fontSize:13 }}>82 <option value="expense">Expense</option>83 <option value="income">Income</option>84 </select>85 </div>86 <div style={{ display:"grid", gridTemplateColumns:"2fr auto", gap:8 }}>87 <select value={form.category} onChange={e => setForm(p => ({ ...p, category: e.target.value }))}88 style={{ padding:"9px 12px", borderRadius:8, border:`1px solid ${border}`, background:bg, color:text, fontSize:13 }}>89 {CATEGORIES.map(c => <option key={c}>{c}</option>)}90 </select>91 <button onClick={addTransaction}92 style={{ padding:"9px 20px", borderRadius:8, background:"#E8692A",93 color:"#fff", border:"none", cursor:"pointer", fontSize:13, fontWeight:500 }}>94 Add95 </button>96 </div>97 </div>9899 <div style={{ background:card, border:`1px solid ${border}`, borderRadius:10, overflow:"hidden" }}>100 <p style={{ margin:0, padding:"12px 16px", borderBottom:`1px solid ${border}`, fontSize:13, fontWeight:500 }}>101 Transactions ({transactions.length})102 </p>103 {transactions.slice().reverse().map(t => (104 <div key={t.id} style={{ display:"flex", justifyContent:"space-between",105 alignItems:"center", padding:"11px 16px", borderBottom:`1px solid ${border}` }}>106 <div>107 <p style={{ margin:0, fontSize:13, fontWeight:500 }}>{t.description}</p>108 <p style={{ margin:"2px 0 0", fontSize:12, color:"#999" }}>{t.category} · {t.date}</p>109 </div>110 <span style={{ fontSize:14, fontWeight:600, color: t.type==="income" ? "#22C55E" : "#EF4444" }}>111 {t.type==="income" ? "+" : "-"}${t.amount.toFixed(2)}112 </span>113 </div>114 ))}115 </div>116 </div>117 </div>118 );119}
Voici l'application complète. Un seul prompt. Elle s'exécute instantanément dans les Artifacts Claude.
Mode 2 – Claude + MCP (déploiement local)
MCP (Model Context Protocol) donne à Claude un accès direct à ton environnement local. Un seul prompt ne se contente pas de générer du code – il crée des dossiers sur ton disque dur, installe des paquets via le terminal, écrit des fichiers de configuration et démarre un serveur local.
La configuration MCP qui connecte Claude à ton système de fichiers :
1{2 "mcpServers": {3 "filesystem": {4 "command": "npx",5 "args": [6 "-y",7 "@modelcontextprotocol/server-filesystem",8 "/Users/yourname/Projects"9 ]10 },11 "terminal": {12 "command": "npx",13 "args": ["-y", "@modelcontextprotocol/server-terminal"]14 },15 "sqlite": {16 "command": "npx",17 "args": [18 "-y",19 "@modelcontextprotocol/server-sqlite",20 "--db-path",21 "/Users/yourname/Projects/app.db"22 ]23 }24 }25}
Avec cette configuration active, un seul prompt :
1Construis et déploie un système CRM local pour un lavage auto.23Crée le projet dans ~/Projects/carwash-crm/4Installe les dépendances automatiquement.5Configure une base de données SQLite avec des tables pour :6- clients (nom, téléphone, email, véhicule, notes)7- visites (client_id, date, service, prix, statut)8- personnel (nom, rôle, planning)910Construis une interface web avec :11- Recherche et profils clients12- Historique des visites par client13- Tableau de bord des revenus par mois14- Système de rappels SMS (intégration Twilio, configuration uniquement)1516Démarre le serveur de développement une fois terminé.17Rapporte l'URL localhost quand c'est prêt.
Claude exécute cela de bout en bout via MCP – création de la structure de répertoires, installation des paquets Node, écriture du schéma de base de données, construction de l'interface utilisateur et démarrage du serveur. Tu obtiens une URL localhost.
Mode 3 – Projets Claude avec les normes de l'entreprise
Télécharge une fois ton kit UI, tes tokens de design, ta documentation API et tes exigences de sécurité dans un Projet Claude. Chaque système que Claude génère ensuite se conforme automatiquement à ta pile interne.
1[Le contexte du Projet Claude contient :]2- design-system.md (couleurs, typographie, espacement)3- api-standards.md (schémas d'authentification, codes d'erreur)4- security-policy.md (règles de validation des entrées, configuration CORS)5- stack.md (React 18, TypeScript, Tailwind, Prisma, PostgreSQL)67Prompt :8"Construis un formulaire d'onboarding client avec vérification par e-mail9et une entrée automatique dans la base de données Notion à la soumission."1011Résultat : code prêt pour la production qui correspond exactement à ta pile12- aucun nettoyage requis.
3. Obsidian comme centre de commande IA
Obsidian en 2026 n'est pas une application de prise de notes. C'est un centre de commande IA personnel où ta base de connaissances accumulée devient la couche de contexte pour chaque système que tu construis.
Le changement d'architecture : ton coffre n'est plus un stockage. C'est du RAG (Retrieval Augmented Generation) – une base de connaissances vivante que les agents IA interrogent avant d'exécuter une tâche.
La pile de plugins qui rend cela possible :
Smart Connections – indexe l'intégralité de ton coffre et envoie les notes pertinentes comme contexte à chaque appel IA.
Obsidian Copilot – connecte directement ton coffre à l'API Claude. Configure une fois :
12 "provider": "anthropic",3 "model": "claude-opus-4-8",4 "apiKey": "YOUR_ANTHROPIC_KEY",5 "systemPrompt": "Tu es un architecte système. Tu as accès à l'ensemble du coffre de connaissances de l'utilisateur comme contexte. Lors de la construction de systèmes, référence ses notes existantes, ses décisions passées et ses schémas établis. Résultat : code fonctionnel + structure de fichiers Obsidian.",6 "contextWindow": {7 "includeActiveFile": true,8 "includeLinkedFiles": true,9 "includeRecentFiles": 10,10 "includeFolders": ["Projects", "Systems", "Decisions"]11 }12}
Canvas comme interface de conception système
Un seul prompt crée un Canvas Obsidian interactif où Claude dispose l'architecture complète du système sous forme de blocs connectés.
1Prompt dans Obsidian Canvas :2"Conçois un pipeline de production de contenu pour mon compte Twitter.3Je publie 3 articles par semaine et je gère 5 deals sponsorisés.4Référence mes notes de calendrier de contenu existantes."56Résultat : Canvas avec des blocs connectés pour :7→ Idéation de contenu (extrait de tes notes d'intérêt)8→ Flux Brouillon → Relecture → Publication9→ Suivi des sponsors avec alertes d'échéance10→ Tableau de bord d'analytiques11→ Logique de publication croisée automatisée12→ Chaque bloc renvoie au fichier Obsidian pertinent
Le résultat Canvas que Claude génère sous forme de fichier structuré :
1{2 "nodes": [3 {4 "id": "ideation",5 "type": "file",6 "file": "Systems/ContentPipeline/Ideation.md",7 "x": 0, "y": 0, "width": 300, "height": 200,8 "color": "1"9 },10 {11 "id": "draft",12 "type": "file",13 "file": "Systems/ContentPipeline/Draft.md",14 "x": 400, "y": 0, "width": 300, "height": 200,15 "color": "3"16 },17 {18 "id": "sponsors",19 "type": "file",20 "file": "Systems/ContentPipeline/SponsorTracker.md",21 "x": 0, "y": 300, "width": 300, "height": 200,22 "color": "5"23 },24 {25 "id": "analytics",26 "type": "file",27 "file": "Systems/ContentPipeline/Analytics.md",28 "x": 400, "y": 300, "width": 300, "height": 200,29 "color": "6"30 }31 ],32 "edges": [33 {34 "id": "e1",35 "fromNode": "ideation", "fromSide": "right",36 "toNode": "draft", "toSide": "left",37 "label": "approved concepts"38 },39 {40 "id": "e2",41 "fromNode": "sponsors", "fromSide": "right",42 "toNode": "draft", "toSide": "bottom",43 "label": "brief integration"44 }45 ]46}
4. LLM locaux pour une confidentialité totale
Pour les données sensibles – systèmes clients, outils financiers, outils internes – tu passes par un modèle local au lieu d'une API cloud. Aucune donnée ne quitte ta machine.
1# Installer Ollama2curl -fsSL https://ollama.com/install.sh | sh34# Tirer un modèle capable de coder5ollama pull llama3.2:latest6# ou pour une génération de code plus puissante :7ollama pull qwen2.5-coder:32b89# Démarrer le serveur local10ollama serve11# S'exécute sur localhost:11434
Configure Obsidian Copilot pour utiliser le point d'accès local :
1{2 "provider": "ollama",3 "model": "qwen2.5-coder:32b",4 "baseUrl": "http://localhost:11434",5 "systemPrompt": "Tu es un constructeur de système local avec accès au système de fichiers de l'utilisateur via MCP. Construis des systèmes complets fonctionnels. N'envoie jamais de données vers des API externes sans instruction explicite."6}
Le pont modèle local + MCP :
1import requests2import json3from pathlib import Path4from watchdog.observers import Observer5from watchdog.events import FileSystemEventHandler67OBSIDIAN_INBOX = Path.home() / "Obsidian" / "AI-Inbox"8PROJECTS_DIR = Path.home() / "Projects"9OLLAMA_URL = "http://localhost:11434/api/generate"1011class InboxWatcher(FileSystemEventHandler):12 """13 Surveiller le dossier Obsidian AI-Inbox.14 Quand un nouveau fichier .md apparaît, le traiter comme un prompt de construction.15 Le passer au LLM local -> exécuter via MCP -> rapporter le résultat.16 """1718 def on_created(self, event):19 if not event.src_path.endswith(".md"):20 return2122 prompt_file = Path(event.src_path)23 prompt = prompt_file.read_text()2425 print(f"[Inbox] Nouveau prompt : {prompt_file.name}")26 self.execute_prompt(prompt, prompt_file.stem)2728 def execute_prompt(self, prompt: str, project_name: str):29 response = requests.post(OLLAMA_URL, json={30 "model": "qwen2.5-coder:32b",31 "prompt": f"""Tu es un constructeur de système.32 Construis ce système : {prompt}3334 Produis un plan JSON avec :35 {{36 "project_dir": "chemin relatif",37 "files": [38 {{"path": "chemin relatif", "content": "contenu du fichier"}}39 ],40 "commands": ["npm install", "etc"],41 "summary": "ce qui a été construit"42 }}""",43 "stream": False44 })4546 plan = json.loads(response.json()["response"])47 project_dir = PROJECTS_DIR / plan["project_dir"]48 project_dir.mkdir(parents=True, exist_ok=True)4950 for file_spec in plan["files"]:51 file_path = project_dir / file_spec["path"]52 file_path.parent.mkdir(parents=True, exist_ok=True)53 file_path.write_text(file_spec["content"])54 print(f"[Build] Créé : {file_path}")5556 result_file = OBSIDIAN_INBOX / f"{project_name}-result.md"57 result_file.write_text(58 f"# Construction terminée : {project_name}\n\n"59 f"**Emplacement :** {project_dir}\n\n"60 f"**Résumé :** {plan['summary']}\n\n"61 f"**Fichiers créés :** {len(plan['files'])}\n"62 )63 print(f"[Terminé] Résultat écrit dans Obsidian")6465if __name__ == "__main__":66 OBSIDIAN_INBOX.mkdir(exist_ok=True)67 observer = Observer()68 observer.schedule(InboxWatcher(), str(OBSIDIAN_INBOX), recursive=False)69 observer.start()70 print(f"[Surveillance] {OBSIDIAN_INBOX}")7172 try:73 while True:74 import time; time.sleep(1)75 except KeyboardInterrupt:76 observer.stop()77 observer.join()
Dépose un fichier .md dans ton dossier Obsidian AI-Inbox avec un prompt de construction. Le pont le récupère, le route via le modèle local, construit le système dans ton dossier Projects, et écrit une note d'achèvement dans Obsidian.
5. Le flux de travail complet – de l'idée au système déployé
1ÉTAPE 1 – Saisie2Dans Obsidian, sur ton panneau IA, écris :3"Système financier personnel avec intégration crypto4et suivi budgétaire mensuel."5Appuie sur Générer.67ÉTAPE 2 – Assemblage du contexte8Le plugin Smart Connections scanne ton coffre.9Trouve tes notes financières des 3 derniers mois.10Les envoie comme contexte à l'API Claude.1112ÉTAPE 3 – Architecture13Claude (Opus 4.8) conçoit le système :14- Schéma de base de données15- Composants UI16- Intégrations API17- Structure de fichiers1819ÉTAPE 4 – Construction20Claude (Sonnet 5) implémente via MCP :21- Crée ~/Projects/finance-tracker/22- Installe les dépendances23- Écrit tous les fichiers24- Démarre le serveur de développement sur localhost:30002526ÉTAPE 5 – Résultat27Obsidian crée un dossier : Système financier/28À l'intérieur : tableaux de bord liés, notes de configuration,29et un lien direct vers l'application en cours d'exécution.
Temps total de l'étape 1 à l'application fonctionnelle : 4 à 12 minutes.
Le changement que cela représente
Ce n'est pas une façon plus rapide d'écrire du code.
C'est une relation différente entre l'idée et l'exécution.
La contrainte sur ce que tu peux construire était autrefois la compétence technique et le temps. Un non-développeur ne pouvait pas construire un CRM. Un développeur solo ne pouvait pas construire cinq systèmes simultanément. Une équipe ne pouvait pas livrer en heures plutôt qu'en semaines.
Ces trois contraintes ont disparu.
La nouvelle contrainte est la clarté de la pensée – la capacité à décrire précisément ce dont tu as besoin, à comprendre à quoi ressemble un bon résultat, et à itérer dessus. C'est une compétence de réflexion, pas une compétence technique.
L'architecture d'application générative ne rend pas les développeurs obsolètes. Elle rend la capacité à penser en systèmes – à raisonner sur ce dont tu as besoin avant de le construire – considérablement plus précieuse que la capacité à écrire le code qui l'implémente.
La pile est là. Les modèles sont capables. La seule variable qui reste est de savoir si tu construis avec ou si tu lis des articles sur ceux qui le font.
Cet article décrit les capacités disponibles dans Claude, Obsidian et MCP en juillet 2026. Les versions spécifiques des plugins et les configurations API peuvent changer. Vérifie toujours la documentation actuelle avant de mettre en œuvre.
Merci d'avoir lu.





