Cloud & on-prem
Your AI systems deployed wherever your constraints require, down to your own infrastructure. The agent acts on your tools, and when the model and the MCP server run inside your perimeter, no data ever leaves.
Sovereignty isn't optional for everyone. I deploy on your cloud when speed matters most, and directly inside your infrastructure when your data must never leave. Private open-source models, EU hosting: you decide where the boundary sits.
Key facts
on-prem
models and MCP server inside your infrastructure
EU
sovereign hosting, outside the US Cloud Act
0
data leaves your perimeter, by design
Cloud & on-prem
What I build
Sovereign MCP server
Your CRM, emails, databases and tools connected to the agent through an MCP server that runs in-house or on an EU cloud. Paired with a private or EU-hosted model, the agent reads, decides and acts on site: neither your documents nor your queries go to a third party. I work out with you where the model needs to run so the promise actually holds.
MCP · On-prem · Sovereignty · EU cloud
On-prem & private models
Open-source models deployed inside your infrastructure: your data never leaves your perimeter, not to answer, not to act, not to train anything.
On-prem · Open-source · Private models · Security
EU deployment & industrialization
Scalable, monitored production deployment on an EU cloud or your own cloud (AWS, GCP, Azure, Vercel), with CI/CD, versioning and zero-downtime updates. I check where your models actually run, not just the logo on the invoice.
EU cloud · CI/CD · MLOps · Zero-downtime
The promise
Your data stays with you, even when the agent acts.
Demonstration
Local routing of a request that carries patient data
A private hospital group wants an assistant that finds its internal procedures from ward workstations. Some requests quote patient data, and those must never leave the hospital network.
Invented caseThis case is not an engagement. It is invented end to end, and the code below is the real code that would run it.
HumanRequest from the ward
Patient MRN 4417832, admitted to cardiology yesterday, is on an anticoagulant. What is the internal procedure before a GI endoscopy?
The agentClassifying the request
I read the request before choosing a model. MRN followed by seven digits triggers the patient_identifier rule. Destination: local, no network egress. Without that match, generic_procedure would have sent it out: it is the only rule that allows egress, and it demands the absence of any patient pattern. A request that no rule classifies stays local by default.
A forgotten pattern is never the reason a request goes out.
Tool callCalling the local model
{ "tool": "procedures_assistant.answer", "rule_applied": "patient_identifier", "trigger_match": "MRN 4417832", "destination": "local", "host": "gpu-01.intra.hospital", "network_egress": false, "request": { "text": "Patient MRN 4417832, admitted to cardiology yesterday, is on an anticoagulant. What is the internal procedure before a GI endoscopy?", "requesting_unit": "cardiology", "role": "nurse" }, "corpus": [ "care_procedures", "endoscopy_protocols" ], "similarity_threshold": 0.62 }Tool responsePassages found on site
{ "status": "ok", "compute": { "location": "hospital server room", "host": "gpu-01.intra.hospital", "network_egress": false }, "passages": [ { "document": "PROC-END-014", "version": "4.2", "section": "Stopping anticoagulants", "similarity": 0.81 }, { "document": "PROC-END-014", "version": "4.2", "section": "Delay before the procedure", "similarity": 0.74 } ], "missing_sections": [ "Heparin bridging" ], "below_threshold": [ { "document": "PROC-CARD-007", "section": "Renal function", "similarity": 0.41 } ], "document_to_revalidate": { "reference": "PROC-END-014", "revision_overdue": true } }The missing_sections field exists so the answer can say what it does not find.
Tool callWriting the trace
{ "tool": "audit.record", "event": "assistant_request", "logged": { "timestamp": "2026-09-03T08:41:12+02:00", "rule_applied": "patient_identifier", "destination": "local", "network_egress": false, "requesting_unit": "cardiology", "request_fingerprint": "sha256:9c2d41ab7e0f5b83", "documents_read": [ "PROC-END-014" ] }, "never_logged": { "fields": [ "request_text", "patient_identifier", "date_of_birth", "generated_answer" ], "reason": "the log proves the routing, it does not replay the patient record" }, "retention_days": 365 }The trace proves a request did not leave. It cannot rebuild who the patient was.
AnswerAnswer returned to the ward
Procedure PROC-END-014, version 4.2, requires stopping the anticoagulant before the procedure, with a delay that depends on the drug. Heparin bridging is not covered by this document: I will not invent it, so call the cardiologist on duty. Another document has a section on renal function, but it falls below the similarity threshold, so I leave it out. The compute ran on the hospital server and the request never left the network. The document is past its revision date, so have the version confirmed before the procedure.
The routing policy the gateway reads
version: 3
policy: internal-procedures-assistant
destinations:
local:
engine: on-site-model
host: gpu-01.intra.hospital
network_egress: false
external:
engine: hosted-model
host: api.third-party-provider
network_egress: true
# local rules run first so a patient pattern always wins
evaluation_order: [patient_identifier, identifying_detail, generic_procedure]
rules:
patient_identifier:
patterns:
- '\bMRN\s?\d{6,9}\b'
- '\bADM\s?\d{6,10}\b'
- '\b[12]\d{2}(?:0[1-9]|1[0-2])\d{8}\b'
destination: local
log_text: false
identifying_detail:
patterns:
- '\broom\s?\d{1,3}\b'
- '\bborn on \d{2}/\d{2}/\d{4}\b'
destination: local
log_text: false
generic_procedure:
patterns:
- '(?i)\b(procedure|protocol|checklist|standard of care)\b'
destination: external
log_text: true
requires_absence_of: [patient_identifier, identifying_detail]
# the guard: an unclassified request is handled as if it held a patient
default:
destination: local
log_text: false
audit:
logged_fields: [timestamp, rule_applied, destination, network_egress, requesting_unit, request_fingerprint, documents_read]
forbidden_fields: [request_text, patient_identifier, date_of_birth, generated_answer]
retention_days: 365
# the service refuses to start rather than run on a permissive policy
startup_checks:
refuse_if_default_external: true
refuse_if_rule_without_destination: true
refuse_if_pattern_invalid: truePatient data leaving the network is almost never a model problem: it is a policy file whose default rule lets the request out.
Cloud & on-prem
Before / after
AI that has to send your data to a third party to act
An MCP server in-house and a model inside your perimeter: the agent acts, nothing leaves
Data that has to pass through a third-party cloud
Private models inside your infrastructure
A POC running on a laptop
A deployed, scalable, monitored system
Cloud & on-prem
The stack
Docker
AWS
GCP
Azure
Ollama
vLLM
Terraform
Vercel
Cloud & on-prem
Straight answers
Can my data stay entirely in-house?
Yes. I deploy open-source models directly inside your infrastructure: nothing leaves your perimeter, not the documents, not the questions people ask. Together we weigh cost, performance and sovereignty.
Is a private model as good as GPT or Claude?
For many focused tasks, yes: classification, extraction, RAG on a specific domain. For complex reasoning, the large models keep the edge. It's a trade-off we measure on your data, not a matter of belief.
Is AI compatible with GDPR?
Yes, provided the architecture is right: EU hosting, private models, data processing agreements. For me it's a design criterion from day one, not a constraint you discover at the end.
Is a European model enough to be sovereign?
Not always. Many models, European ones included, run on US clouds like Azure and then fall under the US Cloud Act: in theory, a US authority can request access. Real sovereignty comes down to where the model AND the MCP server that acts on your tools actually run. I check this before advising you, and I switch to an EU cloud or on-prem when your data requires it.
Read on this topic
Contact
Ready to go from demo to production?
Reply within 24 hours · first conversation free, no strings attached.