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éthode | Chemin | Ce qu’elle fait | Rend |
|---|---|---|---|
| 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.