# MCP est un transport, Non une architecture

<!-- category -- MCP, ACP, AI,Architecture,LLM,Patterns -->
<datetime class="hidden">2026-01-20T16:00</datetime>

**"Comment construire un serveur MCP?" est la mauvaise question**

Il existe des SDKs. Un LLM peut former un scaffold en quelques secondes . La question réelle est :

> *Quel rôle devrait jouer un serveur MCP à l'intérieur d'un système qui ne doit pas être lié?*

La rare compétence actuelle consiste à concevoir **système autour** MCP: autoritéM SK1 autorisation, vérifiabilité , et contrôle déterministeMNK4 Le MCP gère le transport MMK5 ces préoccupations vivent ailleursMRK6

Cet article explique comment j'utilise MCP **sans agents, autonome, ou vibes**, et pourquoi la plupart des exemples de MCP récréent les mêmes problèmes que ceux que nous avons vu avec l’appel d’outils non contraints.

*Il s'agit d'une partie 2 des "LLMs en tant que composantes". [Partie 1: Pourquoi les LLM échouent en tant que capteurs](/blog/llms-fail-as-sensors) Cet article porte sur l’erreur de catégorie d’utilisation des LLM pour la perception.*

[TOC]

---


## Qu’est-ce que le MCP en fait ? (et n’est‐il pas?

MCP (Model Context Protocol) est un **protocole de câble**. Il se déplace

- Inputs et outputs
- Systèmes
- Les métadonnées de l'outil
- Développement des capacités

Il le fait. **non pas**:

- Décision *Lorsque :* les outils devraient être utilisés
- Valider la vérité
- Exécuter la confiance
- Gestion des effets secondaires

```mermaid
flowchart LR
    subgraph MCP["MCP: What It Does"]
        Schema[Schema Discovery] --> Transport[Transport Layer]
        Transport --> Invoke[Tool Invocation]
        Invoke --> Response[Structured Response]
    end

    subgraph NotMCP["Not MCP's Job"]
        When[When to run?]
        Trust[Is this true?]
        Should[Should we act?]
        Safe[Is this safe?]
    end

    style MCP fill:none,stroke:#16a34a,stroke-width:2px
    style NotMCP fill:none,stroke:#dc2626,stroke-width:2px
    style Schema fill:none,stroke:#059669,stroke-width:2px
    style Transport fill:none,stroke:#059669,stroke-width:2px
    style Invoke fill:none,stroke:#059669,stroke-width:2px
    style Response fill:none,stroke:#059669,stroke-width:2px
    style When fill:none,stroke:#dc2626,stroke-width:2px
    style Trust fill:none,stroke:#dc2626,stroke-width:2px
    style Should fill:none,stroke:#dc2626,stroke-width:2px
    style Safe fill:none,stroke:#dc2626,stroke-width:2px
```

**MCP est plus proche de OpenAPI qu'un cadre d'agents.**

Si vous 'utilisez MCP comme couche de raisonnement,, vous \' avez déjà fait l'erreur de la même catégorie décrite dans [Partie 1](/blog/llms-fail-as-sensors).

Si MCP est un transport, alors l'architecture vit au-dessus de ce dernier: orchestrationM SK2 politique , validationMNK4 persistanceMMK5 Le reste du présent article est celui de la couche

---


## Principe de base: Proposition vs décision

C'est la règle fondamentale de [RAG réduit](/blog/reduced-rag) et [Fuzziness restreinte](/blog/constrained-fuzzy-image-intelligence):

- **Les composantes probabilistes proposent**
- **Les systèmes déterministes décident**

Dans mes systèmes:

- Les LLM sont *Aucune fois* autorisations
- Les outils sont *Aucune fois* d'autonomisation
- Chaque réponse du MCP est une **Propositions**, n’est pas un fait

"DeterministeM SK1 ici ne signifie pas 't simpliste. Il signifie **Règles-géréeM SK1 reproduisable , et vérifiable**.

