Backend Test Worker
CorrectRoadH/OpenTickly
Build and verify real-Postgres Go tests and thin transport smoke for tracking behavior.
Seed a Mendix app's PostgreSQL database directly, bypassing the runtime — Mendix's internal ID system, association storage, and bulk import from an external database.
$ npx skills add mendixlabs/mxcli --skill demo-data -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install mendixlabs/mxcli demo-data --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/mendix/demo-data .claude/skills/demo-data && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .claude/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-dataType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add mendixlabs/mxcli --skill demo-data -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install mendixlabs/mxcli demo-data --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/mendix/demo-data .agents/skills/demo-data && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .agents/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mendixlabs/mxcli --skill demo-data -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install mendixlabs/mxcli demo-data --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/mendix/demo-data .cursor/skills/demo-data && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .cursor/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/mendixlabs/mxcli.git --path .claude/skills/mendix/demo-data--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add mendixlabs/mxcli --skill demo-data -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install mendixlabs/mxcli demo-data --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/mendix/demo-data .gemini/skills/demo-data && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .gemini/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install mendixlabs/mxcli demo-dataInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add mendixlabs/mxcli --skill demo-data -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/mendix/demo-data .github/skills/demo-data && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .github/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add mendixlabs/mxcli --skill demo-data -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install mendixlabs/mxcli demo-data --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/mendixlabs/mxcli.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/mendix/demo-data .opencode/skills/demo-data && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "demo-data" agent skill from https://github.com/mendixlabs/mxcli/tree/main/.claude/skills/mendix/demo-data into .opencode/skills/demo-data/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "demo-data", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
demo-dataSeed a Mendix app's PostgreSQL database directly, bypassing the runtime — Mendix's internal ID system, association storage, and bulk import from an external database.
Demo Data is an agent skill from mendixlabs/mxcli. Seed a Mendix app's PostgreSQL database directly, bypassing the runtime — Mendix's internal ID system, association storage, and bulk import from an external database. Use when populating test or demo data, when data is needed before the UI exists, or for imports too large for the runtime.
Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Databases. It works with PostgreSQL. The repository describes itself as: Mendix cli tool, a headless way to work with Mendix projects. Enables Mendix projects for use with 3rd party agentic coding tools like Claude Code and Copilot. Includes a… The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a924d11. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
psqlFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
MXCLI_DB_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Demo Data loads about 4.2k tokens when it runs. Until then it costs about 75 tokens; SKILL.md has 1,145 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from mendixlabs/mxcli at commit a924d11, republished under its Apache-2.0 licence (© mendixlabs). 1,145 words, ~4,182 tokens.
.claude/skills/demo-data/SKILL.md (or your agent's skills folder).Connect directly to the Mendix application's PostgreSQL database from a devcontainer and insert demo data — bypassing the runtime. Covers reading DB settings, understanding Mendix's internal ID system, and safely inserting rows with correct IDs and association links.
Use mxcli to read the project's configured database connection:
./mxcli -p <project>.mpr -c "list settings;"Example output:
| configuration 'Default' | PostgreSql, localhost:5434, db=mxcli2-dev, http=8080 |For full credentials (username, password):
./mxcli -p <project>.mpr -c "describe settings;"Example output:
mdl 1;
alter settings configuration 'Default' (
DatabaseType: 'PostgreSql',
DatabaseUrl: 'localhost:5434',
DatabaseName: 'mxcli2-dev',
DatabaseUserName: 'mendix',
DatabasePassword: 'mendix',
HttpPortNumber: 8080
);The Mendix app's localhost in the project settings refers to the Mac host, not the
devcontainer. Use host.docker.internal to reach it:
PGPASSWORD=mendix psql -h host.docker.internal -p 5434 -U mendix -d mxcli2-dev# list all tables
\dt
# describe a table
\d tasklist$task
# run a query and exit
PGPASSWORD=mendix psql -h host.docker.internal -p 5434 -U mendix -d mxcli2-dev \
-c "select * from \"tasklist\$task\" limit 5;"Every Mendix object has a bigint ID composed of three parts:
| bits 63–48 | bits 47–7 | bits 6–0 |
| entity ID | sequence number | random |
| (16 bits) | (41 bits) | (7 bits) |Formula: id = (short_id::bigint << 48) | (sequence_number::bigint << 7) | (random_7bits)
The 7-bit random suffix adds unpredictability to object IDs, preventing sequential ID
enumeration attacks (e.g., IDOR). Generate it with floor(random() * 128) in SQL.
select e.entity_name, e.table_name, ei.short_id, ei.object_sequence,
(ei.short_id::bigint << 48) as id_base
from mendixsystem$entityidentifier ei
join mendixsystem$entity e on e.id = ei.id
where e.entity_name = 'TaskList.Task';Example result:
entity_name | table_name | short_id | object_sequence | id_base
--------------+---------------+----------+-----------------+-------------------
TaskList.Task| tasklist$task | 50 | 11 | 14073748835532800select id,
to_hex(id::bigint) as hex_id,
(id::bigint >> 48) as entity_short_id,
(id::bigint >> 7) & x'1ffffffffff'::bigint as sequence_num,
id::bigint & 127 as random_bits
from "tasklist$task";object_sequence is the next available sequence number for that entityobject_sequence by N so the running runtime
does not reuse those IDsshort_id, giving different id valuesThe running app won't see these rows until it reloads. Direct SQL inserts bypass the runtime's query/cache layer, so
mxcli oql(which queries the running app) returns0for freshly seeded data — this looks like a seeding failure but isn't. Runmxcli docker reload(or restart the app) after seeding. To confirm rows landed before a reload, query Postgres directly. See verify-with-oql.
Query mendixsystem$association to see how each association is stored:
select association_name, table_name, child_column_name, storage_format
from mendixsystem$association
where table_name like 'tasklist%';Mendix stores associations in one of two ways, controlled by the project's
AssocStorage convention setting (check with list settings):
AssocStorage: column)The FK is a regular column in the owner entity's table. No junction table exists.
tasklist$note
id bigint PK
content varchar
tasklist$note_task bigint FK → tasklist$task.id ← inline association column
mxobjectversion bigint ← optimistic lock versionColumn naming convention: {module}${associationname} — all lowercase, $ separator.
To insert a note linked to a task, simply set the FK column (note the random suffix per ID):
insert into "tasklist$note" (id, content, author, datecreated, "tasklist$note_task", mxobjectversion)
values (
(59::bigint << 48) | (18::bigint << 7) | floor(random() * 128)::bigint,
'Note text', 'Alice', '2026-02-18 10:00:00',
(50::bigint << 48) | (11::bigint << 7) | floor(random() * 128)::bigint,
1
);Mendix creates a separate join table. Both entity IDs are stored there.
tasklist$note_task
tasklist$noteid bigint FK → tasklist$note.id (unique — enforces one task per note)
tasklist$taskid bigint FK → tasklist$task.idInspect with \d "tasklist$note_task". Insert the entity row first, then the link.
Use a CTE or variable to capture the generated ID so both statements share it:
with new_note as (
select (59::bigint << 48) | (18::bigint << 7) | floor(random() * 128)::bigint as id
)
insert into "tasklist$note" (id, content, author, datecreated)
select id, 'Note text', 'Alice', '2026-02-18 10:00:00' from new_note;
-- Then link (reuse the same id — query it back or generate in application code)
insert into "tasklist$note_task" ("tasklist$noteid", "tasklist$taskid") values
(<the_generated_note_id>, <task_id>);In practice, pre-generate IDs in application code or use returning id to capture them.
mxobjectversionWhen the project has optimistic locking enabled, every entity table gets an
mxobjectversion bigint column. The runtime:
1 for all existing rows during schema synccommitAlways set mxobjectversion = 1 when inserting rows directly. Leaving it null
will cause the runtime to reject the object the first time a user saves it.
Check whether a table has the column:
select column_name from information_schema.columns
where table_name = 'tasklist$task' and column_name = 'mxobjectversion';begin;
-- short_id=59 for Note, short_id=50 for Task
-- sequence 18 and 19 for the two new notes; task id uses sequence 11
insert into "tasklist$note" (id, content, author, datecreated, "tasklist$note_task", mxobjectversion)
values
((59::bigint << 48) | (18::bigint << 7) | floor(random() * 128)::bigint,
'First note content', 'Bob', '2026-02-18 10:00:00',
(50::bigint << 48) | (11::bigint << 7) | floor(random() * 128)::bigint, 1),
((59::bigint << 48) | (19::bigint << 7) | floor(random() * 128)::bigint,
'Second note content', 'Alice', '2026-02-18 11:00:00',
(50::bigint << 48) | (11::bigint << 7) | floor(random() * 128)::bigint, 1);
-- Advance Note sequence (was 18, inserted 2, now 20)
update mendixsystem$entityidentifier ei
set object_sequence = 20
from mendixsystem$entity e
where e.id = ei.id and e.entity_name = 'TaskList.Note';
commit;For junction-table associations, IDs must be reused across two INSERT statements.
Pre-generate them in a CTE or use returning:
begin;
-- Pre-generate IDs for the new notes (short_id=59, sequences 18 and 19)
with new_ids as (
select (59::bigint << 48) | (18::bigint << 7) | floor(random() * 128)::bigint as id1,
(59::bigint << 48) | (19::bigint << 7) | floor(random() * 128)::bigint as id2
)
insert into "tasklist$note" (id, content, author, datecreated)
select id1, 'First note content', 'Bob', '2026-02-18 10:00:00' from new_ids
union all
select id2, 'Second note content', 'Alice', '2026-02-18 11:00:00' from new_ids;
-- Link notes to task (use the same generated IDs — query them back)
insert into "tasklist$note_task" ("tasklist$noteid", "tasklist$taskid")
select id, <task_id> from "tasklist$note"
where content in ('First note content', 'Second note content');
update mendixsystem$entityidentifier ei
set object_sequence = 20
from mendixsystem$entity e
where e.id = ei.id and e.entity_name = 'TaskList.Note';
commit;Tip: In application code, generate the random suffix in Go/Python and use literal IDs to avoid the need for CTEs.
begin;
-- short_id=50, object_sequence=11, random suffix appended
insert into "tasklist$task" (id, title, taskstatus, priority, assignedto, duedate, iscompleted, estimatedhours, mxobjectversion)
values
((50::bigint << 48) | (11::bigint << 7) | floor(random() * 128)::bigint,
'My demo task', 'ToDo', 'Medium', 'Alice', '2026-03-01 09:00:00', false, 4.0, 1);
-- Advance sequence (was 11, inserted 1 row)
update mendixsystem$entityidentifier ei
set object_sequence = 12
from mendixsystem$entity e
where e.id = ei.id and e.entity_name = 'TaskList.Task';
commit;The random suffix means you cannot pre-compute exact IDs, but you can compute the deterministic portion (short_id + sequence) and see the available sequence range:
select
entity_name,
short_id,
object_sequence as next_seq,
(short_id::bigint << 48) | (object_sequence::bigint << 7) as first_new_id_base,
(short_id::bigint << 48) | ((object_sequence + 9)::bigint << 7) as last_id_base_if_10_rows
from mendixsystem$entityidentifier ei
join mendixsystem$entity e on e.id = ei.id
where e.entity_name = 'TaskList.Note';Each actual ID = id_base | floor(random() * 128) — the random part is added at insert time.
Mendix automatically adds system attributes to every entity. Do not use these names for custom attributes — they will cause errors when the app tries to sync the schema:
| Reserved name | System meaning |
|---|---|
CreatedDate | Auto-set on object creation |
ChangedDate | Auto-set on every commit |
owner | Reference to creating user |
ChangedBy | Reference to last user to commit |
If you need a "date created" field, name it DateCreated, NoteDate, etc. Also avoid
Type and ID — these are platform-reserved (CE7247) and, like the audit names above,
are rejected even when quoted ("Type" still fails MDL021); rename to ResourceType,
TypeValue, etc.
Seed microflow wired to after-startup must return
Boolean. If you point the project's after-startup setting at a seed microflow, it must end withreturn true— a void seed microflow fails the Mendix build with CE0142.
When you create a new entity with mxcli exec, the table and mendixsystem$entity
registration only appear after the Mendix runtime starts and syncs the schema.
The runtime does this automatically on startup. Until then:
\dt will not show the tablemendixsystem$entityidentifier will not have a row for the entityWorkflow:
mxcli exec\dt *entityname*Always update object_sequence in the same transaction as your inserts. If the runtime
is running concurrently, it may also allocate IDs from the same sequence. To be safe,
insert demo data while the runtime is stopped, or use a sequence value well above the
current object_sequence to leave headroom.
# get DB settings
./mxcli -p <project>.mpr -c "describe settings;"
# connect (devcontainer on macOS)
PGPASSWORD=mendix psql -h host.docker.internal -p 5434 -U mendix -d mxcli2-dev
# find entity short_id and id_base
select e.entity_name, ei.short_id, ei.object_sequence,
(ei.short_id::bigint << 48) as id_base
from mendixsystem$entityidentifier ei
join mendixsystem$entity e on e.id = ei.id
where e.entity_name = 'Module.Entity';
# ID formula
id = (short_id::bigint << 48) | (sequence_number::bigint << 7) | floor(random() * 128)
# check association storage mode
select association_name, table_name, child_column_name
from mendixsystem$association
where table_name like 'mymodule%';
# check if optimistic locking is enabled on a table
select column_name from information_schema.columns
where table_name = 'mymodule$myentity' and column_name = 'mxobjectversion';
# after inserting N rows, advance the sequence
update mendixsystem$entityidentifier ei
set object_sequence = <old_value + N>
from mendixsystem$entity e
where e.id = ei.id and e.entity_name = 'Module.Entity';| Column | Required | Value |
|---|---|---|
id | Always | (short_id::bigint << 48) | (sequence::bigint << 7) | random_0_127 |
mxobjectversion | If column exists | 1 |
module$assocname | If column-storage association | FK id of related object |
| Custom attributes | As needed | Your data |
For bulk imports from an external database, use the import from command instead of
writing manual INSERT statements. It handles ID generation, sequence updates, and
mxobjectversion automatically:
mdl 1;
-- Connect to external database
sql connect postgres 'postgres://user:pass@host:5432/legacydb' as source;
-- Import rows directly into Mendix app database
import from source query 'SELECT name, email, department FROM employees'
into HRModule.Employee
map (name as Name, email as Email, department as Department)
batch 500;
-- Import with association linking (lookup by natural key)
import from source query 'SELECT name, email, dept_name FROM employees'
into HR.Employee
map (name as Name, email as Email)
link (dept_name to Employee_Department on Name);
-- Multiple associations
import from source query 'SELECT name, dept, mgr_email FROM employees'
into HR.Employee
map (name as Name)
link (dept to Employee_Department on Name,
mgr_email to Employee_Manager on Email);The import command auto-connects to the Mendix app's PostgreSQL database using
project settings. Override with env vars for devcontainers/Docker:
MXCLI_DB_TYPE, MXCLI_DB_HOST, MXCLI_DB_PORT, MXCLI_DB_NAME,
MXCLI_DB_USER, MXCLI_DB_PASSWORD.
The link clause maps source columns to Mendix associations:
on ChildAttr — looks up the child entity by attribute value (builds a cache)on — treats the source value as a raw Mendix object IDUse manual INSERT (described above) when you need:
alter settings© mendixlabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/mendix/demo-data of mendixlabs/mxcli.
Open the folder on GitHubat commit a924d11
Demo Data next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Demo Data this skillmendixlabs/mxcli | 128 | — | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Backend Test WorkerCorrectRoadH/OpenTickly | 306 | — | ~1.3k | Automated safety check: Pass | AGPL-3.0 | |
| Ef Core Migrationsjihadkhawaja/Egroo | 178 | — | ~673 | Automated safety check: Pass | Apache-2.0 | |
| Add Oliphaunt Extensionf0rr0/oliphaunt | 105 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Diagnose Cloud SessionFreakStudioCN/mpy-hardware-extension | 118 | — | ~809 | Automated safety check: Notes | Custom licence | |
| DB AdminEliasOulkadi/shokunin | 114 | — | ~2k | Automated safety check: Notes | MIT |
CorrectRoadH/OpenTickly
Build and verify real-Postgres Go tests and thin transport smoke for tracking behavior.
jihadkhawaja/Egroo
Handle EF Core schema changes in Egroo. An agent skill from jihadkhawaja/Egroo.
f0rr0/oliphaunt
Add, update, or remove an Oliphaunt PostgreSQL contrib or external extension, including source pins, build recipes, target support, SDK metadata, release products, carrier identities, and package…
FreakStudioCN/mpy-hardware-extension
用户报告 Blockless 扩展在云端实测时出问题(卡死/灰屏/跳步/构建失败),但本地复现不了、日志不在本地文件里时,用这个从云端托管数据库拉真实 session 定位症状与根因 / Use when a user reports an in-product Blockless bug from live cloud-backend testing and the real session…
EliasOulkadi/shokunin
PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…
ynulihao/AgentSkillOS
Design a PostgreSQL-specific schema. An agent skill from ynulihao/AgentSkillOS.
mendixlabs/mxcli
Push OData query options into the SQL of a Mendix resource served by a read microflow, so $filter, $orderby, $top, $skip, $count and the key lookup reach the database instead of being silently…
mendixlabs/mxcli
Chart a Mendix app with Vega-Lite through a pluggable widget that takes the specification and the data as separate properties, so the model emits rows and never assembles a chart payload.
mendixlabs/mxcli
Author Mendix AI agent documents in MDL — Model, Knowledge Base, Consumed MCP Service and Agent, with variables, tools and multi-line prompts.
mendixlabs/mxcli
Run set-based INSERT, UPDATE and DELETE against Mendix entities through OQL statements, which the runtime supports and Studio Pro cannot author.
mendixlabs/mxcli
Stand up an HTTP endpoint you control instead of a live third-party API, and point the Mendix app at it — Prism from an OpenAPI contract, a constant swap, or a forward proxy.
mendixlabs/mxcli
Call external REST APIs from Mendix — the three approaches (inline REST CALL, consumed REST client document, generated from OpenAPI) and how to choose.
Works with
Categories
Seed a Mendix app's PostgreSQL database directly, bypassing the runtime — Mendix's internal ID system, association storage, and bulk import from an external database. Demo Data is an agent skill from mendixlabs/mxcli. Seed a Mendix app's PostgreSQL database directly, bypassing the runtime — Mendix's internal ID system, association storage, and bulk import from an external database.
Demo Data fits situations like: populating test; data is needed before the UI exists; for imports too large for the runtime.
Run `npx skills add mendixlabs/mxcli --skill demo-data -a claude-code`. Or copy the skill folder (.claude/skills/mendix/demo-data in mendixlabs/mxcli) into .claude/skills/demo-data in your project. Claude Code loads it when a task matches its description.
Run `npx skills add mendixlabs/mxcli --skill demo-data -a codex`. Or copy the skill folder (.claude/skills/mendix/demo-data in mendixlabs/mxcli) into .agents/skills/demo-data in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add mendixlabs/mxcli --skill demo-data -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/demo-data, .gemini/skills/demo-data, .github/skills/demo-data and .opencode/skills/demo-data in your project.
Going by SKILL.md and its folder, Demo Data needs the command-line tools its instructions call (psql) and credentials named MXCLI_DB_PASSWORD. Our summary lists: Python 3; Docker.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Demo Data is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Demo Data: Backend Test Worker (CorrectRoadH/OpenTickly, 306 stars), Ef Core Migrations (jihadkhawaja/Egroo, 178 stars), Add Oliphaunt Extension (f0rr0/oliphaunt, 105 stars) and Diagnose Cloud Session (FreakStudioCN/mpy-hardware-extension, 118 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
mendixlabs (a GitHub organization) maintains it in mendixlabs/mxcli, which has 128 GitHub stars. The repository holds 75 skills in this directory. The repository was last updated on October 7, 2026.
Source: mendixlabs/mxcli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.