keen

io.github.imogenlabs由 GitHub 帳號 imogenlabs 發布v1.9.0更新於 Nov 4, 2026

Atlassian Cloud for AI apps: Jira, Confluence, Bitbucket, Service Management, Admin and more.

概覽

AI 產生的概覽

Keen 讓 AI 助理透過兩個工具搜尋並執行約 1,900 條指令,涵蓋 Jira、Confluence、Bitbucket、Service Desk、Admin 等 Atlassian Cloud 服務。

可以做什麼
  • 用自然語言描述任務,找出對應指令並依名稱執行
  • 處理 Jira 議題、狀態轉換、JQL 搜尋、欄位、工作流程與批次操作
  • 管理敏捷看板、衝刺、待辦清單、史詩與排序
  • 搜尋、讀取與寫入 Confluence 頁面、部落格、空間、標籤與附件
  • 瀏覽 Bitbucket 儲存庫、拉取請求、流水線與提交,以及 Service Desk、Assets、Compass、Marketplace 和 Admin 介面
  • 查詢本機 SQLite 全文快取,進行快速搜尋與分析
適用情境
適合讓助理直接讀取或修改 Jira 與 Confluence 的工作內容:分流議題、調整衝刺、草擬發布說明,或在大量 Atlassian 項目中查詢而不觸發速率限制。
執行需求
以本機程序執行(Go 二進位檔、Homebrew、deb/rpm、Docker 或 Claude Desktop 安裝包)。需要 Atlassian 站台網址、登入電子郵件與 API 權杖,透過 JIRA_CLOUD_PLATFORM_URL、JIRA_CLOUD_PLATFORM_USERNAME、JIRA_CLOUD_PLATFORM_PASSWORD 或本機驗證檔提供。需能連線 Atlassian;GitHub 關聯功能可選用 GitHub 權杖。
安裝前請注意
JIRA_CLOUD_PLATFORM_PASSWORD 中的 API 權杖擁有該帳號的 Atlassian 權限,本機驗證檔應僅本人可讀。工具可寫入、轉換狀態、留言與建立議題和頁面,Admin 介面另需管理員金鑰。本機 SQLite 快取保存 API 回應,應視為敏感資料。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 keen,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Keen

The complete Atlassian platform CLI and MCP Server.

[Release] [Apache 2.0 License] [Go Version] [CI] [Go Report Card]

[Imogen Labs]


1,843 API endpoints across Jira, Confluence, Agile, Marketplace, Service Desk, Assets, Compass, Bitbucket and Admin — in a single Go binary. SQLite-backed local sync with full-text search. MCP server for AI agents. Built for automation first, humans second.

What is Keen?

Every Atlassian workflow you automate is a wall of curl calls with hand-rolled JSON payloads and fragile jq parsing. Every AI agent that touches Jira hits rate limits after a few dozen operations.

Keen replaces all of that with typed commands, structured output, local SQLite caching with FTS5 full-text search, and an MCP server that gives AI agents fast, uncapped access to your entire Atlassian stack.

Free and open source. Apache-2.0 license. No account required. No telemetry.

API Coverage

APIEndpointsWhat you get
Jira Platform v3630Issues, transitions, search, bulk ops, fields, workflows, permissions
Jira Agile105Sprints, boards, backlogs, epics, ranking, velocity
Confluence130CQL search, spaces, labels, templates, attachments, permissions, content states
Confluence v2252Pages, blog posts, spaces, folders, databases, whiteboards, comments, attachments, space roles
Marketplace v2143Addons, versions, vendors, distribution, reviews, reporting
Service Desk75Requests, queues, customers, SLAs, approvals
Assets64Objects, object schemas and types, AQL search, imports (keen assets-...). keen finds your cloud and workspace ids from the site
Compass11Events, metric values, attachments and API specs for components
Teamwork Graph18 queriesOrg chart (manager, direct reports, report chain), teams, a person's created, commented, mentioned and viewed work, over GraphQL (Teamwork Graph). Plus keen graphql for any read query
Bitbucket300Repositories, pull requests, pipelines, branches, commits, snippets, workspaces (keen bitbucket-...). Public data works without a token; private data needs a Bitbucket-scoped token (Authentication)
Admin133Organizations, directories, groups, domains, policies, user management, user provisioning (SCIM), API tokens and service accounts, data loss prevention. Needs an admin API key (Authentication)

Your First 5 Minutes

