Agent skill

Manage Security

by mendixlabs in mendixlabs/mxcli

Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access.

Apache-2.0Auto-check passed

Install Manage Security

skills CLI
$ npx skills add mendixlabs/mxcli --skill manage-security -a claude-code

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

GitHub CLI
$ gh skill install mendixlabs/mxcli manage-security --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/manage-security .claude/skills/manage-security && 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
manage-security
GitHub stars
128
Token cost
~6.5k tokens
SKILL.md length
2,469 words
Files
1
Skills in repo
75
Repo updated
First seen
Licence
Apache-2.0

At a glance

Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access.

  • Works in 3 steps: Record, don't pick. Have the workflow… → Read it inside a microflow, return your… → Split the page by role. Keep raw System…
  • Changing who can see
  • SKILL.md covers When to Use This Skill, Security Concepts, The System-module ceiling —… and Syntax Reference, plus 4 more sections
  • Calls docker

What it does

Manage Security is an agent skill from mendixlabs/mxcli. Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access. Use when setting up or changing who can see or do what in an app.

Its SKILL.md is about 6.5k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

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

  • Changing who can see
  • Do what in an app

Example prompts

  • “/manage-security”

Requirements

  • Docker

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Record, don't pick. Have the workflow stamp itself against a row your own
  2. Read it inside a microflow, return your OWN object. Entity access does not
  3. Split the page by role. Keep raw System grids on an Administrator-only page.

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:

    • docker

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

  • Network

    No URLs in SKILL.md. Its commands use docker, which can reach the network depending on how they are called.

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

  • Credentials

    Names no API keys, tokens, secrets or passwords.

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

Context cost

Manage Security loads about 6.5k tokens when it runs. Until then it costs about 59 tokens; SKILL.md has 2,469 words of instructions outside code blocks.

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

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). 2,469 words, ~6,461 tokens.

