Create, get, edit, delete, list, validate, and consolidate all global configurations in a Mule project — connector configs, TLS Context, Object Store, Caching Strategy, Global Error Handler, API AutoDiscovery, Import Project Reference, properties files, global-property elements, and multi-environment setup. Use when the user asks to "add Salesforce config", "configure connector", "set up connection", "create TLS context", "set up object store", "add caching strategy", "create error handler", "set up autodiscovery", "import shared project", "create config.yaml", "set up environments", "add global property", "list global elements", "find usages", "validate config exists", "consolidate configs", or any request to manage global-level configuration in a Mule app. NEVER use MCP server tools — use only the bash scripts provided.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Create, view, edit, delete, list, validate, and consolidate all global configurations in a Mule 4 project through an interactive, multi-turn workflow.
What you'll build: Fully configured global elements in global-configs.xml, properties files, and validated pom.xml dependencies — all following MuleSoft best practices.
flowchart TD
Start{User Intent} -->|connector, config, connection| CC[Connector Config]
Start -->|TLS, SSL, certificate| TLS[TLS Context]
Start -->|object store, key-value| OS[Object Store]
Start -->|caching, cache strategy| CS[Caching Strategy]
Start -->|error handler, on-error| EH[Error Handler]
Start -->|autodiscovery, API gateway| AD[API AutoDiscovery]
Start -->|import project, shared library| IMP[Import]
Start -->|properties, config.yaml, env| PROP[Properties]
Start -->|global-property, inline| GP[Global Property]
Start -->|list all, show all configs| LIST[List All]
Start -->|find usages, where is used| FIND[Find Usages]
Start -->|validate, dangling ref| VAL[Validate]
Start -->|consolidate, centralize| CON[Consolidate]
CC --> OP{Operation}
TLS --> OP
OS --> OP
CS --> OP
EH --> OP
AD --> OP
IMP --> OP
PROP --> OP
GP --> OP
OP -->|Create| CREATE[Generate XML + config.yaml + pom.xml]
OP -->|Get| GET[Scan & Display]
OP -->|Edit| EDIT[Modify & Validate]
OP -->|Delete| DELETE[Remove & Cleanup]Before starting, ensure you have:
src/main/mule/, src/main/resources/, pom.xml)@mulesoft/anypoint-cli-dx-mule-plugin)dx mule describe-connector metadata commandsCreate connector config: Steps 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
projectDir, connectorNameCreate global element: Steps 1, 2, 12
projectDir, elementTypeManage properties: Steps 1, 2, 13
projectDirManagement operations: Steps 1, 2, 14
projectDirRules:
search_asset, get_asset, or any MCP-based tool.describe-connector metadata is the source of truth.get_latest_connector.sh → pick_connector.sh.global-configs.xml. See references/global-config-conventions.md for ordering and structure.pom.xml. Read pom.xml, add the <dependency> block inside <dependencies>, and write the file. The build will fail without this. Never skip this step.Scripts:
This skill includes shell scripts in its own scripts/ directory. Invoke them with the Bash tool at the absolute path you were given in the "skill is now active" message. Do not use relative paths.
| Script | Purpose |
|---|---|
get_latest_connector.sh <search> [nickname] | Search Exchange for connector candidates (one GAV per line) |
pick_connector.sh <nickname> <gav> | Record chosen GAV as a draft |
describe_connector.sh <nickname> | Run dx mule describe-connector, save JSON, echo digest |
build_gav.sh <json> | Turn a saved connector JSON into groupId:assetId:version |
Scripts path: <skill-root>/scripts/ (where <skill-root> is the directory containing this SKILL.md).
References:
Read these files with the Read tool when instructed. Use the absolute path from the "skill is now active" message.
| File | Content | When to Read |
|---|---|---|
references/global-elements-catalog.md | XML templates, namespace URIs, XSD URLs, pom.xml dependencies, attribute tables, validation rules, and connector config generation rules for ALL element types. | Before generating ANY XML — verify structure, required attributes, namespace, and dependency. |
references/global-config-conventions.md | Element ordering, namespace management, centralization rules, default project structure, consolidation decision matrix. | When placing elements in global-configs.xml, managing namespaces, or running consolidation. |
references/properties-patterns.md | Property file formats, ${placeholder} resolution, multi-env patterns, secure properties, built-in properties, naming conventions, validation rules. | When creating/editing properties files, setting up environments, or validating placeholders. |
Resolve Target Project:
Run once per session — reuse the result for all subsequent operations in this conversation.
If multiple Mule projects exist in the workspace, ask the user which one to use via AskUserQuestion and STOP. Do not combine this question with any other question. If only one exists, use it without asking.
Operation Routing — Level 1 (Domain):
| Keywords | Domain |
|---|---|
| connector, config, connection, Salesforce, HTTP, DB, database, Slack, S3, ServiceNow, Jira, NetSuite, oauth, credentials | → CONNECTOR CONFIG |
| TLS, SSL, trust store, key store, certificate, mTLS | → TLS CONTEXT |
| object store, key-value store, persistent store, os:config | → OBJECT STORE |
| caching, cache strategy, cache scope | → CACHING STRATEGY |
| error handler, global error, default error handler, on-error | → ERROR HANDLER |
| autodiscovery, API gateway, API ID, API Manager | → API AUTODISCOVERY |
| import project, reference project, shared library, JAR import | → IMPORT |
| properties, config.yaml, .properties, placeholder, environment, dev/QA/prod, multi-env, check placeholders, unresolved properties | → PROPERTIES |
| global-property, inline property, name-value | → GLOBAL PROPERTY |
| list all, what global elements, show all configs | → LIST ALL |
| find usages, where is used, which flows reference | → FIND USAGES |
| validate, check config exists, dangling reference | → VALIDATE |
| consolidate, centralize, move to global-config | → CONSOLIDATE |
Operation Routing — Level 2 (Operation):
| Intent | Operation |
|---|---|
| Create / add / set up / configure (new) | → CREATE |
| Get / list / show / view | → GET |
| Edit / update / modify / change | → EDIT |
| Delete / remove / drop | → DELETE |
If unclear, ask:
What would you like to do? (create, view, edit, delete, validate, consolidate)
STOP.
If not specified, ask which connector. Then search Exchange:
bash scripts/get_latest_connector.sh salesforce sfdcIf multiple variants are returned and the user did NOT pre-supply a specific connector artifact, ask user via AskUserQuestion and STOP. If only one result matches (or the connector is already in pom.xml), proceed without asking.
Then pick:
bash scripts/pick_connector.sh sfdc com.mulesoft.connectors:mule-salesforce-connector:11.1.0If connector is already in the project's pom.xml, extract GAV from there instead.
bash scripts/describe_connector.sh sfdcRead the configs[] and connectionProviders from the digest.
If the user pre-supplied a config name, use it and skip this STOP. Otherwise ask:
What name for this connector configuration? (e.g.,
salesforceConfig)
STOP (only if not pre-supplied).
If the user pre-supplied a provider name that unambiguously matches one provider from the metadata, use it and skip this STOP. If multiple providers exist and the user did NOT specify one (or the name is ambiguous), ask user.
STOP (only if prompting).
anypoint-cli-v4 dx mule describe-connector \
--connector "$(bash scripts/build_gav.sh tmp/connector-choices/sfdc.json)" \
--type connection-provider \
--name basic-connection \
--config-name sfdc-config \
--output json > tmp/connector-metadata/sfdc-config.jsonCheck for oauthCallbackConfig child element.
If the user pre-supplied explicit field values or indicated "use placeholders" / "default placeholders" for all fields, use that preference and skip this STOP. When placeholders are chosen, generate ${connectorNamespace.fieldName} for each required field automatically.
Otherwise ask:
Provide values for required fields, or choose "placeholders" for
${property}references.
STOP (only if not pre-supplied).
Read references/global-elements-catalog.md → "Connector Config Generation Rules" section. Generate XML following Pattern 1 (attributes) or Pattern 2 (child elements) based on metadata.
Only for fields where user chose placeholders. Use ${namespace.attributeName} pattern.
src/main/mule/global-configs.xml (create if missing — see references/global-config-conventions.md).src/main/resources/config.yaml.pom.xml.<artifactId> already exists in <dependencies>.<dependencies>:
<dependency>
<groupId>{groupId}</groupId>
<artifactId>{artifactId}</artifactId>
<version>{version}</version>
<classifier>mule-plugin</classifier>
</dependency>groupId, artifactId, and version come from the GAV saved by pick_connector.sh in tmp/connector-choices/.pom.xml with the new dependency added.cd <project-dir> && mvn clean package -DskipTestsFix and re-run until BUILD SUCCESS.
GET / EDIT / DELETE (Connector Config):
GET: Scan src/main/mule/*.xml for <*:*-config> elements with connection provider children. Display name, type, file, provider, attributes.
EDIT: GET → ask which → show current values → ask for changes → STOP → apply edits → validate.
DELETE: Identify → search all XML for config-ref="{name}" → show usages → confirm → STOP → remove element → clean namespaces → validate.
For all element types below, read references/global-elements-catalog.md for the canonical XML structure, required attributes, and validation rules before generating XML.
Q1: Name? Trust Store only / Key Store only / both (mutual TLS)?
STOP.
Q2: Store paths, passwords (use placeholders). Optional: protocols, cipher suites, revocation check, store type/algorithm.
STOP. → Execute: write XML to global-configs.xml, add tls namespace, update config.yaml.
Q1: Need a new os:config, or use existing? Name?
STOP.
Q2: Object Store name, config-ref, persistent?, maxEntries, entryTtl, TTL unit.
STOP. → Execute:
global-configs.xml.os namespace: xmlns:os="http://www.mulesoft.org/schema/mule/os" and its schemaLocation entry.mule-objectstore-connector dependency to pom.xml (MANDATORY — do not skip):
pom.xml and check if mule-objectstore-connector already exists in <dependencies>.<dependencies>:
<dependency>
<groupId>org.mule.connectors</groupId>
<artifactId>mule-objectstore-connector</artifactId>
<version>1.2.5</version>
<classifier>mule-plugin</classifier>
</dependency>pom.xml.cd <project-dir> && mvn clean package -DskipTests.Q1: Name? Which Object Store to use (existing reference or inline)?
STOP.
Q2: Key generation expression? Event copy strategy (simple/serializable)? Synchronized?
STOP. → Execute: write XML, add ee namespace, ensure Object Store dependency if inline.
Q1: Name? What strategies? (on-error-continue / on-error-propagate). Which error types per strategy?
STOP.
Q2: What should each strategy do? (log, set payload, set status code). Set as default?
STOP. → Execute: write XML + <configuration defaultErrorHandler-ref="..."/> if default. Add ee namespace if using <ee:transform>.
Q1: API ID? Which flow? (show available flows from project scan).
STOP.
Q2: Optional settings (ignoreBasePath, etc.).
STOP. → Execute:
global-configs.xml:
<api-gateway:autodiscovery apiId="${api.id}" flowRef="{flow-name}" doc:name="API AutoDiscovery" />api-gateway namespace: xmlns:api-gateway="http://www.mulesoft.org/schema/mule/api-gateway" and its schemaLocation entry.mule-api-gateway dependency to pom.xml (MANDATORY — do not skip):
pom.xml and check if mule-api-gateway already exists in <dependencies>.<dependencies>:
<dependency>
<groupId>org.mule.modules</groupId>
<artifactId>mule-api-gateway</artifactId>
<version>${app.runtime}</version>
<classifier>mule-plugin</classifier>
<scope>provided</scope>
</dependency>pom.xml.api.id to config.yaml (MANDATORY — do not skip):
src/main/resources/config.yaml.api.id: "YOUR_API_ID" (or user-specified value) under an appropriate section.cd <project-dir> && mvn clean package -DskipTests.Q1: Maven coordinates (groupId, artifactId, version)?
STOP.
Q2: What resources to use? Add <import> declaration?
STOP. → Execute: add dependency to pom.xml, add <import file="{artifactId}.xml"/> to global-configs.xml.
Same shared pattern as Connector Config:
GET: Scan all Mule XML for the relevant element patterns. Display grouped by type.
EDIT: List → ask which → show values → ask changes → STOP → apply → validate.
DELETE: Identify → find usages (per-type reference patterns from references/global-elements-catalog.md) → present → confirm → STOP → remove → namespace cleanup → validate.
Read references/properties-patterns.md before any properties operation.
Q1: YAML or Properties format? Filename?
STOP.
Q2: Initial key-value pairs (or "empty")? Register as <configuration-properties>?
STOP. → Execute: create file in src/main/resources/, register in global-configs.xml if requested.
Q1: List available files → which to edit?
STOP.
Q2: Show current contents → what to add/modify/remove?
STOP. → Execute: apply changes, warn if removed keys are still referenced.
Q1: Which environments? (dev, QA, prod, etc.) Default environment?
STOP.
Q2: What properties differ per environment? Common properties in base config.yaml?
STOP. → Execute: create per-env files, add <global-property name="env" value="{default}"/>, add <configuration-properties file="${env}.yaml"/> to global-configs.xml.
Register: List unregistered files → ask which → add <configuration-properties file="..." doc:name="..."/>.
Unregister: List registered files → ask which → warn ("placeholders won't resolve") → confirm → STOP → remove element (keep file).
Create Q1: What name-value pairs?
STOP. → Execute: add <global-property name="..." value="..." doc:name="..."/> to global-configs.xml.
Edit: List → ask which → show → ask new value → STOP → apply.
Delete: List → find ${name} usages → present → confirm → STOP → remove.
List: registered files + unregistered files + global properties. Show key counts and registration locations.
src/main/mule/.<mule> that is NOT <flow> or <sub-flow>.config-ref, tlsContext, objectStore, cachingStrategy-ref, defaultErrorHandler-ref, errorHandler-ref, listenerConfig).global-configs.xml), unused elements (0 references).config-ref="{name}" — connector operations/sourceslistenerConfig="{name}" — OAuth callback configstlsContext="{name}" — HTTP configsobjectStore="{name}" — caching strategiescachingStrategy-ref="{name}" — <ee:cache> scopesdefaultErrorHandler-ref="{name}" — <configuration>errorHandler-ref="{name}" — individual flowsChecks that every config-ref, tlsContext, objectStore, cachingStrategy-ref, defaultErrorHandler-ref, errorHandler-ref, and listenerConfig attribute in flow XML points to a global element that actually exists in the project.
src/main/mule/ for reference attributes (config-ref="X", tlsContext="X", objectStore="X", cachingStrategy-ref="X", defaultErrorHandler-ref="X", errorHandler-ref="X", listenerConfig="X").name attribute).Read references/global-config-conventions.md → "Consolidation Decision Matrix" section.
global-configs.xml.mvn clean package -DskipTests.describe-connector metadata is the source of truth.get_latest_connector.sh → pick_connector.sh.global-configs.xml. See references/global-config-conventions.md for ordering and structure.pom.xml. This is the #1 cause of build failures. The dependency XML patterns are documented in references/global-elements-catalog.md. Read pom.xml → add dependency → write pom.xml. Do this BEFORE running mvn clean package.${property.name} placeholders in XML, the corresponding property MUST be added to src/main/resources/config.yaml. For AutoDiscovery, always add api.id to config.yaml.get_latest_connector.sh.tmp/connector-choices/ for the saved JSON.<configuration-properties> is registered in global-configs.xml and the properties file exists in src/main/resources/.mulesoft/mulesoft-dx
b8cef7d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.