1Designer anatomy
The Designer tab groups commands by their object type. Each object type appears as a card with its commands listed in a table. A stats strip across the top counts everything.
| Name | Method | Path | MCP |
|---|---|---|---|
| get_user | GET | /users/{id} | β |
| list_users | GET | /users | β |
| create_user | POST | /users | β |
| update_user | PATCH | /users/{id} | β |
| delete_user | DELETE | /users/{id} | β |
| Name | Method | Path | MCP |
|---|---|---|---|
| list_groups | GET | /groups | β |
| add_member | POST | /groups/{id}/members | β |
| Element | Purpose |
|---|---|
| Stats strip | Object Types / Commands / MCP-enabled count. Updates live as you add or remove. |
| Object-type panel | One card per resource (User, Group, Ticket, β¦). Holds a header (name + count) and a table of commands. |
| Command table row | Click to open the Enhanced Command Modal in edit mode. Right-click for Quick Test, Duplicate, Delete. |
| + Add Object Type | Test id add-object-type-button. Opens the Create Object Type modal. |
| + Command | Test id add-command-btn. Opens the Enhanced Command Modal in create mode for that object type. |
2Add an object type
Click + Add Object Type
The button on the Designer toolbar (test id add-object-type-button) opens the Create Object Type modal. Provide:
- Name β singular noun:
user,group,incident. - Display name β title-cased label shown in UIs and pickers.
- Description β what this object represents in the source system.
- Schema source β pick from the imported OpenAPI definitions, paste a JSON Schema, or start empty.
3Add a command
Click + Command on an object type
Each object-type card has its own + Command button (test id add-command-btn, aria-label "Add command"). The Enhanced Command Modal opens with the object type pre-selected.
4Command modal β fields tour
| Tab | What's there |
|---|---|
| Basics | Name (id), display name, object type, HTTP method, path. Path placeholders use {name}. |
| Parameters | Add path / query / header / body parameters. Each has a name, type, required flag, default, and description. |
| Body | Optional template for the request body β e.g. JSON skeleton with {{ params.name }} placeholders. |
| MCP | Expose this command as an MCP tool. See section 7. |
| Test | Quick-Test panel: fill values, run, see response. Faster than opening the full Test System modal for a single command. |
5Parameter badges
Each parameter row in the Parameters tab carries a badge that summarises its role. The badges are intentionally bright so you can scan the list and spot misconfiguration.
| Parameter | Type | In | Default |
|---|---|---|---|
| REQUIRED userPrincipalName | string | body | β |
| REQUIRED displayName | string | body | β |
| OPTIONAL mailNickname | string | body | β |
| AUTO tenantId | string | header | ${env:TENANT_ID} |
| AUTO requestId | uuid | header | uuid() |
| Badge | Meaning |
|---|---|
| REQUIRED | Caller must supply a value. Workflows that omit it fail with a 400. |
| OPTIONAL | Caller may supply a value. If omitted, the upstream's default applies (or the field is left out entirely). |
| AUTO | Set by the platform β env variable, secret, or a generated value (uuid, timestamp). Caller cannot override. |
6Body templates
When to use
For commands with non-trivial JSON bodies, the Body tab lets you paste a template that maps parameter values into the right structure:
{
"accountEnabled": true,
"displayName": "{{ params.displayName }}",
"mailNickname": "{{ params.mailNickname | default(params.displayName | replace(' ','')) }}",
"userPrincipalName": "{{ params.userPrincipalName }}",
"passwordProfile": {
"forceChangePasswordNextSignIn": true,
"password": "{{ secret:initial_password }}"
}
}
The template engine supports the same expression syntax as Orchestration Studio β pipe filters, defaults, conditionals.
7MCP config inside the command modal
The MCP tab inside the command modal is where you describe how the command should appear to AI agents that connect via MCP.
| Field | data-testid | Notes |
|---|---|---|
| Enable as MCP tool | mcp-enable-toggle | Master toggle. When off, the command is not exposed via MCP regardless of other settings. |
| Tool name | mcp-tool-name | Identifier the agent sees. Defaults to the command name; override when you want a more descriptive label. |
| Annotations | mcp-annotations | Read-only / destructive / idempotent flags so the agent knows what side effects to expect. |
| Delegation scopes | mcp-delegation-scopes | OAuth scopes required when invoked by a delegated agent. Empty = run as platform service. |
| AI use-when | mcp-use-when | Plain-English hint to the agent ("Use this when the user asks to onboard a new hire"). Improves tool selection. |
| Examples | mcp-examples-add | Pairs of (intent β arguments) the agent can learn from. |
| Next-action hint | mcp-next-action | Suggest the natural follow-up tool to call after this one succeeds. |
Enabling a command's MCP tool only matters if System Details has the system flagged as an mcp-instance-provider. Otherwise the toggle is decorative.
8Schema Mapper
The Schema Mapper translates the system's native schema (e.g. EntraID's userPrincipalName) into EmpowerNow's canonical schema (e.g. email). Every command can map its output, and every command-modal Parameters tab can map its input.
Open the Schema Mapper
Click πΊ Map schema on a command row, or use Ctrl + Shift + M from the command modal. The Schema Mapper opens with two side-by-side schemas: Source (the system's native fields) on the left, Canonical (EmpowerNow Person/Account/Group) on the right.
Source Β· EntraID User
Canonical Β· Person
Two modes
- Visual (default) β drag to draw mappings between fields; right-click a mapping for transform options (uppercase, default, jsonpath).
- YAML β text view of the same mapping. Use for bulk edits or when you want to copy mappings between commands.
The mode toggle is at the top-right of the Mapper. The filter input (test id schema-mapper-filter) hides fields not matching your search.
9MCP Tools tab
The system editor's π MCP Tools tab is the cross-system view of every MCP-enabled command on this system. Use it to audit and bulk-manage what your agents can call.
| Element | data-testid | Use it for |
|---|---|---|
| Search | mcp-tools-search | Filter by tool name, command name, or annotation. |
| Filter by status | mcp-tools-filter-status | Enabled / Disabled / Misconfigured. |
| Tool row | mcp-tool-row-<name> | Click to open the underlying command modal at the MCP tab. |
| Inline edit | mcp-tool-edit-<name> | Open the MCP tab directly without going via the Designer. |
| Toggle | mcp-tool-toggle-<name> | Enable / disable without opening any modal. |
10Bulk enable / edit
Select multiple tools
Tick the checkboxes on the left of each row. The bulk action bar appears at the top of the MCP Tools tab once any are selected.
Bulk actions
- Enable all / Disable all β flip many tools at once.
- Edit annotations β open a small editor that applies the same annotation set to every selected tool.
- Set delegation scopes β apply the same scopes to every selected tool.
Bulk operations require system-editor:command Β· edit on every selected row.
The bulk edit replaces (not merges) the annotation set per tool. Confirm carefully β undo is per-tool.
11Fulfillment tab
Fulfillment connects EmpowerNow's canonical operations (create person, link account, deactivate) to the actual commands on the system. The platform reads this map when it needs to fulfill a high-level operation.
Resource kinds & operations
The tab lists each resource kind the system supports (e.g. Person, Account, Group, Entitlement). For each, you map the standard operations: create, update, read, delete, list, link, unlink.
| Operation | Maps to command | Notes |
|---|---|---|
| create person | create_user | Required for new-hire workflows. |
| update person | update_user | Used by sync. |
| read person | get_user | Lookups by id. |
| list persons | list_users | Used for full-tenant scans. |
| deactivate person | update_user with {accountEnabled:false} | Soft-delete pattern. |
Why it matters
Fulfillment is what lets canonical platform features ("offboard this person across all systems", "do an access review") work without the orchestration layer needing to know each system's specific verbs. Configure it once per system; the platform calls the right command automatically.
12Validate fulfillment & override
Validation drawer
Press Ctrl + Shift + V (test id fulfillment-validate-button) to open the validation drawer. The drawer lists every resource kind with its operation coverage:
- β Mapped β operation has a target command.
- β Unmapped β operation has no target. The platform feature that uses it won't work for this system.
- β Broken β target command doesn't exist anymore (e.g. someone deleted it).
Click any row in the drawer to jump to the failing mapping.
Override
Validation errors block save by default. The Override action (test id fulfillment-override-button, requires the system-editor:fulfillment Β· override permission) lets a privileged operator save anyway β for example, when a connector is being authored over multiple sessions and you want to commit partial work.
Document the override and the planned follow-up in the system's description. Don't leave overridden systems in production.