```mermaid
flowchart TD
    subgraph Proposers["Proposers (Probabilistic)"]
        LLM[LLM Synthesis]
        MCP1[MCP Tool Response]
        MCP2[MCP Tool Response]
    end

    subgraph Constrainer["Constrainer (Deterministic)"]
        Validate[Validate Proposals]
        Compare[Compare Confidence]
        Policy[Apply Policy Rules]
        Decide[Accept / Reject / Escalate]
    end

    subgraph Persistence["Persistence (Facts)"]
        Facts[(Verified Facts<br/>With Provenance)]
    end

    LLM --> Validate
    MCP1 --> Validate
    MCP2 --> Validate
    Validate --> Compare
    Compare --> Policy
    Policy --> Decide
    Decide --> Facts

    style Proposers fill:none,stroke:#d97706,stroke-width:2px
    style Constrainer fill:none,stroke:#2563eb,stroke-width:2px
    style Persistence fill:none,stroke:#16a34a,stroke-width:2px
    style LLM fill:none,stroke:#d97706,stroke-width:2px
    style MCP1 fill:none,stroke:#d97706,stroke-width:2px
    style MCP2 fill:none,stroke:#d97706,stroke-width:2px
    style Validate fill:none,stroke:#2563eb,stroke-width:2px
    style Compare fill:none,stroke:#2563eb,stroke-width:2px
    style Policy fill:none,stroke:#2563eb,stroke-width:2px
    style Decide fill:none,stroke:#2563eb,stroke-width:2px
    style Facts fill:none,stroke:#16a34a,stroke-width:3px
```

Le serveur MCP ne décide pas't. Le constrainer décideM SK2

---


## Pourquoi "Outils" sont-ils le mauvais modèle mental?

Le cadre MCP par défaut est:

- "Exposer les méthodes comme outils"
- "Laisez le modèle choisir l'outil à appeler
- " Demander la permission avant l'exécution"

Cela ne fonctionne pas pour des raisons prévisibles:

1. **Les descriptions d'outils deviennent des prompts**: Le LLM déduit l’intention du libellé, non de la sémantique du schéma
2. **Déplacement de la sélection des outils**: Le modèle optimise la plausibilité , non l'exactitude M SK2 et choisit les outils en fonction de la similitude des descriptions
3. **Les prompts de permission sont UX, non sûr**: Un dialogue modal n’empêche pas le choix de l’outil erroné
4. **Aucune reproductibilité**: Vous ne pouvez pas reproduire une session parce que la sélection de l'outil était probabiliste.

