CONNECT APP
Build with Jira Service Desk
Help Desk & Support
- OAuth
MCP
Give your agent Jira Service Desk tools
Every Jira Service Desk action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Jira Service Desk account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "jira_service_desk",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Create Comment on Request:
const result = await mcp.callTool({
name: "jira_service_desk-create-comment-on-request",
arguments: {
cloudId: "Cloud ID",
requestId: "Request ID",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "jira_service_desk",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Create Comment on Request:
result = await session.call_tool("jira_service_desk-create-comment-on-request", {
"cloudId": "Cloud ID",
"requestId": "Request ID",
})API PROXY
Call the Jira Service Desk API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Jira Service Desk API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.atlassian.com/me",
})
// Any allowed Jira Service Desk endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.atlassian.com/me
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkuYXRsYXNzaWFuLmNvbS9tZQ?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Jira Service Desk actions from your backend
Connect a user's Jira Service Desk account once, then run Create Comment on Request on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "jira_service_desk-create-comment-on-request",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
jira_service_desk: { authProvisionId: "apn_xxxxxxx" },
cloudId: "Cloud ID",
requestId: "Request ID",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="jira_service_desk-create-comment-on-request",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"jira_service_desk": {"authProvisionId": "apn_xxxxxxx"},
"cloudId": "Cloud ID",
"requestId": "Request ID",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "jira_service_desk-create-comment-on-request",
"configured_props": {
"jira_service_desk": { "authProvisionId": "apn_xxxxxxx" },
"cloudId": "Cloud ID",
"requestId": "Request ID"
}
}'TOOLS
Jira Service Desk actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Create Comment on Request
actionCreate a comment on a customer request. See the documentationWritev0.1.5 -
Create Incident
actionCreates a new incident request in a Jira Service Desk. Auto-discovers the best-matching request type (prefers types named 'incident' or 'problem') and, ifserviceDeskIdis omitted, auto-discovers it from the user's existing requests. Use List Sites first to obtain the requiredcloudId.serviceDeskIdis optional — if not provided, the tool calls List My Requests to discover it automatically. Returns the new request including itsissueKeyandissueId. See the documentationWritev0.0.2 -
Create Request
actionCreates a customer request (ticket) in a Jira Service Management service desk. This is the single tool for creating any kind of ticket (incident, service request, access request, hardware request, and so on). The kind of ticket is decided byrequestTypeId, not by the wording of the summary, so always pick the request type deliberately. Use List Sites to getcloudId, List Service Desks to getserviceDeskId, and List Request Types to choose therequestTypeIdwhose name and description match the user's intent. Call List Request Type Fields to see which fields that request type requires; pass anything beyond summary and description inadditionalFieldValues, keyed by Jira field ID. Worked example: on service desk1, request type4("Onboard new employees") requiressummaryand also accepts aduedate, so call with SummaryJoseph Wilson starts on September 1, DescriptionNeeds a laptop and an email account, and Additional Field Values{ "duedate": "2026-09-01" }. Optionally attach one or more files at creation time viaattachments; to add, replace, or delete attachments on a request that already exists, use Manage Request Attachment instead. Returns the created request including itsissueKeyandissueId. Ifattachmentsis set, the response also includes either anattachmentsarray (on success) or anattachmentErrorstring (if the request was created but the attachment step failed) — the request itself is never rolled back because of an attachment failure. See the documentationWritev1.1.1 -
Download Issue Attachment
actionDownload the binary content of a Jira Service Desk attachment to the file-stash directory, returning the saved path plus the attachment metadata (filename,mimeType,size). Run List Issue Attachments first to obtain the attachmentid, then pass both it and the sameissueIdOrKeyhere. Example: passingissueIdOrKeyIT-42andattachmentId10042downloadsscreenshot.pngto/tmp/10042-screenshot.pngand returns{ "filedata": ["10042-screenshot.png", "/tmp/10042-screenshot.png"], "attachment": { "id": "10042", "filename": "screenshot.png", "mimeType": "image/png", "size": 84213 } }. See the documentationRead-onlyv0.0.4 -
Find Service Desk Customers
actionFinds the customers of one service desk by name or email address and returns theaccountIdof each match. Pick this tool when the person is the one the ticket is being raised for on a service desk you can identify, i.e. to fillraiseOnBehalfOfon Create Request. Natural-language cues: "raise a ticket for Jean on the IT desk", "open a request on behalf of john@acme.com", "file this for my colleague Dana", "submit a hardware request for the new starter". Pick Find Users instead when the person does not have to be a customer of this desk, such as an approver, manager, or agent you are adding torequestParticipants, or when you cannot tell which service desk applies. Prefer this tool wherever both would work: it searches only this desk's customer list, so a match proves the person can actually raise a request here, and bot accounts are excluded (a site-wide search on a live site returned 17 users of which 16 were integrations). Use List Sites forcloudIdand List Service Desks forserviceDeskIdfirst. Worked example: for "open a laptop request for Joseph Wilson on the IT desk", call this with Service Desk ID1and QueryJoseph Wilson, readaccountId5b10a2844c20165700ede21goff the single match, then call Create Request with Service Desk ID1and thataccountIdasraiseOnBehalfOf. Omit Query to list every customer of the desk, which answers "who can raise requests on this desk?". Query is matched againstdisplayNameandemailAddress, and matches more than just the start of them. Pass a full name or a full email address to keep the result set tight. If nobody matches, the person may exist on the site without being a customer of this desk, retry with Find Users. Results are paginated automatically up tomaxResults. Returns{ users, truncated }, wheretruncatedistruewhen more matches remained unfetched.accountIdis the only field guaranteed present: Atlassian's profile visibility rules hideemailAddresson users who have not made it public, so match ondisplayNameand never require an email to be returned. An unknown or inaccessible Service Desk ID fails with a 404 rather than returning an empty list, so an empty list really does mean nobody matched. See the documentationRead-onlyv0.0.1 -
Find Users
actionFinds any active user on an Atlassian site by name or email address and returns theaccountIdof each match. Pick this tool when the person does not have to be a customer of one particular service desk, i.e. to fillrequestParticipantson Create Request with an approver, manager, watcher, or agent, or when the user names somebody but no service desk is known yet. Natural-language cues: "add my manager Dana as a participant", "cc the security lead on this ticket", "loop in john@acme.com", "what is the account ID for Jean?". Pick Find Service Desk Customers instead when you already know the service desk and the person is the one the ticket is being raised for (raiseOnBehalfOf). That tool is more precise, confirms the person can actually raise a request on that desk, and excludes bots. Use List Sites first to obtain the requiredcloudId. Worked example: for "open a laptop request and add Dana Lee as a participant", call this with QueryDana Lee, readaccountId5b10a2844c20165700ede21goff the match whoseaccountTypeisatlassian, then pass["5b10a2844c20165700ede21g"]asrequestParticipantson Create Request. Most users on a Jira site are bots, not people. Integrations come back as ordinary matches carryingaccountTypeapp, so readaccountTypeand use onlyatlassianaccounts asraiseOnBehalfOforrequestParticipants. Query is matched againstdisplayNameandemailAddress, and matches more than just the start of them. Pass a full name or a full email address to keep the result set tight. Results are paginated automatically up tomaxResults. Returns{ users, truncated }.truncatedistruewhen the result set may be incomplete, either because more matches remained unfetched or because collection stopped at Atlassian's 1000-match limit, which looks the same whether or not further matches exist. Once you have 1000 matches, narrow the query rather than raisingmaxResults, which cannot go higher.accountIdis the only field guaranteed present: Atlassian's profile visibility rules hideemailAddresson users who have not made it public, so match ondisplayNameand never require an email to be returned. An emptyuserslist means either nobody matched or the connected account lacks the "Browse users and groups" global permission, which Atlassian reports as zero results rather than as an error. See the documentationRead-onlyv0.0.1 -
Get Current User
actionReturns the authenticated user'saccount_id,display_name, andemailfrom Atlassian. Use this to identify who is logged in, or to filter requests by the current user'saccount_id. NocloudIdrequired — this uses the Atlassian Identity API directly. See the documentationRead-onlyv0.0.8 -
Get Request
actionFetches the full details of a Jira Service Desk request including its field values and comment thread in a single response. Comments are paginated automatically up tomaxResults; the summary says so when the thread was truncated. Use this to summarize a ticket without needing follow-up calls. Use List Sites first to obtain the requiredcloudId. Use List My Requests to find theissueKeyof a request (e.g.IT-42). See the documentationRead-onlyv0.2.5 -
Get Request Status
actionReturns the status history of a Jira Service Desk request: the current status plus previous states with timestamps. The history is paginated automatically up tomaxResults. Returns{ statuses, truncated }, newest first, wheretruncatedistruewhen more entries remained unfetched. Use this to understand how a request has progressed through the workflow. Use List Sites first to obtain the requiredcloudId. Use List My Requests to find theissueKey(e.g.IT-42). See the documentationRead-onlyv1.1.5 -
List Cloud ID Options
actionLists the Atlassian sites you can raise requests on, as{label, value}options, to discover thecloudIdevery other Jira Service Desk tool needs. Takes no input beyond the account. Example: returns[{ "label": "acme", "value": "822faf0d-5427-420e-9016-999d3dc76918" }]. Use List Sites instead if you want the full site records. See the documentationRead-onlyv0.1.5 -
List Issue Attachments
actionList metadata for every attachment on a Jira Service Desk request.issueIdOrKeyaccepts either a Jira issue key (e.g.IT-42) or a numeric Jira issue ID (e.g.10001). Results are paginated automatically up tomaxResults. Returns{ attachments, truncated }, where each attachment includesid,filename,size(bytes),mimeType, andcontent(an opaque reference URL whose exact shape varies by account access level and is not directly fetchable through this connection's authentication), andtruncatedistruewhen more attachments remained unfetched. Use Download Issue Attachment with an attachmentidand the sameissueIdOrKeyto fetch the binary content — do not callcontentdirectly. If this connection has customer-level access rather than agent access, only public attachments are returned; internal attachments exist but won't appear here. Returns{ attachments: [], truncated: false }(no error) when the request exists but has no visible attachments. Example: issueIT-42with one attachment returns{ "attachments": [{ "id": "10042", "filename": "screenshot.png", "size": 84213, "mimeType": "image/png", "content": "<opaque reference URL>" }], "truncated": false }. See the documentationRead-onlyv0.0.4 -
List My Requests
actionLists Jira Service Desk requests owned or participated in by the current user. Defaults to open requests owned by the current user. Results are paginated automatically up tomaxResults. Returns{ requests, truncated }, wheretruncatedistruewhen more requests remained unfetched. Use List Sites first to obtain the requiredcloudId. Each result includesissueKey,issueId, and request field values (summary, status).requestStatus:OPEN_REQUESTS(default),CLOSED_REQUESTS, orALL_REQUESTS.requestOwnership:OWNED_REQUESTS(default) orPARTICIPATED_REQUESTS. See the documentationRead-onlyv1.1.5 -
List Request Transitions
actionLists the available workflow transitions for a Jira Service Desk request, returning each transition'sidandname. Transitions are paginated automatically up tomaxResults. Returns{ transitions, truncated }, wheretruncatedistruewhen more transitions remained unfetched. Call this before Transition Request to obtain validtransitionIdvalues. Use List Sites first to obtain the requiredcloudId. Use List My Requests or Get Request to find theissueKey(e.g.IT-42). See the documentationRead-onlyv1.1.5 -
List Request Type Fields
actionLists the fields a given request type accepts, so you can build theadditionalFieldValuesargument for Create Request in a single pass. Each entry gives thefieldIdto use as the key, whether it isrequired, itsjiraSchema(the value format), and anyvalidValuesfor select-style fields. Use List Sites forcloudId, List Service Desks forserviceDeskId, and List Request Types forrequestTypeId. Example: request type4("Onboard new employees") on service desk1returns a requiredsummaryplus optionalduedate(jiraSchema.typedate, so pass"2026-09-01"),description, andattachment. Also returnscanRaiseOnBehalfOfandcanAddRequestParticipants, which tell you whether theraiseOnBehalfOfandrequestParticipantsarguments of Create Request are usable with this account. Hidden fields are only visible to service desk administrators. See the documentationRead-onlyv0.0.6 -
List Request Types
actionLists the customer request types a service desk offers, with theid,name, anddescriptionof each. Call this before Create Request to choose therequestTypeIdthat matches what the user is asking for: the request type, not the summary wording, decides what kind of ticket gets created. Names vary by desk, so match on meaning rather than assuming a type called "Incident" exists (an IT desk may instead offer "Report a system problem"). Use List Sites forcloudIdand List Service Desks forserviceDeskId. Results are paginated automatically up tomaxResults. Returns{ requestTypes, truncated }, wheretruncatedistruewhen more types remained unfetched. Example: service desk1returns entries such as{ "id": "8", "name": "Report a system problem", "description": "Let us know if something isn't working properly", "canCreateRequest": true }. Types withcanCreateRequest: falsecannot be used to raise a request. Then call List Request Type Fields to see what the chosen type requires. See the documentationRead-onlyv0.0.6 -
List Service Desks
actionLists every service desk on an Atlassian site, with theidand project details of each. Call this to discover theserviceDeskIdrequired by Create Request, List Request Types, and List My Requests when you only know a project name or key. Use List Sites first to obtain the requiredcloudId. Results are paginated automatically up tomaxResults. Returns{ serviceDesks, truncated }, wheretruncatedistruewhen more desks remained unfetched. Example: a site with one desk returns{ "serviceDesks": [{ "id": "1", "projectName": "Support", "projectKey": "SUP" }], "truncated": false }. See the documentationRead-onlyv0.0.6 -
List Sites
actionReturns all Atlassian cloud sites accessible to the authenticated user. Call this tool first to obtain thecloudId(returned asid) required by every other Jira Service Desk tool. Each site includes itsid(cloudId),name, andurl. See the documentationRead-onlyv0.0.8 -
Manage Request Attachment
actionAdds, replaces, or deletes a single attachment on a customer request (ticket) that already exists. To attach file(s) while creating a brand-new request, use Create Request'sattachmentsprop instead — use this tool only for requests that already exist. Setoperationtoaddto attach a new file,updateto replace an existing attachment with a different file (there's no in-place replace in the API, so this uploads the new file and only deletes the old one once the new one is confirmed attached), ordeleteto remove an attachment.addandupdaterequireserviceDeskId(the temp-file upload step is scoped by service desk, not by issue) — use List Service Desks to find it, or read it off the response of the request that created the ticket.updateanddeleterequireattachmentId, the numeric ID of the attachment being replaced or removed; theadd/updateresponse doesn't expose this as a plain field, so use List Issue Attachments on the same request to look it up. Worked example: to replace an attachment10050on requestHD-12with a new file, call with Operationupdate, Issue ID Or KeyHD-12, Service Desk ID1, Attachment ID10050, and File/tmp/revised-report.pdf. Forupdate, if the new file attaches successfully but removing the old attachment then fails, the response includes adeleteErrorstring alongside the successful attachment data — the request ends up with both files rather than losing either one, and the error is never masked as a full failure. By default the attachment is visible to the customer who raised the request (public: true); setpublictofalseto attach an internal-only file. See the documentationWritev0.0.2 -
Transition Request
actionTransitions a Jira Service Desk request to a new workflow status. Use List Request Transitions first to get validtransitionIdvalues for the request. Use List Sites to obtain the requiredcloudId. Use List My Requests or Get Request to find theissueKey(e.g.IT-42). Optionally include a comment to explain the transition. See the documentationWritev0.1.5 -
Update Issue Fields
actionUpdates fields on an existing Jira Service Desk request via the Jira platform API. Use this to change the summary, priority, description, or other fields after a request has been created. Use List Sites first to obtain the requiredcloudId. Use List My Requests or Get Request to find theissueKey(e.g.IT-42).fieldsis a JSON object of field name-value pairs. Example:{"summary": "Updated title", "priority": {"name": "High"}}. See the documentationWritev0.1.5
EVENTS
Jira Service Desk triggers
Event sources your backend can deploy for users and receive through a webhook.
MULTI-APP
Use Jira Service Desk with other popular apps
Most products don't stop at one integration. Pair Jira Service Desk with the other apps your users rely on, and ship use cases that span both.
REFERENCE
App details
Reference metadata for the Jira Service Desk connector in the Pipedream registry.
- App slug
- jira_service_desk
- Authentication
- OAuth
- Categories
- Help Desk & Support
- Actions
- 20
- Triggers
- 2
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Jira Service Desk OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- read:servicedesk-request
- manage:servicedesk-customer
- write:servicedesk-request
- read:jira:user
- read:jira-work
- write:jira-work
- read:organization:jira-service-management
- read:me
- offline_access