DÉMO EN COURS Instance de démonstration — bientôt disponible. Ne déposez pas de BOM confidentielle.
Quatre portes, un seul Intake LOCAL · MONO_UTILISATEUR

Quatre portes, un seul Intake

L’application, la ligne de commande, l’API HTTP et le connecteur Claude sont quatre façons d’entrer dans le même produit — pas quatre produits. Mêmes lecteurs, même résolution, même contrat, même installation : une décision prise dans l’application est déjà en vigueur quand Claude analyse le fichier suivant.

Ce qui ne change pas d’une porte à l’autre

Le fichier est lu par le même moteur, les lignes sont résolues par les mêmes règles, et le résultat sort dans le même contrat adesio.bom.canonical/v1. Aucune porte ne prétend avoir trouvé une pièce : found veut dire que le fichier l’énonce. Une seule asymétrie est voulue — la CLI n’applique aucune décision d’opérateur, parce qu’un chiffre qu’elle imprime parle de ce que l’outil lit, pas de ce que quelqu’un a confirmé.

L’application

Pour déposer un fichier et le regarder.

Glissez une BOM sur la page d’accueil. Le rapport s’ouvre, vous corrigez les rôles de colonne là où le moteur s’est trompé, vous enregistrez la lecture comme format nommé — et le prochain fichier de cette forme est reconnu sans question. Les lignes qui attendent une décision se retrouvent dans la file de revue, une carte par pièce et non par ligne.

C’est la seule porte où les boutons de confirmation existent : un rapport téléchargé les affiche inertes, parce qu’il n’y a plus de serveur à qui parler.

La ligne de commande

Pour traiter un fichier, ou un dossier entier, sans ouvrir de navigateur.

Elle produit exactement les mêmes livrables que l’application : le rapport autonome, le JSON canonique, les CSV, et la worklist de recherche. Elle n’applique aucune décision d’opérateur et ne lit aucun format appris — ce qu’elle mesure, c’est ce que l’outil comprend seul.

npm install

# un seul fichier — rapport, JSON canonique, CSV, et la liste de recherches
npm run analyze -- ma-bom.xlsx \
  -o rapport.html --canonical canonical.json --csv bom.csv --queries recherches.csv

# une feuille par son nom, un encodage que le fichier a menti sur, un profil client
npm run analyze -- ma-bom.xlsx --sheet "BOM" --profile analyzer/profiles/cadence-atdm.json

# un dossier entier, deux fois : la passe 1 apprend un format par forme, la passe 2 relit avec lui
npm run corpus-run -- --dir ./boms

L’API HTTP

Pour appeler Intake depuis votre propre système.

Le tableau ci-dessous est rendu depuis la table de routage elle-même, celle dont sort openapi.json. Une route non déclarée y est donc invisible et injoignable, et une route déclarée y figure forcément — le document ne peut pas mentir sur ce que le serveur fait.

