Install
$ agentstack add skill-camunda-skills-camunda-connectors ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Camunda Connectors
Browse and configure pre-built Camunda connectors using element templates. Apply connector configurations to BPMN service tasks and event elements for integrations with external systems (REST APIs, Slack, Kafka, AWS, email, databases, etc.).
Prerequisites
- c8ctl CLI installed and configured (
c8ctl add profile) — providesc8ctl element-templatecommands - Local OOTB catalog synced — run
c8ctl element-template synconce before usingsearch,info,get-properties,get, orapplywith an OOTB template ID. Re-run (optionally with--prune) to pick up upstream changes. Applying a template from a local file path orhttps://URL bypasses the cache and does not require sync. - c8ctl ≥ 3.2.0 for
--engine-versionon discovery commands and--setFEEL auto-=. If a command or flag is unavailable, ask the user to upgrade:npm install -g @camunda8/cli
Cross-References
- camunda-bpmn: Use for creating the BPMN process structure (service tasks and event elements that host connectors)
- camunda-feel: Use for FEEL expressions in connector input/output mappings
- camunda-process-mgmt: Use for deploying the configured process to a cluster
Instructions
Element Templates
Element templates (also called connector templates — the terms are used interchangeably in Camunda's docs and tooling) are JSON files that encapsulate connector configuration. Each template defines:
- The task type identifying which connector runtime handles the job
- Properties with bindings that map to BPMN XML (input mappings, task headers, etc.)
- Conditions controlling which properties are active based on user choices
- Constraints validating user input (required fields, URL patterns, etc.)
- Groups organizing properties into logical sections (authentication, endpoint, output, error handling)
Read references/element-template-schema.md for the reader's guide to property fields and the binding → BPMN XML mapping. The full authoring schema lives in camunda-connectors-development.
Discovering Connectors via Search
Always discover the template ID via c8ctl element-template search rather than guessing or recalling an ID from memory. Template IDs and versions evolve — the search command reflects what's actually available in the local OOTB catalog.
c8ctl element-template search "REST" # find HTTP/REST connectors
c8ctl element-template search "slack" # find Slack connectors
c8ctl element-template search "kafka" # find Kafka connectors
c8ctl element-template search "connector" --limit 5 # cap results (default 20)
c8ctl element-template search "REST" --engine-version 8.8.0 # latest version compatible with 8.8.0
Each result shows the template name, ID (e.g. io.camunda.connectors.HttpJson.v2), version, appliesTo, engine constraint, and description. The header reads Showing N of M matches for '' — if M > N, narrow the query or raise --limit. Pick the ID that matches your use case.
Inbound integrations typically ship as a family of templates — one per BPMN element type the inbound event can attach to (message-start event, intermediate-catch event, boundary event, receive task, …). search returns each variant; pick the one that matches the BPMN shape you're modelling.
Inspecting a Template
Two commands cover the questions you'll ask before applying:
c8ctl element-template info [--engine-version ]— metadata card (applies-to, engine constraint, description, docs link). Pass--engine-versionto resolve the latest version compatible with that engine. Useful when the connector is unfamiliar.c8ctl element-template get-properties [...] [--engine-version ]— settable properties (condensed: name + description, grouped). Accepts positional names (shell-style globs work, quote them) and--groupto narrow. Pass--engine-versionto resolve the latest version compatible with that engine. Add--detailedfor per-property cards showing Required, FEEL, Active when, Pattern, Default, Choices — reach for--detailedwhen anapply --setcall fails or when you need to know whether to prefix a value with=.
c8ctl element-template get-properties io.camunda.connectors.HttpJson.v2 url method
c8ctl element-template get-properties io.camunda.connectors.HttpJson.v2 --group endpoint
c8ctl element-template get-properties io.camunda.connectors.HttpJson.v2 --detailed authentication.token
If a property's internal id differs from its binding name (the name --set matches), the condensed view annotates it as [id: ] on a continuation line — always use the top-line name with --set.
Applying a Template to a BPMN Element
Apply a template to a service task (or other supported element) — one call produces a fully-configured connector:
c8ctl element-template apply -i io.camunda.connectors.HttpJson.v2 Task_FetchUser process.bpmn
The `` argument can be:
- An OOTB template ID (with optional
@, e.g.io.camunda.connectors.HttpJson.v2@13). Without@, the highest version compatible with the BPMN'sexecutionPlatformVersionis auto-resolved. Requiresc8ctl element-template syncto have run at least once. - A local file path (e.g.
./my-custom-template.json) — no sync required - An
https://URL (GitHub blob URLs are auto-rewritten to raw content) — no sync required
-i modifies the BPMN file in place. Without -i, the modified XML is printed to stdout — useful for previews, redirected output, or composing with other tooling:
c8ctl element-template apply process.bpmn | diff process.bpmn - # preview the diff
c8ctl element-template apply process.bpmn > new-process.bpmn # write to a different file
c8ctl element-template apply process.bpmn | c8ctl bpmn lint # apply and lint in one pipeline
Apply writes zeebe:modelerTemplate, zeebe:modelerTemplateVersion, zeebe:modelerTemplateIcon, zeebe:taskDefinition, the **entire zeebe:ioMapping block (inputs and outputs)**, and the zeebe:taskHeaders onto the element. All of those must stay consistent — apply owns them. In particular, custom ` mappings hand-added to a connector element will be wiped on the next apply — put downstream extraction on a separate activity, or on the next flow element's ` (end events accept it too).
apply auto-resolves the latest OOTB template version compatible with the BPMN's executionPlatformVersion. Pass --engine-version to search, info, or get-properties to apply the same engine-compatibility filter during discovery — search returns the latest compatible version per template, and info / get-properties resolve via the same check. A pinned @ (e.g. io.camunda.connectors.HttpJson.v2@12) always takes precedence over --engine-version and produces a warning when the two differ.
Setting Property Values at Apply Time
Set every value via repeated --set key=value flags on the same apply call:
c8ctl element-template apply -i io.camunda.connectors.HttpJson.v2 Task_FetchUser process.bpmn \
--set method=GET \
--set url='="https://api.example.com/users/" + string(userId)' \
--set authentication.type=bearer \
--set authentication.token='{{secrets.API_TOKEN}}' \
--set resultExpression='={user: response.body}'
Note the string(userId) wrapper — userId is a number and FEEL does not auto-coerce in string concatenation. Without string(), the expression silently evaluates to null (the connector then issues a request to null). See camunda-feel for FEEL type coercion details.
key matches the template's property binding names — discover them with get-properties. When the same name appears on multiple binding types, prefix with input:, output:, header:, property:, or taskDefinition::
--set input:correlationKey='=order.id'
--set header:correlationKey=staticHeaderValue
apply errors with a helpful list of valid names if you pass an unknown property, and with the qualified-name list if a bare key is ambiguous.
FEEL value syntax. feel: required values must start with =. The canonical form is --set key='=value'; --set 'key==value' (compact) also works. For feel: required properties, c8ctl auto-prepends = when the value doesn't start with one, so --set key=expression stores =expression; value-side whitespace is trimmed. Check get-properties --detailed when unsure about the feel setting for a property.
Defaults bake in. apply materializes every active property with a default into the BPMN — `, , , and entries — not just the keys you --set`. The defaults are captured at apply time — if the template later ships a new default, this BPMN keeps the old value.
Re-apply. Omitted --set keys keep their current XML value, so single-property re-applies don't disturb the rest. Exception: dropdowns reset to the template default on every re-apply.
Result Mapping — resultVariable and resultExpression
Connectors expose two properties under the Output mapping group that control what gets written back into the process scope when the connector completes:
resultVariable— name of a single process variable that receives the raw response. Plain string, no=prefix. Use when downstream tasks just need the whole response under one name.resultExpression— FEEL expression evaluated against the response, with its result merged into the process scope. Requires the=prefix. Use to extract specific fields, rename them, or compute derived values.
Both can be set together — resultVariable captures the raw response, resultExpression shapes named variables alongside it. If neither is set, the response is discarded and downstream tasks see no new variables from this connector.
--set resultVariable=apiResponse \
--set resultExpression='={user: response.body.user, status: response.statusCode}'
The same mechanism applies to inbound connectors — e.g. the Slack inbound connector surfaces resultVariable + resultExpression under the same Output mapping group. The engine writes the incoming event payload into the process scope when the trigger fires, identically to how outbound writes the response when the service task completes.
When a connector is used as an AI-Agent tool, its output must surface under a toolCallResult variable (see camunda-ai-agents for the concept). REST connectors typically use resultExpression='={toolCallResult: response.body}'; other connectors apply the same resultExpression/resultVariable mechanics shaped to their own response.
Example — HTTP REST Connector
# 1. Discover the template
c8ctl element-template search "REST"
# → io.camunda.connectors.HttpJson.v2 (REST Outbound Connector)
# 2. Apply with all values in one call
c8ctl element-template apply -i io.camunda.connectors.HttpJson.v2 Task_FetchUser process.bpmn \
--set authentication.type=bearer \
--set authentication.token='{{secrets.API_TOKEN}}' \
--set method=GET \
--set url='="https://api.example.com/users/" + string(userId)' \
--set resultVariable=apiResponse \
--set resultExpression='={user: response.body}' \
--set errorExpression='=if response.statusCode >= 400 then bpmnError("HTTP_ERROR", string(response.statusCode)) else null'
Resulting BPMN (the data:image/svg+xml;base64,... icon blob is elided here for readability — leave it in place in the real file):
After applying, validate with c8ctl bpmn lint process.bpmn.
Common Pitfalls
- `
is not settable via--set.** It's a separate BPMN child element, not a template property — hand-edit it in afterapply`. Matters most when a connector is used as a camunda-ai-agents** tool. - Set only active properties. Conditional properties (e.g.
authentication.tokenonly applies whenauthentication.type=bearer) are silently skipped if their gating property isn't set in the same call. Decide the parent value first, then set the children. - Outbound and inbound connectors both need
resultVariableand/orresultExpression. Omitting both means the connector's response is discarded. - Use
{{secrets.NAME}}for credentials. Never hardcode tokens, API keys, or webhook URLs in--set. See camunda-c8ctl for the secrets bootstrap on local clusters. - For values that are not yet known, use a clear placeholder like
TODO_REPLACE_WITH_API_URLorPLACEHOLDER_SLACK_CHANNEL. Avoid"","test", or"xxx"— those can be mistaken for intended values.
References
For detailed reference material, read from references/:
- [element-template-schema.md](references/element-template-schema.md) — reader's guide for configuring OOTB templates via
apply --set: property-reading checklist, binding → BPMN XML mapping table, HTTP worked example. For the full authoring schema, see camunda-connectors-development
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: camunda
- Source: camunda/skills
- License: Apache-2.0
- Homepage: https://camunda.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.