集成

Jira

通过托管 OAuth 调用 Jira Cloud API,搜索并管理工单。

它能做什么

把请求代理到 Jira Cloud REST API (api.atlassian.com),Token 由代理自动注入。 支持列出与查看项目、用 JQL 搜索工单、创建/更新/删除/指派工单、流转工作流状态、列出与添加评论,以及查询用户和 issue type、priority、status 等元数据。 写操作需要在执行前获得用户明确确认,访问范围限定在已连接的 Jira 账号之内。

什么时候用它

  • 用 JQL 搜索与筛选工单
  • 在自动化流程中创建或更新工单
  • 推动工单在工作流中流转
  • 给工单添加评论或查询用户信息

技能文档

Jira

Access the Jira Cloud API with managed OAuth authentication. Search issues with JQL, create and manage issues, and automate workflows.

Quick Start

CLI:

maton jira issue search 'project = PROJ AND status = "In Progress"' --cloud-id abc-123
maton api '/jira/ex/jira/{cloudId}/rest/api/3/search/jql?jql=project%3DKEY&maxResults=10'

Python:

# First, get your cloud ID
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/jira/oauth/token/accessible-resources')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

# Then search issues
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/jira/ex/jira/{cloudId}/rest/api/3/search/jql?jql=project%3DKEY&maxResults=10')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://api.maton.ai/jira/{native-api-path}

Maton proxies requests to api.atlassian.com and automatically injects your OAuth token.

Getting Cloud ID

Jira Cloud requires a cloud ID. Get it first:

GET /jira/oauth/token/accessible-resources

Example:

maton jira cloud list

Response:

[{
  "id": "62909843-b784-4c35-b770-e4e2a26f024b",
  "url": "https://yoursite.atlassian.net",
  "name": "yoursite"
}]

Installation

NPM:

npm install -g @maton/cli

Homebrew:

brew install maton-ai/cli/maton

Authentication

CLI:

maton login                          # Opens browser for API key
maton login --interactive            # Skip browser, paste API key directly
maton whoami                         # Show current auth state

Manual:

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key
  4. Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"

Connection Management

Manage your Jira OAuth connections at https://api.maton.ai.

List Connections

CLI:

maton connection list jira --status ACTIVE
maton api -X GET /connections -f app=jira -f status=ACTIVE

Python:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=jira&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

CLI:

maton connection create jira
maton api /connections -f app=jira

Python:

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'jira'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

CLI:

maton connection view {connection_id}
maton api /connections/{connection_id}

Python:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "{connection_id}",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "jira",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

Delete Connection

CLI:

maton connection delete {connection_id}
maton api -X DELETE /connections/{connection_id}

Python:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple Jira connections, specify which one to use:

CLI:

maton jira project list --cloud-id abc-123 --connection {connection_id}
maton api /jira/ex/jira/{cloudId}/rest/api/3/project --connection {connection_id}

Python:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/jira/ex/jira/{cloudId}/rest/api/3/project')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If you have multiple connections, always specify the connection to ensure requests go to the intended account.

Security & Permissions

  • Access is scoped to issues, projects, boards, sprints, and users within the connected Jira account.
  • All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.

API Reference

Projects

List Projects

GET /jira/ex/jira/{cloudId}/rest/api/3/project

Example:

maton jira project list --cloud-id abc-123

Get Project

GET /jira/ex/jira/{cloudId}/rest/api/3/project/{projectKeyOrId}

Example:

maton jira project view PROJ --cloud-id abc-123

Issues

Search Issues (JQL)

GET /jira/ex/jira/{cloudId}/rest/api/3/search/jql?jql=project%3DPROJ%20order%20by%20created%20DESC&maxResults=20&fields=summary,status,assignee

Example:

maton jira issue search 'project = PROJ order by created DESC' --cloud-id abc-123 --limit 20 --fields summary,status,assignee

Get Issue

GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}

Example:

maton jira issue view PROJ-123 --cloud-id abc-123

Create Issue

POST /jira/ex/jira/{cloudId}/rest/api/3/issue
Content-Type: application/json

{
  "fields": {
    "project": {"key": "PROJ"},
    "summary": "Fix login",
    "issuetype": {"name": "Task"}
  }
}

Example:

maton jira issue create --cloud-id abc-123 --project PROJ --summary 'Fix login' --type Task

Update Issue

PUT /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}
Content-Type: application/json

{
  "fields": {
    "summary": "Updated summary"
  }
}

Example:

maton jira issue update PROJ-123 --cloud-id abc-123 --summary 'Updated summary'

Delete Issue

DELETE /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}

Example:

maton jira issue delete PROJ-123 --cloud-id abc-123

Assign Issue

PUT /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/assignee
Content-Type: application/json

{
  "accountId": "712020:5aff718e-6fe0-4548-82f4-f44ec481e5e7"
}

Example:

maton jira issue update PROJ-123 --cloud-id abc-123 --assignee 712020:5aff718e-6fe0-4548-82f4-f44ec481e5e7

Transitions

Get Transitions

GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions

Example:

maton jira transition list PROJ-123 --cloud-id abc-123

Transition Issue (change status)

POST /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/transitions
Content-Type: application/json

{
  "transition": {"id": "31"}
}

Example:

maton jira transition apply PROJ-123 --cloud-id abc-123 --id 31

Comments

Get Comments

GET /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment

Example:

maton jira comment list PROJ-123 --cloud-id abc-123

Add Comment

POST /jira/ex/jira/{cloudId}/rest/api/3/issue/{issueIdOrKey}/comment
Content-Type: application/json

{
  "body": {
    "type": "doc",
    "version": 1,
    "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Comment text"}]}]
  }
}

Example:

maton jira comment add PROJ-123 --cloud-id abc-123 --body 'Comment text'

