@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.
Files changed (3) hide show
  1. package/README.md +12 -8
  2. package/dist/index.js +35 -27
  3. 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.0`), 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.
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.0
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.0"],
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.0"],
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.0"]
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 | Toolsets to turn on besides the default, comma-separated, or `all`. See [Toolsets](#toolsets). |
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, so an assistant sees the ones for the job rather than all of them.
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
- A key with the viewer role gets every toolset, which for it holds only reads. Every other role gets `core` and `operate`. Set `TAIGA_TOOLSETS` to turn on more, for example `setup` or `setup,observe`, or `all`, then restart the server; it adds to the default, never takes from it. A toolset never adds a tool your key does not allow. `taiga_whoami` lists the toolsets that are on and the tools in the ones that are off.
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 goal, 2026-10-12): the tools an agent sees by default, by what the person does.
2562
+ * Toolsets (PRO-2846, PRO-2838): the tools an AI tool sees, grouped by what the person does.
2549
2563
  *
2550
- * Every review ranked the catalogue's size first, and an owner's key saw all of it. A role decides what a key MAY
2551
- * do (the API enforces it, and tools a key cannot use are never registered); a toolset decides what it SEES by
2552
- * default. A toolset never adds a tool the key's capabilities do not allow. The tool list stays the same for every
2553
- * connection of one server (MCP 2026-07-28), so toolsets are chosen in the server's config, not mid-session.
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
- /** The toolsets a server turns on: the role's default, and any the config adds. A toolset only widens. */
2665
- function activeToolsets(role, added) {
2666
- const on = /* @__PURE__ */ new Set([...defaultToolsets(role), ...added ?? []]);
2667
- return TOOLSETS.filter((toolset) => on.has(toolset));
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 (TAIGA_TOOLSETS).`
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, and which tools the others hold (TAIGA_TOOLSETS turns them 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: "Add them to TAIGA_TOOLSETS in this server's config (comma-separated, or all), then restart the server." } : {}
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.role, config.toolsets);
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.0",
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": {