Jira connector setup
Operator·4 minutes to read
This page is the setup half — creating the OAuth 2.0 (3LO) app Atlassian needs in its developer console and getting its client id and secret into this deployment. Authorising a connection afterwards is the Authenticate control on the plugin sheet, which is what actually sends you to Atlassian. This connector is for Jira Cloud only; Jira Data Center and Server use a different OAuth provider and different addresses.
1. Create the OAuth app in the Atlassian developer console
-
Open the Atlassian developer console and create an OAuth 2.0 integration — this is your own app, not Botseon's.
-
Under Permissions, add the Jira API and its two classic scopes from section 2.
-
Under Authorization, configure OAuth 2.0 (3LO) and paste the callback URL from
docs/connectors/README.md— with the quickstart's defaultBOTSEON_PUBLIC_URL, that is:http://127.0.0.1:3000/api/oauth/jira/callbackIt must match exactly — scheme, host and path.
-
Open Settings. The Client ID and Secret are there — copy both.
A new app is private: only your own Atlassian account can authorise it. To let other sites connect, turn on Distribution → Enable sharing. Until Atlassian has reviewed the app, everyone who authorises it sees "this app has not yet been reviewed by Atlassian", and Atlassian publishes no turnaround for that review. Some sites restrict third-party apps, in which case a site admin, not the member connecting, has to allow it.
2. Scopes
Request the narrowest set that covers the tools this connector exposes (F-PLUG-1: minimum scopes per capability, read and write requested separately):
Read:
read:jira-work— read projects, issues, comments and transitions.offline_access— stay connected: without it Atlassian issues no refresh token.
Write, on top of the read set:
write:jira-work— create and change issues, move them through their workflow, and comment. A comment notifies the issue's watchers, so that tool's approval card names the issue and the comment's text is disclosed on the card.
3. Enter the app
One command, with the client secret on standard input — there is no flag that takes it and no
environment variable that holds it (see
docs/connectors/README.md):
printf %s "$CLIENT_SECRET" | botseon oauth-app set \
--org <organisation id> --slug jira \
--client-id <the client ID from step 1> \
--auth-url https://auth.atlassian.com/authorize \
--token-url https://auth.atlassian.com/oauth/token \
--configured-by <your user id>
It stores the secret encrypted and prints the redirect URL from step 1 back, so you can check the
two match. botseon oauth-app show --org <organisation id> --slug jira says whether an app is
configured and under which client id; nothing prints the secret back.
After authorising, set the plugin's Atlassian site id (cloud_id): it is the id that
GET https://api.atlassian.com/oauth/token/accessible-resources returns for your site, a value in
the form 1324a887-45db-1bf4-1e99-ef0ff456d421. It never changes.
Never put either value in a bot's description, a memory, or anywhere else a model reads as ordinary text.
4. What this connector does and does not do
jira.search_issues— searches issues with a JQL query, one page of up to 100 at a time.jira.get_issue— one issue, its description as text and the transitions it allows.jira.list_comments— the comments on an issue.jira.list_projects— the projects on the site.jira.create_issue— creates an issue. Taggedwrite; the approval card names the project.jira.update_issue— changes an issue's summary, description or labels. Taggedwrite; the approval card names the issue.jira.comment— comments on an issue. Taggedwriteandexternal_send, because a comment notifies the issue's watchers; the approval card names the issue and the comment's text is disclosed on the card.jira.transition_issue— moves an issue along one of the transitionsjira.get_issuelists for it. Taggedwrite; the approval card names the issue.
Refresh tokens rotate on every use and expire after 90 days without one; a connection nobody uses for 90 days has to be authorised again.
Jira counts API use in points per hour shared across every site an app reaches, plus per-second limits; a member may notice a short pause when a busy site reaches one.
EU data residency, available on Jira's Standard plan and above, changes where a site's data is stored, not the address this connector calls.
This connector's catalogue row ships available: false: it stays disabled until the live smoke
runs at turn-on.
Last verified against build 331481c.