Early Access · beta. Help test and shape the 1.0 release. Where the project stands →

Open-source healthcare interface engine

Connect healthcare systems on your own servers.

MessageFoundry is an open-source healthcare interface engine with no per-interface license fees. It routes and transforms a wide range of message types, with deep HL7 v2 support. Build interfaces with guided wizards or Python, and use optional AI assistance to draft migrations.

Free & open source No per-interface fees No per-seat fees AI-assisted migration Early Access — new & moving fast
IB_Test_ADT
The IB_Test_ADT interface as a wired graph An MLLP inbound named IB_Test_ADT is wired by the name adt_router to a router, then by the name map_location to a handler that translates the patient location (PV1-3) from 4N-412B to ROOM412-B via the bed_locations translation table, then sends to a file outbound named FILE_Test_ADT. Non-ADT messages branch off as UNROUTED; unmapped locations are dead-lettered (held for review) — both tracked, never silently dropped. router="adt_router" → ["map_location"] Send("FILE_Test_ADT") INBOUND IB_Test_ADT MLLP · :2575 ROUTER adt_router route(msg) HANDLER · TRANSFORM map_location PV1-3 · patient location 4N-412B → ROOM412-B OUTBOUND FILE_Test_ADT File · out/adt UNROUTED not ADT DEAD-LETTER unmapped location delivered tracked — never dropped
from messagefoundry import MLLP, File, Send, code_set, inbound, outbound, router, handler

# Connections — named endpoints, wired together by name
inbound("IB_Test_ADT", MLLP(port=2575), router="adt_router")
outbound("FILE_Test_ADT", File(directory="./out/adt", filename="{MSH-10}.hl7"))

# Router — routes each message to handlers by name
@router("adt_router")
def route(msg):
    if msg["MSH-9.1"] != "ADT":
        return []          # not ADT → UNROUTED
    return ["map_location"]

# Translation table — edited in a grid, stored as version-controlled CSV
ROOMS = code_set("bed_locations")

# Handler — translate the patient location for the receiver
@handler("map_location")
def map_location(msg):
    msg["PV1-3.1"] = ROOMS[msg["PV1-3.1"]]   # unmapped → held for review
    return Send("FILE_Test_ADT", msg)

One example route. Use the Graph / Code toggle above to switch between the explainer diagram and the plain code.

MessageFoundry started in May 2026. It is Early Access, beta-level software under fast development toward 1.0.

Try your interfaces in a sandboxed test environment with synthetic data. Tell us what breaks and what you need. Read the project status →

Why MessageFoundry

Built for analysts and developers alike

Setup wizards generate your connections and routes. Use Python to add custom logic, then review and test each change.

Your config lives in git

Keep interface configuration in version control. Review changes, see who made them, and restore earlier versions.

Ordered, reliable delivery — no broker

Messages are stored durably, delivered in order to each destination, and retried automatically. Replay stored messages and use active-passive failover without a separate broker.

Patient data protected by default

Authentication, role-based access, encryption, and a tamper-evident audit trail help protect patient data.

Our security, standards & PHI posture →

Handles real-world, messy HL7

Read non-conformant HL7 messages and enable strict validation for feeds that need it.

Never lose track of a message

The engine stores each message before acknowledging it and tracks its outcome through processing. Failed deliveries remain available for review and replay.

Tools for your whole team

Watch interfaces and replay messages in the browser console. Configure and test routes with the VS Code extension.

Security & standards

Review the security controls and evidence

Read the published Secure Development Standard, control mappings, and security self-assessment. An independent review and penetration test are planned after Early Access.

NIST SSDF 800-218

Built through a secure development lifecycle — threat-modeled per interface, automatically reviewed in CI, and secure by default.

NIST 800-115

Security testing in CI — SAST, dependency, and secret scanning on every build. An independent external review and penetration test are planned after Early Access.

NIST 800-66 Rev. 2

Controls mapped to the HIPAA Security Rule — access control, audit, integrity, and transmission security.

OWASP ASVS 5.0 Level 3

The self-assessment covers all 345 Level 3 requirements. Partially met requirements remain recorded as partials while controls are completed.

Encryption and least-privilege access are enabled by default. Sign in with local accounts or Active Directory (LDAP). Your organization remains responsible for its deployment and compliance.

FAQ

Frequently asked questions

Is MessageFoundry free and open source?

Yes. The engine is free and open source under AGPL-3.0-or-later, installable from PyPI with pip install messagefoundry. A low-cost commercial license is also available from MessageFoundry, LLC for organizations that can't use copyleft terms.

What protocols and message types does MessageFoundry support?

It connects a wide range of protocols and message types, with deep HL7 v2 support — plus FHIR, X12/EDI, and DICOM — over transports including MLLP (with TLS), HTTP/REST, SOAP, files, SFTP, and databases.

Where does my data live?

On your own servers or in your private cloud. You control the message store, encryption keys, and configured destinations. SQLite, PostgreSQL, and SQL Server are supported.

How much message volume can MessageFoundry handle?

A single interface measured about 50 messages per second on anonymized, representative traffic. Actual throughput depends on partner response times, transforms, storage, and hardware. Interfaces share resources, so their capacities do not simply add together. See measurements and sizing guidance →

Try your first interface in a sandbox

Install the engine, send a synthetic message, and inspect the result.