Skip to main content
Glama
README.md
# 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](CONTRIBUTING.md) for the branch model and commit rules.

## License

[MIT](LICENSE)

TDQS

A4.5/5.0

Scored across 6 tools

Disambiguation5/5

Each tool maps to a distinct Taiga resource: projects, work items, sprints, comments, attachments, and wiki. Shared type/item parameters are used for child resources, but the tool purposes do not overlap.

Naming Consistency4/5

Top-level tool names are simple lowercase resource nouns and are internally consistent. The pattern is slightly mixed because some names are plural resources while work and wiki are singular, and the internal op verbs vary between add/create and edit/update.

Tool Count5/5

Six resource-scoped tools is a well-balanced surface for a project-management server. Each tool represents a meaningful functional area without making the tool list overwhelming.

Completeness4/5

The server covers most core workflows: project inspection, work-item CRUD, sprints, comments, attachments, and wiki with lifecycle operations. Deliberate gaps such as project creation/deletion and sprint update/delete prevent it from being fully complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues