Every path matters.
Variables set on only some branches, broken flow references,
error read outside a handler, shadowed or empty
handlers, and config Mule refuses to deploy.
Static analysis for MuleSoft 4. Types from your API specs, database schemas and Salesforce org are followed through every flow, DataWeave script and connector, so mistakes show up in your terminal or CI, not in production.
types: Order: properties: id: string customerId: string total: number/orders: post: body: Orderrequest responses: 201: { body: Order }response<flow name="post:\orders:application\json:api-config"> <logger message="#['Order for ' ++ payload.custmerId]"/> <ee:transform> <ee:message> <ee:set-payload><![CDATA[%dw 2.0output application/json---{ id: uuid(), customerId: payload.customerId }]]></ee:set-payload> </ee:message> </ee:transform></flow>
Field custmerId is not declared of Order (known:
id, customerId, total). Did you mean customerId?
POST /orders returns a payload that does not match the 201
response 'Order': $.total: missing required
field.
Each example is real analyzer output for a small orders project with a RAML spec, a SQL schema, a Salesforce describe and a sibling customers API.
Muleflow builds a model of your whole application and tracks what each processor does to the event, across files and flow references.
Variables set on only some branches, broken flow references,
error read outside a handler, shadowed or empty
handlers, and config Mule refuses to deploy.
Types inferred from specs, queries and DataWeave flow into every selector. Unknown fields, bad function arguments, missing imports and responses that break the contract.
SQL and SOQL against your schema and org metadata, connector operations from their jars, HTTP contracts of sibling APIs, and properties per environment.
Unknown and dynamic values stay unknown, so findings stay trustworthy. All rules
Readable text for a quick check. A self-contained HTML report with filters and search. SARIF for code scanning. JSON for your own tools.
Commit a baseline to report only new findings, and pick the severity that fails the build.
CI reporting docsuv run muleflow-analyzer ./orders-api
Clone the repo, sync with uv, and point the analyzer at a Mule project or a folder of projects. Requires Python 3.15+ and uv.
git clone
https://github.com/f-schnabel/muleflow-analyzer.git
cd
muleflow-analyzer
uv sync --locked
uv run muleflow-analyzer path/to/mule-project
No. Muleflow analyzes project files without starting Mule or opening Studio. Connector jars from your Maven repository, API specs, database schemas and Salesforce metadata enrich the checks when available; Salesforce metadata can come from offline describes or an authenticated org.
Yes. Point at a folder containing Mule projects. Each project is analyzed with its own properties and specs, then findings are combined. Sibling API projects supply HTTP contracts for outgoing requests.
Predictions are checked against a real Mule runtime with a conformance harness. Dynamic expressions and missing metadata stay unknown instead of producing guesses.
No. Static analysis has limits, especially for dynamic expressions and unavailable metadata. Use it alongside runtime tests; the README lists supported behavior and known limitations.