[Forme d'outils](https://arxiv.org/abs/2302.04761) (2023) établit la base théorique de l’utilisation des outils LLM : les modèles peuvent apprendre *Lorsque :* pour appeler les outils en mesurant les résultats réels. C’était un travail fondamental . Mais Toolformer fonctionne à l’heure de la formation avec des ensembles d’outils curatés - pas des systèmes d'agents de temps d’exécution avec des points finals arbitraires du PCMMSC3 La leçon de Toolformer n’est-elle pas? **mesurer objectivement les résultats**. Voir [ma comparaison de Voyager, Toolformer, et approches structurées](/blog/disejustvoyager) pour savoir pourquoi la structure bat le brilliance.

**Réélaborer: Les paramètres de MCP publient les signauxM SK1 non les actions.**

- Les signaux sont typés, bounded, et attribuables
- Tous les signaux ont une provenance de confiance,, , et des points témoins
- La langue naturelle est une *couche de présentation*, non le substrat

```mermaid
flowchart LR
    subgraph Wrong["❌ Tools Mental Model"]
        Desc[Tool Description<br/>'Gets weather for city'] --> LLM1[LLM Chooses]
        LLM1 --> Execute[Execute Action]
        Execute --> Trust1[Trust Result?]
    end

    subgraph Right["✓ Signals Mental Model"]
        Schema2[Typed Schema<br/>city: string, units: enum] --> Invoke2[Deterministic Invoke]
        Invoke2 --> Signal[Signal Response<br/>+ confidence + provenance]
        Signal --> Validate2[Constrainer Validates]
    end

    style Wrong fill:none,stroke:#dc2626,stroke-width:2px
    style Right fill:none,stroke:#16a34a,stroke-width:2px
    style Desc fill:none,stroke:#dc2626,stroke-width:2px
    style LLM1 fill:none,stroke:#dc2626,stroke-width:2px
    style Execute fill:none,stroke:#dc2626,stroke-width:2px
    style Trust1 fill:none,stroke:#dc2626,stroke-width:2px
    style Schema2 fill:none,stroke:#16a34a,stroke-width:2px
    style Invoke2 fill:none,stroke:#16a34a,stroke-width:2px
    style Signal fill:none,stroke:#16a34a,stroke-width:2px
    style Validate2 fill:none,stroke:#16a34a,stroke-width:2px
```

---


## Contrats de signalisation au-dessus du chat

Chaque point final de MCP dans mes systèmes a:

- **Un schéma**: Typed inputs and outputsM SK1 not free-form text
- **Confidentialité**: Quelle est la certitude de ce résultat?
- **Provenance**: D’où provient-il?
- **Indicateurs de preuve**: Qu’est-ce qui peut être vérifié indépendamment?

Aucune réponse libre-autorité du texte. Aucun M SK2effort le plus efficace " réponsesMSC4

**Exemples des systèmes de production:**

| Signale | Source de confiance MSC2 Pointeur des preuves MSC3
|--------|-------------------|------------------|
| Extraction du texte par OCR | FlorenceM SK2 cote de confiance
| Classification des images | Coefficient de similitude du CLIP MSC2 Emplacement MSC3 Coefficience de similitudes S+ ID d'image de référence M|
| Transcription sonore | Parole murmuranteM SK2 Confiance de niveau | Étendue d'échantillonnage du temps
| Identification de l'émetteur | Distance du groupe de diarisation

**La règle: Si un résultat n’est pas validé, il ne peut être validé.**

Il s'agit du même principe que [Règle de conception #5](/blog/llms-fail-as-sensors): les faits doivent être prouvés

---


## Le constérnateur: La partie que tout le monde passe

La plupart des tutorials MCP montrent:

1. Définir les outils
2. Connexion à LLM
3. Laissez-le courir

La composante manquante est la **Constrainer** - la logique déterministe selon laquelle

- Évaluer les propositions concurrentes
- Exécuter la politique
- Décide ce qui persiste et ce qui est rejeté
- Routes vers l'escalade lorsque la confiance est faible

```mermaid
flowchart TD
    subgraph Sources["Signal Sources"]
        Heuristics[Heuristics<br/>Text-likeliness: 0.3]
        LocalModel[Local Model<br/>Florence-2 OCR: 0.85]
        LLMCall[LLM Escalation<br/>GPT-4V: 0.92]
    end

    subgraph Constrainer["Constrainer Logic"]
        Receive[Receive All Signals]
        Check{Confidence<br/>≥ 0.7?}
        Cross[Cross-Validate<br/>Signals Agree?]
        Accept[Accept as Fact]
        Reject[Reject / Log]
        Escalate[Escalate to<br/>Higher Tier]
    end

    Heuristics --> Receive
    LocalModel --> Receive
    LLMCall --> Receive

    Receive --> Check
    Check -->|Yes| Cross
    Check -->|No| Escalate
    Cross -->|Yes| Accept
    Cross -->|No| Reject

    style Sources fill:none,stroke:#d97706,stroke-width:2px
    style Constrainer fill:none,stroke:#2563eb,stroke-width:2px
    style Heuristics fill:none,stroke:#d97706,stroke-width:2px
    style LocalModel fill:none,stroke:#d97706,stroke-width:2px
    style LLMCall fill:none,stroke:#d97706,stroke-width:2px
    style Receive fill:none,stroke:#2563eb,stroke-width:2px
    style Check fill:none,stroke:#2563eb,stroke-width:2px
    style Cross fill:none,stroke:#2563eb,stroke-width:2px
    style Accept fill:none,stroke:#16a34a,stroke-width:2px
    style Reject fill:none,stroke:#dc2626,stroke-width:2px
    style Escalate fill:none,stroke:#7c3aed,stroke-width:2px
```

**Décisions de constrainer réelles:**

- Rejet de la caption LLM lorsque les héuristiques ne sont pas d’accord sur le texte-likeliness
- Préférer un texte hallucinatoire de confiance plus bas-confidence, mais une OCR démontrée par rapport à un texte élevé
- Évacuer à la vision LLM seulement lorsque le modèle local est fiable < 0.7

**MCP relie les composants. Le constrainer les régitM SK1**

---


## Démarrage du LLM (et pourquoi je le fais)

Mon serveur MCP fonctionne toujours avec le LLM désactivé.

Il s’agit d’un mode dégradé. **mode primaire**.

Si votre système cesse de fonctionner lorsque le LLM n'est pas disponible, la LLM faisait un travail qu'elle ne devrait pas' avoirM SK2

C'est le même principe qui sous-tend [Pourquoi la structure bat le brilliance](/blog/disejustvoyager): ne l’espérons pas, ' ne nous attendons pas à ce qu’un seul modèle fasse tout, MSC2 Répartir la cognition dans un système où les composants déterministes manipulent ce qui est bon pour eux.

Les fonctions de base:

- Résumé déterministe tiré des faits extraits
- Evidence-première recherche par embeddings et filtres
- Demandes structurées contre la base de données factuelles

Le LLM devient:

- Une couche de synthèse (optionnelle)
- Un moteur d’explication (à la demande)
- Un enrichisseur (pour la sortie de langage naturel)

Le LLM est **non pas**:

- Un décideur
- Mémoire
- Un moteur de la vérité

```mermaid
flowchart TD
    subgraph AlwaysOn["Always On (Deterministic)"]
        Sensors[Sensors + Heuristics]
        Local[Local Models<br/>Florence-2, Whisper, CLIP]
        Facts[(Facts Database)]
        Query[Query Engine]
    end

    subgraph Optional["Optional (LLM)"]
        Synthesis[Natural Language Synthesis]
        Explain[Explanation Generation]
    end

    Sensors --> Local
    Local --> Facts
    Facts --> Query
    Query --> Synthesis
    Query --> Explain

    style AlwaysOn fill:none,stroke:#16a34a,stroke-width:2px
    style Optional fill:none,stroke:#6b7280,stroke-width:2px,stroke-dasharray: 5 5
    style Sensors fill:none,stroke:#16a34a,stroke-width:2px
    style Local fill:none,stroke:#16a34a,stroke-width:2px
    style Facts fill:none,stroke:#16a34a,stroke-width:3px
    style Query fill:none,stroke:#16a34a,stroke-width:2px
    style Synthesis fill:none,stroke:#6b7280,stroke-width:2px
    style Explain fill:none,stroke:#6b7280,stroke-width:2px
```

**Pourquoi cela importe:**

| Avantage | LLM-Systèmes requis MSC3 LLSMSc4Sstèmes options MSC5
|---------|---------------------|----------------------|
| **Coût** | Par-coûts de l’API pour la demande |Infrastructure fixe
| **La fiabilité** | Interruption de l’API = Système en panne
| **Vérifiabilité** | Réponses de Mock LLM | Affirmations déterministes |
| **Confiance** | "Le modèle l’a dit.

---


## MCP en tant que limite, Non intégration

Je traite le MCP comme un **Ã‰tablissement d'une bÃ©nÃ©rance stricte**:

- **Isolation du processus**: Les serveurs MCP fonctionnent dans des processus distincts
- **Inputs explicites/outputs**: Aucun état mutable partagé
- **Aucun contexte ambiant**: Chaque appel est évalué à partir d’entrées explicites , non résidu de conversation
- **Contrats types**: Les violations du schéma sont des erreurs

Cela contraste avec:

- Agents de processus In- avec mémoire partagée
- Prompt-chaining avec l'accumulation contextuelle cachée
- "Conversational" Utilisation d'outils lorsque les virages antérieurs ont une incidence sur le comportement

**Pourquoi les limites sont importantes:**

1. **Réjouir**: Reproduisez toute session en replayant les intrants
2. **Vérification**: Chaque signal a une origine traçable
3. **Essais déterministes**: Les mêmes intrants → les mêmes sorties
4. **Conformité**: Chaînes de décision explicatives

```mermaid
flowchart LR
    subgraph Process1["Process: Orchestrator"]
        Orch[Orchestrator<br/>Constrainer Logic]
    end

    subgraph Process2["Process: MCP Server 1"]
        MCP1[Image Analysis<br/>Signals]
    end

    subgraph Process3["Process: MCP Server 2"]
        MCP2[Audio Analysis<br/>Signals]
    end

    subgraph Process4["Process: MCP Server 3"]
        MCP3[Video Analysis<br/>Signals]
    end

    Orch <-->|MCP Protocol| MCP1
    Orch <-->|MCP Protocol| MCP2
    Orch <-->|MCP Protocol| MCP3

    style Process1 fill:none,stroke:#2563eb,stroke-width:2px
    style Process2 fill:none,stroke:#16a34a,stroke-width:2px
    style Process3 fill:none,stroke:#16a34a,stroke-width:2px
    style Process4 fill:none,stroke:#16a34a,stroke-width:2px
    style Orch fill:none,stroke:#2563eb,stroke-width:2px
    style MCP1 fill:none,stroke:#16a34a,stroke-width:2px
    style MCP2 fill:none,stroke:#16a34a,stroke-width:2px
    style MCP3 fill:none,stroke:#16a34a,stroke-width:2px
```

---


## Modes de défaillance Exemples MCP Don't Talk About

Cas de défaillance réels à la suite d’un usage non restreint du MCP:

| Mode de défaillance | Cause SSK2 Atténuation |
|--------------|-------|------------|
| **La hallucination d'outils** | Évacuation de la description dans le raisonnement du LLM
| **Exécution attendue** | Outils d'appels de modèle "juste pour vérifier" | Les portes du connexeur permettent toutes les invocations.
| **Déplacement du schéma** | Changements de comportement des outilsM SK1 schéma ne fonctionne pas't | Systèmes modifiés
| **Défaillances partielles silencieuses** | L'outil retourne des données partielles , le modèle progresse
| **LLM surconfidence** | Le modèle traite la sortie de l'outil comme une vérité fondamentale | CrossM SK2 Validation, Exigences relatives aux preuves
| **Augmentation des capacités** | Modèle "tries" Outils de plus en plus puissants progressivement | Niveaux des capacités M+ Évaluation des politiques m+ Budgets ||

Le thread commun: **Ces échecs se produisent parce que le LLM est considéré comme une autorité**.

La solution: **Les LLM proposent que les entraîneurs décident de l’écart entre le taux d’immatriculation et le taux de mortalité**.

---


## Qu’est-ce que le MCP est bon pour ( Lorsque il est utilisé correctement)

MCP est excellent pour:

- **Développement des capacités**: Énumération du temps d'exécution des signaux disponibles
- **Composition de l'interprocessus**: Nettoyage des limites entre les composants
- **Interopérabilité des outils**: Travaille avec n'importe quel client compatible MCP
- **Modèle-Intégration agnostique**: Swap LLMs sans changer les contrats de signalisation

MCP est **non pas**:

- Cadre d'agents
- Système de raisonnement
- Une couche de sécurité
- Une limite de confiance

Utiliser le MCP pour ce qu’il est: un protocole de câble pour la communication structurée entre les composants.

---


## Où se termine MCP

MCP normalise la façon dont les modèles et outils échangent le contexte. Il ne définit pas qui est autorisé à agir, dans quelles conditionsM SK2 ou comment les décisions sont vérifiéesMSC3

D’autres approches existent pour formaliser ces contraintes.

Cet article n’est pas sur les ACP, mais sur le principe de conception. **les transports et la gouvernance sont des questions distinctes**.

MCP vous dit *comment* pour appeler un outil. Une autre chose doit décider *si* Dans mes systèmes, ,, il faut que ' soit le constrainer; dans les systèmes d’entreprise, ,, il pourrait être un moteur de politique.

---


## Démonstration MCP vs Production MCP

| Aspect | Démonstration du CPM | Production du CMP M|
|--------|----------|----------------|
| **Description de l'outil** | Langue naturelleM SK1 détaillée | Minimale, schémaMSC4première |
| **Qui décide de téléphoner** | LLM | Orchestre
| **Format de réponse** | FreeM SK1form text | Signaux types avec confiance |
| **Validation** | Aucune | CrossM SK2 Validation, seuils |
| **LLM dépendance** | Exigé | Enrichissement facultatif ≥|
| **Réjouir** | NonM SK1déterministe | pleinement reproductible |
| **Voie de vérification** | Logs de conversation | Chaîne de provenance des signaux |

---


## Clôture

MCP permet **composition**.
Le déterminisme permet **de la confiance**.
Les LLMs permettent **fluence**.

Mais seulement si:

> *La probabilité propose : et le déterminisme persisteM SK1*

MCP sans constérateur est une injection rapide avec des étapes supplémentaires.

Faire de la synthèse l’étape finale. Rendre le LLM facultatif. Faire en sorte que tous les faits soient traçables

---


## Conditions clés

- **MCP (Protocole de contexte modèle)**: Protocole de câble pour la découverte d'outils et l'invocation entre les processus
- **Connexeur**: Logique déterministe qui évalue les propositions et décide ce qui persiste
- **Signale**: Réponse type avec confiance, provenanceM SK2 et indicateurs de preuve
- **Propositions**: Tout élément (LLM, Modèle localMSC3 héuristiqueM SK4 qui suggère des faits sans autorité
- **Pointeur de preuve**: Référence à la source vérifiable

---


## Articles connexes

**Précédent dans la série:** [Partie 1: Pourquoi les LLM échouent en tant que capteurs](/blog/llms-fail-as-sensors)

**Fondements théoriques:**

- [Pourquoi la structure bat Brilliance: Voyager, ToolformerM SK2 et DiSE](/blog/disejustvoyager) - Le cas de la cognition répartie au-dessus d’une seule brilliance du modèle
- [Documents d'outils](https://arxiv.org/abs/2302.04761) - Travaux fondamentaux sur l’apprentissage des LLM à utiliser les outils

**Mise en œuvre du modèle:**

- [RAG réduit: Carte-Reduction pour les systèmes probabilistes](/blog/reduced-rag)
- [ImageSummarizer: Intelligence visuelle floue limitée](/blog/constrained-fuzzy-image-intelligence)
- [VideoSummarizer: RAG réduit pour le vidéo](/blog/videosummarizer-scalable-video-intelligence)
- [StyloFlow:Signal-Flois de travail dirigés](/blog/styloflow-signal-driven-workflows)