@taiga-ai/mcp-server 0.26.0 → 0.26.1-dev.543
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -8
- package/dist/index.js +35 -27
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ It runs locally over stdio and calls the Taiga API with your API key.
|
|
|
13
13
|
1. Create an API key in Taiga under **Settings > Account > API keys**.
|
|
14
14
|
2. The key acts as you. It can do what your role can do, within the key's scopes.
|
|
15
15
|
|
|
16
|
-
The examples pin a release (`@taiga-ai/mcp-server@0.26.
|
|
16
|
+
The examples pin a release (`@taiga-ai/mcp-server@0.26.1`), so an install runs the version you chose rather than whatever `latest` is at the next start. Taiga's settings page shows the snippet for your environment.
|
|
17
17
|
|
|
18
18
|
## Install
|
|
19
19
|
|
|
@@ -22,7 +22,7 @@ The examples pin a release (`@taiga-ai/mcp-server@0.26.0`), so an install runs t
|
|
|
22
22
|
Paste your key when the command waits for it; it is read without echo and stays out of your shell history:
|
|
23
23
|
|
|
24
24
|
```sh
|
|
25
|
-
read -rs TAIGA_API_KEY && claude mcp add taiga -e TAIGA_API_KEY="$TAIGA_API_KEY" -- npx -y @taiga-ai/mcp-server@0.26.
|
|
25
|
+
read -rs TAIGA_API_KEY && claude mcp add taiga -e TAIGA_API_KEY="$TAIGA_API_KEY" -- npx -y @taiga-ai/mcp-server@0.26.1
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
### Claude Desktop
|
|
@@ -34,7 +34,7 @@ In `claude_desktop_config.json`:
|
|
|
34
34
|
"mcpServers": {
|
|
35
35
|
"taiga": {
|
|
36
36
|
"command": "npx",
|
|
37
|
-
"args": ["-y", "@taiga-ai/mcp-server@0.26.
|
|
37
|
+
"args": ["-y", "@taiga-ai/mcp-server@0.26.1"],
|
|
38
38
|
"env": { "TAIGA_API_KEY": "your-key-here" }
|
|
39
39
|
}
|
|
40
40
|
}
|
|
@@ -56,7 +56,7 @@ In `.vscode/mcp.json`. VS Code reads `servers`, and can prompt for the key once
|
|
|
56
56
|
"taiga": {
|
|
57
57
|
"type": "stdio",
|
|
58
58
|
"command": "npx",
|
|
59
|
-
"args": ["-y", "@taiga-ai/mcp-server@0.26.
|
|
59
|
+
"args": ["-y", "@taiga-ai/mcp-server@0.26.1"],
|
|
60
60
|
"env": { "TAIGA_API_KEY": "${input:taiga-api-key}" }
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -70,7 +70,7 @@ In `~/.codex/config.toml`:
|
|
|
70
70
|
```toml
|
|
71
71
|
[mcp_servers.taiga]
|
|
72
72
|
command = "npx"
|
|
73
|
-
args = ["-y", "@taiga-ai/mcp-server@0.26.
|
|
73
|
+
args = ["-y", "@taiga-ai/mcp-server@0.26.1"]
|
|
74
74
|
env = { TAIGA_API_KEY = "your-key-here" }
|
|
75
75
|
```
|
|
76
76
|
|
|
@@ -80,11 +80,11 @@ env = { TAIGA_API_KEY = "your-key-here" }
|
|
|
80
80
|
| ---------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
81
81
|
| `TAIGA_API_KEY` | Yes | Your API key. |
|
|
82
82
|
| `TAIGA_API_URL` | For `@dev` and `@staging` builds | The Taiga API. A release defaults to `https://api.eu.tai.ga`. It must be https (plain http only for `localhost`), with no query or fragment. |
|
|
83
|
-
| `TAIGA_TOOLSETS` | No |
|
|
83
|
+
| `TAIGA_TOOLSETS` | No | Overrides the key's toolsets for this server, comma-separated, or `all`. See [Toolsets](#toolsets). |
|
|
84
84
|
|
|
85
85
|
## Toolsets
|
|
86
86
|
|
|
87
|
-
The tools come in five toolsets
|
|
87
|
+
The tools come in five toolsets. Every toolset is on unless you choose otherwise for the key.
|
|
88
88
|
|
|
89
89
|
| Toolset | For |
|
|
90
90
|
| ----------- | ---------------------------------------------------------------------------- |
|
|
@@ -94,7 +94,7 @@ The tools come in five toolsets, so an assistant sees the ones for the job rathe
|
|
|
94
94
|
| `observe` | Deployments, monitoring, delivery metrics, packages and the SBOM. |
|
|
95
95
|
| `documents` | Factory documents, writing and publishing documents, and the knowledge base. |
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
Choose a key's toolsets in Taiga when you connect a tool under Settings › Account › AI tools, or change them later under Settings › Account › API keys, then restart your AI tool; the server reads them when it starts. `TAIGA_TOOLSETS` in the server's config overrides them for that server. A toolset never adds a tool your key does not allow: your role and the key's scopes decide what it may do. `taiga_whoami` lists the toolsets that are on and the tools in the ones that are off.
|
|
98
98
|
|
|
99
99
|
## First steps
|
|
100
100
|
|
|
@@ -124,3 +124,7 @@ Organization administration stays in the web. That covers members and roles, SSO
|
|
|
124
124
|
- **"Failed to validate API key":** the key is wrong, revoked or expired. Create a new one.
|
|
125
125
|
- **"The Taiga API at ... is older than @taiga-ai/mcp-server ... needs":** run the release your Taiga environment names on its settings page.
|
|
126
126
|
- **"This is a pre-release build":** `@dev` and `@staging` builds are for Taiga's own environments and need `TAIGA_API_URL`.
|
|
127
|
+
|
|
128
|
+
## License
|
|
129
|
+
|
|
130
|
+
Proprietary. This package is provided for use with a Taiga account; it is not open source.
|
package/dist/index.js
CHANGED
|
@@ -1970,6 +1970,20 @@ const ENVIRONMENT_TYPES = [
|
|
|
1970
1970
|
"load_test",
|
|
1971
1971
|
"custom"
|
|
1972
1972
|
];
|
|
1973
|
+
//#endregion
|
|
1974
|
+
//#region ../../packages/types/dist/api-keys.js
|
|
1975
|
+
/**
|
|
1976
|
+
* The groups the MCP server's tools come in (PRO-2838). A key may name the ones
|
|
1977
|
+
* its AI tool sees; null is every one. This is focus, not security: a tool the
|
|
1978
|
+
* key's role or scopes do not allow is never offered, whatever is named here.
|
|
1979
|
+
*/
|
|
1980
|
+
const MCP_TOOLSETS = [
|
|
1981
|
+
"core",
|
|
1982
|
+
"operate",
|
|
1983
|
+
"setup",
|
|
1984
|
+
"observe",
|
|
1985
|
+
"documents"
|
|
1986
|
+
];
|
|
1973
1987
|
[...TURN_EVENT_TRIGGERS];
|
|
1974
1988
|
//#endregion
|
|
1975
1989
|
//#region ../../packages/types/dist/maintenance.js
|
|
@@ -2545,20 +2559,16 @@ function apiLevelProblem(introspection, apiUrl, required = 4, version = SERVER_V
|
|
|
2545
2559
|
//#endregion
|
|
2546
2560
|
//#region src/tools/toolsets.ts
|
|
2547
2561
|
/**
|
|
2548
|
-
* Toolsets (PRO-2846
|
|
2562
|
+
* Toolsets (PRO-2846, PRO-2838): the tools an AI tool sees, grouped by what the person does.
|
|
2549
2563
|
*
|
|
2550
|
-
*
|
|
2551
|
-
*
|
|
2552
|
-
*
|
|
2553
|
-
*
|
|
2564
|
+
* A role decides what a key MAY do (the API enforces it, and tools a key cannot use are never registered); a toolset
|
|
2565
|
+
* decides what it SEES. A toolset never adds a tool the key's capabilities do not allow. Every toolset is on unless
|
|
2566
|
+
* the key says otherwise: the person chooses them for the key in Taiga's settings, and the server reads them at
|
|
2567
|
+
* start. Toolsets alone barely changed what the task test cost in Claude Code, which loads tool details on demand,
|
|
2568
|
+
* so the default is everything rather than a short list someone has to know how to widen. The tool list stays the
|
|
2569
|
+
* same for every connection of one server (MCP 2026-07-28), so the set is fixed at start, not mid-session.
|
|
2554
2570
|
*/
|
|
2555
|
-
const TOOLSETS =
|
|
2556
|
-
"core",
|
|
2557
|
-
"operate",
|
|
2558
|
-
"setup",
|
|
2559
|
-
"observe",
|
|
2560
|
-
"documents"
|
|
2561
|
-
];
|
|
2571
|
+
const TOOLSETS = MCP_TOOLSETS;
|
|
2562
2572
|
/** What each toolset is for, as whoami says it. */
|
|
2563
2573
|
const TOOLSET_PURPOSE = {
|
|
2564
2574
|
core: "where products, initiatives, runs, policies and findings stand",
|
|
@@ -2645,13 +2655,6 @@ const TOOLSET_OF = {
|
|
|
2645
2655
|
taiga_retry_knowledge: "documents"
|
|
2646
2656
|
};
|
|
2647
2657
|
/**
|
|
2648
|
-
* The toolsets a key sees when its config names none: a viewer can only read, so it sees every read it may use;
|
|
2649
|
-
* everyone else sees where things stand and the work they move, and opts into setup, observe and documents.
|
|
2650
|
-
*/
|
|
2651
|
-
function defaultToolsets(role) {
|
|
2652
|
-
return role === "viewer" ? TOOLSETS : ["core", "operate"];
|
|
2653
|
-
}
|
|
2654
|
-
/**
|
|
2655
2658
|
* TAIGA_TOOLSETS as written: comma-separated names, or "all"; a name it does not know is said, not ignored, and so
|
|
2656
2659
|
* is a value that names none.
|
|
2657
2660
|
*/
|
|
@@ -2661,10 +2664,15 @@ function parseToolsets(raw) {
|
|
|
2661
2664
|
if (unknown.length > 0 || names.length === 0) return { problem: `TAIGA_TOOLSETS ${unknown.length > 0 ? `names ${unknown.join(", ")}, which is no toolset` : "names no toolset"}: use ${TOOLSETS.join(", ")} or all.` };
|
|
2662
2665
|
return { toolsets: names.includes("all") ? TOOLSETS : [...new Set(names)] };
|
|
2663
2666
|
}
|
|
2664
|
-
/**
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2667
|
+
/**
|
|
2668
|
+
* The toolsets a server turns on: TAIGA_TOOLSETS when the server's config names some, else the ones the key names,
|
|
2669
|
+
* else every one. A name the server does not know (a key set by a newer Taiga) is passed over; a key that names
|
|
2670
|
+
* none this server knows sees every one, rather than starting with no tools.
|
|
2671
|
+
*/
|
|
2672
|
+
function activeToolsets(fromKey, fromConfig) {
|
|
2673
|
+
const named = fromConfig ?? fromKey?.filter((name) => TOOLSETS.includes(name));
|
|
2674
|
+
if (!named || named.length === 0) return [...TOOLSETS];
|
|
2675
|
+
return TOOLSETS.filter((toolset) => named.includes(toolset));
|
|
2668
2676
|
}
|
|
2669
2677
|
//#endregion
|
|
2670
2678
|
//#region src/config.ts
|
|
@@ -23408,7 +23416,7 @@ function withToolsetNote(result, left) {
|
|
|
23408
23416
|
...answer,
|
|
23409
23417
|
content: [...answer.content, {
|
|
23410
23418
|
type: "text",
|
|
23411
|
-
text: `Not on in this server: ${where}. taiga_whoami says how to turn a toolset on
|
|
23419
|
+
text: `Not on in this server: ${where}. taiga_whoami says how to turn a toolset on.`
|
|
23412
23420
|
}]
|
|
23413
23421
|
};
|
|
23414
23422
|
}
|
|
@@ -23610,7 +23618,7 @@ function registerAllTools(server, client, options = {}) {
|
|
|
23610
23618
|
function registerWhoami(server, client, registered, toolsets, left) {
|
|
23611
23619
|
server.registerTool("taiga_whoami", {
|
|
23612
23620
|
title: "Who am I",
|
|
23613
|
-
description: "See who this API key acts as and what it can do: role, capabilities, its tools split into reads, writes and ask-first writes, and the toolsets: which are on,
|
|
23621
|
+
description: "See who this API key acts as and what it can do: role, capabilities, its tools split into reads, writes and ask-first writes, and the toolsets: which are on, which tools the others hold, and how to turn them on.",
|
|
23614
23622
|
inputSchema: z.object({}),
|
|
23615
23623
|
annotations: READ_ONLY
|
|
23616
23624
|
}, () => runTool(async () => {
|
|
@@ -23635,7 +23643,7 @@ function registerWhoami(server, client, registered, toolsets, left) {
|
|
|
23635
23643
|
for: TOOLSET_PURPOSE[set],
|
|
23636
23644
|
tools: [...left].filter(([, s]) => s === set).map(([n]) => n)
|
|
23637
23645
|
}]).filter(([, entry]) => entry.tools.length > 0)),
|
|
23638
|
-
...left.size > 0 ? { howToTurnOn: "
|
|
23646
|
+
...left.size > 0 ? { howToTurnOn: "Change this key's toolsets in Taiga (Settings, Account, API keys), then restart your AI tool. If TAIGA_TOOLSETS is set in this server's config, it chooses them instead: change or remove it, then restart." } : {}
|
|
23639
23647
|
}
|
|
23640
23648
|
});
|
|
23641
23649
|
}));
|
|
@@ -23722,7 +23730,7 @@ async function main() {
|
|
|
23722
23730
|
process.exit(1);
|
|
23723
23731
|
}
|
|
23724
23732
|
console.error(`Taiga MCP server started (${introspection.capabilities.length} capabilities, role: ${introspection.role})`);
|
|
23725
|
-
const toolsets = activeToolsets(introspection.
|
|
23733
|
+
const toolsets = activeToolsets(introspection.mcpToolsets, config.toolsets);
|
|
23726
23734
|
serveStdio(() => createServer(client, { toolsets }), { onerror: (error) => console.error("Taiga MCP server error:", error) });
|
|
23727
23735
|
}
|
|
23728
23736
|
main().catch((error) => {
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taiga-ai/mcp-server",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.1-dev.543",
|
|
4
4
|
"description": "Taiga for AI coding assistants: read products, policies, initiatives and runs, and operate the line, over MCP",
|
|
5
5
|
"mcpName": "ga.tai/mcp-server",
|
|
6
|
+
"license": "UNLICENSED",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"main": "./dist/index.js",
|
|
8
9
|
"bin": {
|