MéthodeChemin Ce qu’elle faitRend
POST/api/analyze Analyse one BOM file (multipart `file`) and write its artefacts. Answers the report summary, or the reason the file was refused.json
POST/api/reports/{id}/reanalyze Re-read the SAME stored bytes with corrections applied — an encoding, a sheet, a header row, column roles. Corrections accumulate across calls.json
POST/api/reports/{id}/decisions Accept, reject or revoke a candidate part for the line’s PART. Keyed on the customer’s part code, so it answers every line that part appears on.json
POST/api/reports/{id}/quote Price the report’s already-resolved lines (no re-upload, no re-read of the file) against Octopart’s public prices and return a summary. Rate-limited. 404 when the report is not this caller’s, the add-on is not configured, or `QUOTE_WEB_ENABLED` is off.json
POST/api/reports/{id}/quote-email Ask for the report’s chiffrage by mail (D2: only a confirmation LINK is sent now, never the attachment). Spends nothing from the discovery cap yet — `confirmQuoteEmail` does, once the address is verified. Rate-limited.json
GET/api/decisions Every decision recorded for this client, accepts and rejects alike.json
GET/api/reports Reports held on this installation, newest first.json
GET/api/profiles Customer profiles available to attach to an analysis.json
GET/api/formats Learned format profiles: what this installation recognises by structure.json
POST/api/formats Save what an operator settled on a report as a named, reusable format.json
POST/api/reports/{id}/confirm-format An Adesio OPERATOR confirms the detected format this report was read with, for every later file of the same shape — allowed on a public instance, operator tokens only.json
DELETE/api/formats/{slug} Forget a learned format.json
GET/api/reports/{id} One report’s summary: coverage, KPIs, the format that was applied.json
GET/api/reports/{id}.{artifact} One artefact of a report: `canonical.json` is the handoff document (adesio.bom.canonical/v1), `html` the self-contained report, `csv` the flat BOM, `queries.csv` the search worklist, `lookups.csv` the distinct PARTS a supplier lookup would be asked about (the figure a per-part bill is counted on), `json` the internal dump.mixed
GET/api/schema The JSON Schema of the canonical document — served so a consumer can validate against the exact version this installation emits.json
GET/api/openapi.json This description, as an OpenAPI 3.1 document.json
POST/api/quote Analyse one BOM attachment in memory and answer an instant quote preview (best price / lead time / stock, an XLSX and an email). Bearer `QUOTE_API_TOKEN`. With a `reply_to` the Apps Script has verified (its `REPLY_TO_SENDER` switch), answers `status: reply` — what to send that sender, and an alert for the owner when the reply is pending — instead of the owner's quote. 404 when this installation has no quote add-on configured.json
GET/api/quote/deliveries Confirmed quotes waiting to be sent, each claimed for a 10-minute lease. Bearer `QUOTE_API_TOKEN`.json
POST/api/quote/deliveries/{deliveryId}/ack The script sent it: forget the delivery. Bearer `QUOTE_API_TOKEN`.json
GET/health Liveness probe: 200 whenever the process is up, whatever else is configured. Use this one on Cloud Run — it reserves paths ending in `z`, so `/healthz` 404s there.json
POST/api/invitations Ask to be invited when Intake goes live. Stores an address and the moment it was given, nothing else. Rate-limited: it is public and appends to a file.json
POST/api/session Exchange a client token for a browser session cookie. The token itself is what authenticates; this only moves it into an HttpOnly cookie so a browser can carry it. Rate-limited: it is public and does cryptographic work.json
DELETE/api/session Clear the browser session. The token stays valid — revoke it with the CLI to withdraw it for good.json
GET/api/me The identity this request carries: client id, token label, and how it was presented. The cheapest way for an integrator to check a token works.json

Le schéma du contrat est servi sur /api/schema, la description OpenAPI sur /api/openapi.json. HEAD répond comme GET ; un verbe qui n’existe pas sur un chemin qui existe rend 405 avec l’en-tête Allow, pas 404.

Le connecteur Claude

Pour que Claude lise vos BOM, avec la mémoire de l’installation.

Un serveur MCP sur stdio. Claude ouvre la même installation que l’application web : mêmes formats appris, mêmes alias fabricants, même catalogue, mêmes décisions. Une pièce confirmée dans l’application est déjà réglée la fois suivante. Aucun outil ne rend jamais une BOM entière — chaque liste est paginée, et la ligne complète est un second appel.

Les outils exposés

analyze_bom
Lit une BOM depuis cette machine et rend sa couverture, ses compteurs et l’identifiant du rapport.
list_reports
Les rapports que cette installation détient, avec leur fichier et leur couverture.
get_coverage
Les compteurs d’un rapport, nommés de façon à ne pas pouvoir être aplatis en « résolu / pas résolu ».
list_lines
Une page de lignes, filtrable par résolution ou par motif de revue.
get_line
Le dossier canonique complet d’une ligne : identité, base, candidats, valeur, boîtier.
search_queries
Les lignes que le fichier décrit sans les nommer, en requêtes dédupliquées.
lookup_worklist
Les pièces distinctes qu’une recherche fournisseur interrogerait — le chiffre sur lequel une facture à la pièce se compte.
review_queue
Les pièces qui attendent une décision, toutes analyses confondues, groupées par pièce.
record_decision
ÉCRIT. Enregistre qu’une pièce est celle d’une ligne, qu’elle ne l’est pas, ou annule.

Déclarez-le dans la configuration MCP de votre client Claude :

{
  "mcpServers": {
    "adesio-intake": {
      "command": "npm",
      "args": ["run", "--silent", "mcp", "-w", "analyzer"],
      "cwd": "/chemin/vers/bom-analyzer"
    }
  }
}

Cette page décrit ce qui fonctionne aujourd’hui. Ce qui n’existe pas encore est marqué comme tel sur la carte du système.