bash
# 1. Install (macOS or Linux with Homebrew; see Install for .deb, .rpm and Docker)brew install imogenlabs/tap/keen
# 2. Save your credentialsmkdir -p ~/.config/keencat > ~/.config/keen/auth.json <<'JSON'{ "base_url": "https://yoursite.atlassian.net", "username": "[email protected]", "password": "your-api-token" }JSONchmod 600 ~/.config/keen/auth.json
# 3. Check connectivitykeen doctor
# 4. Sync your Jira data locallykeen sync
# 5. Search instantly (no API calls)keen search "authentication bug" --data-source local

Generate an API token at id.atlassian.com/manage-profile/security/api-tokens.

Environment variables work too, and override the file:

bash
export JIRA_CLOUD_PLATFORM_USERNAME="[email protected]"export JIRA_CLOUD_PLATFORM_PASSWORD="your-api-token"export JIRA_CLOUD_PLATFORM_URL="https://yoursite.atlassian.net"

Install

Homebrew (macOS and Linux)

bash
brew install imogenlabs/tap/keen

This installs both keen and keen-mcp. brew upgrade keen picks up new releases; the formula follows each release within a day.

Debian, Ubuntu, Fedora, RHEL

Each release has .deb and .rpm packages for x86_64 (amd64) and arm64. They install keen and keen-mcp in /usr/bin.

bash
# Debian, Ubuntucurl -LO https://github.com/imogenlabs/keen/releases/latest/download/keen_linux_amd64.debsudo apt install ./keen_linux_amd64.deb
# Fedora, RHELcurl -LO https://github.com/imogenlabs/keen/releases/latest/download/keen_linux_amd64.rpmsudo dnf install ./keen_linux_amd64.rpm

On arm64, use keen_linux_arm64.deb or keen_linux_arm64.rpm. To upgrade, install the new release's package the same way.

Docker

The image is on GitHub's registry and Docker Hub, for amd64 and arm64: ghcr.io/imogenlabs/keen or smashingtags/keen. It runs keen-mcp by default. To run the CLI, put keen and its arguments after the image name:

bash
docker run --rm \  -e JIRA_CLOUD_PLATFORM_URL=https://yoursite.atlassian.net \  -e [email protected] \  -e JIRA_CLOUD_PLATFORM_PASSWORD=your-api-token \  ghcr.io/imogenlabs/keen keen get PROJ-42 --agent

Add -v keen-data:/home/nonroot to keep keen sync's local copy between runs. To use it as an MCP server, see Docker under MCP Server.

Binary download

Download from GitHub Releases:

bash
# macOS (Apple Silicon)curl -L https://github.com/imogenlabs/keen/releases/latest/download/keen_darwin_arm64.tar.gz | tar xzsudo mv keen_darwin_arm64/keen /usr/local/bin/sudo mv keen_darwin_arm64/keen-mcp /usr/local/bin/
# macOS (Intel)curl -L https://github.com/imogenlabs/keen/releases/latest/download/keen_darwin_amd64.tar.gz | tar xzsudo mv keen_darwin_amd64/keen /usr/local/bin/sudo mv keen_darwin_amd64/keen-mcp /usr/local/bin/
# Linux (x86_64)curl -L https://github.com/imogenlabs/keen/releases/latest/download/keen_linux_amd64.tar.gz | tar xzsudo mv keen_linux_amd64/keen /usr/local/bin/sudo mv keen_linux_amd64/keen-mcp /usr/local/bin/
# Linux (arm64)curl -L https://github.com/imogenlabs/keen/releases/latest/download/keen_linux_arm64.tar.gz | tar xzsudo mv keen_linux_arm64/keen /usr/local/bin/sudo mv keen_linux_arm64/keen-mcp /usr/local/bin/

Each release also publishes checksums.txt.

From source

bash
git clone https://github.com/imogenlabs/keen.gitcd keenmake build-all   # builds bin/keen and bin/keen-mcp

Requires Go 1.26.10 or newer.

What changed in each release: CHANGELOG.md.

MCP Server

Keen includes an MCP server (keen-mcp) that gives AI agents every keen command (1,939 tools). Works with Claude Code, Cursor, Windsurf, and any MCP-compatible host.

It offers two tools: keen_search finds the tools for a task ("transition an issue", "list sprints on a board") and returns them with their parameters, and keen_run runs one by name. Listing all 1,939 tools one by one would take about half a million tokens, more than most models can hold, so an app connecting to keen would fill up before doing any work. To get the full list anyway, set KEEN_MCP_TOOLS=all in the server's environment.

