Developer surfaces
Gateway, MCP, OTel et n8n
Les SDK principaux d'Attesto couvrent l'intégration directe dans les applications. Gateway, MCP, OpenTelemetry et n8n couvrent les systèmes autour des applications : proxy de modèles, outils d'agents, traces d'observabilité et automatisation de workflows. Chaque surface doit émettre une vraie preuve Proofstream, respecter les timestamps source et garder les secrets hors des payloads, receipts, bundles, logs et code navigateur.
Scope
Cette page s'adresse aux développeurs et opérateurs techniques qui intègrent Attesto dans des AI gateways, agent hosts, telemetry pipelines et outils d'automatisation. Elle ne documente pas les opérations internes de staff et ne remplace pas les manuels SDK, API, connecteurs ou Local Vault. Utilisez-la pour choisir la bonne surface et comprendre quelle preuve chacune produit.
Quand utiliser chaque surface
| Surface | À utiliser quand | Produit | Responsable principal |
|---|---|---|---|
| Inference Gateway | Vous voulez capturer des appels de modèles compatibles OpenAI sans modifier chaque application. | Commitments request/response, métadonnées de politique, evidence de routage modèle et receipts. | Équipe plateforme ou AI engineering. |
| MCP server | Des agent hosts ont besoin d'outils déterministes pour journaliser des events, vérifier des receipts ou construire des bundles. | Evidence de tool calls, stream events et résultats de vérification de receipts. | Équipe agent platform ou developer tooling. |
| OpenTelemetry bridge | Vous émettez déjà des spans et voulez transformer certaines traces en evidence Attesto. | Span commitments, trace/span source references et service metadata receipts. | Équipe observability ou plateforme. |
| n8n node | L'automatisation de workflows exige des step receipts vérifiables et la vérification de webhooks signés. | Workflow-step events, source references, receipt IDs et résultats de vérification. | Équipe automation ou operations. |
Inference Gateway
L'Attesto Inference Gateway est un proxy serveur pour les appels de modèles compatibles OpenAI. Les applications envoient les requêtes à la gateway ; la gateway les transmet au provider upstream configuré et écrit l'evidence Attesto avant de renvoyer la réponse du provider. Utilisez-la lorsque les équipes ne peuvent pas ajouter des appels SDK dans chaque application, ou lorsqu'une politique centrale et un routage modèle sont nécessaires.
export ATTESTO_API_KEY="$ATTESTO_SYSTEM_KEY"
export OPENAI_BASE_URL=http://127.0.0.1:8765/v1
attesto-gateway --listen 127.0.0.1:8765 \
--admin-listen 127.0.0.1:8766 \
--attesto-base-url https://verify.attesto.eu \
--upstream https://api.openai.com/v1 \
--stream-id "$ATTESTO_STREAM_ID" \
--capture commitments
curl -sS "$OPENAI_BASE_URL/chat/completions" \
-H "Authorization: Bearer ${PROVIDER_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4.1-mini","messages":[{"role":"user","content":"Summarize this policy"}]}'
- Capture mode: engager les métadonnées request et response, pas les secrets bruts ni les credentials provider.
- Modes autorisés :
commitmentsetnonesont les seuls capture modes ; la capture brute des prompts/responses n'existe volontairement pas. - Chemins compatibles OpenAI :
/v1/chat/completions,/v1/completions,/v1/embeddingset/v1/responsescréent des eventsattesto.model_decision. Les autres chemins sont proxifiés sans modification et attestés comme events de commitment génériqueshttp_call. - Streaming : les responses SSE passent byte-for-byte avec flush immédiat ; la gateway ne réassemble le stream après la fin que pour calculer les commitments.
- Source time: conserver le timestamp appelant lorsqu'il est fourni ; sinon enregistrer le receive time de la gateway avec timezone.
- Idempotency: utiliser un request id ou source reference pour que les retries ne créent pas d'historique contradictoire.
- Delivery : les events utilisent une queue bornée et des batches en arrière-plan. Les pannes Attesto ou overflow de queue vont dans un dead-letter spool NDJSON fsync, rejoué automatiquement ou avec
attesto-gateway replay-spool.--spool-max-bytesest le seul point de drop et il est compté et loggé explicitement. - Header redaction :
Authorization,Proxy-Authorization,Cookie,Set-Cookie,api-key,x-api-keyet les headers correspondant àtoken|secret|keyn'apparaissent jamais dans les events, logs, spool entries ou messages d'erreur. - Fail behavior: la gateway est fail-open par défaut avec avertissements et spool fsync; ajoutez
--strictlorsque la politique exige que la création du receipt réussisse avant de continuer vers l'upstream. - Routing et TLS : garder la vérification TLS upstream activée et utiliser des entrées
--routeexplicites pour les déploiements multi-upstream. - Operations: surveillez
/healthzet/metricssur--admin-listen, et utilisezattesto-gateway replay-spoolaprès une panne.
MCP server
Le serveur MCP d'Attesto expose un ensemble restreint d'outils
Attesto déterministes aux agent hosts compatibles MCP. La surface
d'outils actuelle est log_action,
get_receipt, verify_receipt,
get_stream_head et verify_completeness. Le
serveur journalise des actions, récupère des receipts, vérifie des
receipts offline, inspecte les stream heads et prouve qu'une plage de
séquence est gap-free sans donner à l'agent des credentials backend
larges. Le serveur MCP doit tourner côté serveur dans l'environnement
runtime de l'agent. Il ne contient aucun modèle AI, aucun import
d'AI vendor et aucune logique de décision cachée ; c'est un wrapper
d'outils déterministe au-dessus du SDK Attesto.
pip install attesto-mcp
{
"mcpServers": {
"attesto": {
"command": "attesto-mcp",
"args": ["--stdio"],
"env": {
"ATTESTO_BASE_URL": "https://verify.attesto.eu",
"ATTESTO_API_KEY": "${ATTESTO_API_KEY}",
"ATTESTO_STREAM_ID": "${ATTESTO_STREAM_ID}"
}
}
}
}
attesto-mcp --stdio
- Stocker les credentials MCP dans le secret store du runtime d'agent.
- Ne pas passer de tenant API keys, provider API keys ou secrets client bruts dans les MCP tool arguments.
- Vérification locale :
verify_receiptetverify_completenesss'exécutent localement ; le trust anchor est la witness public key épinglée, pas une response backend Attesto. - Leak guard : les payloads sont refusés lorsqu'ils contiennent la valeur d'une environment variable finissant par
_KEY,_TOKEN,_SECRETou_PASSWORD. - Garder les sorties d'outils déterministes et orientées receipts pour que les logs d'agents restent vérifiables plus tard.
- La package default base URL est volontairement overrideable; définissez explicitement
ATTESTO_BASE_URL=https://verify.attesto.eupour le service Attesto public. - Restreindre les outils disponibles par rôle d'agent ; tous les agents n'ont pas besoin d'export de bundles ou de création de streams.
OpenTelemetry bridge
L'OpenTelemetry bridge transforme des spans sélectionnés en events Attesto. Il est utile lorsque la source de vérité est déjà une pipeline de traces : spans de model gateway, d'évaluation de policy, de sync connecteur ou de gestion d'incident. Le bridge doit filtrer fortement ; n'envoyez pas chaque span par défaut.
pip install attesto opentelemetry-sdk
import os
from attesto import AttestoClient
from attesto.otel import AttestoSpanProcessor
from opentelemetry.sdk.trace import TracerProvider
provider = TracerProvider()
provider.add_span_processor(
AttestoSpanProcessor(
client=AttestoClient(api_key=os.environ["ATTESTO_API_KEY"]),
stream_id=os.environ["ATTESTO_STREAM_ID"],
)
)
- Event type : chaque span terminé devient un event de commitment
attesto.otel_span. - Source reference : les spans utilisent des source references déterministes
otel:{trace_id}:{span_id}, afin que renvoyer le même span soit idempotent. - Payload discipline: retirer les attributes pouvant contenir des secrets ou données personnelles avant qu'ils atteignent le processor; Python utilise
attribute_allowlistet TypeScript utiliseattributeAllowlist. - Commitment-only attributes : seuls les attributes allowlisted sont engagés, sous forme de
attributes_commitmentplusattribute_keys; les valeurs non allowlisted ne sont pas écrites dans Attesto. Désactivez entièrement les attribute commitments aveccommit_attributes=FalseoucommitAttributes: false. - Host safety : les failures du processor ne cassent pas l'application hôte par défaut ; utilisez
strict=Trueoustrict: truelorsque l'échec de capture evidence doit faire échouer la requête, eton_error/onErrorpour l'observability. - Sampling: aligner le sampling OTel sur la politique d'evidence ; les spans échantillonnés hors flux ne peuvent pas devenir evidence plus tard.
- Verification: les receipt IDs doivent être réécrits dans les logs ou trace attributes lorsque c'est possible.
n8n node
Le node Attesto n8n est destiné aux automatisations de workflows qui exigent une step evidence vérifiable. Utilisez-le pour les workflows d'approbation, handoffs de connecteurs, triage d'incidents, policy checks et automatisations côté client où un auditeur doit pouvoir voir plus tard ce qui s'est passé et quand.
npm install n8n-nodes-attesto
- Stocker les credentials Attesto dans les credentials n8n, pas dans le workflow JSON.
- Utiliser l'action node pour Log Event, Log Typed Compliance Event, Get Receipt et Verify Receipt (Offline).
- Offline receipt verification : Verify Receipt recalcule localement le canonical hash et la signature Ed25519 avec la witness key épinglée dans le credential n8n ; les serveurs Attesto ne sont pas consultés.
- Webhook trigger : utiliser le trigger node uniquement pour des webhooks Attesto signature-verified. Il vérifie le HMAC sur
timestamp.bodyavec comparaison constant-time et tolérance de clock-skew de 300 s ; les deliveries stale ou forged reçoivent 401 et ne lancent pas de workflow. - Définir explicitement source object id et source timestamp pour les systèmes externes.
- Ne pas publier de workflows contenant des tenant keys, provider tokens ou payloads réglementés bruts.
Evidence model
Les quatre surfaces doivent émettre l'evidence avec la même sémantique Proofstream que les SDKs. Une requête gateway, un MCP tool call, un span OTel ou une étape n8n n'est pas un cas spécial : c'est un source event avec source reference, timestamp, normalized commitment, receipt et inclusion optionnelle ultérieure dans des windows, checkpoints, witnesses et anchors.
| Champ | Comportement requis |
|---|---|
| source_system_id | Identifier la gateway, l'agent host, le telemetry service ou l'instance n8n. |
| source_ref | Clé d'idempotency stable comme request id, tool call id, trace/span id ou workflow execution id. |
| source_time | Timestamp source original avec timezone ou offset. |
| payload_commitment | Engager les métadonnées de payload normalisées sans stocker de secrets provider. |
| receipt | Renvoyer ou stocker le receipt id afin que l'event puisse être vérifié plus tard. |
Security boundaries
- Exécuter Gateway et MCP uniquement côté serveur ; ne jamais placer d'API keys Attesto dans des bundles navigateur.
- Conserver les secrets provider upstream dans le secret store du runtime propriétaire.
- Préférer Local Vault lorsque des credentials connecteur ou edge doivent rester côté client.
- Masquer prompts, responses, trace attributes et workflow variables lorsqu'ils contiennent des données personnelles ou des secrets.
- Utiliser des API keys scoped au tenant et les révoquer lorsqu'une gateway, agent host, telemetry collector ou workflow est retiré.
Operations
Traitez ces surfaces comme des intégrations de production. Elles ont besoin de health checks, retry policy, rate-limit handling, idempotency, validation du source time et états d'échec observables. Une surface peut être installée depuis un package registry, mais elle n'est production-ready pour un tenant que lorsqu'elle possède une vraie API key Attesto, un vrai stream et une canary receipt/verify réussie.
| Check | Résultat attendu |
|---|---|
| Install smoke | Le package s'installe depuis le registry officiel sans source maps ni source leaks. |
| Receipt canary | Un vrai event est journalisé et le receipt se vérifie. |
| Retry canary | Un source_ref répété produit un comportement replay/idempotent, pas un historique dupliqué. |
| Secret scan | Aucune tenant key, provider key, prompt secret, trace secret ou credential de workflow n'apparaît dans les logs ou bundles. |
Failure modes
| Failure | Signification | Réponse |
|---|---|---|
| Attesto unavailable | La surface ne peut pas obtenir de receipt. | Fail closed lorsque la politique exige l'evidence ; sinon marquer l'exécution comme missing evidence. |
| Provider unavailable | Le service upstream model/tool/workflow a échoué. | Journaliser des métadonnées d'échec sûres si la politique l'autorise ; ne pas inventer un success event. |
| Invalid source time | Le timestamp source est absent ou malformed. | Rejeter ou normaliser selon la tenant policy et enregistrer séparément le receive time. |
| Secret detected | Un payload ou attribute semble contenir du secret material. | Bloquer l'émission, rediger à la source et effectuer une rotation si la fuite est confirmée. |
Rollout checklist
- Choisir une surface et un stream de production ; ne pas activer toutes les surfaces à la fois.
- Stocker les credentials uniquement dans des secret stores côté serveur ou dans les credentials n8n.
- Exécuter une vraie canary event → receipt → verify avant d'inviter des utilisateurs.
- Documenter source timestamps, source references et retention policy.
- Ajouter dashboards ou alertes pour receipt failures, retry conflicts et secret-scan rejections.
- Mettre à jour les docs tenant et le changelog lors de l'activation d'une nouvelle surface.
