# negoro26/mcp-taiga [Health: Active]

**Category:** 📋 Product Management  
**Repository:** https://github.com/negoro26/mcp-taiga  
**GitHub Stars:** 3  
**npm Downloads (last month):** 235  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/negoro26-mcp-taiga

## Description
Taiga project management: issues, user stories, tasks, epics, sprints, comments, attachments and wiki via a compact set of tools.

## Tools
Capabilities this server exposes over MCP:

- **projects** — project` accepts an ID or slug
- **work** — type`, `project`, `item`, `subject`, `items
- **sprints** — project`, `sprint`, `name`, `start`, `finish
- **comments** — type`, `item`, `text`, `commentId
- **attachments** — type`, `item`, `attachmentId`, `filePath` or `fileContent`, `savePath
- **wiki** — project`, `page`, `content`, `watch

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "mcp-taiga": {
    "command": "npx",
    "args": ["-y","mcp-taiga"]
  }
}
```

## Documentation & README

# Taiga MCP server

[![CI](https://github.com/negoro26/mcp-taiga/actions/workflows/ci.yml/badge.svg)](https://github.com/negoro26/mcp-taiga/actions/workflows/ci.yml)
[![npm](https://img.shields.io/npm/v/mcp-taiga)](https://www.npmjs.com/package/mcp-taiga)
[![Node](https://img.shields.io/badge/node-%E2%89%A524-blue)](https://nodejs.org/)
[![MCP](https://img.shields.io/badge/MCP-2026--07--28-black)](https://modelcontextprotocol.io/)
[![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)

A TypeScript MCP server for Taiga. It gives LLM clients six tools for projects, work items, sprints, comments, attachments, and wiki pages.

The server uses MCP revision `2026-07-28`, native `fetch`, and either stdio or streamable HTTP.

## Requirements

- Node.js 24 or newer.
- A Taiga account on taiga.io or a self-hosted instance.
- `TAIGA_USERNAME` and `TAIGA_PASSWORD`.

Set `TAIGA_API_URL` for a self-hosted instance. Include `/api/v1` in the URL.

| Variable | Purpose | Default |
| --- | --- | --- |
| `TAIGA_API_URL` | Taiga REST API base URL | `https://api.taiga.io/api/v1` |
| `TAIGA_USERNAME` | Taiga username or email | Required |
| `TAIGA_PASSWORD` | Taiga password | Required |
| `TAIGA_HTTP_PORT` | Serve streamable HTTP when set | stdio |
| `TAIGA_HTTP_HOST` | HTTP bind address | `127.0.0.1` |

## Install

### Published package

Use the published package from an MCP client that accepts a stdio command:

```json
{
  "mcpServers": {
    "taiga": {
      "command": "npx",
      "args": ["-y", "mcp-taiga"],
      "env": {
        "TAIGA_USERNAME": "your_username",
        "TAIGA_PASSWORD": "your_password"
      }
    }
  }
}
```

Pass credentials through the client environment. An npx install does not load a repository `.env` file.

### Local checkout

```bash
git clone https://github.com/negoro26/mcp-taiga.git
cd mcp-taiga
npm ci
npm run build
cp .env.example .env
```

Fill in `.env`, then configure the client to run:

```json
{
  "mcpServers": {
    "taiga": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-taiga/dist/src/index.js"],
      "cwd": "/absolute/path/to/mcp-taiga"
    }
  }
}
```

A local checkout loads `.env` with Node's built-in environment loader. Do not commit `.env`.

### Oh My Pi

Start OMP in the checkout and run:

```text
/mcp add
```

Choose a local stdio server, then use:

```text
command: node
args: /absolute/path/to/mcp-taiga/dist/src/index.js
cwd: /absolute/path/to/mcp-taiga
```

Run `/mcp test taiga` or `/mcp list` to verify the server. OMP configuration lives in `~/.omp/agent/mcp.json`.

## HTTP transport

Set `TAIGA_HTTP_PORT` to serve the same tools over streamable HTTP:

```bash
TAIGA_HTTP_PORT=3000 npx -y mcp-taiga
```

The endpoint is:

```text
http://127.0.0.1:3000/mcp
```

Configure URL-based clients with:

```json
{
  "mcpServers": {
    "taiga": {
      "type": "http",
      "url": "http://127.0.0.1:3000/mcp"
    }
  }
}
```

The HTTP server is stateless, validates the Host and Origin headers, and defaults to loopback. A routable bind address prints a warning because the connection is not encrypted.

## Tools

The server exposes six tools and 28 operation pairs.

| Tool | Operations | Key arguments |
| --- | --- | --- |
| `projects` | `list`, `get`, `whoami` | `project` accepts an ID or slug |
| `work` | `list`, `get`, `create`, `update`, `link`, `unlink`, `delete` | `type`, `project`, `item`, `subject`, `items` |
| `sprints` | `list`, `get`, `create`, `stats` | `project`, `sprint`, `name`, `start`, `finish` |
| `comments` | `list`, `add`, `edit`, `delete` | `type`, `item`, `text`, `commentId` |
| `attachments` | `list`, `upload`, `download`, `delete` | `type`, `item`, `attachmentId`, `filePath` or `fileContent`, `savePath` |
| `wiki` | `list`, `get`, `create`, `update`, `delete`, `watch` | `project`, `page`, `content`, `watch` |

### Input conventions

- Projects accept a numeric ID or slug.
- Work items accept a numeric ID or a `#reference`. A reference also needs `project`.
- Members accept an ID, username, full name, or `me`.
- Statuses, priorities, severities, issue types, and sprint names resolve to Taiga IDs.
- Batch work-item creation accepts at most 20 items.
- `attachments.download` returns metadata by default. Set `includeContent: true` to return bytes, or set `savePath` to write them locally.
- Listings return dense plain text. Empty lists are successful results.

## Safety and reliability

- 401 responses trigger one token refresh and retry.
- 429 responses retry at most twice and honor `Retry-After`. Waits longer than five seconds fail with a retry message.
- 5xx responses are not retried because a write may already have succeeded.
- Project, user, and taxonomy metadata is cached for 60 seconds.
- Requests time out after 30 seconds.
- Attachment downloads reject redirects, cap reads at 10 MB, require the Taiga hostname, and do not send the bearer token to media hosts.
- File downloads refuse to overwrite an existing file.
- Deletes accept one target at a time. Batch creation does not imply batch deletion.

## Docker

```bash
docker build -t mcp-taiga .
docker run --rm -i --env-file .env mcp-taiga
```

For HTTP mode:

```bash
docker run --rm -p 127.0.0.1:3000:3000 \
  -e TAIGA_HTTP_PORT=3000 \
  --env-file .env \
  mcp-taiga
```

The container uses Node.js 24 Alpine and runs as the non-root `node` user.

## Development

```bash
npm ci
npm run check
npm run lint
npm test
```

| Command | Purpose |
| --- | --- |
| `npm run build` | Compile `src` and `test` into `dist` |
| `npm run check` | Type-check without output |
| `npm run lint` | Run the TypeScript anti-slop checks with oxlint |
| `npm test` | Run unit, protocol, contract, and HTTP tests |
| `npm run test:integration` | Run the live Taiga smoke test when credentials exist |

The test suite covers pure helpers, the MCP stdio handshake, all tool operations against a mock Taiga server, streamable HTTP, and live Taiga reads.

## Project layout

```text
src/index.ts             server entrypoint and transport selection
src/http.ts              streamable HTTP transport
src/api.ts               authenticated fetch transport and cache
src/taiga.ts             Taiga domain resolution and patching
src/tools/*.ts           six tool implementations
test/apiContractTest.ts  mock Taiga contract tests
test/protocolTest.ts     stdio MCP tests
test/httpTest.ts         HTTP MCP tests
test/integration.ts      live Taiga smoke test
```

## Contributing

Pull requests target `dev`. See [CONTRIBUTING.md](https://github.com/negoro26/mcp-taiga/blob/HEAD/CONTRIBUTING.md) for the branch model and commit rules.

## License

[MIT](https://github.com/negoro26/mcp-taiga/blob/HEAD/LICENSE)