Users

Get Current User

GET /jira/ex/jira/{cloudId}/rest/api/3/myself

Example:

maton jira whoami --cloud-id abc-123

Search Users

GET /jira/ex/jira/{cloudId}/rest/api/3/user/search?query=john

Example:

maton jira user search john --cloud-id abc-123

Metadata

List Issue Types

GET /jira/ex/jira/{cloudId}/rest/api/3/issuetype

Example:

maton jira issuetype list --cloud-id abc-123

List Priorities

GET /jira/ex/jira/{cloudId}/rest/api/3/priority

Example:

maton jira priority list --cloud-id abc-123

List Statuses

GET /jira/ex/jira/{cloudId}/rest/api/3/status

Example:

maton jira status list --cloud-id abc-123

Code Examples

CLI

# Discover accessible Jira Cloud resources
maton jira cloud list

# Search issues with JQL
maton jira issue search 'project = PROJ AND status = "In Progress"' --cloud-id abc-123

# Filter with jq
maton jira issue search 'project = PROJ' --cloud-id abc-123 \
  --json --jq '.issues | map(select(.fields.status.name == "In Progress"))'

# Create an issue
maton jira issue create --cloud-id abc-123 --project PROJ --summary 'Fix login'

JavaScript

// Get cloud ID first
const resources = await fetch(
  'https://api.maton.ai/jira/oauth/token/accessible-resources',
  { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } }
).then(r => r.json());

const cloudId = resources[0].id;

// Search issues
const issues = await fetch(
  `https://api.maton.ai/jira/ex/jira/${cloudId}/rest/api/3/search/jql?jql=project=KEY`,
  { headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } }
).then(r => r.json());

Python

import os
import requests

headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}

# Get cloud ID
resources = requests.get(
    'https://api.maton.ai/jira/oauth/token/accessible-resources',
    headers=headers
).json()

cloud_id = resources[0]['id']

# Search issues
issues = requests.get(
    f'https://api.maton.ai/jira/ex/jira/{cloud_id}/rest/api/3/search/jql',
    headers=headers,
    params={'jql': 'project=KEY', 'maxResults': 10}
).json()

Notes

  • Always fetch cloud ID first using /oauth/token/accessible-resources
  • JQL queries must be bounded (e.g., project=KEY)
  • Use URL encoding for JQL query parameters
  • Update, Delete, Transition return HTTP 204 on success
  • Agile API requires additional OAuth scopes. If you receive a scope error, contact Maton support at [email protected] with the specific operations/APIs you need and your use-case
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.

Error Handling

StatusMeaning
400Missing Jira connection or invalid JQL
401Invalid or missing Maton API key
429Rate limited (10 req/sec per account)
4xx/5xxPassthrough error from Jira API

Troubleshooting: API Key Issues

CLI:

  1. Check your auth state:
maton whoami
  1. Verify the API key is valid by listing connections:
maton connection list

Manual:

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with jira. For example:
  • Correct: https://api.maton.ai/jira/ex/jira/{cloudId}/rest/api/3/project
  • Incorrect: https://api.maton.ai/ex/jira/{cloudId}/rest/api/3/project

Resources

常见问题

用的是什么认证方式?
托管 OAuth,配合 Maton 的 API Key 使用。技能会返回一个连接 URL,在浏览器里完成 OAuth,之后 Token 由代理自动注入每个请求,无需自己管理凭据。
调用 API 必须先拿到 Cloud ID 吗?
是的。需要先调用 /oauth/token/accessible-resources 拿到可访问资源,把其中的 id 作为 {cloudId} 拼到路径里,例如 /jira/ex/jira/{cloudId}/rest/api/3/...。
写操作可以直接自动执行吗?
不可以一键自动放过。文档的 Security & Permissions 部分明确要求,所有 create、update、delete、transition 在执行前都必须先与用户确认目标资源和预期效果。

相关技能

通过托管 OAuth 接入 GitHub REST API,覆盖仓库、Issue、PR、Commit、分支与用户等接口。

595 次安装47 星标

通过托管 OAuth 调用 Google Docs API,实现文档创建、读写与样式管理。

278 次安装8 星标

通过托管 OAuth 代理访问 Google Calendar API,读写日程与事件。

345 次安装21 星标

通过托管 OAuth 代理对接 Asana API,统一处理任务、项目、空间、用户与 Webhook。

601 次安装6 星标

通过托管 OAuth 代理访问 Trello API,统一管理看板、列表、卡片、检查项、标签与成员。

587 次安装7 星标

通过托管的 OAuth GraphQL 接口查询与管理 Linear 的 issue、项目、团队、周期、标签和评论。

作者 byungkyu517 次安装18 星标

byungkyu 的更多技能

浏览全部技能

通过 Microsoft Graph 接入 Outlook,读取、发送、管理邮件、文件夹、日历事件和联系人,OAuth 由平台托管。

作者 byungkyu771 次安装46 星标

通过托管的 OAuth GraphQL 接口查询与管理 Linear 的 issue、项目、团队、周期、标签和评论。

作者 byungkyu517 次安装18 星标

Google Slides API integration with managed OAuth. Create presentations, add slides, insert content, and manage slide formatting. Use this skill when users wa...

作者 byungkyu653 次安装33 星标

Google Meet API integration with managed OAuth. Create meeting spaces, list conference records, and manage meeting participants. Use this skill when users wa...

作者 byungkyu619 次安装15 星标

Google Contacts API integration with managed OAuth. Manage contacts, contact groups, and search your address book. Use this skill when users want to create,...

作者 byungkyu233 次安装5 星标

Pipedrive API integration with managed OAuth. Manage deals, persons, organizations, activities, and pipelines. Use this skill when users want to interact wit...

作者 byungkyu621 次安装7 星标