Agent skill

Demo Data

by mendixlabs in 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.

Apache-2.0Auto-check passedDatabases

Install Demo Data

skills CLI
$ npx skills add mendixlabs/mxcli --skill demo-data -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install mendixlabs/mxcli demo-data --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
demo-data
GitHub stars
128
Token cost
~4.2k tokens
SKILL.md length
1,145 words
Files
1
Skills in repo
75
Repo updated
First seen
Licence
Apache-2.0

At a glance

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.

  • Works in 5 steps: Get Database Settings → Connect to the Database → Understand the Mendix ID System → …
  • Populating test
  • SKILL.md covers Purpose, When to Use This Skill, Step 1: Get Database Settings and Step 2: Connect to the Database, plus 7 more sections
  • Calls psql; needs MXCLI_DB_PASSWORD

What it does

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.

When your agent uses it

  • Populating test
  • Data is needed before the UI exists
  • For imports too large for the runtime

Example prompts

  • “s PostgreSQL database directly, bypassing the runtime — Mendix”
  • “/demo-data”

Requirements

  • Python 3
  • Docker

Workflow steps

5 steps, taken from the step headings in SKILL.md.

  1. Get Database Settings
  2. Connect to the Database
  3. Understand the Mendix ID System
  4. Check Association Storage and Optimistic Locking
  5. Insert Demo Data

What it can do on your machine

Read from SKILL.md and the folder at commit a924d11. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • psql

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • MXCLI_DB_PASSWORD

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~75
When it runs · the whole SKILL.md, loaded when a task matches
~4.2k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from mendixlabs/mxcli at commit a924d11, republished under its Apache-2.0 licence (© mendixlabs). 1,145 words, ~4,182 tokens.

Download SKILL.mdSave it as .claude/skills/demo-data/SKILL.md (or your agent's skills folder).
name
demo-data
description
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.

Skill: Connect to Application Database and Generate Demo Data

Purpose

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.

When to Use This Skill

  • User asks to seed or populate the database with test/demo data
  • User needs data in the app before the UI is built
  • User wants to inspect the database directly (schema, row counts, etc.)
  • Bulk data import that is impractical through the Mendix UI

Step 1: Get Database Settings

Use mxcli to read the project's configured database connection:

bash
./mxcli -p <project>.mpr -c "list settings;"

Example output:

| configuration 'Default' | PostgreSql, localhost:5434, db=mxcli2-dev, http=8080 |

For full credentials (username, password):

bash
./mxcli -p <project>.mpr -c "describe settings;"

Example output:

sql
mdl 1;
alter settings configuration 'Default' (
  DatabaseType: 'PostgreSql',
  DatabaseUrl: 'localhost:5434',
  DatabaseName: 'mxcli2-dev',
  DatabaseUserName: 'mendix',
  DatabasePassword: 'mendix',
  HttpPortNumber: 8080
);

Step 2: Connect to the Database

From a devcontainer on macOS

The Mendix app's localhost in the project settings refers to the Mac host, not the devcontainer. Use host.docker.internal to reach it:

bash
PGPASSWORD=mendix psql -h host.docker.internal -p 5434 -U mendix -d mxcli2-dev
Useful psql commands
bash
# 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;"

Step 3: Understand the Mendix ID System

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.

Look up an entity's short_id and current sequence
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 | 14073748835532800
Decode an existing ID
sql
select 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";
ID generation rules
  • object_sequence is the next available sequence number for that entity
  • After inserting N rows, advance object_sequence by N so the running runtime does not reuse those IDs
  • IDs are entity-scoped: two entities can have the same sequence number but different short_id, giving different id values
  • Each ID includes a 7-bit random suffix (0–127) for security; generate a fresh random value per row

The 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) returns 0 for freshly seeded data — this looks like a seeding failure but isn't. Run mxcli docker reload (or restart the app) after seeding. To confirm rows landed before a reload, query Postgres directly. See verify-with-oql.


Step 4: Check Association Storage and Optimistic Locking

Determine association storage mode

Query mendixsystem$association to see how each association is stored:

text
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):

Mode A — Column storage (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 version

Column 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):

sql
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
);
Mode B — Junction table storage

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

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

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

Optimistic locking — mxobjectversion

When the project has optimistic locking enabled, every entity table gets an mxobjectversion bigint column. The runtime:

  • Initialises the column to 1 for all existing rows during schema sync
  • Increments it by 1 on every commit
  • Rejects a save if the version in the DB doesn't match what the client loaded

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

sql
select column_name from information_schema.columns
where table_name = 'tasklist$task' and column_name = 'mxobjectversion';

Step 5: Insert Demo Data

Template — entity with column-storage association + optimistic locking
sql
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;
Template — entity with junction-table association (no optimistic locking)

For junction-table associations, IDs must be reused across two INSERT statements. Pre-generate them in a CTE or use returning:

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

Template — standalone entity (no association)
sql
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;
Helper query — compute next N IDs for an entity

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:

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


Important Caveats

Show full SKILL.md (458 more words)Show less
Reserved attribute names

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 nameSystem meaning
CreatedDateAuto-set on object creation
ChangedDateAuto-set on every commit
ownerReference to creating user
ChangedByReference 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 with return true — a void seed microflow fails the Mendix build with CE0142.

