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 id — create_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.

The browser is sent to whichever approval URL the identity provider names in its device-code response, so the flow follows the server rather than a URL built here.

If a tool ever fails with "Not logged in" or "Session expired", just run okr login again. Upgrading from 0.3.0 may ask for one such re-login: the CLI now talks to auth.orkestrr.com instead of auth.evoheim.com.

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.
ORKESTRR_AUTH_URL https://auth.orkestrr.com Optional. The Authentik that issues and approves the CLI's tokens.

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.

Metadata

Release files for orkestrr-mcp 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for orkestrr-mcp 0.4.0
File Size Uploaded
orkestrr_mcp-0.4.0.tar.gz 82.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for orkestrr-mcp 0.4.0
File Interpreter ABI Platform
orkestrr_mcp-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 103.8 kB

Release files / orkestrr_mcp-0.4.0.tar.gz

Download URL orkestrr_mcp-0.4.0.tar.gz
Size 82.1 kB
Tags Source
SHA-256 checksum
How to use checksums
400fee576b9270d9e4c865c3f910b1a75e3fc262758481d93aaa1739e0098417
BLAKE2b-256 checksum
How to use checksums
60950054dc1bac69cfb0f56a90efbcf14fb60c9324f9173a2176148d74bfd6e0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.

Transparency log

Release files / orkestrr_mcp-0.4.0-py3-none-any.whl

Download URL orkestrr_mcp-0.4.0-py3-none-any.whl
Size 21.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
92fac0f277c5ff4894445f306614e0b95f0f0ccb9c7f8927dfa104a37890c7a7
BLAKE2b-256 checksum
How to use checksums
4b2bca8175ed647a1c33eea3cb2d884490bddd42a32ffb07082e4d6dc15708a5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 3, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.0

2 release files

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page