Tool calls arrive as JSON-RPC over stdio. Finding a tool happens inside keen-mcp with no call to Atlassian. Running one goes to Atlassian, except that a read repeated within 5 minutes is answered from keen's cache, so a busy agent stays under Atlassian's rate limits. Any successful write clears the cache, so a read after a write is fresh. Set KEEN_MCP_CACHE=off to make every read live. If a tool's API has been switched off by Atlassian, the result says what to use instead.

[MCP request flow: the AI app asks keen_search for a task in plain words and gets the best matching tools back without any call to Atlassian, then calls keen_run, which answers a recent repeat read from keen's cache and sends everything else to Atlassian.]

Source: docs/diagrams/mcp-flow.drawio.

Claude Desktop, and the MCP registry

On a Mac, download keen-mcp.mcpb from the latest release and open it: Claude Desktop installs keen and asks for your Atlassian site, email and API token. keen is also listed in the official MCP registry as io.github.imogenlabs/keen, updated with every release.

keen-mcp finds credentials the same way the CLI does: environment variables first, then ~/.config/keen/auth.json or config.toml. If you already set up the CLI, claude mcp add --transport stdio keen -- keen-mcp is enough. To pass them explicitly instead:

Claude Code

bash
claude mcp add --transport stdio keen \  --env [email protected] \  --env JIRA_CLOUD_PLATFORM_PASSWORD=your-api-token \  --env JIRA_CLOUD_PLATFORM_URL=https://yoursite.atlassian.net \  -- keen-mcp

Cursor

Add to .cursor/mcp.json:

json
{  "mcpServers": {    "keen": {      "command": "keen-mcp",      "env": {        "JIRA_CLOUD_PLATFORM_USERNAME": "[email protected]",        "JIRA_CLOUD_PLATFORM_PASSWORD": "your-api-token",        "JIRA_CLOUD_PLATFORM_URL": "https://yoursite.atlassian.net"      }    }  }}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json with the same structure.

Docker

Any MCP host can run keen-mcp from the image instead of installing it. The -e NAME flags pass the values from env into the container:

json
{  "mcpServers": {    "keen": {      "command": "docker",      "args": ["run", "-i", "--rm",               "-e", "JIRA_CLOUD_PLATFORM_URL", "-e", "JIRA_CLOUD_PLATFORM_USERNAME", "-e", "JIRA_CLOUD_PLATFORM_PASSWORD",               "ghcr.io/imogenlabs/keen"],      "env": {        "JIRA_CLOUD_PLATFORM_URL": "https://yoursite.atlassian.net",        "JIRA_CLOUD_PLATFORM_USERNAME": "[email protected]",        "JIRA_CLOUD_PLATFORM_PASSWORD": "your-api-token"      }    }  }}

Local Sync & Offline Search

Keen syncs your Atlassian data to a local SQLite database with FTS5 full-text search. Queries run in under 100ms against the local cache instead of hitting the Jira Cloud API.

bash
keen sync                                          # hydrate local cachekeen search "sprint bug" --data-source local        # FTS search (sub-100ms)keen analytics                                      # analytics on synced datakeen stale --days 30                                # find stale itemskeen orphans                                        # find orphaned itemskeen load                                           # workload distribution

This is especially useful for AI agents that need to make many queries without hitting Atlassian's rate limits.

Agent Mode

Every command supports --agent which sets JSON output, no interactive prompts, compact format, and no color in one flag. Designed for AI agent consumption.

bash
keen agile get-all-boards --agentkeen issue transitions get PROJ-42 --agent | jq '.results.transitions[] | {id, name}'

The everyday Jira calls have short forms:

bash
keen find-issues --jql "project = PROJ AND status = 'In Progress'" --agentkeen get PROJ-42 --agentkeen transition PROJ-42 --transition-name "In Progress" --agent   # name resolved to its idkeen sprints 42 --state active --agent

To start work on an issue, one call gets everything around it, kept under a token budget:

bash
keen context PROJ-42 --org my-org --agent              # default --budget 8000

It returns the issue, its parent, comments, linked issues, sub-tasks, GitHub pull requests and commits (see GitHub Work for an Issue) and linked Confluence pages. The issue comes first, then the parent, GitHub work, linked issues and sub-tasks, the newest comments, Confluence pages and older comments. Whatever does not fit is listed under budget.omitted with its size, never dropped silently.

Key Flags

FlagWhat it does
--agentJSON + no prompts + compact (use this for all scripted calls)
--compactOnly key fields (id, name, status, timestamps)
--jsonForce JSON output
--csvCSV output
--dry-runShow what would be sent without sending
--stdinRead request body as JSON from stdin
--select "key,fields.summary"Keep only these fields (dotted paths reach nested ones). A mistyped field fails with a suggestion, except after a write that went through, which warns and prints the whole response
--output-summary[=N]If the output is over N bytes (default 4096), save it to a private temp file and print a one-line JSON summary with the file path, size and record count
--quietOne value per line
--data-source localQuery local SQLite cache only

Command Discovery

bash
keen which "transition an issue"   # the command for a task, in plain wordskeen which "create page"           # one line per answer; "no match" when nothing fitskeen api                     # browse all API interfaceskeen api wiki                # browse Confluence endpointskeen api agile               # browse Agile endpoints

Common Workflows

Sprint Management

bash
keen agile get-all-boards --agentkeen agile get-all-sprints BOARD_ID --state active,future --agentkeen agile create-sprint --stdin <<< '{"name":"Sprint 5","originBoardId":42}'keen agile move-issues-to-sprint-and-rank SPRINT_ID \  --stdin <<< '{"issues": ["PROJ-42", "PROJ-43"]}'keen agile partially-update-sprint SPRINT_ID --stdin <<< '{"state": "active"}'

Release Tracking

Record git release tags as Jira versions and tag the issues they shipped:

bash
# every release tag so far, plus an unreleased "next" for work merged sincekeen release sync --repo-path . --project PROJ --backfill --head origin/main --dry-run# after publishing a release: "next" becomes the tag, a fresh "next" is createdkeen release sync --repo-path . --project PROJ --tag v1.4.0 --head origin/main

A version is named as the tag, released on the tag's commit date and linked to its GitHub release. An issue gets the first release whose commits name its key as a Fix Version; existing Fix Versions are added to, never replaced.

GitHub Work for an Issue

Put the issue key in branch names, commit messages and PR titles, the way Atlassian links them (fix/PROJ-42-retry-uploads, fix: PROJ-42 retry failed uploads). Then:

bash
keen github links PROJ-42 --org my-org     # or --repo my-org/api, or run it inside a checkout

lists every pull request and commit for the issue once, with where it was found: Jira's development panel (when the GitHub for Jira app is connected), GitHub search for the key, and web links on the issue that point at a PR. GitHub search uses KEEN_GITHUB_TOKEN, GH_TOKEN, GITHUB_TOKEN or your gh login. A source that is not set up is a warning, not a failure.

Issue Lifecycle

bash
keen jira-cloud-platform-search and-reconsile-issues-using-jql-post \  --jql "project = PROJ AND status != Done" --agentkeen issue transitions get PROJ-42 --agentkeen issue transitions do PROJ-42 --transition-id 41 --agentkeen issue comment add PROJ-42 --body "Done."    # plain text is wrapped into ADF

Confluence

bash
keen wiki search-content-by-cql --cql "type=page AND space=DOCS" --agentkeen wiki create-page --space DOCS --title "Release notes" --stdin < notes.xhtmlkeen wiki update-page PAGE_ID --stdin < notes.xhtml   # version bumped for youkeen wiki get-page PAGE_ID --agentkeen wiki get-content-descendants PAGE_ID --agentkeen wiki add-labels-to-content PAGE_ID --stdin <<< '[{"prefix":"global","name":"adr"}]'

Page bodies are Confluence storage format (XHTML); Markdown is not converted.

Marketplace

bash
keen addons get io.example.my-addon --agentkeen addons list-search --q "story points" --agentkeen addons versions get io.example.my-addon --agent

Comparison

FeatureKeenmcp-atlassianAtlassian Rovo MCPjira-cliACLI (Appfire)
Endpoints1,84398 tools46+Jira onlyMany
Local cacheSQLite + FTS5NoNoNoNo
MCP serverYesYesYes (official)NoNo
Products9 (Jira, Confluence, Agile, Marketplace, Service Desk, Admin, Assets, Compass, Bitbucket)2 (Jira, Confluence)514
Server / Data CenterNoYesNoYesYes
PriceFree (Apache-2.0)Free (open source)Free with CloudFree (MIT)$360-$6,195/yr
BinarySingle Go binaryPython (uvx, pip, Docker)Remote serverSingle Go binaryRequires JVM
Offline searchYesNoNoNoNo

More detail, and when to pick something else: Comparison.

Architecture

The keen CLI and the keen-mcp server share one set of commands over 1,843 REST endpoints and 18 GraphQL queries. Calls go to Atlassian, with repeat reads within 5 minutes answered from a short response cache that every write clears. keen sync copies data into a local SQLite + FTS5 store, which keen search and offline reads (--data-source local, or automatically when Atlassian cannot be reached) use.

[Keen architecture: the keen CLI and keen-mcp server share one set of commands that call Atlassian through an HTTP client (REST and GraphQL) with a short response cache, with a local SQLite + FTS5 store filled by sync for search and offline reads. Atlassian Cloud APIs: Jira Platform, Jira Agile, Confluence v1 and v2, Marketplace, Service Desk, Admin, Assets, Compass, Bitbucket, and Teamwork Graph.]

Source: docs/diagrams/architecture.drawio (editable in draw.io).

Regeneration

keen is generated from 15 official Atlassian OpenAPI specs (in specs/) by CLI Printing Press, then carries its own changes on top. The list of specs lives in one place, SPECS in scripts/regen/config.sh. One script refreshes keen from Atlassian's current specs without losing those changes:

bash
git switch -c build/refresh-specsscripts/regen/regen.sh        # download current specs, generate, merge onto keenscripts/regen/check.sh        # build, tests, lint, vulnerabilities, old-name and help checks

How it works: the generator's previous output (renamed to keen) is kept on GitHub as the hidden ref refs/regen/base (not a branch; regen.sh fetches it). regen.sh generates again from today's specs, renames that output the same way, and does a three-way git merge onto keen. Spec changes land, and keen's own edits stay. Files keen writes by hand (README, docs, changelog, the patch list) always keep keen's version. scripts/regen/postfix.py applies keen's standing rules to code the generator adds for the first time. scripts/regen/placeholders.py gives help examples a placeholder that fits each argument (the generator puts your-token-here in every *Key argument), and check.sh fails if one slips back.

If the merge stops on a conflict, the script lists the files. Resolve them in the work folder it prints (scripts/regen/resolve.py ours|theirs <file> takes one side for a whole file), then run scripts/regen/finish.sh. Both scripts remove the work folder they made once the merge is in your checkout (a folder you name with REGEN_WORK is kept), and check.sh removes its build folder however it ends. When the branch is merged to main, move the base forward as regen.sh says.

To see what Atlassian has changed since the last refresh, without changing anything, run scripts/regen/specdiff.py. It lists the operations added, removed or changed in each spec. A weekly GitHub workflow (.github/workflows/spec-check.yml) runs the same check, opens one issue when anything differs and closes it once keen is current again, so a change is never missed.

scripts/mcp-check.py <dir with keen and keen-mcp> tests the MCP server against a live site the way an AI app uses it: it asks keen_search for ten everyday tasks in plain words, runs the tool through keen_run and compares the answer with the CLI's. It fails when the right tool is not in the top three, or when a tool ranked above it is one Atlassian has switched off. With --claude it also hands Claude Code keen-mcp as its only tools and checks it answers real questions with no failed call. It picks its test data from the site, and check.sh runs it alongside the live smoke test.

To add an Atlassian API, add one name=URL line to the end of SPECS and run the two commands above. Nothing else needs editing.

The org chart and Teamwork Graph commands come from Atlassian's GraphQL schema instead of an OpenAPI spec. scripts/regen/graphql.py reads it (no login needed), keeps a snapshot in specs/graphql.json and writes the command table; the refresh runs it, and the weekly check compares the live schema with the snapshot.

If Atlassian retires an API, the generator stops producing its command. Add it to internal/compat/compat.go so the old command and MCP tool keep their name and tell people what replaced it. Every local change is listed in .printing-press-patches.json.

Atlassian also keeps deprecated APIs in its specs, sometimes after switching them off. scripts/regen/deprecated.py lists every operation the specs mark deprecated (the refresh runs it, and check.sh fails if the list is out of date); keen labels those commands and tools, and keen_search ranks them below the alternatives. When one starts answering 410 Gone, add it to RemovedEndpoints in internal/compat/deprecated.go with what to use instead: keen then hides it, its command and tool name the replacement, and keen sync skips it.

Security

See SECURITY.md for vulnerability reporting. Keen reads API credentials from environment variables or from ~/.config/keen/auth.json. If you use the file, keep it readable only by you (chmod 600). The local SQLite database contains cached API responses and should be treated as sensitive.

Contributing

See CONTRIBUTING.md. Bug fixes welcome. Open an issue before submitting PRs for new features.

License

Apache-2.0


Built by Imogen Labs

來源:README.md,提交 610e4f5

工具

0
SourceWeft 曾在隔離沙箱中以無憑證方式啟動該軟體包一次,以列出其工具,但未能完成:該軟體包類型無法在沙箱中執行。

版本歷史

4
  1. v1.9.0最新Nov 4, 2026
  2. v1.8.0Nov 4, 2026
  3. v1.7.0Nov 3, 2026
  4. v1.6.4Oct 31, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分