Connect Jira
to Your Pipeline
Create issues, track sprints, run JQL queries, and automate project workflows with natural language - API tokens never leave your machine.
Your natural language commands flow through OpenClaw to your Expanso-managed pipeline, which queries and updates Jira via its REST API. Credentials stay in your infrastructure.
Three steps to go live
Generate a Jira API Token
Jira Cloud uses API tokens for authentication. The token is scoped to your user account's permissions.
1.1 Create an API token
Go to Atlassian API Tokens and click Create API token. Give it a label like "OpenClaw Expanso" and copy the token.
1.2 Store credentials securely
export JIRA_DOMAIN="yourcompany.atlassian.net"
export JIRA_EMAIL="[email protected]"
export JIRA_API_TOKEN="your-atlassian-api-token" Deploy the Jira Pipeline
Create Expanso pipelines for reading and writing Jira data.
2.1 Set up Expanso (if you haven't already)
Follow the Expanso setup guide to create your account and install the CLI.
2.2 Create the Jira query pipeline
Open cloud.expanso.io, click New Pipeline, and paste:
# jira-query.yaml
# Runs JQL queries and returns structured results
input:
http_server:
path: /jira-query
allowed_verbs: [ "POST" ]
pipeline:
processors:
- http:
url: "https://${JIRA_DOMAIN}/rest/api/3/search"
verb: POST
headers:
Content-Type: "application/json"
basic_auth:
username: "${JIRA_EMAIL}"
password: "${JIRA_API_TOKEN}"
- mapping: |
root.issues = this.issues.map_each(issue -> {
"key": issue.key,
"summary": issue.fields.summary,
"status": issue.fields.status.name,
"priority": issue.fields.priority.name,
"assignee": issue.fields.assignee.displayName.or("Unassigned"),
"type": issue.fields.issuetype.name
})
root.total = this.total
output:
sync_response: {} 2.3 Create the issue creator pipeline
# jira-create.yaml
# Creates new Jira issues
input:
http_server:
path: /jira-create
allowed_verbs: [ "POST" ]
pipeline:
processors:
- mapping: |
root.fields.project.key = this.project
root.fields.summary = this.summary
root.fields.issuetype.name = this.type.or("Task")
root.fields.priority.name = this.priority.or("Medium")
- http:
url: "https://${JIRA_DOMAIN}/rest/api/3/issue"
verb: POST
headers:
Content-Type: "application/json"
basic_auth:
username: "${JIRA_EMAIL}"
password: "${JIRA_API_TOKEN}"
output:
sync_response: {} 2.4 Create the sprint status pipeline
# jira-sprint.yaml
# Gets current sprint status with issue breakdown
input:
http_server:
path: /jira-sprint
allowed_verbs: [ "POST" ]
pipeline:
processors:
- http:
url: "https://${JIRA_DOMAIN}/rest/api/3/search?jql=sprint%20in%20openSprints()&maxResults=100"
verb: GET
basic_auth:
username: "${JIRA_EMAIL}"
password: "${JIRA_API_TOKEN}"
- mapping: |
let issues = this.issues
root.total = $issues.length()
root.done = $issues.filter(i -> i.fields.status.statusCategory.name == "Done").length()
root.in_progress = $issues.filter(i -> i.fields.status.statusCategory.name == "In Progress").length()
root.todo = $issues.filter(i -> i.fields.status.statusCategory.name == "To Do").length()
output:
sync_response: {} 2.5 Deploy all pipelines
Click Deploy for each pipeline. They run locally with your Jira credentials resolved from environment variables.
Connect to OpenClaw
Register the Expanso MCP server so OpenClaw can invoke your Jira pipelines.
3.1 Register the MCP server
expanso-cli mcp add npx @expanso/mcp-pipelines 3.2 Test the integration
Open OpenClaw and try these commands:
"Show me all open bugs in the PLATFORM project"
"Create a task in PLATFORM: Update API rate limiting docs"
"What's the current sprint progress?"
"Get the sprint status and post it to #standup on Slack" Use cases
Ask for a sprint summary and get a breakdown of done, in-progress, and blocked items with assignees. Post to Slack before standup.
Skip JQL syntax. Ask "show me all high-priority bugs created this week" and OpenClaw translates it, runs it, and returns formatted results.
Mention a bug in Slack and have OpenClaw create a Jira issue automatically with the right project, type, priority, and description.
Weekly velocity reports comparing current sprint performance against historical averages. Surfaces trends, bottlenecks, and scope changes.
Move issues through your workflow with natural language. "Mark all QA-passed tickets to done" — Expanso handles the Jira API calls.
Connect Jira issues with GitHub PRs, Slack threads, and Confluence pages. OpenClaw uses Expanso pipelines to link data across your toolchain.
Common questions
Does this work with Jira Server or Data Center?
The pipelines above are optimized for Jira Cloud, which uses API tokens for authentication. Jira Server and Data Center use different authentication (personal access tokens or OAuth). You can adapt the pipeline configuration by changing the auth method and base URL, but the setup is slightly different.
What Jira permissions does the API token have?
The API token inherits the permissions of the Atlassian account that created it. If your account can view a project in Jira, the pipeline can read it. If your account can create issues, the pipeline can create them. The access scope is identical to your browser-based Jira access.
Can OpenClaw handle large JQL result sets?
Jira's API returns paginated results (default 50, max 100 per request). The Expanso pipeline handles pagination automatically for result sets under 1,000 issues. For larger result sets, results are summarized rather than fully returned to keep response times fast.
Is my Jira API token safe?
Yes. The token is stored in an environment variable on your machine. Expanso reads it at pipeline runtime. Neither OpenClaw nor any AI model ever sees your Jira credentials. All API calls go directly from your machine to Atlassian's servers.
Can I limit which projects OpenClaw can access?
You can constrain access in two ways: (1) Use a Jira API token from an account with limited project access, or (2) Add project-level filtering in the Expanso pipeline to restrict which projects can be queried. Both approaches work, and you can combine them.
Ready to connect Jira?
Get your OpenClaw wired up to Jira in under 15 minutes.