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

01

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

02

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

03

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.

  1. HumanRequest from the ward

    Patient MRN 4417832, admitted to cardiology yesterday, is on an anticoagulant. What is the internal procedure before a GI endoscopy?

  2. 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.

  3. 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
    }
  4. 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.

  5. 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.

  6. 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 coderouting-policy.yamlyaml

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: true

Patient 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

Cloud & on-prem

The stack

Docker

AWS

GCP

Azure

Ollama

vLLM

Terraform

Vercel

Cloud & on-prem

Straight answers

01

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.

02

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.

03

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.

04

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.