T
Taiga MCP
by @JohnWBlack
MCP server by JohnWBlack
Created 10/30/2025
Updated about 14 hours ago
README
Repository documentation and setup instructions
Taiga MCP Server
Project Overview
- Implements a Starlette-based Model Context Protocol (MCP) server that exposes both Server-Sent Events (SSE) and Streamable HTTP transports for ChatGPT and other MCP compliant clients.
- Serves as a bridge between ChatGPT and the Taiga project management API, currently including an echotool for transport validation with ongoing integration of Taiga-specific actions.
- Deployed as a container workload to Azure Container Apps and packaged for distribution through GitHub Container Registry (GHCR).
Runtime Architecture
- app.pyinstantiates- FastMCPwith the Taiga MCP identity, mounts SSE at- /sse/and Streamable HTTP at- /mcp/, and disables trailing-slash redirects to preserve MCP session headers.
- A custom middleware rewrites bare /mcprequests to/mcp/and normalizes blank paths inside the sub-application to avoid 307 redirects that previously dropped MCP session headers.
- The FastMCP session manager is started via Starlette's lifespan hook to ensure streamable sessions stay active for long-running ChatGPT conversations.
- Health checks:
- GET /→ plain text "Taiga MCP up" for quick availability probes.
- GET /healthz→ minimal health endpoint for container orchestrators.
 
Endpoints Summary
- /— Root status page.
- /healthz— Liveness probe used by Azure Container Apps.
- /sse/— Server-Sent Events transport; requires- Accept: text/event-streamand returns the message posting endpoint in the first event payload.
- /sse/sse/messages/— POST target for SSE message submission (returned in SSE- endpointevent).
- /mcp/— Streamable HTTP transport; clients must send- Accept: application/json, text/event-streamto satisfy protocol negotiation.
MCP Tools
- echo(message)— diagnostic helper that returns the provided message.
- taiga.projects.list()— lists projects visible to the service account.
- taiga.epics.list(project_id)— lists epics for a project, including id/ref/subject/status metadata.
- taiga.stories.create(project_id, subject, description?, status?, tags?, assigned_to?)— creates a Taiga user story;- statusaccepts either an id or status name/slug.
- taiga.epics.add_user_story(epic_id, user_story_id)— links a user story to an epic.
Local Development Workflow
- Prerequisites
- Python 3.11 (project uses a .chat-venvvirtual environment by default).
- Docker Desktop for container builds.
- Azure CLI for deployment automation.
- GHCR authentication (docker login ghcr.io).
 
- Python 3.11 (project uses a 
- Install dependencies
- python -m venv .chat-venv
- .\.chat-venv\Scripts\python.exe -m pip install -r requirements.txt
 
- Run the server locally
- .\.chat-venv\Scripts\uvicorn.exe app:app --host 127.0.0.1 --port 8010
- Streamable probe: .\.chat-venv\Scripts\python.exe streamable_client.py http://127.0.0.1:8010/mcp --message "hello local"
 
- SSE manual test
- curl.exe -sN -H "Accept: text/event-stream" http://127.0.0.1:8010/sse/
 
Container Build & Publish
- Build tagged images:
- docker build -t ghcr.io/johnwblack/taiga-mcp:v0.0.10 -t ghcr.io/johnwblack/taiga-mcp:latest .
 
- Push to GHCR:
- docker push ghcr.io/johnwblack/taiga-mcp:v0.0.10
- docker push ghcr.io/johnwblack/taiga-mcp:latest
 
Azure Container Apps Deployment
- Resource group: rg-offset3
- Container app: taiga-mcp
- Managed environment: cae-offset3
- Deployment command (after successful image push):
- az containerapp update -g rg-offset3 -n taiga-mcp --image ghcr.io/johnwblack/taiga-mcp:v0.0.10
 
- CLI prerequisites on Windows (prevents permission errors):
- $env:AZURE_EXTENSION_DIR = Join-Path $HOME '.az-extensions'
- $env:AZURE_CONFIG_DIR = Join-Path $HOME '.az-cli'
 
Secret Management for Taiga Credentials
- Secrets are stored in Azure Container Apps and surfaced as environment variables for the MCP process.
- Commands used:
- az containerapp secret set --resource-group rg-offset3 --name taiga-mcp --secrets taiga-username="info@offset3.com" taiga-password="<PASSWORD>"
- az containerapp update --resource-group rg-offset3 --name taiga-mcp --set-env-vars TAIGA_USERNAME=secretref:taiga-username TAIGA_PASSWORD=secretref:taiga-password
 
- Environment variables available inside the container:
- TAIGA_BASE_URL— base URL for Taiga API (secret reference- taiga-base-url).
- TAIGA_USERNAME— service account username.
- TAIGA_PASSWORD— service account password.
- Legacy variables TAIGA_USERNAME_SECRET/TAIGA_PASSWORD_SECRETremain for backward compatibility.
 
- Rotate passwords regularly and repeat the secret update commands to propagate changes.
Verification Checklist
- Streamable HTTP smoke test:
- .\.chat-venv\Scripts\python.exe streamable_client.py https://taiga-mcp.politeground-c43f6662.eastus.azurecontainerapps.io/mcp --message "ping from retest"
 
- SSE availability test:
- curl.exe -sN -H "Accept: text/event-stream" https://taiga-mcp.politeground-c43f6662.eastus.azurecontainerapps.io/sse/ --max-time 5
 
- Azure logs review:
- az containerapp logs show -g rg-offset3 -n taiga-mcp --tail 50
 
- ChatGPT connector validation:
- Configure ChatGPT with the MCP endpoint https://taiga-mcp.politeground-c43f6662.eastus.azurecontainerapps.io/mcpand confirm that theechotool responds.
- Verify Taiga API routes once exposed by running list and write operations through ChatGPT.
 
- Configure ChatGPT with the MCP endpoint 
Troubleshooting Notes
- Not Acceptable: Client must accept text/event-stream— Ensure clients send- Accept: application/json, text/event-streamwhen calling- /mcp/.
- Session terminatederrors usually indicate a redirect; verify the request hits- /mcp/(with trailing slash) and that proxies are not rewriting headers.
- Azure CLI WinError 5permission issues are resolved by settingAZURE_EXTENSION_DIRandAZURE_CONFIG_DIRto user-writable locations.
- After updating secrets, Azure Container Apps restarts the revision; allow 1–2 minutes before retesting endpoints.
Project History (October 2025 Highlights)
- Refactored Starlette routing to eliminate automatic slash redirects that stripped MCP session headers on Azure.
- Added middleware to normalize Streamable HTTP paths and ensure compatibility with Azure ingress rewrite behavior.
- Built and published container versions v0.0.4throughv0.0.10, withv0.0.10deployed as revisiontaiga-mcp--0000016.
- Validated SSE and Streamable HTTP transports using local clients, curl, and the ChatGPT MCP connector.
- Stored Taiga service account credentials securely in Azure Container Apps secrets to enable future write access to Taiga.
Quick Setup
Installation guide for this server
Install Package (if required)
uvx taiga-mcp
Cursor configuration (mcp.json)
{
  "mcpServers": {
    "johnwblack-taiga-mcp": {
      "command": "uvx",
      "args": [
        "taiga-mcp"
      ]
    }
  }
}