Download SKILL.mdSave it as .claude/skills/manage-security/SKILL.md (or your agent's skills folder).
name
manage-security
description
Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access. Use when setting up or changing who can see or do what in an app.

Security Management Skill

This skill covers Mendix security configuration via MDL: module roles, user roles, access control (microflows, pages, entities), project security settings, and demo users.

When to Use This Skill

Use when the user asks to:

  • Set up security for a module or project
  • Create or manage module roles / user roles
  • Grant or revoke access to microflows, pages, or entities
  • Configure project security level or demo users
  • Review existing security configuration

Security Concepts

  • Module Roles define permissions within a single module (e.g., Shop.Admin, Shop.Viewer)
  • User Roles aggregate module roles from multiple modules (e.g., Administrator includes Shop.Admin + System.Administrator)
  • Access Rules control CRUD rights on entities per module role
  • Microflow/Page Access controls which module roles can execute/view specific elements
  • Project Security Level determines enforcement: off, prototype, or production

The System-module ceiling — decide the role model around this FIRST

No project module can widen access to System.User, System.Workflow or System.WorkflowUserTask. Access to System entities comes from the System module's own roles, and a grant in your module cannot raise it. This is a design constraint, not a detail: it decides what your screens can be, and finding it late means rebuilding them (ako/mxcli-maintenance-2 designed a technician picker, built it, tested it, and tore it out).

Every consequence is silent — the page renders, the data is simply missing, and mx check, mxcli lint and mxcli report all pass:

What you buildWhat a non-Administrator sees
A combo box over System.User (e.g. "pick a technician")The current user only
A grid over System.Workflow / System.WorkflowUserTaskEmpty
Either of those, re-sourced from a microflowEvery row present, every field blank
The rule: a microflow data source moves the ROWS, not the MEMBERS

Learn this as a rule rather than as a symptom, because the obvious workaround only looks like it worked, and the same trap is waiting on the next screen.

A microflow does not apply entity access, so its retrieve returns every row. But the runtime re-applies entity access when it serializes those objects to the client, XPath constraint included — so a row the role may not read arrives with every member empty. The list comes out the right length and the cards come out blank.

Measured in a browser on Mendix 11.14.0 — one page, two microflow-sourced lists over the same System.User retrieve, opened by two users:

listas Administratoras a plain User
A — the System.User objects themselvesprobe_admin, probe_viewer(blank), probe_viewer
B — a module-owned copy, Name read inside the microflowprobe_admin, probe_viewerprobe_admin, probe_viewer

Both lists hold two rows for both users, so the microflow really did carry the rows past entity access. Only A loses the values, and it loses them per object: System.User's own rule grants read where [id = '[%CurrentUser%]'], which is why a user picker shows you yourself and nobody else rather than showing nothing.

System.WorkflowUserTask has no such escape hatch for an ordinary role, so a workflow inbox built this way comes out entirely blank — the reported case (ako/mxcli#587): the inbox drew the right number of cards, every one of them empty, with mxcli check, lint, report and docker check all at 0 errors.

What to do instead
  1. Record, don't pick. Have the workflow stamp itself against a row your own module owns — an ON CREATED MICROFLOW writing an association plus a plain status string — and list those objects. Target a task at a role, let whoever opens it do the work, and record who acted when they act.
  2. Read it inside a microflow, return your OWN object. Entity access does not apply to the retrieve or to the member read, only to what crosses to the client — so copy the values you need onto an entity your module owns (persistent or non-persistent) and bind the page to that. This is list B above, and it is the same shape the reporter arrived at independently for user pickers: Engineer is a module-owned entity rather than System.User.
  3. Split the page by role. Keep raw System grids on an Administrator-only page. Mendix hides a button to a page the user may not view, so the link simply does not appear.

Related: grant … on System.User is refused by exec — the System module's domain model is not stored in the project, so it has no access rules to add to. The refusal is at execution, not at mxcli check, so a script carrying one passes check and then stops part-way through.

Syntax Reference

Show Commands (Read-Only)
sql
-- Project-wide security overview
describe app security;

-- Module roles (all or filtered)
list module roles;
list module roles in MyModule;

-- User roles and demo users
list user roles;
list demo users;

-- Access on specific elements
list access on microflow MyModule.ProcessOrder;
list access on page MyModule.CustomerOverview;
list access on entity MyModule.Customer;
list access on MyModule.Customer;        -- a bare name means the entity

-- Full security matrix
describe security matrix;
describe security matrix in MyModule;
Describe Commands
sql
-- Describe individual roles and users (MDL output)
describe module role MyModule.Admin;
describe user role Administrator;
describe demo user 'demo_admin';

describe demo user never prints the password. It emits create or modify demo user 'demo_admin' password '***' …, where '***' means keep the stored password: replaying the output on the same project leaves the password as it is, and on a project without that user the statement is refused until you replace '***' with a real password.

Catalog Queries (SQL)

Security data is available in catalog tables for advanced querying. Use refresh catalog full to populate permissions and role mappings.

sql
-- All permissions (entity, microflow, page, OData access)
select * from CATALOG.PERMISSIONS where ModuleRoleName = 'MyModule.Admin';

-- Filter by type
select ElementName, AccessType from CATALOG.PERMISSIONS
  where ElementType = 'ENTITY' and ModuleName = 'MyModule';

select ElementName from CATALOG.PERMISSIONS
  where ElementType = 'MICROFLOW' and AccessType = 'EXECUTE';

-- User role to module role mappings
select * from CATALOG.ROLE_MAPPINGS;
select ModuleRoleName from CATALOG.ROLE_MAPPINGS where UserRoleName = 'Administrator';

-- Which user roles have access to a module?
select distinct UserRoleName from CATALOG.ROLE_MAPPINGS where ModuleName = 'MyModule';

-- Describe catalog table schema
describe CATALOG.PERMISSIONS;
describe CATALOG.ROLE_MAPPINGS;

Catalog tables:

TableContentsBuild mode
CATALOG.PERMISSIONSEntity CRUD, microflow EXECUTE, page VIEW, OData ACCESSrefresh catalog full
CATALOG.ROLE_MAPPINGSUser role → module role assignmentsrefresh catalog
Module Roles
sql
mdl 1;
-- Create module roles
create module role MyModule.Admin description 'Full administrative access';
create module role MyModule.User;
create module role MyModule.Viewer description 'Read-only access';

-- `or modify` updates an existing role's description instead of failing, so the
-- whole security script stays re-runnable rather than needing a run-once file.
create or modify module role MyModule.ApiUser description 'API consumer';

-- Remove a module role (`if exists` makes it a no-op when the role is gone)
drop module role MyModule.Viewer;
drop module role if exists MyModule.Legacy;
Microflow Access
sql
mdl 1;
-- Grant execute access (multiple roles supported)
grant execute on microflow MyModule.ACT_Customer_Create to MyModule.User, MyModule.Admin;

-- Revoke from specific roles
revoke execute on microflow MyModule.ACT_Customer_Create from MyModule.User;
Nanoflow Access
sql
mdl 1;
-- Grant execute access (same syntax as microflows)
grant execute on nanoflow MyModule.NF_ValidateCart to MyModule.User, MyModule.Admin;

-- Revoke from specific roles
revoke execute on nanoflow MyModule.NF_ValidateCart from MyModule.User;

-- Show current access
list access on nanoflow MyModule.NF_ValidateCart;

Note: Security roles persist through DROP+CREATE of the same nanoflow name within a session (by design, for refactor-in-place workflows).

Page Access
sql
mdl 1;
-- Grant view access
grant view on page MyModule.Customer_Overview to MyModule.User, MyModule.Admin;

-- Revoke from specific roles
revoke view on page MyModule.Customer_Overview from MyModule.User;
What a New Document Starts With — and Why GRANT Does Not Narrow It

Document grants (page, microflow, nanoflow) are additive, like entity grants: GRANT adds roles, REVOKE removes them, nothing replaces the list. What a newly created document starts with depends on its module:

Module has…New page / microflow / nanoflow gets
no module rolesan auto-created <Module>.User role (created on first use), granted to every new document while it is the module's only role. exec prints access: granted to auto-created role <Module>.User (…) under the create
module roles of its ownno allowed roles — grant them in the same script

Consequences:

  • A stub page created early (module still role-less) is open to <Module>.User. A later grant view on page M.Stub to M.Admin; adds Admin; every user role mapped to M.User can still open it. Narrow it explicitly: revoke view on page M.Stub from M.User;
  • Drop + create in separate runs loses access. create or modify, and drop
    • create of the same name within one run, keep the stored roles. A create in a later run than the drop is a new document; in a module with its own roles it has none, and if a page, snippet, nanoflow or navigation item uses the flow MxBuild fails with CE0106 at security level Prototype/Production. mxcli check -p reports it as MDL-SEC21 before exec. Prefer create or modify to rebuild a flow; otherwise grant in the same script.
Always Qualify a Module Role

A module role is always Module.Role. The grammar makes the module part optional, so a bare Admin parses — and then either fails at exec (after every earlier statement has already been written) or, in create user role, is stored as .Admin and refused by MxBuild with CE1613. mxcli check reports it as MDL-GRANT02 without needing a project.

text
grant read * on entity MyModule.Customer to Admin;            -- ✗ MDL-GRANT02
sql
mdl 1;
grant read * on entity MyModule.Customer to MyModule.Admin;   -- ✓
Entity Access (CRUD)

GRANT is additive — it merges with existing access, never removes permissions. Rights rank None < ReadOnly < ReadWrite and a merge takes the higher, so use revoke to take access away; a narrower grant will not do it.

A rule is identified by its role set and its where constraint. Two grants with the same constraint update one rule; with different constraints they make two, which Mendix combines at runtime (a role's access is the union of every rule naming it). So adding a where to an existing grant creates a second rule — it does not narrow the first.

sql
mdl 1;
-- Full access (all CRUD + all members)
grant create, delete, read *, write * on entity MyModule.Customer to MyModule.Admin;

-- Read-only (all members)
grant read * on entity MyModule.Customer to MyModule.Viewer;

-- Selective member access
grant read (Name, Email), write (Email) on entity MyModule.Customer to MyModule.User;

-- Additive: adds Phone to existing read access (Name, Email preserved)
grant read (Phone) on entity MyModule.Customer to MyModule.User;

-- With XPath constraint: in [ ] like every XPath, quotes written once.
-- The old `grant MyModule.User on MyModule.Order (…) where '[…]'` still parses
-- but warns MDL-DEPR030; `mxcli fmt --upgrade` rewrites it.
grant read *, write * on entity MyModule.Order to MyModule.User where [Status = 'Open'];

-- Revoke entity access entirely
revoke all on entity MyModule.Customer from MyModule.Viewer;

-- Partial revoke: remove read on specific attribute
revoke read (Phone) on entity MyModule.Customer from MyModule.User;

-- Partial revoke: downgrade write to read-only
revoke write (Email) on entity MyModule.Customer from MyModule.User;

-- Partial revoke: remove structural permission
revoke delete on entity MyModule.Customer from MyModule.User;
Members added later

A rule also carries a default for members added after it was written, and MDL derives it from the grant: write * → ReadWrite, read * → ReadOnly, and a grant written purely as member lists leaves it at None.

So alter entity … add attribute gives the new attribute None on a member-listed rule. Nothing is broken — every rule gets an entry, the build is clean — but the attribute renders blank for that role. alter entity warns and prints the grant that widens it.

What decides this is the rule's default, not how narrow its member list is: read *, write (Email) is narrower than read *, write * and still picks up new members, because read * set its default to ReadOnly. Give a rule read * and narrow with revoke when the role should follow the entity as it grows.

Inherited members

Mendix inheritance is multi-table: a child adds attributes to its parent's, and all the parent's members belong to the child. Grant them exactly like the entity's own — read * / write * cover them too:

sql
mdl 1;
create persistent entity Docs.DocumentBase (
  DocName: String(200),
  Confidential: Boolean
);

create persistent entity Docs.Contract extends Docs.DocumentBase (
  ContractNumber: String(50)
);

-- DocName is inherited, ContractNumber is Contract's own — name both the same way
grant read (DocName, ContractNumber) on entity Docs.Contract to Docs.Viewer;

-- Attachment inherits the file members from System.FileDocument
create persistent entity Docs.Attachment extends System.FileDocument (
  Category: String(50)
);
grant read (Category, "Name", Size) on entity Docs.Attachment to Docs.Viewer;

An access rule must carry an entry for every member, own and inherited — mxcli writes the ones you did not grant with rights None. Omitting them is Mendix CE0066 "Entity access is out of date", which masks the CE2729 "No read access to attribute" errors underneath until Studio Pro's Update security is clicked.

Show full SKILL.md (984 more words)Show less
UPDATE SECURITY — reconciling rules that have gone stale

mxcli reconciles an entity's access rules whenever it writes the entity, so a rule normally cannot go stale through mxcli. UPDATE SECURITY is the repair for one that did — a model edited elsewhere, or an older mxcli:

sql
mdl 1;
update security;                 -- every module the project owns
update security RestLab;         -- one module (IN is optional)
update security in RestLab;      -- the same thing

Three things worth knowing, each of which was a defect until mendixlabs/mxcli#1047:

  • System is skipped. Its entities are the platform's, its access rules are Mendix's rather than the project's, and its domain model is not stored in the .mpr at all. Naming it explicitly is an error, not a silent no-op.
  • One unreadable module does not end the run. It is reported and stepped over, so the rest are still reconciled. Previously the first failure returned, and System guaranteed one on every project — which made the command inert.
  • The scope is honoured. update security RestLab used to parse cleanly and run project-wide, because the name reached the parser's error recovery.

A run that skipped something says so. All entity access rules are up to date means every module was looked at.

The commonest source of a stale rule is a module that arrived from outside Studio Pro. mxcli marketplace install and mxcli marketplace update copy the incoming units in verbatim, so a package whose rules do not cover their entities' members used to land CE0066 in the project with nothing said about it (mendixlabs/mxcli#1085); both now run this reconcile for the module they copy in and report the count. Run it by hand for a module installed some other way, or by an older mxcli:

bash
mxcli -p app.mpr -c "update security UserCommons"

A member name that matches nothing is now an error rather than a silent skip:

Error: entity Docs.Contract has no member(s) DocNam; grant only names members
of the entity or of an entity it inherits from

Exception — user entities. An entity extending System.User is a user entity, and Mendix manages its inherited platform members (Name, Password, Blocked, …). Those must not appear in the rule; listing them is CE0066. Grant only the entity's own members — mxcli leaves the platform ones out automatically:

sql
mdl 1;
create persistent entity Docs.Employee extends System.User (
  EmployeeNo: String(20)
);
grant read (EmployeeNo) on entity Docs.Employee to Docs.Viewer;   -- not Name/Blocked
User Roles
sql
mdl 1;
-- Create with module roles
create user role RegularUser ( ModuleRoles: (MyModule.User, OtherModule.Reader) );

-- Create with manage all roles permission
create user role SuperAdmin ( ModuleRoles: (MyModule.Admin), ManageAllRoles: true );

-- Every property is optional: Description, CheckSecurity, ManageableRoles,
-- ManageUsersWithoutRoles. `create user role Guest;` has no module roles.
-- `create or modify` adds the listed module roles and sets only the stated
-- properties. The positional `create user role R (M.A) manage all roles`
-- is deprecated (MDL-DEPR710); `mxcli fmt --upgrade` rewrites it.
create or modify user role Manager (
  ModuleRoles: (MyModule.Manager),
  Description: 'Approves orders',
  ManageableRoles: (RegularUser),
  CheckSecurity: true
);

-- Add/drop module roles
alter user role RegularUser add module roles (MyModule.Viewer);
alter user role RegularUser drop module roles (MyModule.Viewer);

-- Remove user role
drop user role RegularUser;
Project Security Settings
sql
mdl 1;
-- Set security level
alter app security ( SecurityLevel: off );
alter app security ( SecurityLevel: prototype );
alter app security ( SecurityLevel: production );

-- Enable/disable demo users
alter app security ( EnableDemoUsers: true );
alter app security ( EnableDemoUsers: false );
Guest (Anonymous) Access

Anonymous access is what makes part of an app public — a product catalogue anyone can browse without signing in. It is one flag plus a user role, and the role is the important half: whatever that role can read is the app's public surface.

sql
mdl 1;
-- The role anonymous visitors are given. System.User is what lets an
-- unauthenticated session exist at all.
create user role Anonymous ( ModuleRoles: (Shop.Viewer, System.User) );

alter app security ( EnableGuestAccess: true, GuestUserRole: Anonymous );

-- Now grant exactly what should be public — and nothing else. Entity access
-- goes to the module role the Anonymous user role carries.
grant read * on entity Shop.Product to Shop.Viewer;

-- Re-enabling later does not need the role retyped; the stored one is used.
alter app security ( EnableGuestAccess: false );
alter app security ( EnableGuestAccess: true );

Three things worth knowing:

  • The role is mandatory. Mendix fails the build with CE0133 ("No user role for anonymous users selected even though the feature anonymous users is enabled") when access is on with no role. EnableGuestAccess: true is refused unless a role is given or one is already stored.
  • Mendix does not check the role exists, so mxcli does. A misspelled role would otherwise build with zero errors and leave anonymous visitors with no access at all — a broken public site that passes every check.
  • off keeps the stored role, so toggling access while testing does not lose it. Guest access off with a role set is valid Mendix.

Review anonymous entity access the way lint rule SEC004 asks you to: any unconstrained read * granted to the anonymous role is readable by the whole internet (DIVD-2022-00019). Add an XPath constraint or do not grant it.

Demo Users
sql
mdl 1;
-- Create demo user (auto-detects entity that generalizes System.User)
create demo user 'demo_admin' ( Password: 'Admin123!', UserRoles: (Administrator, SuperAdmin) );

-- Create demo user with explicit entity
create demo user 'demo_admin' ( Password: 'Admin123!', Entity: Administration.Account, UserRoles: (Administrator, SuperAdmin) );

-- Remove demo user
drop demo user 'demo_admin';

The ENTITY clause specifies which entity (generalizing System.User) to use. If omitted, it auto-detects the unique System.User subtype in the project. If multiple subtypes exist, you must specify ENTITY explicitly.

Starlark Lint Rule APIs

Security data is available in Starlark lint rules (.star files):

FunctionReturnsDescription
permissions()list of permissionAll permissions across all element types
permissions_for(qn)list of permissionPermissions for a specific entity
user_roles()list of user_roleUser roles with module role assignments
module_roles()list of module_roleDistinct module roles
role_mappings()list of role_mappingUser role → module role mappings
project_security()struct or NoneSecurity level, guest access, password policy

See write-lint-rules for object property details.

Common Workflow: Setting Up Module Security

A typical security setup follows this order:

sql
mdl 1;
-- 1. Create module roles
create module role Shop.User description 'Regular user access';
create module role Shop.Admin description 'Administrative access';
create module role Shop.Viewer description 'Read-only access';

-- 2. Grant entity access
grant create, delete, read *, write * on entity Shop.Customer to Shop.Admin;
grant read (Name, Email), write (Email) on entity Shop.Customer to Shop.User;
grant read * on entity Shop.Customer to Shop.Viewer;

-- 3. Grant microflow access
grant execute on microflow Shop.ACT_Customer_Create to Shop.User, Shop.Admin;
grant execute on microflow Shop.ACT_Customer_Delete to Shop.Admin;

-- 4. Grant page access
grant view on page Shop.Customer_Overview to Shop.User, Shop.Admin, Shop.Viewer;
grant view on page Shop.Customer_Edit to Shop.User, Shop.Admin;

-- 5. Create user roles (project-level)
create user role AppUser ( ModuleRoles: (Shop.User) );
create user role AppAdmin ( ModuleRoles: (Shop.Admin), ManageAllRoles: true );

-- 6. Verify
describe security matrix in Shop;
describe user role AppAdmin;
What counts as a member of an entity

An access rule has to cover every member of the entity, or Mendix fails the build with CE0066 "Entity access is out of date" — a partially covered rule is worse than no rule at all. read * / write * cover them all, including the ones that are easy to overlook:

MemberNamed in a GRANT asNotes
Attributes (own and inherited)the attribute namesee "Inherited members" above
Association, OWNER Defaultthe association nameon the FROM entity only — adding it to the TO side is itself a CE0066
Association, OWNER Boththe association nameon both entities — each end owns it
createdDate / changedDatethe member namecovered by the rule's default only; Mendix stores no per-member access for them
owner / changedBy—emitted automatically as System.owner / System.changedBy

Audit members are the one case where naming a member cannot change its rights: grant write *, read (createdDate) on entity M.E to R is refused, because Mendix has no member access to write for it and a rule that carries one fails CE0066. Let the rule's default cover it, or change the default.

Common Mistakes

  1. Creating module roles before the module exists — create module must come first
  2. Referencing non-existent roles in GRANT — create the module role before granting access
  3. Forgetting qualified names — roles use Module.Role format in GRANT/REVOKE
  4. User roles without System module roles — in Production security, user roles need at least one System module role (CE0156)
  5. Entity access without proper member rights — use read * for all members or read (Attr1, Attr2) for specific ones
  6. Expecting a GRANT to replace a default — a new document in a role-less module is granted to the auto-created <Module>.User; a later grant adds to it. revoke … from <Module>.User to narrow
  7. Rebuilding a flow with drop + create across runs — the later create starts with no access in a module that has roles (CE0106 when the flow is used from a page/nanoflow/navigation). Use create or modify, or grant in the same script

Validation

After setting up security, verify with:

bash
# check security matrix
mxcli -p app.mpr -c "describe security matrix in MyModule"

# Validate with Mendix
mxcli docker check -p app.mpr

© 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/manage-security of mendixlabs/mxcli.

Open the folder on GitHubat commit a924d11

Compare with similar skills

Manage Security 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.

Manage Security compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Manage Security this skillmendixlabs/mxcli128—~6.5kAutomated safety check: PassApache-2.0
Es Modulesthedaviddias/Front-End-Checklist74k—~482Automated safety check: PassMIT
Aria Rolesthedaviddias/Front-End-Checklist74k—~515Automated safety check: PassMIT
Configure Eccaffaan-m/ECC274k1 repos~2kAutomated safety check: PassMIT
Configure Eccaffaan-m/ECC274k—~1.3kAutomated safety check: PassMIT
Configure Eccaffaan-m/ECC274k—~1.1kAutomated safety check: PassMIT

Similar skills

  • Es Modules

    thedaviddias/Front-End-Checklist

    A skill your agent uses when reviewing scripts, client components, bundles, or runtime behavior related to Use ES modules (import/export).

    74k GitHub stars~482 tokensUpdated yesterday
    Auto-check passed
  • Aria Roles

    thedaviddias/Front-End-Checklist

    A skill your agent uses when reviewing rendered HTML, interactive components, or design-system patterns related to Use valid ARIA role values.

    74k GitHub stars~515 tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Configure Ecc

    affaan-m/ECC

    Run the conversational ECC setup wizard inside the current harness: inventory the install, collect scope (user/project/local) and hook mode (off/minimal/standard/strict) in Claude Code, use Codex's…

    274k GitHub starsUsed in 1 repo~2k tokens
    Auto-check passed
  • Configure Ecc

    affaan-m/ECC

    Claude Code、Codex、Kimi 内で ECC のインストール、更新、再設定を案内し、各ハーネスが実際に備えるプラグイン、スコープ、フック機能を守ります。

    274k GitHub stars~1.3k tokensUpdated 2 days ago
    Auto-check passed
  • Configure Ecc

    affaan-m/ECC

    在 Claude Code、Codex 或 Kimi 内引导 ECC 安装、更新或重新配置,同时严格遵守各家工具真实的插件、范围和 Hook 能力。

    274k GitHub stars~1.1k tokensUpdated 2 days ago
    Auto-check passed
  • Ssh Configuration

    sickn33/agentic-awesome-skills

    Configure SSH servers and clients securely. An agent skill from sickn33/agentic-awesome-skills.

    47k GitHub starsUsed in 2 repos~2.5k tokens
    DevOps & CloudAuto-check: warnings

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

Questions about Manage Security

What does Manage Security do?

Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access. Manage Security is an agent skill from mendixlabs/mxcli. Configure Mendix security in MDL — module and user roles, access to microflows, pages and entities, project security level, demo users, and guest access.

When should I use Manage Security?

Manage Security fits situations like: changing who can see; do what in an app.

How do I install Manage Security in Claude Code?

Run `npx skills add mendixlabs/mxcli --skill manage-security -a claude-code`. Or copy the skill folder (.claude/skills/mendix/manage-security in mendixlabs/mxcli) into .claude/skills/manage-security in your project. Claude Code loads it when a task matches its description.

How do I install Manage Security in Codex?

Run `npx skills add mendixlabs/mxcli --skill manage-security -a codex`. Or copy the skill folder (.claude/skills/mendix/manage-security in mendixlabs/mxcli) into .agents/skills/manage-security in your project. Codex loads it when a task matches its description.

Can I use Manage Security 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 manage-security -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/manage-security, .gemini/skills/manage-security, .github/skills/manage-security and .opencode/skills/manage-security in your project.

What does Manage Security need to run?

Going by SKILL.md and its folder, Manage Security needs the command-line tools its instructions call (docker). Our summary lists: Docker.

Does Manage Security access the network?

SKILL.md contains no URLs. Its commands use docker, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Manage Security 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 Manage Security use?

Manage Security 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 Manage Security use?

About 6.5k tokens (SKILL.md is roughly 26k 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 Manage Security?

Skills that share tags, products or a category with Manage Security: Es Modules (thedaviddias/Front-End-Checklist, 74k stars), Aria Roles (thedaviddias/Front-End-Checklist, 74k stars), Configure Ecc (affaan-m/ECC, 274k stars) and Configure Ecc (affaan-m/ECC, 274k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Manage Security?

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.