New entities need a runtime sync before demo data can be inserted

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 table
  • mendixsystem$entityidentifier will not have a row for the entity

Workflow:

  1. Create entity with mxcli exec
  2. Start (or restart) the Mendix runtime
  3. Verify the table exists: \dt *entityname*
  4. Insert demo data
Sequence safety

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.


Quick Reference

bash
# 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';
INSERT column checklist
ColumnRequiredValue
idAlways(short_id::bigint << 48) | (sequence::bigint << 7) | random_0_127
mxobjectversionIf column exists1
module$assocnameIf column-storage associationFK id of related object
Custom attributesAs neededYour data

Automated Alternative: IMPORT FROM

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:

sql
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)
  • Without on — treats the source value as a raw Mendix object ID
  • Handles both Column storage (inline FK) and Table storage (junction table) automatically
  • Only Reference associations supported (not ReferenceSet)

Use manual INSERT (described above) when you need:

  • ReferenceSet association linking
  • Custom ID allocation or sequence management
  • Non-standard data transformations

© 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

Files

Just SKILL.md in .claude/skills/mendix/demo-data of mendixlabs/mxcli.

Open the folder on GitHubat commit a924d11

Compare with similar skills

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.

Demo Data compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Demo Data this skillmendixlabs/mxcli128—~4.2kAutomated safety check: PassApache-2.0
Backend Test WorkerCorrectRoadH/OpenTickly306—~1.3kAutomated safety check: PassAGPL-3.0
Ef Core Migrationsjihadkhawaja/Egroo178—~673Automated safety check: PassApache-2.0
Add Oliphaunt Extensionf0rr0/oliphaunt105—~1.4kAutomated safety check: PassMIT
Diagnose Cloud SessionFreakStudioCN/mpy-hardware-extension118—~809Automated safety check: NotesCustom licence
DB AdminEliasOulkadi/shokunin114—~2kAutomated safety check: NotesMIT

Similar skills

  • Backend Test Worker

    CorrectRoadH/OpenTickly

    Build and verify real-Postgres Go tests and thin transport smoke for tracking behavior.

    306 GitHub stars~1.3k tokensUpdated 5 days ago
    DatabasesAuto-check passed
  • Ef Core Migrations

    jihadkhawaja/Egroo

    Handle EF Core schema changes in Egroo. An agent skill from jihadkhawaja/Egroo.

    178 GitHub stars~673 tokensUpdated 6 mo ago
    DatabasesAuto-check passed
  • 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…

    105 GitHub stars~1.4k tokensUpdated today
    DatabasesAuto-check passed
  • Diagnose Cloud Session

    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…

    118 GitHub stars~809 tokensUpdated 9 days ago
    DatabasesAuto-check: notes
  • DB Admin

    EliasOulkadi/shokunin

    PostgreSQL database administration — backup/restore (pgdump, PITR, WAL archiving), health monitoring (connections, bloat, cache hit ratio, dead tuples), connection pooling (PgBouncer), replication…

    114 GitHub stars~2k tokensUpdated 2 days ago
    DatabasesAuto-check: notes
  • Postgresql Table Design

    ynulihao/AgentSkillOS

    Design a PostgreSQL-specific schema. An agent skill from ynulihao/AgentSkillOS.

    617 GitHub starsUsed in 14 repos~4k tokens
    DatabasesAuto-check passed

More from mendixlabs/mxcli

All 75 skills in this repo
  • Mendix Odata Pushdown

    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…

    128 GitHub stars~2.5k tokensUpdated today
    Auto-check passed
  • Mendix Vega Charts

    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.

    128 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Agents

    mendixlabs/mxcli

    Author Mendix AI agent documents in MDL — Model, Knowledge Base, Consumed MCP Service and Agent, with variables, tools and multi-line prompts.

    128 GitHub starsUsed in 1 repo~2.2k tokens
    Auto-check passed
  • Mendix Bulk Oql Dml

    mendixlabs/mxcli

    Run set-based INSERT, UPDATE and DELETE against Mendix entities through OQL statements, which the runtime supports and Studio Pro cannot author.

    128 GitHub stars~1.4k tokensUpdated today
    Auto-check passed
  • Mock REST APIs

    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.

    128 GitHub starsUsed in 1 repo~2.5k tokens
    Auto-check passed
  • REST Client

    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.

    128 GitHub starsUsed in 1 repo~3.9k tokens
    Auto-check passed

Works with

Categories

Questions about Demo Data

What does Demo Data do?

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.

When should I use Demo Data?

Demo Data fits situations like: populating test; data is needed before the UI exists; for imports too large for the runtime.

How do I install Demo Data in Claude Code?

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.

How do I install Demo Data in Codex?

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.

Can I use Demo Data in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Demo Data need to run?

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.

Does Demo Data access the network?

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.

Is Demo Data safe to install?

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.

What licence does Demo Data use?

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.

How many tokens does Demo Data use?

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.

What are the alternatives to Demo Data?

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.

Who maintains Demo Data?

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.