@taiga-ai/mcp-server 0.26.0-rc.530 → 0.26.1-dev.542
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 +43 -33
- 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
|
|
@@ -2081,11 +2095,12 @@ const MAINTENANCE_IGNORE_REASONS = [
|
|
|
2081
2095
|
* alone is shipped, and `dev` + `optional` (devOptional) is left undecided.
|
|
2082
2096
|
* - pnpm-lock.yaml: `dev` comes from a per-package `dev: true` that lockfile
|
|
2083
2097
|
* v9 no longer writes, so an empty list says nothing; `dev` still means dev.
|
|
2084
|
-
*
|
|
2085
|
-
*
|
|
2086
|
-
*
|
|
2087
|
-
*
|
|
2088
|
-
*
|
|
2098
|
+
* From a v9 lockfile the sweep walks the `snapshots` graph (PRO-2943): a
|
|
2099
|
+
* copy reachable from any workspace's `dependencies` or
|
|
2100
|
+
* `optionalDependencies` gets Taiga's own `prod` and reads runtime; one
|
|
2101
|
+
* reachable only from `devDependencies` gets `dev`. From an older lockfile
|
|
2102
|
+
* only a copy a workspace declares under `dependencies` or
|
|
2103
|
+
* `optionalDependencies` gets `prod`, and the rest stays unknown.
|
|
2089
2104
|
* - poetry.lock: group names with `main` dropped; a non-main, non-optional
|
|
2090
2105
|
* group is not in the runtime install. Poetry 1.x lockfiles carry no groups
|
|
2091
2106
|
* at all, so an empty list says nothing.
|
|
@@ -2544,20 +2559,16 @@ function apiLevelProblem(introspection, apiUrl, required = 4, version = SERVER_V
|
|
|
2544
2559
|
//#endregion
|
|
2545
2560
|
//#region src/tools/toolsets.ts
|
|
2546
2561
|
/**
|
|
2547
|
-
* Toolsets (PRO-2846
|
|
2562
|
+
* Toolsets (PRO-2846, PRO-2838): the tools an AI tool sees, grouped by what the person does.
|
|
2548
2563
|
*
|
|
2549
|
-
*
|
|
2550
|
-
*
|
|
2551
|
-
*
|
|
2552
|
-
*
|
|
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.
|
|
2553
2570
|
*/
|
|
2554
|
-
const TOOLSETS =
|
|
2555
|
-
"core",
|
|
2556
|
-
"operate",
|
|
2557
|
-
"setup",
|
|
2558
|
-
"observe",
|
|
2559
|
-
"documents"
|
|
2560
|
-
];
|
|
2571
|
+
const TOOLSETS = MCP_TOOLSETS;
|
|
2561
2572
|
/** What each toolset is for, as whoami says it. */
|
|
2562
2573
|
const TOOLSET_PURPOSE = {
|
|
2563
2574
|
core: "where products, initiatives, runs, policies and findings stand",
|
|
@@ -2644,13 +2655,6 @@ const TOOLSET_OF = {
|
|
|
2644
2655
|
taiga_retry_knowledge: "documents"
|
|
2645
2656
|
};
|
|
2646
2657
|
/**
|
|
2647
|
-
* The toolsets a key sees when its config names none: a viewer can only read, so it sees every read it may use;
|
|
2648
|
-
* everyone else sees where things stand and the work they move, and opts into setup, observe and documents.
|
|
2649
|
-
*/
|
|
2650
|
-
function defaultToolsets(role) {
|
|
2651
|
-
return role === "viewer" ? TOOLSETS : ["core", "operate"];
|
|
2652
|
-
}
|
|
2653
|
-
/**
|
|
2654
2658
|
* TAIGA_TOOLSETS as written: comma-separated names, or "all"; a name it does not know is said, not ignored, and so
|
|
2655
2659
|
* is a value that names none.
|
|
2656
2660
|
*/
|
|
@@ -2660,10 +2664,15 @@ function parseToolsets(raw) {
|
|
|
2660
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.` };
|
|
2661
2665
|
return { toolsets: names.includes("all") ? TOOLSETS : [...new Set(names)] };
|
|
2662
2666
|
}
|
|
2663
|
-
/**
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
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));
|
|
2667
2676
|
}
|
|
2668
2677
|
//#endregion
|
|
2669
2678
|
//#region src/config.ts
|
|
@@ -3379,6 +3388,7 @@ const PACKAGE_ROW_FIELDS = [
|
|
|
3379
3388
|
"licenses",
|
|
3380
3389
|
"scope",
|
|
3381
3390
|
"relation",
|
|
3391
|
+
"introducedBy",
|
|
3382
3392
|
"sourcePath",
|
|
3383
3393
|
"productRepositoryId",
|
|
3384
3394
|
"detectedAt"
|
|
@@ -3702,7 +3712,7 @@ function registerMaintenanceTools(server, client) {
|
|
|
3702
3712
|
}));
|
|
3703
3713
|
server.registerTool("taiga_list_packages", {
|
|
3704
3714
|
title: "List the package inventory",
|
|
3705
|
-
description: "List every package a product's code uses, with version, license
|
|
3715
|
+
description: "List every package a product's code uses, with version, license, whether it is direct or dev only, and what pulls a transitive one in. The first page summarizes licenses against the allowed list. Filter by license, name or repository. NOT_FOUND where the licenses feature is off.",
|
|
3706
3716
|
inputSchema: z.object({
|
|
3707
3717
|
productId,
|
|
3708
3718
|
license: z.string().min(1).max(MAINTENANCE_LICENSE_FILTER_MAX).optional().describe("Only packages carrying exactly this SPDX string"),
|
|
@@ -23406,7 +23416,7 @@ function withToolsetNote(result, left) {
|
|
|
23406
23416
|
...answer,
|
|
23407
23417
|
content: [...answer.content, {
|
|
23408
23418
|
type: "text",
|
|
23409
|
-
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.`
|
|
23410
23420
|
}]
|
|
23411
23421
|
};
|
|
23412
23422
|
}
|
|
@@ -23608,7 +23618,7 @@ function registerAllTools(server, client, options = {}) {
|
|
|
23608
23618
|
function registerWhoami(server, client, registered, toolsets, left) {
|
|
23609
23619
|
server.registerTool("taiga_whoami", {
|
|
23610
23620
|
title: "Who am I",
|
|
23611
|
-
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.",
|
|
23612
23622
|
inputSchema: z.object({}),
|
|
23613
23623
|
annotations: READ_ONLY
|
|
23614
23624
|
}, () => runTool(async () => {
|
|
@@ -23633,7 +23643,7 @@ function registerWhoami(server, client, registered, toolsets, left) {
|
|
|
23633
23643
|
for: TOOLSET_PURPOSE[set],
|
|
23634
23644
|
tools: [...left].filter(([, s]) => s === set).map(([n]) => n)
|
|
23635
23645
|
}]).filter(([, entry]) => entry.tools.length > 0)),
|
|
23636
|
-
...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." } : {}
|
|
23637
23647
|
}
|
|
23638
23648
|
});
|
|
23639
23649
|
}));
|
|
@@ -23720,7 +23730,7 @@ async function main() {
|
|
|
23720
23730
|
process.exit(1);
|
|
23721
23731
|
}
|
|
23722
23732
|
console.error(`Taiga MCP server started (${introspection.capabilities.length} capabilities, role: ${introspection.role})`);
|
|
23723
|
-
const toolsets = activeToolsets(introspection.
|
|
23733
|
+
const toolsets = activeToolsets(introspection.mcpToolsets, config.toolsets);
|
|
23724
23734
|
serveStdio(() => createServer(client, { toolsets }), { onerror: (error) => console.error("Taiga MCP server error:", error) });
|
|
23725
23735
|
}
|
|
23726
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.542",
|
|
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": {
|