Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.
Integrations
Jira API工具
Try itCall the Jira Cloud API with managed OAuth to search and manage issues.
What it does
Proxy requests to the Jira Cloud REST API (api.atlassian.com) with OAuth tokens injected automatically. Supports listing and viewing projects, searching issues with JQL, creating, updating, deleting, and assigning issues, transitioning workflow status, listing and adding comments, and querying users plus metadata like issue types, priorities, and statuses. All write operations require explicit user approval, and access is scoped to the connected Jira account.
When to use it
- Searching and filtering issues with JQL
- Creating or updating issues from automated workflows
- Moving issues through workflow transitions
- Adding comments and querying users on issues
The skill document
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:
- Sign in or create an account at maton.ai
- Go to maton.ai/settings
- Copy your API key
- 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 support@maton.ai with the specific operations/APIs you need and your use-case
- IMPORTANT: When using curl commands, use
curl -gwhen URLs contain brackets (fields[],sort[],records[]) to disable glob parsing - IMPORTANT: When piping curl output to
jqor other commands, environment variables like$MATON_API_KEYmay not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.
Error Handling
| Status | Meaning |
|---|---|
| 400 | Missing Jira connection or invalid JQL |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Jira API |
Troubleshooting: API Key Issues
CLI:
- Check your auth state:
maton whoami
- Verify the API key is valid by listing connections:
maton connection list
Manual:
- Check that the
MATON_API_KEYenvironment variable is set:
echo $MATON_API_KEY
- 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
- 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
Questions people ask
- What authentication does this use?
- It uses managed OAuth via Maton's API key. The skill returns a connection URL to complete OAuth in the browser, then injects the token into each proxied request so you don't manage OAuth credentials yourself.
- Do I need a Jira Cloud ID to call the API?
- Yes. The first step is to fetch accessible resources from /oauth/token/accessible-resources and use the returned id as {cloudId} in the request path, e.g. /jira/ex/jira/{cloudId}/rest/api/3/....
- Are write operations safe to run automatically?
- No single-step automation. Per the skill's Security & Permissions section, every create, update, delete, or transition call requires explicit user confirmation of the target and intended effect before execution.
Related skills
Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.
Save, search, and manage personal notes and knowledge bases in Get笔记 on explicit request.
Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.
Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.
Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.
More from byungkyu
Browse all skillsRoute vulnerability lookups through agent-bom with explicit data boundaries and preserved advisory provenance.
Route prompts to the right dlazy CLI audio model for TTS, music, sound effects, and voice cloning.
Query and manage Linear issues, projects, teams, cycles, labels, and comments through a managed OAuth GraphQL endpoint.
Build, debug, preview, and publish WeChat Mini Programs using Nightly DevTools, wechatide CLI, and a miniprogram-ci fallback.
语音通话服务让AI代理为用户拨打真实的美国电话。语音AI代理负责拨号、对话、处理电话菜单或等待时间, 并在通话结束后返回转录、结果与录音链接(如可用)。首次外呼可自动签发API密钥. 核心能力: - 外呼:POST /call 发起通话,轮询 GET /call/{call_id} 至 lifecycle=fin...
Route image, video, and audio requests to the right dlazy CLI model based on intent.