Taiga Mcp Remote — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Taiga Mcp Remote (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A remote Model Context Protocol (MCP) server for Taiga project management. Runs as an HTTP service — multiple users can connect simultaneously, each authenticating with their own Taiga account.
MCP Client (e.g. LibreChat, Claude)
│ OAuth 2.1 / Bearer <access-token>
▼
┌─────────────────────────────┐
│ Taiga Remote MCP Server │
│ (this repo, port 3000) │
│ │
│ /authorize ─► Taiga login│
│ /token ─► OAuth token│
│ /mcp ─► sprints … │
└──────────┬──────────────────┘
│ Taiga REST API calls
▼
Taiga Backend ServerOAuth-capable MCP clients can now discover this server, open the authorization flow, let each user sign in with their own Taiga account, and receive a per-user Bearer access token automatically. The legacy /auth/login page still exists for manual token workflows.
| Requirement | Version |
|---|---|
| Node.js | ≥ 20 |
| npm | ≥ 10 |
| Docker + Docker Compose | any recent version (for Docker deploy) |
| A running Taiga instance | v6+ |
git clone https://github.com/raynguyen256/Enosta-Taiga-RemoteMCP.git
cd Enosta-Taiga-RemoteMCP.env filecp .env.example .envOpen .env and fill in at minimum:
TAIGA_BASE_URL=https://taiga.enosta.com/api/v1
MCP_SERVER_URL=https://your-mcp-server-domain.com
PORT=3000See Environment Variables for all options.
docker-compose up -dThe server will be available at http://localhost:3000 (or the port you set).
This repo includes a render.yaml Blueprint for a single free web service on Render.
Render creates Blueprint services from a Git repository, so make sure this repo is pushed first.
render.yaml and propose a web service named taiga-mcp-remote.singapore; change it if your Taiga server or users are closer to another Render region.Render will prompt you for:
TAIGA_BASE_URL — for example https://taiga.example.com/api/v1The Blueprint also preconfigures:
PORT=3000CORS_ORIGINS=*Finish the Blueprint setup and wait for the first deploy to complete.
When deployed on Render, the server automatically uses Render's default public URL (RENDER_EXTERNAL_URL) as MCP_SERVER_URL if you did not set MCP_SERVER_URL manually.
This means the first deploy works without needing to know the final onrender.com URL in advance.
Open:
https://<your-service>.onrender.com/healthhttps://<your-service>.onrender.com/.well-known/oauth-protected-resource/mcphttps://<your-service>.onrender.com/auth/loginIf /health returns JSON and the .well-known endpoint loads, the MCP server is ready to test.
If you later attach a custom domain in Render, explicitly set:
MCP_SERVER_URL=https://your-custom-domain.comOtherwise the server will keep advertising the default onrender.com URL in OAuth metadata.
This project currently keeps sessions in memory only. If the Render free instance sleeps or restarts, active MCP/login sessions are lost and users need to authenticate again.
git clone https://github.com/raynguyen256/Enosta-Taiga-RemoteMCP.git
cd Enosta-Taiga-RemoteMCP
npm install.env filecp .env.example .env
# Edit .env with your valuesnpm run buildnpm startFor development with auto-rebuild on save:
npm run devCopy .env.example to .env and configure the values below. Never commit your `.env` file.
| Variable | Example | Description |
|---|---|---|
TAIGA_BASE_URL | https://taiga.enosta.com/api/v1 | Full URL to your Taiga REST API. No trailing slash. |
| Variable | Default | Description |
|---|---|---|
PORT | 3000 | TCP port the HTTP server listens on. |
MCP_SERVER_URL | http://localhost:3000 | Public-facing URL of this MCP server. Used in OAuth metadata responses and logs. Must be reachable by MCP clients. On Render, if unset, the server falls back to RENDER_EXTERNAL_URL. |
CORS_ORIGINS | * | Allowed CORS origins for browser-based clients. Use * to allow all, or a comma-separated list: https://app1.com,https://app2.com. |
| Variable | Default | Description |
|---|---|---|
SESSION_TTL | 86400 | How long (in seconds) a user session stays valid after login. 86400 = 24 hours. After expiry the user must log in again. |
OAUTH_ACCESS_TOKEN_TTL | 3600 | OAuth access token lifetime in seconds. Refresh tokens remain usable until SESSION_TTL is reached. |
| Variable | Default | Description |
|---|---|---|
TAIGA_CACHE_TTL | 300 | How long (in seconds) to cache static lookups — project members, issue types, statuses, priorities. Reduces repeated API calls. 300 = 5 minutes. |
TAIGA_REQUEST_TIMEOUT | 30000 | Per-request timeout in milliseconds when calling the Taiga API. 30000 = 30 seconds. |
TAIGA_MAX_RETRIES | 3 | Number of retry attempts on transient network errors before giving up. |
TAIGA_TOKEN_REFRESH_THRESHOLD | 72000 | Seconds before a Taiga auth token's age triggers a background refresh. Default is 20 hours. Only relevant in Bootstrap mode. |
These three variables work as a group. All three must be set to activate Bootstrap mode. If any is missing, Bootstrap mode is disabled and the server runs in standard multi-user mode.
Important: In the standard multi-user setup you do not need to fill inTAIGA_USERNAMEorTAIGA_PASSWORDhere. Each user authenticates individually through the/auth/loginweb page. Only set these if you specifically want the server to log in automatically on startup under a single shared account (e.g. for an AI assistant or CI pipeline with a dedicated Taiga service account).
| Variable | Description |
|---|---|
TAIGA_BOOTSTRAP_TOKEN | A fixed UUID you generate once. This becomes the permanent Bearer token for the bootstrap session. Generate with: node -e "console.log(require('crypto').randomUUID())" |
TAIGA_USERNAME | (Bootstrap only) Username of the Taiga service account. Leave empty for multi-user deployments. |
TAIGA_PASSWORD | (Bootstrap only) Password of the Taiga service account. Leave empty for multi-user deployments. |
The default mode. No credentials in .env required.
/.well-known/oauth-protected-resource/mcp and /.well-known/oauth-authorization-server.GET /authorize in the user’s browser./mcp plus a refresh token.OAUTH_ACCESS_TOKEN_TTL seconds and the refresh token remains valid until SESSION_TTL is reached.Still available for clients that do not support MCP OAuth yet.
https://your-mcp-server-domain.com/auth/login.Authorization: Bearer <token>.Useful when one shared Taiga account drives an AI assistant or automated pipeline.
node -e "console.log(require('crypto').randomUUID())"TAIGA_BOOTSTRAP_TOKEN, TAIGA_USERNAME, and TAIGA_PASSWORD in .env.If your client does not support MCP OAuth yet, use a manual Bearer token from /auth/login:
mcpServers:
- name: Taiga
url: https://your-mcp-server-domain.com/mcp
headers:
Authorization: "Bearer <your-session-token>"In your MCP config, set:
{
"mcpServers": {
"taiga": {
"url": "https://your-mcp-server-domain.com/mcp",
"headers": {
"Authorization": "Bearer <your-session-token>"
}
}
}
}Replace <your-session-token> with the token you received from /auth/login.
For OAuth-aware MCP clients, point them at https://your-mcp-server-domain.com/mcp and let discovery/authorization run automatically.
| Method | Path | Auth | Description |
|---|---|---|---|
GET | /authorize | OAuth client | Start OAuth authorization code flow for /mcp. |
POST | /authorize/submit | Browser form | Submit Taiga credentials for the current OAuth authorization request. |
POST | /token | OAuth client | Exchange authorization code or refresh token for an access token. |
POST | /register | OAuth client | Dynamic OAuth client registration endpoint. |
GET | /.well-known/oauth-protected-resource/mcp | — | OAuth 2.0 protected resource metadata for the MCP endpoint. |
GET | /.well-known/oauth-authorization-server | — | OAuth 2.0 authorization server metadata. |
GET | /auth/login | — | Web login page — opens in a browser to get a token. |
POST | /auth/login | — | JSON login: { "username": "...", "password": "..." } → returns { token, expires_at, username }. |
POST | /auth/refresh | Bearer | Extend the current session and get a refreshed expiry. |
DELETE | /auth/logout | Bearer | Invalidate the current session token. |
GET | /auth/status | Bearer | Check if the current token is valid and see its expiry. |
POST | /mcp | Bearer | Main MCP endpoint — all tool calls go here. |
GET | /.well-known/oauth-protected-resource | — | Legacy metadata alias kept for compatibility. |
scripts/refresh-session.sh is a helper for non-bootstrap deployments that need to keep a token alive automatically (e.g. for a LibreChat integration).
It tries to refresh the existing token first; if that fails it falls back to a full login.
# Example: run every 6 hours via cron
0 */6 * * * TAIGA_MCP_URL=https://your-mcp-server.com TAIGA_MCP_TOKEN=<uuid> /path/to/scripts/refresh-session.sh >> /var/log/taiga-mcp-refresh.log 2>&1Set LIBRECHAT_CONFIG=/path/to/librechat.yaml to have the script automatically update the Bearer token in your LibreChat config file after a successful refresh.
.env is listed in .gitignore — never commit it.TAIGA_USERNAME and TAIGA_PASSWORD in .env are for Bootstrap mode only. In a multi-user deployment these fields should remain empty.MCP_SERVER_URL to your HTTPS domain.CORS_ORIGINS to trusted domains in production instead of using *.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.