Jira Integration

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.

Prerequisites
OpenClaw installed and connected to Expanso · Jira Cloud account · Admin or project access
How it works
You
AI Assistant
OpenClaw
MCP Agent
Expanso
Your Infra
Jira
REST API

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.

Setup Guide

Three steps to go live

1

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

.env
export JIRA_DOMAIN="yourcompany.atlassian.net"
export JIRA_EMAIL="[email protected]"
export JIRA_API_TOKEN="your-atlassian-api-token"
Security: Jira API tokens inherit your account's permissions. The token stays on your machine - Expanso reads it at runtime, and OpenClaw never sees it.
2

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
# 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
# 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
# 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.

Pre-built option: Check the Skills Catalog for ready-made Jira pipelines including sprint reports, bulk operations, and transition workflows.
3

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"
What you can build

Use cases

01
Sprint status reports

Ask for a sprint summary and get a breakdown of done, in-progress, and blocked items with assignees. Post to Slack before standup.

JQL / READ
02
Natural language queries

Skip JQL syntax. Ask "show me all high-priority bugs created this week" and OpenClaw translates it, runs it, and returns formatted results.

NLP / QUERY
03
Issue creation from chat

Mention a bug in Slack and have OpenClaw create a Jira issue automatically with the right project, type, priority, and description.

REST / WRITE
04
Team velocity tracking

Weekly velocity reports comparing current sprint performance against historical averages. Surfaces trends, bottlenecks, and scope changes.

METRICS / READ
05
Bulk status transitions

Move issues through your workflow with natural language. "Mark all QA-passed tickets to done" — Expanso handles the Jira API calls.

REST / WRITE
06
Cross-tool linking

Connect Jira issues with GitHub PRs, Slack threads, and Confluence pages. OpenClaw uses Expanso pipelines to link data across your toolchain.

API / CHAIN
FAQ

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.