Skip to main content

orkestrr-mcp

An MCP server that lets an AI agent (e.g. Claude Code) create, reuse, and manage the Orkestrr project-management hierarchy — Bundles, Goals, and Tasks — through the existing Orkestrr REST API.

It is a standalone process that talks to Orkestrr over HTTP, so once registered at user scope it works from any project/repo you open, against local or production Orkestrr.

What it exposes

Hierarchy tools (read + write):

Area Tools
Projects list_projects, get_project, list_project_members
Bundles list_bundles, create_bundle, update_bundle (incl. status & archive)
Goals list_goals, create_goal, update_goal (incl. status)
Tasks list_tasks, create_task, update_task (incl. status & assignment)

Task details:

Area Tools
Status set_task_status
Estimation list_estimation_values, set_task_estimation
Labels list_labels, create_label, add_task_labels, remove_task_labels

Status changes propagate up the hierarchy automatically (Task → Goal → Bundle → Project), handled by the Orkestrr backend. add_task_labels reads the task's current labels and sends the union (the API replaces the label set on update), so existing labels are preserved.

Backend quirks worked around (candidates for a future backend fix)

  • POST /labels/ does not return the new label's idcreate_label resolves it by re-querying labels by name.
  • A task's estimation_label is null in list/update payloads (only the nested estimation object on the detail payload carries the label) — set_task_estimation re-fetches the detail so it can confirm the value.

Authentication

You sign in once, interactively, in the browser with your EVOHEIM SSO (Authentik):

okr login     # opens the browser (OAuth device flow); approve the code
okr status    # shows who you're logged in as + token validity
okr logout    # clears the stored session

okr login uses the OAuth 2.0 Device Authorization Flow against the public orkestrr-cli Authentik provider. The issued JWT carries your real identity, so tasks and status changes stay attributed to you. Tokens are stored in ~/.config/orkestrr-mcp/tokens.json (mode 0600) and auto-refresh — the MCP server never needs an interactive prompt. No secrets go into the MCP registration.

If a tool ever fails with "Not logged in" or "Session expired", just run okr login again.

Configuration

Variable Example Notes
ORKESTRR_BASE_URL http://localhost:9000 The only required var. /api is appended automatically if absent.
ORKESTRR_MCP_HOME ~/.config/orkestrr-mcp Optional. Override the directory where the session is stored.

Install

From PyPI (recommended — no repo checkout needed):

uv tool install orkestrr-mcp        # or: pipx install orkestrr-mcp
# installs the `okr` command on your PATH; upgrade with `uv tool upgrade orkestrr-mcp`

From source (for development on the server itself):

git clone git@github.com:cafadev/orkestrr.git
uv tool install --editable ./orkestrr/orkestrr-mcp

Register with Claude Code (user scope = available in every project)

No credentials in the registration — the server command is okr mcp, and it uses your okr login session.

# Local Orkestrr
claude mcp add --scope user orkestrr-local \
  --env ORKESTRR_BASE_URL=http://localhost:9000 \
  -- okr mcp

# Production Orkestrr
claude mcp add --scope user orkestrr \
  --env ORKESTRR_BASE_URL=https://<prod-domain> \
  -- okr mcp

Then run okr login once (it works for both environments — same Authentik). Restart Claude Code and run /mcp to confirm the tools are listed.

Develop

uv sync          # install deps + this package (editable)
uv run pytest    # run the test suite

Publishing to PyPI (maintainers)

Publishing is automated by GitHub Actions (.github/workflows/orkestrr-mcp-publish.yml) using PyPI Trusted Publishing (OIDC) — no API token is stored anywhere.

One-time setup on PyPI (do this before the first release): on https://pypi.org/manage/account/publishing/ add a pending trusted publisher:

Field Value
PyPI Project Name orkestrr-mcp
Owner cafadev
Repository name orkestrr
Workflow name orkestrr-mcp-publish.yml
Environment (leave blank)

Each release:

  1. Bump version in pyproject.toml (PyPI never lets you re-upload the same version) and merge it.
  2. Create a GitHub Release whose tag starts with orkestrr-mcp-v (e.g. orkestrr-mcp-v0.1.0). The tag prefix is what triggers the workflow (and keeps it monorepo-safe).

The workflow builds the sdist + wheel and publishes them. Teammates then uv tool install orkestrr-mcp.

Manual fallback (if Actions is unavailable) — needs an API token from Account settings → API tokens:

rm -rf dist && uv build
uvx twine check dist/*
UV_PUBLISH_TOKEN=pypi-XXXX uv publish

Out of scope (for now)

Acceptance criteria, action items, comments, blockers, and estimation-scale configuration (creating/editing the scale itself — only assigning existing values is supported). A dedicated API-key / OAuth2 machine-to-machine auth layer is also deferred — token auth covers current needs.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

orkestrr_mcp-0.2.0.tar.gz (81.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

orkestrr_mcp-0.2.0-py3-none-any.whl (21.0 kB view details)

Uploaded Python 3

File details

Details for the file orkestrr_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: orkestrr_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 81.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for orkestrr_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a0dd9d40fb8649c030ad366ac2a684bc08ef8512e797b4352921113883543f96
MD5 0ec0c683c731de91d00d13f07d1d9325
BLAKE2b-256 be375a21203efa9074df74f9c801112fe41b8f90c8bbc4bd43d5855831a5c2b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for orkestrr_mcp-0.2.0.tar.gz:

Publisher: orkestrr-mcp-publish.yml on cafadev/orkestrr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file orkestrr_mcp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: orkestrr_mcp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 21.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for orkestrr_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9a61826a1c9de78f36fc1a9c5372ab2a2ef62836183dbc156c978692aa92c645
MD5 b00c1a63cbebaa06df82fe868b0dfc98
BLAKE2b-256 04ff97e7a8cf6c2724c5791979b25e10ece8bafb0ac11757ebdae6ad5dde8664

See more details on using hashes here.

Provenance

The following attestation bundles were made for orkestrr_mcp-0.2.0-py3-none-any.whl:

Publisher: orkestrr-mcp-publish.yml on cafadev/orkestrr

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.0

2 files

This release

0.2.0 This release

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page