MCP server exposing the Orkestrr project-management hierarchy (Bundles, Goals, Tasks) to AI agents
Project description
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'sid—create_labelresolves it by re-querying labels by name.- A task's
estimation_labelis null in list/update payloads (only the nestedestimationobject on the detail payload carries the label) —set_task_estimationre-fetches the detail so it can confirm the value.
Authentication
Uses Orkestrr's existing DRF token auth (Authorization: Token <key>). No backend changes needed.
Get a token by logging in:
curl -X POST http://localhost:9000/api/auth/login/ \
-H "Content-Type: application/json" \
-d '{"email":"<email>","password":"<password>"}'
# -> copy the "token" value from the response
For production, prefer a dedicated integration user (e.g. agent@orkestrr.app) added to the
relevant projects with the least role needed — better audit trail and scoped permissions than a
personal token. The token acts with that user's organization/project permissions.
Configuration
Two environment variables select the target environment:
| Variable | Example | Notes |
|---|---|---|
ORKESTRR_BASE_URL |
http://localhost:9000 |
/api is appended automatically if absent. |
ORKESTRR_TOKEN |
9b1f… |
DRF token (see above). |
Install
From PyPI (recommended — no repo checkout needed):
uv tool install orkestrr-mcp # or: pipx install orkestrr-mcp
# installs the `orkestrr-mcp` 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/faztor.git
uv tool install --editable ./faztor/orkestrr-mcp
Register with Claude Code (user scope = available in every project)
# Local Orkestrr
claude mcp add --scope user orkestrr-local \
--env ORKESTRR_BASE_URL=http://localhost:9000 \
--env ORKESTRR_TOKEN=<local-token> \
-- orkestrr-mcp
# Production Orkestrr
claude mcp add --scope user orkestrr \
--env ORKESTRR_BASE_URL=https://<prod-domain> \
--env ORKESTRR_TOKEN=<prod-token> \
-- orkestrr-mcp
Restart Claude Code and run /mcp to confirm the tools are listed. Tokens live only in your user
config (~/.claude.json) — never commit them.
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 | faztor |
| Workflow name | orkestrr-mcp-publish.yml |
| Environment | (leave blank) |
Each release:
- Bump
versioninpyproject.toml(PyPI never lets you re-upload the same version) and merge it. - 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orkestrr_mcp-0.1.0.tar.gz.
File metadata
- Download URL: orkestrr_mcp-0.1.0.tar.gz
- Upload date:
- Size: 76.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c535ceb3e5ffa535d746ad8bec768aeb59815937eb5e4f4875f97021c7920c87
|
|
| MD5 |
4f56cfc1bace59a8a45b25fc17616a0a
|
|
| BLAKE2b-256 |
728bd0b0c7a8184b3fa5cef4638b9303f6fa0942ea6334dfa830e80b8c3c8952
|
Provenance
The following attestation bundles were made for orkestrr_mcp-0.1.0.tar.gz:
Publisher:
orkestrr-mcp-publish.yml on cafadev/orkestrr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orkestrr_mcp-0.1.0.tar.gz -
Subject digest:
c535ceb3e5ffa535d746ad8bec768aeb59815937eb5e4f4875f97021c7920c87 - Sigstore transparency entry: 1892385115
- Sigstore integration time:
-
Permalink:
cafadev/orkestrr@6e192105ae1a2a606ef9396957235dff04fc68a1 -
Branch / Tag:
refs/tags/orkestrr-mcp-v0.1.0 - Owner: https://github.com/cafadev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
orkestrr-mcp-publish.yml@6e192105ae1a2a606ef9396957235dff04fc68a1 -
Trigger Event:
release
-
Statement type:
File details
Details for the file orkestrr_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: orkestrr_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0667308102fc2d6e7800e8589006c75addf80105ae5a54c581a9d0ea43cc3a7
|
|
| MD5 |
697af95cb7c6ab79a5a664d718cf0372
|
|
| BLAKE2b-256 |
489f3a75847ab09c99d8122a67c4e2afcbbada7c42d7ba40c17ce2004eeda57e
|
Provenance
The following attestation bundles were made for orkestrr_mcp-0.1.0-py3-none-any.whl:
Publisher:
orkestrr-mcp-publish.yml on cafadev/orkestrr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
orkestrr_mcp-0.1.0-py3-none-any.whl -
Subject digest:
e0667308102fc2d6e7800e8589006c75addf80105ae5a54c581a9d0ea43cc3a7 - Sigstore transparency entry: 1892385202
- Sigstore integration time:
-
Permalink:
cafadev/orkestrr@6e192105ae1a2a606ef9396957235dff04fc68a1 -
Branch / Tag:
refs/tags/orkestrr-mcp-v0.1.0 - Owner: https://github.com/cafadev
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
orkestrr-mcp-publish.yml@6e192105ae1a2a606ef9396957235dff04fc68a1 -
Trigger Event:
release
-
Statement type: