The modelsdk-go library provides programmatic access to Mendix projects from Go code. This is the underlying library that powers mxcli.
go get github.com/mendixlabs/mxclipackage main
import (
"fmt"
"github.com/mendixlabs/mxcli"
)
func main() {
// Open a Mendix project
reader, err := modelsdk.Open("/path/to/MyApp.mpr")
if err != nil {
panic(err)
}
defer reader.Close()
// List all modules
modules, _ := reader.ListModules()
for _, m := range modules {
fmt.Printf("Module: %s\n", m.Name)
}
// Get domain model for a module
dm, _ := reader.GetDomainModel(modules[0].ID)
for _, entity := range dm.Entities {
fmt.Printf(" Entity: %s\n", entity.Name)
for _, attr := range entity.Attributes {
fmt.Printf(" - %s: %s\n", attr.Name, attr.Type.GetTypeName())
}
}
// List microflows
microflows, _ := reader.ListMicroflows()
fmt.Printf("Total microflows: %d\n", len(microflows))
// List pages
pages, _ := reader.ListPages()
fmt.Printf("Total pages: %d\n", len(pages))
}package main
import (
"github.com/mendixlabs/mxcli"
)
func main() {
// Open for writing
writer, err := modelsdk.OpenForWriting("/path/to/MyApp.mpr")
if err != nil {
panic(err)
}
defer writer.Close()
reader := writer.Reader()
modules, _ := reader.ListModules()
dm, _ := reader.GetDomainModel(modules[0].ID)
// Create a new entity
customer := modelsdk.NewEntity("Customer")
writer.CreateEntity(dm.ID, customer)
// Add attributes
writer.AddAttribute(dm.ID, customer.ID, modelsdk.NewStringAttribute("Name", 200))
writer.AddAttribute(dm.ID, customer.ID, modelsdk.NewStringAttribute("Email", 254))
writer.AddAttribute(dm.ID, customer.ID, modelsdk.NewBooleanAttribute("IsActive"))
writer.AddAttribute(dm.ID, customer.ID, modelsdk.NewDateTimeAttribute("CreatedDate", true))
// Create another entity
order := modelsdk.NewEntity("Order")
writer.CreateEntity(dm.ID, order)
// Create an association
assoc := modelsdk.NewAssociation("Customer_Order", customer.ID, order.ID)
writer.CreateAssociation(dm.ID, assoc)
}The api/ package provides a simplified, fluent API inspired by the Mendix Web Extensibility Model API:
package main
import (
"github.com/mendixlabs/mxcli/api"
"github.com/mendixlabs/mxcli/sdk/mpr"
)
func main() {
writer, err := mpr.OpenForWriting("/path/to/MyApp.mpr")
if err != nil {
panic(err)
}
defer writer.Close()
// Create the high-level API
modelAPI := api.New(writer)
// Set the current module context
module, _ := modelAPI.Modules.GetModule("MyModule")
modelAPI.SetModule(module)
// Create entity with fluent builder
customer, _ := modelAPI.DomainModels.CreateEntity("Customer").
Persistent().
WithStringAttribute("Name", 100).
WithStringAttribute("Email", 254).
WithIntegerAttribute("Age").
WithBooleanAttribute("IsActive").
WithDateTimeAttribute("CreatedDate", true).
Build()
// Create another entity
order, _ := modelAPI.DomainModels.CreateEntity("Order").
Persistent().
WithDecimalAttribute("TotalAmount").
WithDateTimeAttribute("OrderDate", true).
Build()
// Create association between entities
_, _ = modelAPI.DomainModels.CreateAssociation("Customer_Orders").
From("Customer").
To("Order").
OneToMany().
Build()
// Create enumeration
_, _ = modelAPI.Enumerations.CreateEnumeration("OrderStatus").
WithValue("Pending", "Pending").
WithValue("Processing", "Processing").
WithValue("Completed", "Completed").
WithValue("Cancelled", "Cancelled").
Build()
// Create microflow
_, _ = modelAPI.Microflows.CreateMicroflow("ACT_ProcessOrder").
WithParameter("Order", "MyModule.Order").
WithStringParameter("Message").
ReturnsBoolean().
Build()
}| Type | Description |
|---|---|
modelsdk.ID |
Unique identifier for model elements (UUID) |
modelsdk.Module |
Represents a Mendix module |
modelsdk.Project |
Represents a Mendix project |
modelsdk.DomainModel |
Contains entities and associations |
modelsdk.Entity |
An entity in the domain model |
modelsdk.Attribute |
An attribute of an entity |
modelsdk.Association |
A relationship between entities |
modelsdk.Microflow |
A microflow (server-side logic) |
modelsdk.Nanoflow |
A nanoflow (client-side logic) |
modelsdk.Page |
A page in the UI |
modelsdk.Layout |
A page layout template |
// Open a project
reader, _ := modelsdk.Open("path/to/project.mpr")
defer reader.Close()
// Metadata
reader.Path() // Get file path
reader.Version() // Get MPR version (1 or 2)
reader.GetMendixVersion() // Get Mendix Studio Pro version
// Modules
reader.ListModules() // List all modules
reader.GetModule(id) // Get module by ID
reader.GetModuleByName(name) // Get module by name
// Domain Models
reader.ListDomainModels() // List all domain models
reader.GetDomainModel(moduleID) // Get domain model for module
// Microflows & Nanoflows
reader.ListMicroflows() // List all microflows
reader.GetMicroflow(id) // Get microflow by ID
reader.ListNanoflows() // List all nanoflows
reader.GetNanoflow(id) // Get nanoflow by ID
// Pages & Layouts
reader.ListPages() // List all pages
reader.GetPage(id) // Get page by ID
reader.ListLayouts() // List all layouts
reader.GetLayout(id) // Get layout by ID
// Other
reader.ListEnumerations() // List all enumerations
reader.ListConstants() // List all constants
reader.ListScheduledEvents() // List all scheduled events
reader.ExportJSON() // Export entire model as JSON// Open for writing
writer, _ := modelsdk.OpenForWriting("path/to/project.mpr")
defer writer.Close()
// Access the reader
reader := writer.Reader()
// Modules
writer.CreateModule(module)
writer.UpdateModule(module)
writer.DeleteModule(id)
// Entities
writer.CreateEntity(domainModelID, entity)
writer.UpdateEntity(domainModelID, entity)
writer.DeleteEntity(domainModelID, entityID)
// Attributes
writer.AddAttribute(domainModelID, entityID, attribute)
// Associations
writer.CreateAssociation(domainModelID, association)
writer.DeleteAssociation(domainModelID, associationID)
// Microflows & Nanoflows
writer.CreateMicroflow(microflow)
writer.UpdateMicroflow(microflow)
writer.DeleteMicroflow(id)
writer.CreateNanoflow(nanoflow)
writer.UpdateNanoflow(nanoflow)
writer.DeleteNanoflow(id)
// Pages & Layouts
writer.CreatePage(page)
writer.UpdatePage(page)
writer.DeletePage(id)
writer.CreateLayout(layout)
writer.UpdateLayout(layout)
writer.DeleteLayout(id)
// Other
writer.CreateEnumeration(enumeration)
writer.CreateConstant(constant)// Create attributes
modelsdk.NewStringAttribute(name, length)
modelsdk.NewIntegerAttribute(name)
modelsdk.NewDecimalAttribute(name)
modelsdk.NewBooleanAttribute(name)
modelsdk.NewDateTimeAttribute(name, localize)
modelsdk.NewEnumerationAttribute(name, enumID)
// Create entities
modelsdk.NewEntity(name) // Persistable entity
modelsdk.NewNonPersistableEntity(name) // Non-persistable entity
// Create associations
modelsdk.NewAssociation(name, parentID, childID) // Reference (1:N)
modelsdk.NewReferenceSetAssociation(name, p, c) // Reference set (M:N)
// Create flows
modelsdk.NewMicroflow(name)
modelsdk.NewNanoflow(name)
// Create pages
modelsdk.NewPage(name)
// Generate IDs
modelsdk.GenerateID()| Namespace | Description |
|---|---|
modelAPI.DomainModels |
Create/modify entities, attributes, associations |
modelAPI.Enumerations |
Create/modify enumerations and values |
modelAPI.Microflows |
Create microflows with parameters and return types |
modelAPI.Pages |
Create pages with widgets (DataView, TextBox, etc.) |
modelAPI.Modules |
List and retrieve modules |
github.com/mendixlabs/mxcli/
├── modelsdk.go # Main package with convenience functions
├── model/ # Core model types (ID, Module, Project, etc.)
├── api/ # High-level fluent API (builders)
│ ├── api.go # ModelAPI entry point
│ ├── domainmodels.go # EntityBuilder, AssociationBuilder
│ ├── enumerations.go # EnumerationBuilder
│ ├── microflows.go # MicroflowBuilder
│ ├── pages.go # PageBuilder, widget builders
│ └── modules.go # ModulesAPI
├── sdk/
│ ├── domainmodel/ # Domain model types (Entity, Attribute, Association)
│ ├── microflows/ # Microflow and Nanoflow types
│ ├── pages/ # Page, Layout, and Widget types
│ └── mpr/ # MPR file reader and writer
└── examples/ # Example applications
Mendix projects are stored in .mpr files which are SQLite databases containing BSON-encoded model elements.
- Single
.mprfile containing all model data - Documents stored as BSON blobs in SQLite
.mprfile contains references and metadatamprcontents/folder contains individual document files- Better for Git versioning and large projects
The library automatically detects and handles both formats.
Project
├── Modules
│ ├── Domain Model
│ │ ├── Entities
│ │ │ ├── Attributes
│ │ │ ├── Indexes
│ │ │ ├── Access Rules
│ │ │ ├── Validation Rules
│ │ │ └── Event Handlers
│ │ ├── Associations
│ │ └── Annotations
│ ├── Microflows
│ │ ├── Parameters
│ │ └── Activities & Flows
│ ├── Nanoflows
│ ├── Pages
│ │ ├── Widgets
│ │ └── Data Sources
│ ├── Layouts
│ ├── Snippets
│ ├── Enumerations
│ ├── Constants
│ ├── Scheduled Events
│ └── Java Actions
└── Project Documents
cd examples/read_project
go run main.go /path/to/MyApp.mprcd examples/modify_project
go run main.go /path/to/MyApp.mprWarning: Always backup your .mpr file before modifying it!
| Feature | Mendix Model SDK (TypeScript) | modelsdk-go |
|---|---|---|
| Language | TypeScript/JavaScript | Go |
| Runtime | Node.js | Native binary |
| Cloud Required | Yes (Platform API) | No |
| Local Files | No | Yes |
| Real-time Collaboration | Yes | No |
| Read Operations | Yes | Yes |
| Write Operations | Yes | Yes |
| Type Safety | Yes (TypeScript) | Yes (Go) |
| CLI Tool | No | Yes (mxcli) |
| SQL-like DSL | No | Yes (MDL) |