Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
7d2828d
wip
yakky Jul 20, 2026
841f5cd
docs: add AGENTS.md with instructions for registering the Taiga MCP s…
yakky Aug 7, 2026
121e97a
docs: clarify token vs password guidance in AGENTS.md
yakky Aug 7, 2026
af3db85
docs: add Sphinx page for the MCP server
yakky Aug 7, 2026
06f82a3
fix: ensure all tox environments run cleanly
yakky Aug 7, 2026
578d25b
feat(mcp): add get_history tool to read comment/change history
yakky Aug 23, 2026
4c8d4a3
refactor(mcp): use official mcp SDK (mcp~=2.0) instead of fastmcp
yakky Aug 24, 2026
2b28178
docs: log mcp SDK rewrite and add evaluation report
yakky Aug 24, 2026
c9ef480
ci: drop stale-cache-prone restore-keys fallback for the .tox cache
yakky Aug 24, 2026
eb5169f
chore: add artifacts to manifest exclusion test
yakky Aug 24, 2026
3ca5b2d
Merge branch 'master' into feature/issue-267-add-mcp
yakky Aug 24, 2026
75b476a
refactor(mcp): resolve user_story/task/issue/epic by ref, not id
yakky Aug 31, 2026
237e2f4
fix(mcp): close pagination bypass, stop serializing stale patch/comme…
yakky Aug 31, 2026
c29e4b4
docs(mcp): add design for CLI parity with ring-mcp-server
yakky Aug 31, 2026
a97679a
docs(mcp): add implementation plan for CLI parity with ring-mcp-server
yakky Aug 31, 2026
a747628
docs(mcp): fix plan preflight gap — implement --version in Task 2, no…
yakky Aug 31, 2026
7817576
build(mcp): add typer dependency for the taiga-mcp-server CLI
yakky Aug 31, 2026
33f531a
feat(mcp)!: require explicit 'serve' subcommand for taiga-mcp-server
yakky Aug 31, 2026
841c94a
feat(mcp): add 'list-tools' subcommand to taiga-mcp-server
yakky Aug 31, 2026
5727e23
feat(mcp): add 'call' subcommand to taiga-mcp-server (success path)
yakky Aug 31, 2026
2573c7d
feat(mcp): add error handling to taiga-mcp-server's 'call' subcommand
yakky Aug 31, 2026
9d2ef6e
docs(mcp): document taiga-mcp-server's new serve/list-tools/call subc…
yakky Aug 31, 2026
1cc24a5
fix(mcp): address final review findings
yakky Aug 31, 2026
07281c4
fix(mcp): address review findings on get_history args, changelog, ser…
yakky Sep 5, 2026
fa99730
Modify cache key in lint workflow for tox
yakky Sep 5, 2026
0111088
Modify cache key in GitHub Actions workflow
yakky Sep 5, 2026
62ea7d1
Fix command to serve taiga-mcp-server
yakky Sep 5, 2026
2934839
feat(mcp): add custom-attribute value get/set tools
yakky Sep 12, 2026
7611ef5
feat(mcp): add list_memberships tool
yakky Sep 12, 2026
e1db218
feat(mcp): add epic-user-story linking tools
yakky Sep 12, 2026
ec4f07c
docs(mcp): note custom-attribute/membership/epic-link tools in changelog
yakky Sep 12, 2026
10f2895
docs(mcp): document custom-attribute, membership, and epic-link tools
yakky Sep 12, 2026
07a59ff
docs: add usage example for linking a user story to an epic
yakky Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ jobs:
uses: actions/cache@v6
with:
path: .tox
key: ${{ runner.os }}-lint-${{ matrix.toxenv }}-${{ hashFiles('setup.cfg') }}
restore-keys: |
${{ runner.os }}-lint-${{ matrix.toxenv }}-
# Include every dependency declaration in the exact cache key so dependency
# changes produce a clean tox environment without relying on partial restores.
key: ${{ runner.os }}-lint-${{ matrix.toxenv }}-${{ hashFiles('setup.cfg', 'tox.ini', 'requirements*.txt') }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip setuptools tox>4
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ jobs:
uses: actions/cache@v6
with:
path: .tox
key: ${{ runner.os }}-tox-${{ format('{{py{0}}}', matrix.python-version) }}-${{ hashFiles('setup.cfg') }}
restore-keys: |
${{ runner.os }}-tox-${{ format('{{py{0}}}', matrix.python-version) }}-
# Include every dependency declaration in the exact cache key so dependency
# changes produce a clean tox environment without relying on partial restores.
key: ${{ runner.os }}-tox-${{ format('{{py{0}}}', matrix.python-version) }}-${{ hashFiles('setup.cfg', 'tox.ini', 'requirements*.txt') }}
- name: Install dependencies
run: |
sudo apt-get install gettext
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ debian/files
debian/python-taiga*
debian/python3-taiga*
.ruff_cache
.venv
*.egg-link
.superpowers
artifacts
112 changes: 112 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# Agent instructions

This file gives coding agents (Claude Code and similar) step-by-step
instructions for tasks specific to this repository. Human-facing docs live in
``README.rst`` and ``docs/``.

## Registering the Taiga MCP server in the user's global Claude config

This repo ships an MCP server (`taiga/mcp_server/`) that exposes the Taiga
REST API as tools over stdio, via the `taiga-mcp-server` console script
(installed by the `mcp` extra: `pip install -e .[mcp]` from this repo, or
`pip install python-taiga[mcp]` from PyPI).

When asked to "add the Taiga MCP server to Claude" / "register taiga-mcp
globally" / "add it to my user-wide config", follow this procedure:

1. **Confirm before acting.** Registering at user scope changes the user's
global Claude Code config (`~/.claude.json`), applying to every project,
not just this repo. Confirm the target Taiga instance and scope with the
user before running the command, unless they've already given explicit
go-ahead in this conversation.

2. **Get a stable `taiga-mcp-server` binary.** Don't point the MCP config at
a project-local `.venv` — Claude Code launches MCP server commands without
inheriting an activated venv, and the binary disappears if that venv is
ever recreated. Install it somewhere durable instead. There are several
equally valid ways to do this; pick whichever fits the user's toolchain,
asking if it's unclear, and default to `pip install --user` since it needs
nothing beyond a reasonably modern Python:
```bash
# default: pip install --user (works with any modern Python/pip)
pip install --user "python-taiga[mcp]" # from PyPI
pip install --user -e ".[mcp]" # from this checkout

# pipx (isolated venv per tool, one binary on PATH)
pipx install "python-taiga[mcp]" # from PyPI
pipx install --editable ".[mcp]" # from this checkout

# uvx (no persistent install; uv manages an ephemeral/cached env)
# here the *registered command* becomes `uvx --from "python-taiga[mcp]" taiga-mcp-server`
# instead of a resolved path — see the uvx example in step 4.
```
After a `pip --user`/`pipx` install, resolve the resulting path and use it
verbatim in step 4:
```bash
command -v taiga-mcp-server
```

3. **Collect credentials.** Ask the user for:
- `TAIGA_HOST` — the Taiga site root, e.g. `https://my.taiga.com`.
For self-hosted instances this is *not* an `api.` subdomain and has no
`/api` suffix — the client appends `/api/v1` itself.
- Either `TAIGA_TOKEN` (pre-issued API token), or both
`TAIGA_USERNAME` and `TAIGA_PASSWORD`. A token takes precedence if both
are configured.
- Optional: `TAIGA_TOKEN_TYPE` (default `Bearer`), `TAIGA_TLS_VERIFY`
(default `true`).

Never pass `--token`/`--password` as CLI arguments — they'd be visible in
the process list. Always pass credentials as environment variables.

**Default to username/password over a token, unless the instance has a
real personal-access-token feature.** Stock Taiga (checked against
`https://my.taiga.com`) has no self-service PAT: the only tokens it
issues are (a) short-lived JWTs from `POST /api/v1/auth` — on that
instance, a 24h access token / 8-day refresh token — and (b) OAuth-style
"Application" tokens, which require an admin-registered app and a
consent/`auth_code` flow (`client.auth_app()`), not something a regular
user can self-serve. This server's `auth.py`/CLI has no refresh-token
support, so a manually-generated `TAIGA_TOKEN` will just silently stop
working after ~24h with no renewal — worse than username/password, which
re-authenticates fresh on every server start. Only reach for `TAIGA_TOKEN`
when the target instance genuinely offers a durable personal token (e.g.
a Taiga Enterprise/hosted deployment with PAT support) — verify that
before recommending it, don't assume it exists.

4. **Register at user scope** with `claude mcp add`, using `-e` for every
credential env var and the resolved binary (or `uvx` invocation) from
step 2:
```bash
claude mcp add --scope user taiga \
-e TAIGA_HOST=https://my.taiga.com \
-e TAIGA_USERNAME=<username> \
-e TAIGA_PASSWORD=<password> \
-- /absolute/path/to/taiga-mcp-server serve
```
or, with a token instead of username/password:
```bash
claude mcp add --scope user taiga \
-e TAIGA_HOST=https://my.taiga.com \
-e TAIGA_TOKEN=<token> \
-- /absolute/path/to/taiga-mcp-server serve
```
With `uvx` there's no path to resolve — pass the `uvx` invocation itself
as the command:
```bash
claude mcp add --scope user taiga \
-e TAIGA_HOST=https://my.taiga.com \
-e TAIGA_TOKEN=<token> \
-- uvx --from "python-taiga[mcp]" taiga-mcp-server serve
```
`--scope user` (not `local`/`project`) is what makes it "user-wide" —
available in every project for that user, stored outside this repo.

5. **Verify** with `claude mcp list` (look for `taiga` ... `✔ Connected`) and
`claude mcp get taiga`. If it fails to connect, re-check the resolved
binary/command from step 2 and that `TAIGA_HOST` is the site root, not an
API subdomain.

6. **Don't persist secrets in the repo.** Credentials belong only in the
`claude mcp add -e ...` invocation (stored in the user's own
`~/.claude.json`) — never write them into files inside this repository.
3 changes: 2 additions & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
include AGENTS.md
include AUTHORS
include LICENSE
include README.rst
include CONTRIBUTING.rst
include HISTORY.rst
include requirements.txt
include requirements-tests.txt
include requirements-test.txt
recursive-include taiga *.html *.png *.gif *js *jpg *jpeg *svg *py *mo *po
1 change: 1 addition & 0 deletions changes/267.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add MCP server exposing Taiga projects, user stories, tasks, issues, epics, milestones and wiki pages as tools for AI agents. `taiga-mcp-server` also gains `list-tools` and `call` subcommands, letting tools be listed and invoked directly from a shell without an MCP client. The server also exposes custom-attribute value read/write, project membership listing, and epic-user-story linking.
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Welcome to python-taiga's documentation!
:maxdepth: 3

usage
mcp
api
models
development
Expand Down
Loading
Loading