@kanbodev/mcp 1.0.5 → 1.1.0

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/dist/index.js CHANGED
@@ -15479,13 +15479,13 @@ function startCallbackServer(port, expectedState, timeoutMs = 120000) {
15479
15479
  }
15480
15480
  if (error2) {
15481
15481
  res.writeHead(400, { "Content-Type": "text/html" });
15482
- res.end(errorHtml(decodeURIComponent(error2)));
15482
+ res.end(errorHtml(error2));
15483
15483
  if (!resolved) {
15484
15484
  resolved = true;
15485
15485
  server.close();
15486
15486
  resolve({
15487
15487
  success: false,
15488
- error: decodeURIComponent(error2)
15488
+ error: error2
15489
15489
  });
15490
15490
  }
15491
15491
  return;
@@ -15628,11 +15628,161 @@ var init_config = __esm(() => {
15628
15628
  CONFIG_PATH = path2.join(CONFIG_DIR, "config.json");
15629
15629
  });
15630
15630
 
15631
+ // src/cli/register.ts
15632
+ import * as fs3 from "node:fs";
15633
+ import * as path3 from "node:path";
15634
+ import * as os3 from "node:os";
15635
+ import { execFileSync } from "node:child_process";
15636
+ function getVscodeMcpPath() {
15637
+ const platform = process.platform;
15638
+ if (platform === "darwin") {
15639
+ return path3.join(os3.homedir(), "Library", "Application Support", "Code", "User", "mcp.json");
15640
+ }
15641
+ if (platform === "win32") {
15642
+ return path3.join(process.env.APPDATA || "", "Code", "User", "mcp.json");
15643
+ }
15644
+ return path3.join(os3.homedir(), ".config", "Code", "User", "mcp.json");
15645
+ }
15646
+ function getCursorMcpPath() {
15647
+ return path3.join(os3.homedir(), ".cursor", "mcp.json");
15648
+ }
15649
+ function getClaudeDesktopMcpPath() {
15650
+ const platform = process.platform;
15651
+ if (platform === "darwin") {
15652
+ return path3.join(os3.homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json");
15653
+ }
15654
+ if (platform === "win32") {
15655
+ return path3.join(process.env.APPDATA || "", "Claude", "claude_desktop_config.json");
15656
+ }
15657
+ return path3.join(os3.homedir(), ".config", "Claude", "claude_desktop_config.json");
15658
+ }
15659
+ function registerInConfigFile(configPath, hostName, serversKey = "servers") {
15660
+ try {
15661
+ const parentDir = path3.dirname(configPath);
15662
+ if (!fs3.existsSync(parentDir)) {
15663
+ return { host: hostName, success: false, message: `${hostName} not detected` };
15664
+ }
15665
+ let config3 = {};
15666
+ if (fs3.existsSync(configPath)) {
15667
+ const content = fs3.readFileSync(configPath, "utf-8");
15668
+ config3 = JSON.parse(content);
15669
+ }
15670
+ const servers = config3[serversKey] || {};
15671
+ if (servers[SERVER_NAME]) {
15672
+ return {
15673
+ host: hostName,
15674
+ success: true,
15675
+ alreadyRegistered: true,
15676
+ message: `Already registered in ${hostName}`
15677
+ };
15678
+ }
15679
+ servers[SERVER_NAME] = MCP_SERVER_ENTRY;
15680
+ config3[serversKey] = servers;
15681
+ fs3.writeFileSync(configPath, JSON.stringify(config3, null, 2) + `
15682
+ `, "utf-8");
15683
+ return {
15684
+ host: hostName,
15685
+ success: true,
15686
+ message: `Registered in ${hostName}`
15687
+ };
15688
+ } catch (error2) {
15689
+ const msg = error2 instanceof Error ? error2.message : "Unknown error";
15690
+ return { host: hostName, success: false, message: `Failed to register in ${hostName}: ${msg}` };
15691
+ }
15692
+ }
15693
+ function isClaudeCliAvailable() {
15694
+ try {
15695
+ execFileSync("claude", ["--version"], { stdio: "pipe" });
15696
+ return true;
15697
+ } catch {
15698
+ return false;
15699
+ }
15700
+ }
15701
+ function registerWithClaudeCli() {
15702
+ const hostName = "Claude Code CLI";
15703
+ try {
15704
+ if (!isClaudeCliAvailable()) {
15705
+ return { host: hostName, success: false, message: "Claude Code CLI not detected" };
15706
+ }
15707
+ execFileSync("claude", ["mcp", "add", SERVER_NAME, "--", "npx", "@kanbodev/mcp"], {
15708
+ stdio: "pipe"
15709
+ });
15710
+ return { host: hostName, success: true, message: "Registered via Claude Code CLI" };
15711
+ } catch (error2) {
15712
+ const msg = error2 instanceof Error ? error2.message : "Unknown error";
15713
+ if (msg.includes("already exists")) {
15714
+ return { host: hostName, success: true, alreadyRegistered: true, message: "Already registered in Claude Code CLI" };
15715
+ }
15716
+ return { host: hostName, success: false, message: `Failed to register via Claude Code CLI: ${msg}` };
15717
+ }
15718
+ }
15719
+ function registerMcpServer() {
15720
+ const results = [];
15721
+ results.push(registerInConfigFile(getVscodeMcpPath(), "VS Code"));
15722
+ results.push(registerInConfigFile(getCursorMcpPath(), "Cursor"));
15723
+ results.push(registerInConfigFile(getClaudeDesktopMcpPath(), "Claude Desktop", "mcpServers"));
15724
+ results.push(registerWithClaudeCli());
15725
+ return results;
15726
+ }
15727
+ function printRegistrationResults(results) {
15728
+ const registered = results.filter((r) => r.success && !r.alreadyRegistered);
15729
+ const alreadyRegistered = results.filter((r) => r.success && r.alreadyRegistered);
15730
+ const anySuccess = results.some((r) => r.success);
15731
+ if (registered.length > 0) {
15732
+ console.log(" MCP server registered with:");
15733
+ for (const r of registered) {
15734
+ console.log(` ✓ ${r.message}`);
15735
+ }
15736
+ }
15737
+ if (alreadyRegistered.length > 0) {
15738
+ for (const r of alreadyRegistered) {
15739
+ console.log(` · ${r.message}`);
15740
+ }
15741
+ }
15742
+ if (registered.length > 0) {
15743
+ console.log("");
15744
+ console.log(" Reload your editor to activate the Kanbo MCP server.");
15745
+ }
15746
+ if (!anySuccess) {
15747
+ printManualInstructions();
15748
+ }
15749
+ return anySuccess;
15750
+ }
15751
+ function printManualInstructions() {
15752
+ console.log(" To register the MCP server manually, add this to your mcp.json:");
15753
+ console.log("");
15754
+ console.log(" {");
15755
+ console.log(' "servers": {');
15756
+ console.log(' "kanbodev": {');
15757
+ console.log(' "type": "stdio",');
15758
+ console.log(' "command": "npx",');
15759
+ console.log(' "args": ["@kanbodev/mcp"]');
15760
+ console.log(" }");
15761
+ console.log(" }");
15762
+ console.log(" }");
15763
+ console.log("");
15764
+ console.log(" Config file locations:");
15765
+ console.log(` VS Code: ${getVscodeMcpPath()}`);
15766
+ console.log(` Cursor: ${getCursorMcpPath()}`);
15767
+ console.log(` Claude Desktop: ${getClaudeDesktopMcpPath()}`);
15768
+ console.log("");
15769
+ console.log(" Or register via Claude Code CLI:");
15770
+ console.log(" claude mcp add kanbodev -- npx @kanbodev/mcp");
15771
+ }
15772
+ var SERVER_NAME = "kanbodev", MCP_SERVER_ENTRY;
15773
+ var init_register = __esm(() => {
15774
+ MCP_SERVER_ENTRY = {
15775
+ type: "stdio",
15776
+ command: "npx",
15777
+ args: ["@kanbodev/mcp"]
15778
+ };
15779
+ });
15780
+
15631
15781
  // node_modules/is-docker/index.js
15632
- import fs3 from "node:fs";
15782
+ import fs4 from "node:fs";
15633
15783
  function hasDockerEnv() {
15634
15784
  try {
15635
- fs3.statSync("/.dockerenv");
15785
+ fs4.statSync("/.dockerenv");
15636
15786
  return true;
15637
15787
  } catch {
15638
15788
  return false;
@@ -15640,7 +15790,7 @@ function hasDockerEnv() {
15640
15790
  }
15641
15791
  function hasDockerCGroup() {
15642
15792
  try {
15643
- return fs3.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
15793
+ return fs4.readFileSync("/proc/self/cgroup", "utf8").includes("docker");
15644
15794
  } catch {
15645
15795
  return false;
15646
15796
  }
@@ -15655,7 +15805,7 @@ var isDockerCached;
15655
15805
  var init_is_docker = () => {};
15656
15806
 
15657
15807
  // node_modules/is-inside-container/index.js
15658
- import fs4 from "node:fs";
15808
+ import fs5 from "node:fs";
15659
15809
  function isInsideContainer() {
15660
15810
  if (cachedResult === undefined) {
15661
15811
  cachedResult = hasContainerEnv() || isDocker();
@@ -15664,7 +15814,7 @@ function isInsideContainer() {
15664
15814
  }
15665
15815
  var cachedResult, hasContainerEnv = () => {
15666
15816
  try {
15667
- fs4.statSync("/run/.containerenv");
15817
+ fs5.statSync("/run/.containerenv");
15668
15818
  return true;
15669
15819
  } catch {
15670
15820
  return false;
@@ -15676,20 +15826,20 @@ var init_is_inside_container = __esm(() => {
15676
15826
 
15677
15827
  // node_modules/is-wsl/index.js
15678
15828
  import process4 from "node:process";
15679
- import os3 from "node:os";
15680
- import fs5 from "node:fs";
15829
+ import os4 from "node:os";
15830
+ import fs6 from "node:fs";
15681
15831
  var isWsl = () => {
15682
15832
  if (process4.platform !== "linux") {
15683
15833
  return false;
15684
15834
  }
15685
- if (os3.release().toLowerCase().includes("microsoft")) {
15835
+ if (os4.release().toLowerCase().includes("microsoft")) {
15686
15836
  if (isInsideContainer()) {
15687
15837
  return false;
15688
15838
  }
15689
15839
  return true;
15690
15840
  }
15691
15841
  try {
15692
- return fs5.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft") ? !isInsideContainer() : false;
15842
+ return fs6.readFileSync("/proc/version", "utf8").toLowerCase().includes("microsoft") ? !isInsideContainer() : false;
15693
15843
  } catch {
15694
15844
  return false;
15695
15845
  }
@@ -15749,7 +15899,7 @@ function parseMountPointFromConfig(content) {
15749
15899
  // node_modules/wsl-utils/index.js
15750
15900
  import { promisify as promisify2 } from "node:util";
15751
15901
  import childProcess2 from "node:child_process";
15752
- import fs6, { constants as fsConstants } from "node:fs/promises";
15902
+ import fs7, { constants as fsConstants } from "node:fs/promises";
15753
15903
  var execFile2, wslDrivesMountPoint, powerShellPathFromWsl = async () => {
15754
15904
  const mountPoint = await wslDrivesMountPoint();
15755
15905
  return `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;
@@ -15757,7 +15907,7 @@ var execFile2, wslDrivesMountPoint, powerShellPathFromWsl = async () => {
15757
15907
  canAccessPowerShellPromise ??= (async () => {
15758
15908
  try {
15759
15909
  const psPath = await powerShellPath2();
15760
- await fs6.access(psPath, fsConstants.X_OK);
15910
+ await fs7.access(psPath, fsConstants.X_OK);
15761
15911
  return true;
15762
15912
  } catch {
15763
15913
  return false;
@@ -15769,15 +15919,15 @@ var execFile2, wslDrivesMountPoint, powerShellPathFromWsl = async () => {
15769
15919
  const command = String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`;
15770
15920
  const { stdout } = await executePowerShell(command, { powerShellPath: psPath });
15771
15921
  return stdout.trim();
15772
- }, convertWslPathToWindows = async (path3) => {
15773
- if (/^[a-z]+:\/\//i.test(path3)) {
15774
- return path3;
15922
+ }, convertWslPathToWindows = async (path4) => {
15923
+ if (/^[a-z]+:\/\//i.test(path4)) {
15924
+ return path4;
15775
15925
  }
15776
15926
  try {
15777
- const { stdout } = await execFile2("wslpath", ["-aw", path3], { encoding: "utf8" });
15927
+ const { stdout } = await execFile2("wslpath", ["-aw", path4], { encoding: "utf8" });
15778
15928
  return stdout.trim();
15779
15929
  } catch {
15780
- return path3;
15930
+ return path4;
15781
15931
  }
15782
15932
  };
15783
15933
  var init_wsl_utils = __esm(() => {
@@ -15795,13 +15945,13 @@ var init_wsl_utils = __esm(() => {
15795
15945
  const configFilePath = "/etc/wsl.conf";
15796
15946
  let isConfigFileExists = false;
15797
15947
  try {
15798
- await fs6.access(configFilePath, fsConstants.F_OK);
15948
+ await fs7.access(configFilePath, fsConstants.F_OK);
15799
15949
  isConfigFileExists = true;
15800
15950
  } catch {}
15801
15951
  if (!isConfigFileExists) {
15802
15952
  return defaultMountPoint;
15803
15953
  }
15804
- const configContent = await fs6.readFile(configFilePath, { encoding: "utf8" });
15954
+ const configContent = await fs7.readFile(configFilePath, { encoding: "utf8" });
15805
15955
  const parsedMountPoint = parseMountPointFromConfig(configContent);
15806
15956
  if (parsedMountPoint === undefined) {
15807
15957
  return defaultMountPoint;
@@ -15856,7 +16006,7 @@ var init_default_browser_id = __esm(() => {
15856
16006
  // node_modules/run-applescript/index.js
15857
16007
  import process7 from "node:process";
15858
16008
  import { promisify as promisify4 } from "node:util";
15859
- import { execFile as execFile4, execFileSync } from "node:child_process";
16009
+ import { execFile as execFile4, execFileSync as execFileSync2 } from "node:child_process";
15860
16010
  async function runAppleScript(script, { humanReadableOutput = true, signal } = {}) {
15861
16011
  if (process7.platform !== "darwin") {
15862
16012
  throw new Error("macOS only");
@@ -15976,10 +16126,10 @@ __export(exports_open, {
15976
16126
  apps: () => apps
15977
16127
  });
15978
16128
  import process10 from "node:process";
15979
- import path3 from "node:path";
16129
+ import path4 from "node:path";
15980
16130
  import { fileURLToPath } from "node:url";
15981
16131
  import childProcess3 from "node:child_process";
15982
- import fs7, { constants as fsConstants2 } from "node:fs/promises";
16132
+ import fs8, { constants as fsConstants2 } from "node:fs/promises";
15983
16133
  function detectArchBinary(binary) {
15984
16134
  if (typeof binary === "string" || Array.isArray(binary)) {
15985
16135
  return binary;
@@ -16143,7 +16293,7 @@ var fallbackAttemptSymbol, __dirname2, localXdgOpenPath, platform, arch, tryEach
16143
16293
  const isBundled = !__dirname2 || __dirname2 === "/";
16144
16294
  let exeLocalXdgOpen = false;
16145
16295
  try {
16146
- await fs7.access(localXdgOpenPath, fsConstants2.X_OK);
16296
+ await fs8.access(localXdgOpenPath, fsConstants2.X_OK);
16147
16297
  exeLocalXdgOpen = true;
16148
16298
  } catch {}
16149
16299
  const useSystemXdgOpen = process10.versions.electron ?? (platform === "android" || isBundled || !exeLocalXdgOpen);
@@ -16231,8 +16381,8 @@ var init_open = __esm(() => {
16231
16381
  init_is_inside_container();
16232
16382
  init_is_in_ssh();
16233
16383
  fallbackAttemptSymbol = Symbol("fallbackAttempt");
16234
- __dirname2 = import.meta.url ? path3.dirname(fileURLToPath(import.meta.url)) : "";
16235
- localXdgOpenPath = path3.join(__dirname2, "xdg-open");
16384
+ __dirname2 = import.meta.url ? path4.dirname(fileURLToPath(import.meta.url)) : "";
16385
+ localXdgOpenPath = path4.join(__dirname2, "xdg-open");
16236
16386
  ({ platform, arch } = process10);
16237
16387
  apps = {
16238
16388
  browser: "browser",
@@ -16284,6 +16434,7 @@ __export(exports_login, {
16284
16434
  login: () => login
16285
16435
  });
16286
16436
  import * as crypto2 from "node:crypto";
16437
+ import { createRequire as createRequire2 } from "node:module";
16287
16438
  async function login() {
16288
16439
  console.log(`
16289
16440
  Kanbo CLI Login
@@ -16328,7 +16479,15 @@ async function login() {
16328
16479
  console.log(" Could not open browser automatically.");
16329
16480
  console.log(" Please copy the URL above and paste it in your browser.");
16330
16481
  }
16331
- const result = await startCallbackServer(port, state);
16482
+ let result;
16483
+ try {
16484
+ result = await startCallbackServer(port, state);
16485
+ } catch (error2) {
16486
+ console.log("");
16487
+ console.error(` Error: Failed to start callback server.`);
16488
+ console.error(` ${error2 instanceof Error ? error2.message : "Unknown error"}`);
16489
+ process.exit(1);
16490
+ }
16332
16491
  if (!result.success) {
16333
16492
  console.log("");
16334
16493
  console.error(` Authentication failed: ${result.error}`);
@@ -16357,17 +16516,20 @@ async function login() {
16357
16516
  console.log("");
16358
16517
  console.log(` Config saved to: ${getConfigPath()}`);
16359
16518
  console.log("");
16360
- console.log(" You can now use Kanbo MCP server. Run:");
16361
- console.log(" kanbo-mcp");
16519
+ const registrationResults = registerMcpServer();
16520
+ printRegistrationResults(registrationResults);
16362
16521
  console.log("");
16363
16522
  }
16364
- var KANBO_WEB_URL, DEFAULT_API_URL, PORT_RANGE, CLI_VERSION = "1.0.0";
16523
+ var KANBO_WEB_URL, DEFAULT_API_URL, PORT_RANGE, require2, CLI_VERSION;
16365
16524
  var init_login = __esm(() => {
16366
16525
  init_callback_server();
16367
16526
  init_config();
16527
+ init_register();
16368
16528
  KANBO_WEB_URL = process.env.KANBO_WEB_URL || "https://kanbo.dev";
16369
16529
  DEFAULT_API_URL = process.env.KANBO_API_URL || "https://api.kanbo.dev";
16370
16530
  PORT_RANGE = { start: 9876, end: 9899 };
16531
+ require2 = createRequire2(import.meta.url);
16532
+ CLI_VERSION = require2("../../package.json").version;
16371
16533
  });
16372
16534
 
16373
16535
  // src/cli/logout.ts
@@ -16450,6 +16612,37 @@ var init_whoami = __esm(() => {
16450
16612
  init_config();
16451
16613
  });
16452
16614
 
16615
+ // src/cli/install.ts
16616
+ var exports_install = {};
16617
+ __export(exports_install, {
16618
+ install: () => install
16619
+ });
16620
+ async function install() {
16621
+ console.log(`
16622
+ Kanbo MCP — Install
16623
+ `);
16624
+ const config3 = loadConfig();
16625
+ if (!config3) {
16626
+ console.log(" You are not logged in. Please authenticate first:");
16627
+ console.log(" npx @kanbodev/mcp login");
16628
+ console.log("");
16629
+ console.log(" Or register the MCP server manually:");
16630
+ console.log("");
16631
+ printManualInstructions();
16632
+ console.log("");
16633
+ return;
16634
+ }
16635
+ console.log(` Logged in as ${config3.userEmail} (${config3.orgName})`);
16636
+ console.log("");
16637
+ const results = registerMcpServer();
16638
+ printRegistrationResults(results);
16639
+ console.log("");
16640
+ }
16641
+ var init_install = __esm(() => {
16642
+ init_config();
16643
+ init_register();
16644
+ });
16645
+
16453
16646
  // src/config/constants.ts
16454
16647
  import * as fs from "node:fs";
16455
16648
  import * as path from "node:path";
@@ -24821,18 +25014,18 @@ function formatToolResult(result) {
24821
25014
  var listProjectsTool = {
24822
25015
  tool: {
24823
25016
  name: "list_projects",
24824
- description: "List all projects the user has access to in the current organization",
25017
+ description: "List all projects in the current organization. Returns project IDs needed by most other tools. Call set_organization first if you have multiple orgs.",
24825
25018
  inputSchema: {
24826
25019
  type: "object",
24827
25020
  properties: {
24828
25021
  includeArchived: {
24829
25022
  type: "boolean",
24830
- description: "Include archived projects (default: false)",
25023
+ description: "Include archived projects in results (default: false)",
24831
25024
  default: false
24832
25025
  },
24833
25026
  search: {
24834
25027
  type: "string",
24835
- description: "Filter by project name"
25028
+ description: "Filter by project name substring (optional)"
24836
25029
  }
24837
25030
  }
24838
25031
  }
@@ -24853,13 +25046,13 @@ var listProjectsTool = {
24853
25046
  var getProjectTool = {
24854
25047
  tool: {
24855
25048
  name: "get_project",
24856
- description: "Get detailed information about a specific project including settings and workflow",
25049
+ description: "Get detailed information about a specific project including settings, workflow configuration, and metadata. Use list_projects to find the project ID.",
24857
25050
  inputSchema: {
24858
25051
  type: "object",
24859
25052
  properties: {
24860
25053
  projectId: {
24861
25054
  type: "string",
24862
- description: "Project ID (format: prj_xxxxx)"
25055
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
24863
25056
  }
24864
25057
  },
24865
25058
  required: ["projectId"]
@@ -24878,13 +25071,13 @@ var getProjectTool = {
24878
25071
  var getProjectBySlugTool = {
24879
25072
  tool: {
24880
25073
  name: "get_project_by_slug",
24881
- description: 'Get a project by its URL slug (e.g., "my-project")',
25074
+ description: 'Get a project by its URL slug (e.g., "my-project"). Useful when you know the project name but not its ID.',
24882
25075
  inputSchema: {
24883
25076
  type: "object",
24884
25077
  properties: {
24885
25078
  slug: {
24886
25079
  type: "string",
24887
- description: "Project slug from the URL"
25080
+ description: 'Project slug from the URL (lowercase-kebab-case, e.g., "my-project")'
24888
25081
  }
24889
25082
  },
24890
25083
  required: ["slug"]
@@ -24903,25 +25096,25 @@ var getProjectBySlugTool = {
24903
25096
  var createProjectTool = {
24904
25097
  tool: {
24905
25098
  name: "create_project",
24906
- description: "Create a new project in the current organization. Requires an initial (3-6 uppercase letters) used as ticket key prefix.",
25099
+ description: "Create a new project in the current organization. Requires an initial (3-6 uppercase letters) used as ticket key prefix (e.g., tickets become PROJ-1, PROJ-2). The initial cannot be changed after creation.",
24907
25100
  inputSchema: {
24908
25101
  type: "object",
24909
25102
  properties: {
24910
25103
  name: {
24911
25104
  type: "string",
24912
- description: "Project name"
25105
+ description: "Project name (1-100 chars)"
24913
25106
  },
24914
25107
  initial: {
24915
25108
  type: "string",
24916
- description: 'Project initial (3-6 uppercase letters, e.g., "PROJ"). Used as ticket key prefix and cannot be changed later.'
25109
+ description: 'Project initial (3-6 uppercase letters, e.g., "PROJ"). Used as ticket key prefix (PROJ-1, PROJ-2). Cannot be changed later.'
24917
25110
  },
24918
25111
  description: {
24919
25112
  type: "string",
24920
- description: "Project description (optional)"
25113
+ description: "Project description (optional, plain text)"
24921
25114
  },
24922
25115
  color: {
24923
25116
  type: "string",
24924
- description: 'Project color as hex (e.g., "#FF5733", optional)'
25117
+ description: 'Project theme color as hex (e.g., "#FF5733", optional)'
24925
25118
  }
24926
25119
  },
24927
25120
  required: ["name", "initial"]
@@ -24945,25 +25138,25 @@ var createProjectTool = {
24945
25138
  var updateProjectTool = {
24946
25139
  tool: {
24947
25140
  name: "update_project",
24948
- description: "Update project details (name, description, color). Requires settings access.",
25141
+ description: "Update project details. Only pass fields you want to change — omitted fields are not modified. Requires project admin or owner role.",
24949
25142
  inputSchema: {
24950
25143
  type: "object",
24951
25144
  properties: {
24952
25145
  projectId: {
24953
25146
  type: "string",
24954
- description: "Project ID"
25147
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
24955
25148
  },
24956
25149
  name: {
24957
25150
  type: "string",
24958
- description: "New project name"
25151
+ description: "New project name (1-100 chars)"
24959
25152
  },
24960
25153
  description: {
24961
25154
  type: "string",
24962
- description: "New project description"
25155
+ description: "New project description (plain text)"
24963
25156
  },
24964
25157
  color: {
24965
25158
  type: "string",
24966
- description: 'New project color as hex (e.g., "#FF5733")'
25159
+ description: 'New project theme color as hex (e.g., "#FF5733")'
24967
25160
  }
24968
25161
  },
24969
25162
  required: ["projectId"]
@@ -24989,13 +25182,13 @@ var updateProjectTool = {
24989
25182
  var deleteProjectTool = {
24990
25183
  tool: {
24991
25184
  name: "delete_project",
24992
- description: "Soft delete a project (can be restored). Requires delete access.",
25185
+ description: "Soft-delete a project. The project can be restored later. All tickets and data are preserved. Requires project owner role.",
24993
25186
  inputSchema: {
24994
25187
  type: "object",
24995
25188
  properties: {
24996
25189
  projectId: {
24997
25190
  type: "string",
24998
- description: "Project ID to delete"
25191
+ description: "Project ID to delete (format: prj_xxxxx)"
24999
25192
  }
25000
25193
  },
25001
25194
  required: ["projectId"]
@@ -25014,13 +25207,13 @@ var deleteProjectTool = {
25014
25207
  var archiveProjectTool = {
25015
25208
  tool: {
25016
25209
  name: "archive_project",
25017
- description: "Archive a project. Archived projects are hidden from lists but can be unarchived.",
25210
+ description: "Archive a project. Archived projects are hidden from list_projects (unless includeArchived is true) but can be restored with unarchive_project.",
25018
25211
  inputSchema: {
25019
25212
  type: "object",
25020
25213
  properties: {
25021
25214
  projectId: {
25022
25215
  type: "string",
25023
- description: "Project ID to archive"
25216
+ description: "Project ID to archive (format: prj_xxxxx)"
25024
25217
  }
25025
25218
  },
25026
25219
  required: ["projectId"]
@@ -25039,13 +25232,13 @@ var archiveProjectTool = {
25039
25232
  var unarchiveProjectTool = {
25040
25233
  tool: {
25041
25234
  name: "unarchive_project",
25042
- description: "Unarchive a previously archived project.",
25235
+ description: "Restore a previously archived project. The project will reappear in list_projects results.",
25043
25236
  inputSchema: {
25044
25237
  type: "object",
25045
25238
  properties: {
25046
25239
  projectId: {
25047
25240
  type: "string",
25048
- description: "Project ID to unarchive"
25241
+ description: "Project ID to unarchive (format: prj_xxxxx)"
25049
25242
  }
25050
25243
  },
25051
25244
  required: ["projectId"]
@@ -25064,7 +25257,7 @@ var unarchiveProjectTool = {
25064
25257
  var getProjectSummariesTool = {
25065
25258
  tool: {
25066
25259
  name: "get_project_summaries",
25067
- description: "Get all projects with summary statistics (ticket counts, member count) in a single efficient call",
25260
+ description: "Get all projects with summary statistics (ticket counts by status, member count) in a single efficient call. Lighter than calling get_project_stats for each project individually.",
25068
25261
  inputSchema: {
25069
25262
  type: "object",
25070
25263
  properties: {}
@@ -25083,13 +25276,13 @@ var getProjectSummariesTool = {
25083
25276
  var getProjectStatsTool = {
25084
25277
  tool: {
25085
25278
  name: "get_project_stats",
25086
- description: "Get detailed project statistics: ticket counts by status, completion rates, and member activity",
25279
+ description: "Get detailed project statistics: ticket counts by status, completion rates, and member activity. For cross-project overview, use get_project_summaries instead.",
25087
25280
  inputSchema: {
25088
25281
  type: "object",
25089
25282
  properties: {
25090
25283
  projectId: {
25091
25284
  type: "string",
25092
- description: "Project ID (format: prj_xxxxx)"
25285
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
25093
25286
  }
25094
25287
  },
25095
25288
  required: ["projectId"]
@@ -25108,13 +25301,13 @@ var getProjectStatsTool = {
25108
25301
  var getProjectMembersTool = {
25109
25302
  tool: {
25110
25303
  name: "get_project_members",
25111
- description: "List all members of a project with their roles. Useful for finding who can be assigned tickets.",
25304
+ description: "List all members of a project with their roles. Returns user IDs needed for assigneeId in create_ticket. Use get_available_project_members to find org members not yet in the project.",
25112
25305
  inputSchema: {
25113
25306
  type: "object",
25114
25307
  properties: {
25115
25308
  projectId: {
25116
25309
  type: "string",
25117
- description: "Project ID (format: prj_xxxxx)"
25310
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
25118
25311
  }
25119
25312
  },
25120
25313
  required: ["projectId"]
@@ -25148,7 +25341,7 @@ var projectTools = [
25148
25341
  var listTicketsTool = {
25149
25342
  tool: {
25150
25343
  name: "list_tickets",
25151
- description: "List tickets in a project with optional filters for status, assignee, priority, location, and tags",
25344
+ description: "List tickets in a project with optional filters. Returns full ticket data. For lightweight search (id, number, title only), use quick_search_tickets instead. Combine filters for targeted queries.",
25152
25345
  inputSchema: {
25153
25346
  type: "object",
25154
25347
  properties: {
@@ -25213,13 +25406,13 @@ var listTicketsTool = {
25213
25406
  var getTicketTool = {
25214
25407
  tool: {
25215
25408
  name: "get_ticket",
25216
- description: "Get detailed information about a specific ticket including status, assignee, tags, and description",
25409
+ description: "Get full details of a ticket: title, description, status, assignee, priority, size, type, acceptance criteria, and metadata. Use before update_ticket to get the current version for optimistic locking.",
25217
25410
  inputSchema: {
25218
25411
  type: "object",
25219
25412
  properties: {
25220
25413
  projectId: {
25221
25414
  type: "string",
25222
- description: "Project ID"
25415
+ description: "Project ID (format: prj_xxxxx)"
25223
25416
  },
25224
25417
  ticketId: {
25225
25418
  type: "string",
@@ -25242,7 +25435,7 @@ var getTicketTool = {
25242
25435
  var getTicketByKeyTool = {
25243
25436
  tool: {
25244
25437
  name: "get_ticket_by_key",
25245
- description: 'Get a ticket by its human-readable key (e.g., "PROJ-123"). This is how users typically refer to tickets.',
25438
+ description: 'Look up a ticket by its human-readable key (e.g., "PROJ-123"). This is how users typically reference tickets in conversation. Org context must be set or pass orgSlug.',
25246
25439
  inputSchema: {
25247
25440
  type: "object",
25248
25441
  properties: {
@@ -25282,37 +25475,37 @@ var getTicketByKeyTool = {
25282
25475
  var createTicketTool = {
25283
25476
  tool: {
25284
25477
  name: "create_ticket",
25285
- description: "Create a new ticket in a project. Returns the created ticket with its generated key.",
25478
+ description: "Create a new ticket in a project. For high-quality tickets, always include: description (structured markdown with ## headings), acceptanceCriteria (Given/When/Then JSON), and typeSlug. After creation, call set_ticket_tags to add tags. Call find_similar_tickets first to check for duplicates. Use list_statuses, list_priorities, list_sizes to get required IDs.",
25286
25479
  inputSchema: {
25287
25480
  type: "object",
25288
25481
  properties: {
25289
25482
  projectId: {
25290
25483
  type: "string",
25291
- description: "Project to create ticket in"
25484
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
25292
25485
  },
25293
25486
  title: {
25294
25487
  type: "string",
25295
- description: `Ticket title (${LIMITS.TITLE_MIN}-${LIMITS.TITLE_MAX} characters)`
25488
+ description: `Ticket title (${LIMITS.TITLE_MIN}-${LIMITS.TITLE_MAX} chars). Be concise and action-oriented. Start with a verb for tasks (e.g., "Implement Google OAuth login flow").`
25296
25489
  },
25297
25490
  description: {
25298
25491
  type: "string",
25299
- description: "Ticket description (optional, supports markdown)"
25492
+ description: `Ticket description in markdown (max ${LIMITS.DESCRIPTION_MAX} chars). Structure with ## headings: "## Requirements" (bullet points), "## Technical Notes" (implementation details, APIs, constraints). Use **bold** for key terms, \`code\` for identifiers, bullet lists for readability. Start with a user story: "As a [role], I want [goal], so that [benefit]."`
25300
25493
  },
25301
25494
  statusId: {
25302
25495
  type: "string",
25303
- description: "Initial status ID (use list_statuses to get available statuses)"
25496
+ description: "Initial status ID (format: sts_xxxxx). Use list_statuses to get valid IDs. Typically use the first/leftmost status for new tickets."
25304
25497
  },
25305
25498
  assigneeId: {
25306
25499
  type: "string",
25307
- description: "Assign to user ID (optional, use get_project_members to find users)"
25500
+ description: "User ID to assign (optional). Use get_project_members to find valid user IDs."
25308
25501
  },
25309
25502
  priorityId: {
25310
25503
  type: "string",
25311
- description: "Priority entity ID (use list_priorities to get available priorities)"
25504
+ description: "Priority ID (required, format: pri_xxxxx). Use list_priorities to get valid IDs for this project."
25312
25505
  },
25313
25506
  sizeId: {
25314
25507
  type: "string",
25315
- description: "Size entity ID (use list_sizes to get available sizes)"
25508
+ description: "Size/effort ID (required, format: siz_xxxxx). Use list_sizes to get valid IDs for this project."
25316
25509
  },
25317
25510
  priority: {
25318
25511
  type: "string",
@@ -25327,28 +25520,28 @@ var createTicketTool = {
25327
25520
  location: {
25328
25521
  type: "string",
25329
25522
  enum: ["board", "backlog"],
25330
- description: "Where to create: board (active) or backlog (later)",
25523
+ description: 'Where to create: "board" (active, visible on board columns) or "backlog" (for later). Default: board.',
25331
25524
  default: "board"
25332
25525
  },
25333
25526
  dueDate: {
25334
25527
  type: "string",
25335
- description: "Due date in ISO format (optional)"
25528
+ description: 'Due date in ISO 8601 format (e.g., "2025-03-15T00:00:00.000Z"). Optional.'
25336
25529
  },
25337
25530
  releaseId: {
25338
25531
  type: "string",
25339
- description: "Assign to release ID (optional)"
25532
+ description: "Assign to a release at creation (format: rel_xxxxx). Use list_releases or get_release_dropdown to find IDs. Optional."
25340
25533
  },
25341
25534
  typeSlug: {
25342
25535
  type: "string",
25343
- description: "Ticket type slug: bug, feature, task, etc. (optional, uses project default)"
25536
+ description: 'Ticket type slug: "bug", "feature", "task", etc. Use list_ticket_types to see available types. Always set this for proper categorization.'
25344
25537
  },
25345
25538
  acceptanceCriteria: {
25346
25539
  type: "string",
25347
- description: "Acceptance criteria as JSON array: [{id, text, isChecked}] (optional)"
25540
+ description: `Acceptance criteria as JSON string of array (max ${LIMITS.ACCEPTANCE_CRITERIA_MAX} chars). Format: [{"id":"ac-1","text":"Given a user on X page, When they do Y, Then Z happens","isChecked":false}]. Use Given/When/Then format. Include 3-8 criteria. Use unique IDs (ac-1, ac-2). Set isChecked to false for new tickets.`
25348
25541
  },
25349
25542
  parentId: {
25350
25543
  type: "string",
25351
- description: "Parent ticket ID for creating subtasks (optional)"
25544
+ description: "Parent ticket ID for creating subtasks (format: tkt_xxxxx). The parent must be in the same project. Optional."
25352
25545
  }
25353
25546
  },
25354
25547
  required: ["projectId", "title", "statusId", "priorityId", "sizeId"]
@@ -25382,37 +25575,37 @@ var createTicketTool = {
25382
25575
  var updateTicketTool = {
25383
25576
  tool: {
25384
25577
  name: "update_ticket",
25385
- description: "Update ticket fields. Only provided fields are updated.",
25578
+ description: "Update one or more ticket fields. Only provided fields are changed; omitted fields stay untouched. To clear a nullable field, pass null explicitly. For status changes, use move_ticket instead. Consider updating tags with set_ticket_tags if needed.",
25386
25579
  inputSchema: {
25387
25580
  type: "object",
25388
25581
  properties: {
25389
25582
  projectId: {
25390
25583
  type: "string",
25391
- description: "Project ID"
25584
+ description: "Project ID (format: prj_xxxxx)."
25392
25585
  },
25393
25586
  ticketId: {
25394
25587
  type: "string",
25395
- description: "Ticket ID to update"
25588
+ description: "Ticket ID to update (format: tkt_xxxxx)."
25396
25589
  },
25397
25590
  title: {
25398
25591
  type: "string",
25399
- description: "New title"
25592
+ description: `New title (${LIMITS.TITLE_MIN}-${LIMITS.TITLE_MAX} chars). Concise and action-oriented.`
25400
25593
  },
25401
25594
  description: {
25402
25595
  type: "string",
25403
- description: "New description (supports markdown)"
25596
+ description: `New description in markdown (max ${LIMITS.DESCRIPTION_MAX} chars). Structure with ## headings: Requirements, Technical Notes. Use **bold**, \`code\`, bullet lists.`
25404
25597
  },
25405
25598
  assigneeId: {
25406
25599
  type: ["string", "null"],
25407
- description: "User ID to assign, or null to unassign"
25600
+ description: "User ID to assign, or null to unassign. Use get_project_members to find IDs."
25408
25601
  },
25409
25602
  priorityId: {
25410
25603
  type: ["string", "null"],
25411
- description: "Priority entity ID (use list_priorities), or null to clear"
25604
+ description: "Priority ID (use list_priorities), or null to clear."
25412
25605
  },
25413
25606
  sizeId: {
25414
25607
  type: ["string", "null"],
25415
- description: "Size entity ID (use list_sizes), or null to clear"
25608
+ description: "Size ID (use list_sizes), or null to clear."
25416
25609
  },
25417
25610
  priority: {
25418
25611
  type: "string",
@@ -25426,27 +25619,27 @@ var updateTicketTool = {
25426
25619
  },
25427
25620
  dueDate: {
25428
25621
  type: ["string", "null"],
25429
- description: "New due date (ISO format), or null to clear"
25622
+ description: 'Due date in ISO 8601 format (e.g., "2025-03-15T00:00:00.000Z"), or null to clear.'
25430
25623
  },
25431
25624
  releaseId: {
25432
25625
  type: ["string", "null"],
25433
- description: "Release ID, or null to remove from release"
25626
+ description: "Release ID (format: rel_xxxxx), or null to remove from release."
25434
25627
  },
25435
25628
  typeSlug: {
25436
25629
  type: ["string", "null"],
25437
- description: "Ticket type slug, or null to remove type"
25630
+ description: 'Ticket type slug ("bug", "feature", "task", etc.), or null to remove type. Use list_ticket_types for valid values.'
25438
25631
  },
25439
25632
  acceptanceCriteria: {
25440
25633
  type: ["string", "null"],
25441
- description: "Acceptance criteria as JSON array: [{id, text, isChecked}], or null to clear"
25634
+ description: `Acceptance criteria as JSON string of array (max ${LIMITS.ACCEPTANCE_CRITERIA_MAX} chars): [{"id":"ac-1","text":"Given... When... Then...","isChecked":false}], or null to clear. Preserve existing criteria IDs when updating.`
25442
25635
  },
25443
25636
  parentId: {
25444
25637
  type: ["string", "null"],
25445
- description: "Parent ticket ID, or null to remove from parent"
25638
+ description: "Parent ticket ID (format: tkt_xxxxx), or null to remove from parent."
25446
25639
  },
25447
25640
  version: {
25448
25641
  type: "number",
25449
- description: "Optimistic locking version (pass current version to prevent stale updates)"
25642
+ description: "Optimistic locking version. Pass the ticket's current version to prevent overwriting concurrent edits. Get from get_ticket response."
25450
25643
  }
25451
25644
  },
25452
25645
  required: ["projectId", "ticketId"]
@@ -25492,13 +25685,13 @@ var updateTicketTool = {
25492
25685
  var moveTicketTool = {
25493
25686
  tool: {
25494
25687
  name: "move_ticket",
25495
- description: "Move a ticket to a different status column on the board, optionally specifying position",
25688
+ description: "Move a ticket to a different status column. Call get_available_transitions first to check valid targets — moves to disallowed statuses will fail. For completing, use complete_ticket; for canceling, use abandon_ticket.",
25496
25689
  inputSchema: {
25497
25690
  type: "object",
25498
25691
  properties: {
25499
25692
  projectId: {
25500
25693
  type: "string",
25501
- description: "Project ID"
25694
+ description: "Project ID (format: prj_xxxxx)"
25502
25695
  },
25503
25696
  ticketId: {
25504
25697
  type: "string",
@@ -25530,13 +25723,13 @@ var moveTicketTool = {
25530
25723
  var completeTicketTool = {
25531
25724
  tool: {
25532
25725
  name: "complete_ticket",
25533
- description: "Mark a ticket as complete. Moves it to the completed area.",
25726
+ description: "Mark a ticket as done. Moves it to the Completed area (off the board). To undo, use reopen_ticket.",
25534
25727
  inputSchema: {
25535
25728
  type: "object",
25536
25729
  properties: {
25537
25730
  projectId: {
25538
25731
  type: "string",
25539
- description: "Project ID"
25732
+ description: "Project ID (format: prj_xxxxx)"
25540
25733
  },
25541
25734
  ticketId: {
25542
25735
  type: "string",
@@ -25559,13 +25752,13 @@ var completeTicketTool = {
25559
25752
  var abandonTicketTool = {
25560
25753
  tool: {
25561
25754
  name: "abandon_ticket",
25562
- description: "Abandon a ticket (won't do). Optionally provide a reason.",
25755
+ description: "Cancel a ticket (won't do). Moves it to the Abandoned area. Optionally provide a reason for the audit trail. To undo, use revive_ticket.",
25563
25756
  inputSchema: {
25564
25757
  type: "object",
25565
25758
  properties: {
25566
25759
  projectId: {
25567
25760
  type: "string",
25568
- description: "Project ID"
25761
+ description: "Project ID (format: prj_xxxxx)"
25569
25762
  },
25570
25763
  ticketId: {
25571
25764
  type: "string",
@@ -25592,13 +25785,13 @@ var abandonTicketTool = {
25592
25785
  var reopenTicketTool = {
25593
25786
  tool: {
25594
25787
  name: "reopen_ticket",
25595
- description: "Reopen a completed ticket - moves it back to board or backlog",
25788
+ description: 'Reopen a completed ticket, returning it to the board or backlog. If destination is "board", you must provide a statusId. Use list_statuses to get valid IDs.',
25596
25789
  inputSchema: {
25597
25790
  type: "object",
25598
25791
  properties: {
25599
25792
  projectId: {
25600
25793
  type: "string",
25601
- description: "Project ID"
25794
+ description: "Project ID (format: prj_xxxxx)"
25602
25795
  },
25603
25796
  ticketId: {
25604
25797
  type: "string",
@@ -25631,13 +25824,13 @@ var reopenTicketTool = {
25631
25824
  var reviveTicketTool = {
25632
25825
  tool: {
25633
25826
  name: "revive_ticket",
25634
- description: "Revive an abandoned ticket - bring it back to board or backlog",
25827
+ description: 'Bring back an abandoned ticket, returning it to the board or backlog. If destination is "board", you must provide a statusId.',
25635
25828
  inputSchema: {
25636
25829
  type: "object",
25637
25830
  properties: {
25638
25831
  projectId: {
25639
25832
  type: "string",
25640
- description: "Project ID"
25833
+ description: "Project ID (format: prj_xxxxx)"
25641
25834
  },
25642
25835
  ticketId: {
25643
25836
  type: "string",
@@ -25670,13 +25863,13 @@ var reviveTicketTool = {
25670
25863
  var deleteTicketTool = {
25671
25864
  tool: {
25672
25865
  name: "delete_ticket",
25673
- description: "Soft delete a ticket (moves to trash, can be restored)",
25866
+ description: `Soft-delete a ticket (moves to trash). Can be restored with restore_ticket. Prefer abandon_ticket for "won't do" tickets — delete is for accidental or junk tickets.`,
25674
25867
  inputSchema: {
25675
25868
  type: "object",
25676
25869
  properties: {
25677
25870
  projectId: {
25678
25871
  type: "string",
25679
- description: "Project ID"
25872
+ description: "Project ID (format: prj_xxxxx)"
25680
25873
  },
25681
25874
  ticketId: {
25682
25875
  type: "string",
@@ -25699,13 +25892,13 @@ var deleteTicketTool = {
25699
25892
  var restoreTicketTool = {
25700
25893
  tool: {
25701
25894
  name: "restore_ticket",
25702
- description: "Restore a deleted ticket from trash",
25895
+ description: "Restore a soft-deleted ticket from trash back to its previous location.",
25703
25896
  inputSchema: {
25704
25897
  type: "object",
25705
25898
  properties: {
25706
25899
  projectId: {
25707
25900
  type: "string",
25708
- description: "Project ID"
25901
+ description: "Project ID (format: prj_xxxxx)"
25709
25902
  },
25710
25903
  ticketId: {
25711
25904
  type: "string",
@@ -25728,13 +25921,13 @@ var restoreTicketTool = {
25728
25921
  var moveToBacklogTool = {
25729
25922
  tool: {
25730
25923
  name: "move_to_backlog",
25731
- description: "Move a ticket from the board to the backlog for later",
25924
+ description: "Move a ticket from the active board to the backlog (for later). The ticket retains its metadata but is no longer visible on board columns.",
25732
25925
  inputSchema: {
25733
25926
  type: "object",
25734
25927
  properties: {
25735
25928
  projectId: {
25736
25929
  type: "string",
25737
- description: "Project ID"
25930
+ description: "Project ID (format: prj_xxxxx)"
25738
25931
  },
25739
25932
  ticketId: {
25740
25933
  type: "string",
@@ -25757,13 +25950,13 @@ var moveToBacklogTool = {
25757
25950
  var moveToBoardTool = {
25758
25951
  tool: {
25759
25952
  name: "move_to_board",
25760
- description: "Move a ticket from the backlog to the active board",
25953
+ description: "Move a ticket from the backlog to the active board. Requires a statusId to place it in a specific column. Use list_statuses to get valid IDs.",
25761
25954
  inputSchema: {
25762
25955
  type: "object",
25763
25956
  properties: {
25764
25957
  projectId: {
25765
25958
  type: "string",
25766
- description: "Project ID"
25959
+ description: "Project ID (format: prj_xxxxx)"
25767
25960
  },
25768
25961
  ticketId: {
25769
25962
  type: "string",
@@ -25790,13 +25983,13 @@ var moveToBoardTool = {
25790
25983
  var getCompletedTicketsTool = {
25791
25984
  tool: {
25792
25985
  name: "get_completed_tickets",
25793
- description: "Get list of completed tickets in a project",
25986
+ description: "Get completed tickets in a project. Use for reviewing finished work or finding tickets to reopen.",
25794
25987
  inputSchema: {
25795
25988
  type: "object",
25796
25989
  properties: {
25797
25990
  projectId: {
25798
25991
  type: "string",
25799
- description: "Project ID"
25992
+ description: "Project ID (format: prj_xxxxx)"
25800
25993
  },
25801
25994
  limit: {
25802
25995
  type: "number",
@@ -25820,13 +26013,13 @@ var getCompletedTicketsTool = {
25820
26013
  var getAbandonedTicketsTool = {
25821
26014
  tool: {
25822
26015
  name: "get_abandoned_tickets",
25823
- description: "Get list of abandoned tickets in a project",
26016
+ description: "Get abandoned (canceled) tickets in a project. Use for reviewing discarded work or finding tickets to revive.",
25824
26017
  inputSchema: {
25825
26018
  type: "object",
25826
26019
  properties: {
25827
26020
  projectId: {
25828
26021
  type: "string",
25829
- description: "Project ID"
26022
+ description: "Project ID (format: prj_xxxxx)"
25830
26023
  },
25831
26024
  limit: {
25832
26025
  type: "number",
@@ -25850,13 +26043,13 @@ var getAbandonedTicketsTool = {
25850
26043
  var getTrashedTicketsTool = {
25851
26044
  tool: {
25852
26045
  name: "get_trashed_tickets",
25853
- description: "Get list of trashed (soft-deleted) tickets in a project",
26046
+ description: "Get trashed (soft-deleted) tickets in a project. Trashed tickets can be restored with restore_ticket.",
25854
26047
  inputSchema: {
25855
26048
  type: "object",
25856
26049
  properties: {
25857
26050
  projectId: {
25858
26051
  type: "string",
25859
- description: "Project ID"
26052
+ description: "Project ID (format: prj_xxxxx)"
25860
26053
  },
25861
26054
  limit: {
25862
26055
  type: "number",
@@ -25880,7 +26073,7 @@ var getTrashedTicketsTool = {
25880
26073
  var getMyTicketsTool = {
25881
26074
  tool: {
25882
26075
  name: "get_my_tickets",
25883
- description: "Get all tickets assigned to the current user. Can filter by project, location, and priority.",
26076
+ description: 'Get all tickets assigned to the current user. Works across all projects unless filtered. Useful for "what am I working on?" and daily standup prep.',
25884
26077
  inputSchema: {
25885
26078
  type: "object",
25886
26079
  properties: {
@@ -25927,7 +26120,7 @@ var getMyTicketsTool = {
25927
26120
  var getOverdueTicketsTool = {
25928
26121
  tool: {
25929
26122
  name: "get_overdue_tickets",
25930
- description: "Get all tickets that are past their due date. Helps identify delayed work that needs attention.",
26123
+ description: "Get tickets past their due date. Pair with get_tickets_due_soon for a complete deadline picture. Useful for standup reviews and priority triage.",
25931
26124
  inputSchema: {
25932
26125
  type: "object",
25933
26126
  properties: {
@@ -25970,7 +26163,7 @@ var getOverdueTicketsTool = {
25970
26163
  var getTicketsDueSoonTool = {
25971
26164
  tool: {
25972
26165
  name: "get_tickets_due_soon",
25973
- description: "Get tickets due within a specified number of days. Helps with proactive deadline management.",
26166
+ description: "Get tickets due within N days (default: 7). Returns only upcoming deadlines, not overdue. Pair with get_overdue_tickets for complete deadline awareness.",
25974
26167
  inputSchema: {
25975
26168
  type: "object",
25976
26169
  properties: {
@@ -26022,13 +26215,13 @@ var getTicketsDueSoonTool = {
26022
26215
  var getTicketCountsTool = {
26023
26216
  tool: {
26024
26217
  name: "get_ticket_counts",
26025
- description: "Get ticket counts by location (board, backlog, completed, abandoned, trash). Quick overview without fetching ticket data.",
26218
+ description: "Get ticket counts by location (board, backlog, completed, abandoned, trash). Lightweight overview without fetching ticket data. Use for dashboards and project health checks.",
26026
26219
  inputSchema: {
26027
26220
  type: "object",
26028
26221
  properties: {
26029
26222
  projectId: {
26030
26223
  type: "string",
26031
- description: "Project ID"
26224
+ description: "Project ID (format: prj_xxxxx)"
26032
26225
  }
26033
26226
  },
26034
26227
  required: ["projectId"]
@@ -26047,13 +26240,13 @@ var getTicketCountsTool = {
26047
26240
  var quickSearchTicketsTool = {
26048
26241
  tool: {
26049
26242
  name: "quick_search_tickets",
26050
- description: "Lightweight ticket search returning only id, number, title, and status. Faster than list_tickets for finding tickets by name.",
26243
+ description: "Fast ticket search returning minimal data (id, number, title, status only). Use to find a ticket by name before calling get_ticket for full details. Lighter and faster than list_tickets.",
26051
26244
  inputSchema: {
26052
26245
  type: "object",
26053
26246
  properties: {
26054
26247
  projectId: {
26055
26248
  type: "string",
26056
- description: "Project ID"
26249
+ description: "Project ID (format: prj_xxxxx)"
26057
26250
  },
26058
26251
  search: {
26059
26252
  type: "string",
@@ -26081,13 +26274,13 @@ var quickSearchTicketsTool = {
26081
26274
  var getTicketChildrenTool = {
26082
26275
  tool: {
26083
26276
  name: "get_ticket_children",
26084
- description: "Get subtasks (child tickets) of a ticket",
26277
+ description: "Get all subtasks of a parent ticket. Create subtasks using create_ticket with the parentId parameter.",
26085
26278
  inputSchema: {
26086
26279
  type: "object",
26087
26280
  properties: {
26088
26281
  projectId: {
26089
26282
  type: "string",
26090
- description: "Project ID"
26283
+ description: "Project ID (format: prj_xxxxx)"
26091
26284
  },
26092
26285
  ticketId: {
26093
26286
  type: "string",
@@ -26110,13 +26303,13 @@ var getTicketChildrenTool = {
26110
26303
  var listBacklogTicketsTool = {
26111
26304
  tool: {
26112
26305
  name: "list_backlog_tickets",
26113
- description: "List tickets in the backlog with cursor-based pagination. Use for browsing backlog items.",
26306
+ description: "Browse backlog tickets with cursor-based pagination. Use for sprint planning — review backlog items before assigning to a release with assign_tickets_to_release.",
26114
26307
  inputSchema: {
26115
26308
  type: "object",
26116
26309
  properties: {
26117
26310
  projectId: {
26118
26311
  type: "string",
26119
- description: "Project ID"
26312
+ description: "Project ID (format: prj_xxxxx)"
26120
26313
  },
26121
26314
  cursor: {
26122
26315
  type: "string",
@@ -26179,13 +26372,13 @@ var ticketTools = [
26179
26372
  var listStatusesTool = {
26180
26373
  tool: {
26181
26374
  name: "list_statuses",
26182
- description: "List all workflow statuses (columns) for a project. Use this to find valid status IDs for creating or moving tickets.",
26375
+ description: "List all workflow statuses (board columns) for a project. Returns status IDs needed for create_ticket, move_ticket, and move_to_board. Call once per session and cache the IDs.",
26183
26376
  inputSchema: {
26184
26377
  type: "object",
26185
26378
  properties: {
26186
26379
  projectId: {
26187
26380
  type: "string",
26188
- description: "Project ID"
26381
+ description: "Project ID (format: prj_xxxxx)"
26189
26382
  }
26190
26383
  },
26191
26384
  required: ["projectId"]
@@ -26204,13 +26397,13 @@ var listStatusesTool = {
26204
26397
  var createStatusTool = {
26205
26398
  tool: {
26206
26399
  name: "create_status",
26207
- description: "Create a new workflow status (board column). Requires settings access.",
26400
+ description: "Create a new workflow status (board column). New status appears as the rightmost column. Requires project manager or admin role.",
26208
26401
  inputSchema: {
26209
26402
  type: "object",
26210
26403
  properties: {
26211
26404
  projectId: {
26212
26405
  type: "string",
26213
- description: "Project ID"
26406
+ description: "Project ID (format: prj_xxxxx)"
26214
26407
  },
26215
26408
  name: {
26216
26409
  type: "string",
@@ -26237,17 +26430,17 @@ var createStatusTool = {
26237
26430
  var updateStatusTool = {
26238
26431
  tool: {
26239
26432
  name: "update_status",
26240
- description: "Update a workflow status name or color. Requires settings access.",
26433
+ description: "Update a workflow status name or color. Requires project manager or admin role.",
26241
26434
  inputSchema: {
26242
26435
  type: "object",
26243
26436
  properties: {
26244
26437
  projectId: {
26245
26438
  type: "string",
26246
- description: "Project ID"
26439
+ description: "Project ID (format: prj_xxxxx)"
26247
26440
  },
26248
26441
  statusId: {
26249
26442
  type: "string",
26250
- description: "Status ID to update"
26443
+ description: "Status ID to update (format: sts_xxxxx). Use list_statuses to find IDs."
26251
26444
  },
26252
26445
  name: {
26253
26446
  type: "string",
@@ -26279,17 +26472,17 @@ var updateStatusTool = {
26279
26472
  var deleteStatusTool = {
26280
26473
  tool: {
26281
26474
  name: "delete_status",
26282
- description: "Delete a workflow status. Tickets in this status must be moved first. Requires settings access.",
26475
+ description: "Delete a workflow status. Tickets in this status must be moved first with batch_move_tickets. Requires project manager or admin role.",
26283
26476
  inputSchema: {
26284
26477
  type: "object",
26285
26478
  properties: {
26286
26479
  projectId: {
26287
26480
  type: "string",
26288
- description: "Project ID"
26481
+ description: "Project ID (format: prj_xxxxx)"
26289
26482
  },
26290
26483
  statusId: {
26291
26484
  type: "string",
26292
- description: "Status ID to delete"
26485
+ description: "Status ID to delete (format: sts_xxxxx)"
26293
26486
  }
26294
26487
  },
26295
26488
  required: ["projectId", "statusId"]
@@ -26308,13 +26501,13 @@ var deleteStatusTool = {
26308
26501
  var getAvailableTransitionsTool = {
26309
26502
  tool: {
26310
26503
  name: "get_available_transitions",
26311
- description: "Get which statuses a ticket can move to from a given status. Useful before moving a ticket.",
26504
+ description: "Get valid target statuses for a move from a given status. ALWAYS call this before move_ticket invalid moves will fail. If no transitions are defined, all moves are allowed.",
26312
26505
  inputSchema: {
26313
26506
  type: "object",
26314
26507
  properties: {
26315
26508
  projectId: {
26316
26509
  type: "string",
26317
- description: "Project ID"
26510
+ description: "Project ID (format: prj_xxxxx)"
26318
26511
  },
26319
26512
  statusId: {
26320
26513
  type: "string",
@@ -26337,13 +26530,13 @@ var getAvailableTransitionsTool = {
26337
26530
  var listTransitionsTool = {
26338
26531
  tool: {
26339
26532
  name: "list_transitions",
26340
- description: "List all workflow transitions (rules for which status can move to which). Shows the full transition graph.",
26533
+ description: "List the full workflow transition graph: which status can move to which. Use for understanding workflow rules. For checking a specific ticket's options, use get_available_transitions instead.",
26341
26534
  inputSchema: {
26342
26535
  type: "object",
26343
26536
  properties: {
26344
26537
  projectId: {
26345
26538
  type: "string",
26346
- description: "Project ID"
26539
+ description: "Project ID (format: prj_xxxxx)"
26347
26540
  }
26348
26541
  },
26349
26542
  required: ["projectId"]
@@ -26362,13 +26555,13 @@ var listTransitionsTool = {
26362
26555
  var createTransitionTool = {
26363
26556
  tool: {
26364
26557
  name: "create_transition",
26365
- description: "Create a workflow transition rule allowing tickets to move from one status to another. Requires settings access.",
26558
+ description: "Create a workflow transition rule allowing tickets to move from one status to another. Use list_statuses to get status IDs. Requires project manager or admin role.",
26366
26559
  inputSchema: {
26367
26560
  type: "object",
26368
26561
  properties: {
26369
26562
  projectId: {
26370
26563
  type: "string",
26371
- description: "Project ID"
26564
+ description: "Project ID (format: prj_xxxxx)"
26372
26565
  },
26373
26566
  fromStatusId: {
26374
26567
  type: "string",
@@ -26395,13 +26588,13 @@ var createTransitionTool = {
26395
26588
  var deleteTransitionTool = {
26396
26589
  tool: {
26397
26590
  name: "delete_transition",
26398
- description: "Delete a workflow transition rule. Requires settings access.",
26591
+ description: "Delete a workflow transition rule, allowing free movement between these statuses. Requires project manager or admin role.",
26399
26592
  inputSchema: {
26400
26593
  type: "object",
26401
26594
  properties: {
26402
26595
  projectId: {
26403
26596
  type: "string",
26404
- description: "Project ID"
26597
+ description: "Project ID (format: prj_xxxxx)"
26405
26598
  },
26406
26599
  fromStatusId: {
26407
26600
  type: "string",
@@ -26440,17 +26633,17 @@ var workflowTools = [
26440
26633
  var listCommentsTool = {
26441
26634
  tool: {
26442
26635
  name: "list_comments",
26443
- description: "List all comments on a ticket",
26636
+ description: "List all comments on a ticket, ordered chronologically. Use to review discussion history before adding a new comment.",
26444
26637
  inputSchema: {
26445
26638
  type: "object",
26446
26639
  properties: {
26447
26640
  projectId: {
26448
26641
  type: "string",
26449
- description: "Project ID"
26642
+ description: "Project ID (format: prj_xxxxx)"
26450
26643
  },
26451
26644
  ticketId: {
26452
26645
  type: "string",
26453
- description: "Ticket ID"
26646
+ description: "Ticket ID (format: tkt_xxxxx)"
26454
26647
  },
26455
26648
  limit: {
26456
26649
  type: "number",
@@ -26474,21 +26667,21 @@ var listCommentsTool = {
26474
26667
  var addCommentTool = {
26475
26668
  tool: {
26476
26669
  name: "add_comment",
26477
- description: "Add a comment to a ticket",
26670
+ description: "Add a comment to a ticket. Supports markdown formatting. Use for status updates, questions, or discussion.",
26478
26671
  inputSchema: {
26479
26672
  type: "object",
26480
26673
  properties: {
26481
26674
  projectId: {
26482
26675
  type: "string",
26483
- description: "Project ID"
26676
+ description: "Project ID (format: prj_xxxxx)"
26484
26677
  },
26485
26678
  ticketId: {
26486
26679
  type: "string",
26487
- description: "Ticket ID"
26680
+ description: "Ticket ID (format: tkt_xxxxx)"
26488
26681
  },
26489
26682
  content: {
26490
26683
  type: "string",
26491
- description: `Comment text (supports markdown, max ${LIMITS.COMMENT_MAX} characters)`
26684
+ description: `Comment text in markdown (max ${LIMITS.COMMENT_MAX} chars). Supports **bold**, *italic*, \`code\`, code blocks, [links](url), and bullet lists.`
26492
26685
  }
26493
26686
  },
26494
26687
  required: ["projectId", "ticketId", "content"]
@@ -26507,21 +26700,21 @@ var addCommentTool = {
26507
26700
  var updateCommentTool = {
26508
26701
  tool: {
26509
26702
  name: "update_comment",
26510
- description: "Edit an existing comment (only the comment author can edit)",
26703
+ description: "Edit an existing comment. Only the original author can edit. Previous versions are preserved in comment history (see get_comment_history).",
26511
26704
  inputSchema: {
26512
26705
  type: "object",
26513
26706
  properties: {
26514
26707
  projectId: {
26515
26708
  type: "string",
26516
- description: "Project ID"
26709
+ description: "Project ID (format: prj_xxxxx)"
26517
26710
  },
26518
26711
  ticketId: {
26519
26712
  type: "string",
26520
- description: "Ticket ID"
26713
+ description: "Ticket ID (format: tkt_xxxxx)"
26521
26714
  },
26522
26715
  commentId: {
26523
26716
  type: "string",
26524
- description: "Comment ID to edit"
26717
+ description: "Comment ID to edit (from list_comments response)"
26525
26718
  },
26526
26719
  content: {
26527
26720
  type: "string",
@@ -26544,21 +26737,21 @@ var updateCommentTool = {
26544
26737
  var deleteCommentTool = {
26545
26738
  tool: {
26546
26739
  name: "delete_comment",
26547
- description: "Delete a comment (only the comment author can delete)",
26740
+ description: "Delete a comment permanently. Only the original author can delete. This cannot be undone.",
26548
26741
  inputSchema: {
26549
26742
  type: "object",
26550
26743
  properties: {
26551
26744
  projectId: {
26552
26745
  type: "string",
26553
- description: "Project ID"
26746
+ description: "Project ID (format: prj_xxxxx)"
26554
26747
  },
26555
26748
  ticketId: {
26556
26749
  type: "string",
26557
- description: "Ticket ID"
26750
+ description: "Ticket ID (format: tkt_xxxxx)"
26558
26751
  },
26559
26752
  commentId: {
26560
26753
  type: "string",
26561
- description: "Comment ID to delete"
26754
+ description: "Comment ID to delete (from list_comments response)"
26562
26755
  }
26563
26756
  },
26564
26757
  required: ["projectId", "ticketId", "commentId"]
@@ -26577,21 +26770,21 @@ var deleteCommentTool = {
26577
26770
  var getCommentHistoryTool = {
26578
26771
  tool: {
26579
26772
  name: "get_comment_history",
26580
- description: "Get the edit history of a comment (previous versions)",
26773
+ description: "Get the edit history of a comment showing all previous versions. Use to see what was changed and when.",
26581
26774
  inputSchema: {
26582
26775
  type: "object",
26583
26776
  properties: {
26584
26777
  projectId: {
26585
26778
  type: "string",
26586
- description: "Project ID"
26779
+ description: "Project ID (format: prj_xxxxx)"
26587
26780
  },
26588
26781
  ticketId: {
26589
26782
  type: "string",
26590
- description: "Ticket ID"
26783
+ description: "Ticket ID (format: tkt_xxxxx)"
26591
26784
  },
26592
26785
  commentId: {
26593
26786
  type: "string",
26594
- description: "Comment ID"
26787
+ description: "Comment ID (from list_comments response)"
26595
26788
  }
26596
26789
  },
26597
26790
  required: ["projectId", "ticketId", "commentId"]
@@ -26619,13 +26812,13 @@ var commentTools = [
26619
26812
  var listTagsTool = {
26620
26813
  tool: {
26621
26814
  name: "list_tags",
26622
- description: "List all tags available in a project",
26815
+ description: "List all tags in a project. Call this before create_ticket to find existing tag IDs for set_ticket_tags. If a needed tag does not exist, create it with create_tag first.",
26623
26816
  inputSchema: {
26624
26817
  type: "object",
26625
26818
  properties: {
26626
26819
  projectId: {
26627
26820
  type: "string",
26628
- description: "Project ID"
26821
+ description: "Project ID (format: prj_xxxxx)"
26629
26822
  }
26630
26823
  },
26631
26824
  required: ["projectId"]
@@ -26644,17 +26837,17 @@ var listTagsTool = {
26644
26837
  var createTagTool = {
26645
26838
  tool: {
26646
26839
  name: "create_tag",
26647
- description: "Create a new tag in a project",
26840
+ description: 'Create a new tag in a project. Use lowercase-kebab-case names (e.g., "google-oauth", "api", "frontend"). Check list_tags first to avoid duplicates. After creating, use set_ticket_tags or add_tag_to_ticket to apply it.',
26648
26841
  inputSchema: {
26649
26842
  type: "object",
26650
26843
  properties: {
26651
26844
  projectId: {
26652
26845
  type: "string",
26653
- description: "Project ID"
26846
+ description: "Project ID (format: prj_xxxxx)"
26654
26847
  },
26655
26848
  name: {
26656
26849
  type: "string",
26657
- description: "Tag name (max 30 characters)"
26850
+ description: `Tag name (max ${LIMITS.TAG_NAME_MAX} chars). Use lowercase-kebab-case (e.g., "google-oauth", "user-login").`
26658
26851
  },
26659
26852
  color: {
26660
26853
  type: "string",
@@ -26679,17 +26872,17 @@ var createTagTool = {
26679
26872
  var updateTagTool = {
26680
26873
  tool: {
26681
26874
  name: "update_tag",
26682
- description: "Update a tag name or color",
26875
+ description: "Update a tag name or color. Changes apply to all tickets using this tag.",
26683
26876
  inputSchema: {
26684
26877
  type: "object",
26685
26878
  properties: {
26686
26879
  projectId: {
26687
26880
  type: "string",
26688
- description: "Project ID"
26881
+ description: "Project ID (format: prj_xxxxx)"
26689
26882
  },
26690
26883
  tagId: {
26691
26884
  type: "string",
26692
- description: "Tag ID to update"
26885
+ description: "Tag ID to update (format: tag_xxxxx). Use list_tags to find IDs."
26693
26886
  },
26694
26887
  name: {
26695
26888
  type: "string",
@@ -26722,17 +26915,17 @@ var updateTagTool = {
26722
26915
  var deleteTagTool = {
26723
26916
  tool: {
26724
26917
  name: "delete_tag",
26725
- description: "Delete a tag from the project. Removes it from all tickets.",
26918
+ description: "Permanently delete a tag from the project. Removes it from ALL tickets. There is no undo — use with caution.",
26726
26919
  inputSchema: {
26727
26920
  type: "object",
26728
26921
  properties: {
26729
26922
  projectId: {
26730
26923
  type: "string",
26731
- description: "Project ID"
26924
+ description: "Project ID (format: prj_xxxxx)"
26732
26925
  },
26733
26926
  tagId: {
26734
26927
  type: "string",
26735
- description: "Tag ID to delete"
26928
+ description: "Tag ID to delete (format: tag_xxxxx)"
26736
26929
  }
26737
26930
  },
26738
26931
  required: ["projectId", "tagId"]
@@ -26751,17 +26944,17 @@ var deleteTagTool = {
26751
26944
  var getTicketTagsTool = {
26752
26945
  tool: {
26753
26946
  name: "get_ticket_tags",
26754
- description: "Get all tags on a specific ticket",
26947
+ description: "Get all tags currently on a ticket. Use before set_ticket_tags if you need to preserve existing tags while adding new ones.",
26755
26948
  inputSchema: {
26756
26949
  type: "object",
26757
26950
  properties: {
26758
26951
  projectId: {
26759
26952
  type: "string",
26760
- description: "Project ID"
26953
+ description: "Project ID (format: prj_xxxxx)"
26761
26954
  },
26762
26955
  ticketId: {
26763
26956
  type: "string",
26764
- description: "Ticket ID"
26957
+ description: "Ticket ID (format: tkt_xxxxx)"
26765
26958
  }
26766
26959
  },
26767
26960
  required: ["projectId", "ticketId"]
@@ -26780,17 +26973,17 @@ var getTicketTagsTool = {
26780
26973
  var setTicketTagsTool = {
26781
26974
  tool: {
26782
26975
  name: "set_ticket_tags",
26783
- description: "Replace all tags on a ticket with a new set. Pass an empty array to remove all tags.",
26976
+ description: "Replace ALL tags on a ticket with a new set. This overwrites existing tags — pass the complete list of desired tag IDs. Pass empty array to remove all tags. Prefer this over multiple add_tag_to_ticket calls when setting multiple tags at once.",
26784
26977
  inputSchema: {
26785
26978
  type: "object",
26786
26979
  properties: {
26787
26980
  projectId: {
26788
26981
  type: "string",
26789
- description: "Project ID"
26982
+ description: "Project ID (format: prj_xxxxx)"
26790
26983
  },
26791
26984
  ticketId: {
26792
26985
  type: "string",
26793
- description: "Ticket ID"
26986
+ description: "Ticket ID (format: tkt_xxxxx)"
26794
26987
  },
26795
26988
  tagIds: {
26796
26989
  type: "array",
@@ -26814,17 +27007,17 @@ var setTicketTagsTool = {
26814
27007
  var addTagToTicketTool = {
26815
27008
  tool: {
26816
27009
  name: "add_tag_to_ticket",
26817
- description: "Add a tag to a ticket",
27010
+ description: "Add a single tag to a ticket without affecting existing tags. Use set_ticket_tags instead when applying multiple tags at once (fewer API calls).",
26818
27011
  inputSchema: {
26819
27012
  type: "object",
26820
27013
  properties: {
26821
27014
  projectId: {
26822
27015
  type: "string",
26823
- description: "Project ID"
27016
+ description: "Project ID (format: prj_xxxxx)"
26824
27017
  },
26825
27018
  ticketId: {
26826
27019
  type: "string",
26827
- description: "Ticket ID"
27020
+ description: "Ticket ID (format: tkt_xxxxx)"
26828
27021
  },
26829
27022
  tagId: {
26830
27023
  type: "string",
@@ -26847,21 +27040,21 @@ var addTagToTicketTool = {
26847
27040
  var removeTagFromTicketTool = {
26848
27041
  tool: {
26849
27042
  name: "remove_tag_from_ticket",
26850
- description: "Remove a tag from a ticket",
27043
+ description: "Remove a single tag from a ticket. Other tags remain unchanged.",
26851
27044
  inputSchema: {
26852
27045
  type: "object",
26853
27046
  properties: {
26854
27047
  projectId: {
26855
27048
  type: "string",
26856
- description: "Project ID"
27049
+ description: "Project ID (format: prj_xxxxx)"
26857
27050
  },
26858
27051
  ticketId: {
26859
27052
  type: "string",
26860
- description: "Ticket ID"
27053
+ description: "Ticket ID (format: tkt_xxxxx)"
26861
27054
  },
26862
27055
  tagId: {
26863
27056
  type: "string",
26864
- description: "Tag ID to remove"
27057
+ description: "Tag ID to remove (format: tag_xxxxx). Use get_ticket_tags to see current tags."
26865
27058
  }
26866
27059
  },
26867
27060
  required: ["projectId", "ticketId", "tagId"]
@@ -26892,13 +27085,13 @@ var tagTools = [
26892
27085
  var listTicketTypesTool = {
26893
27086
  tool: {
26894
27087
  name: "list_ticket_types",
26895
- description: "List all ticket types available in a project (e.g., Bug, Feature, Task). Use this to find valid typeSlug values when creating tickets.",
27088
+ description: "List ticket types for a project (e.g., Bug, Feature, Task). Returns slug values needed for the typeSlug parameter in create_ticket. Call once per session and cache.",
26896
27089
  inputSchema: {
26897
27090
  type: "object",
26898
27091
  properties: {
26899
27092
  projectId: {
26900
27093
  type: "string",
26901
- description: "Project ID"
27094
+ description: "Project ID (format: prj_xxxxx)"
26902
27095
  }
26903
27096
  },
26904
27097
  required: ["projectId"]
@@ -26917,13 +27110,13 @@ var listTicketTypesTool = {
26917
27110
  var getTicketTypeTool = {
26918
27111
  tool: {
26919
27112
  name: "get_ticket_type",
26920
- description: "Get details of a specific ticket type by slug",
27113
+ description: 'Get details of a specific ticket type by its slug (e.g., "bug", "feature").',
26921
27114
  inputSchema: {
26922
27115
  type: "object",
26923
27116
  properties: {
26924
27117
  projectId: {
26925
27118
  type: "string",
26926
- description: "Project ID"
27119
+ description: "Project ID (format: prj_xxxxx)"
26927
27120
  },
26928
27121
  slug: {
26929
27122
  type: "string",
@@ -26952,7 +27145,7 @@ var createTicketTypeTool = {
26952
27145
  properties: {
26953
27146
  projectId: {
26954
27147
  type: "string",
26955
- description: "Project ID"
27148
+ description: "Project ID (format: prj_xxxxx)"
26956
27149
  },
26957
27150
  name: {
26958
27151
  type: "string",
@@ -26993,7 +27186,7 @@ var updateTicketTypeTool = {
26993
27186
  properties: {
26994
27187
  projectId: {
26995
27188
  type: "string",
26996
- description: "Project ID"
27189
+ description: "Project ID (format: prj_xxxxx)"
26997
27190
  },
26998
27191
  slug: {
26999
27192
  type: "string",
@@ -27035,7 +27228,7 @@ var deleteTicketTypeTool = {
27035
27228
  properties: {
27036
27229
  projectId: {
27037
27230
  type: "string",
27038
- description: "Project ID"
27231
+ description: "Project ID (format: prj_xxxxx)"
27039
27232
  },
27040
27233
  slug: {
27041
27234
  type: "string",
@@ -27071,13 +27264,13 @@ var ticketTypeTools = [
27071
27264
  var listPrioritiesTool = {
27072
27265
  tool: {
27073
27266
  name: "list_priorities",
27074
- description: "List all priorities defined in a project. Projects can have custom priority levels.",
27267
+ description: "List priority levels for a project. Returns IDs needed for the priorityId parameter in create_ticket and update_ticket. Call once per session and cache.",
27075
27268
  inputSchema: {
27076
27269
  type: "object",
27077
27270
  properties: {
27078
27271
  projectId: {
27079
27272
  type: "string",
27080
- description: "Project ID"
27273
+ description: "Project ID (format: prj_xxxxx)"
27081
27274
  }
27082
27275
  },
27083
27276
  required: ["projectId"]
@@ -27096,17 +27289,17 @@ var listPrioritiesTool = {
27096
27289
  var getPriorityTool = {
27097
27290
  tool: {
27098
27291
  name: "get_priority",
27099
- description: "Get details of a specific priority by ID",
27292
+ description: "Get details of a specific priority level by ID (format: pri_xxxxx).",
27100
27293
  inputSchema: {
27101
27294
  type: "object",
27102
27295
  properties: {
27103
27296
  projectId: {
27104
27297
  type: "string",
27105
- description: "Project ID"
27298
+ description: "Project ID (format: prj_xxxxx)"
27106
27299
  },
27107
27300
  priorityId: {
27108
27301
  type: "string",
27109
- description: "Priority ID"
27302
+ description: "Priority ID (format: pri_xxxxx)"
27110
27303
  }
27111
27304
  },
27112
27305
  required: ["projectId", "priorityId"]
@@ -27131,7 +27324,7 @@ var createPriorityTool = {
27131
27324
  properties: {
27132
27325
  projectId: {
27133
27326
  type: "string",
27134
- description: "Project ID"
27327
+ description: "Project ID (format: prj_xxxxx)"
27135
27328
  },
27136
27329
  name: {
27137
27330
  type: "string",
@@ -27172,11 +27365,11 @@ var updatePriorityTool = {
27172
27365
  properties: {
27173
27366
  projectId: {
27174
27367
  type: "string",
27175
- description: "Project ID"
27368
+ description: "Project ID (format: prj_xxxxx)"
27176
27369
  },
27177
27370
  priorityId: {
27178
27371
  type: "string",
27179
- description: "Priority ID to update"
27372
+ description: "Priority ID to update (format: pri_xxxxx)"
27180
27373
  },
27181
27374
  name: {
27182
27375
  type: "string",
@@ -27220,11 +27413,11 @@ var deletePriorityTool = {
27220
27413
  properties: {
27221
27414
  projectId: {
27222
27415
  type: "string",
27223
- description: "Project ID"
27416
+ description: "Project ID (format: prj_xxxxx)"
27224
27417
  },
27225
27418
  priorityId: {
27226
27419
  type: "string",
27227
- description: "Priority ID to delete"
27420
+ description: "Priority ID to delete (format: pri_xxxxx)"
27228
27421
  },
27229
27422
  replaceWithId: {
27230
27423
  type: "string",
@@ -27256,13 +27449,13 @@ var priorityTools = [
27256
27449
  var listSizesTool = {
27257
27450
  tool: {
27258
27451
  name: "list_sizes",
27259
- description: "List all sizes defined in a project. Projects can have custom size levels.",
27452
+ description: "List size/effort levels for a project. Returns IDs needed for the sizeId parameter in create_ticket and update_ticket. Call once per session and cache.",
27260
27453
  inputSchema: {
27261
27454
  type: "object",
27262
27455
  properties: {
27263
27456
  projectId: {
27264
27457
  type: "string",
27265
- description: "Project ID"
27458
+ description: "Project ID (format: prj_xxxxx)"
27266
27459
  }
27267
27460
  },
27268
27461
  required: ["projectId"]
@@ -27281,17 +27474,17 @@ var listSizesTool = {
27281
27474
  var getSizeTool = {
27282
27475
  tool: {
27283
27476
  name: "get_size",
27284
- description: "Get details of a specific size by ID",
27477
+ description: "Get details of a specific size level by ID (format: siz_xxxxx).",
27285
27478
  inputSchema: {
27286
27479
  type: "object",
27287
27480
  properties: {
27288
27481
  projectId: {
27289
27482
  type: "string",
27290
- description: "Project ID"
27483
+ description: "Project ID (format: prj_xxxxx)"
27291
27484
  },
27292
27485
  sizeId: {
27293
27486
  type: "string",
27294
- description: "Size ID"
27487
+ description: "Size ID (format: siz_xxxxx)"
27295
27488
  }
27296
27489
  },
27297
27490
  required: ["projectId", "sizeId"]
@@ -27316,7 +27509,7 @@ var createSizeTool = {
27316
27509
  properties: {
27317
27510
  projectId: {
27318
27511
  type: "string",
27319
- description: "Project ID"
27512
+ description: "Project ID (format: prj_xxxxx)"
27320
27513
  },
27321
27514
  name: {
27322
27515
  type: "string",
@@ -27357,11 +27550,11 @@ var updateSizeTool = {
27357
27550
  properties: {
27358
27551
  projectId: {
27359
27552
  type: "string",
27360
- description: "Project ID"
27553
+ description: "Project ID (format: prj_xxxxx)"
27361
27554
  },
27362
27555
  sizeId: {
27363
27556
  type: "string",
27364
- description: "Size ID to update"
27557
+ description: "Size ID to update (format: siz_xxxxx)"
27365
27558
  },
27366
27559
  name: {
27367
27560
  type: "string",
@@ -27405,11 +27598,11 @@ var deleteSizeTool = {
27405
27598
  properties: {
27406
27599
  projectId: {
27407
27600
  type: "string",
27408
- description: "Project ID"
27601
+ description: "Project ID (format: prj_xxxxx)"
27409
27602
  },
27410
27603
  sizeId: {
27411
27604
  type: "string",
27412
- description: "Size ID to delete"
27605
+ description: "Size ID to delete (format: siz_xxxxx)"
27413
27606
  },
27414
27607
  replaceWithId: {
27415
27608
  type: "string",
@@ -27441,13 +27634,13 @@ var sizeTools = [
27441
27634
  var listReleasesTool = {
27442
27635
  tool: {
27443
27636
  name: "list_releases",
27444
- description: "List releases in a project",
27637
+ description: "List releases (sprints/milestones) in a project. Filter by status: open, released, or all.",
27445
27638
  inputSchema: {
27446
27639
  type: "object",
27447
27640
  properties: {
27448
27641
  projectId: {
27449
27642
  type: "string",
27450
- description: "Project ID"
27643
+ description: "Project ID (format: prj_xxxxx)"
27451
27644
  },
27452
27645
  status: {
27453
27646
  type: "string",
@@ -27472,17 +27665,17 @@ var listReleasesTool = {
27472
27665
  var getReleaseTool = {
27473
27666
  tool: {
27474
27667
  name: "get_release",
27475
- description: "Get detailed information about a specific release",
27668
+ description: "Get full release details including ticket counts, progress, and target date. Use before update_release to get the version for optimistic locking.",
27476
27669
  inputSchema: {
27477
27670
  type: "object",
27478
27671
  properties: {
27479
27672
  projectId: {
27480
27673
  type: "string",
27481
- description: "Project ID"
27674
+ description: "Project ID (format: prj_xxxxx)"
27482
27675
  },
27483
27676
  releaseId: {
27484
27677
  type: "string",
27485
- description: "Release ID"
27678
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27486
27679
  }
27487
27680
  },
27488
27681
  required: ["projectId", "releaseId"]
@@ -27501,13 +27694,13 @@ var getReleaseTool = {
27501
27694
  var createReleaseTool = {
27502
27695
  tool: {
27503
27696
  name: "create_release",
27504
- description: "Create a new release for grouping tickets",
27697
+ description: "Create a new release (sprint/milestone) for grouping tickets. After creating, use assign_tickets_to_release to add tickets. Track progress with get_release_burndown.",
27505
27698
  inputSchema: {
27506
27699
  type: "object",
27507
27700
  properties: {
27508
27701
  projectId: {
27509
27702
  type: "string",
27510
- description: "Project ID"
27703
+ description: "Project ID (format: prj_xxxxx)"
27511
27704
  },
27512
27705
  name: {
27513
27706
  type: "string",
@@ -27542,21 +27735,21 @@ var createReleaseTool = {
27542
27735
  var assignTicketToReleaseTool = {
27543
27736
  tool: {
27544
27737
  name: "assign_ticket_to_release",
27545
- description: "Assign a ticket to a release, or remove from release by passing null",
27738
+ description: "Assign a single ticket to a release, or remove from release by passing null. Use assign_tickets_to_release for bulk assignment.",
27546
27739
  inputSchema: {
27547
27740
  type: "object",
27548
27741
  properties: {
27549
27742
  projectId: {
27550
27743
  type: "string",
27551
- description: "Project ID"
27744
+ description: "Project ID (format: prj_xxxxx)"
27552
27745
  },
27553
27746
  ticketId: {
27554
27747
  type: "string",
27555
- description: "Ticket ID"
27748
+ description: "Ticket ID (format: tkt_xxxxx)"
27556
27749
  },
27557
27750
  releaseId: {
27558
27751
  type: ["string", "null"],
27559
- description: "Release ID, or null to remove from release"
27752
+ description: "Release ID (format: rel_xxxxx), or null to remove from release. Use list_releases to find IDs."
27560
27753
  }
27561
27754
  },
27562
27755
  required: ["projectId", "ticketId", "releaseId"]
@@ -27575,17 +27768,17 @@ var assignTicketToReleaseTool = {
27575
27768
  var markReleaseShippedTool = {
27576
27769
  tool: {
27577
27770
  name: "mark_release_shipped",
27578
- description: "Mark a release as shipped/released",
27771
+ description: "Mark a release as shipped. Verify all tickets are complete first with get_release_tickets. To undo, use reopen_release.",
27579
27772
  inputSchema: {
27580
27773
  type: "object",
27581
27774
  properties: {
27582
27775
  projectId: {
27583
27776
  type: "string",
27584
- description: "Project ID"
27777
+ description: "Project ID (format: prj_xxxxx)"
27585
27778
  },
27586
27779
  releaseId: {
27587
27780
  type: "string",
27588
- description: "Release ID"
27781
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27589
27782
  }
27590
27783
  },
27591
27784
  required: ["projectId", "releaseId"]
@@ -27604,17 +27797,17 @@ var markReleaseShippedTool = {
27604
27797
  var getReleaseTicketsTool = {
27605
27798
  tool: {
27606
27799
  name: "get_release_tickets",
27607
- description: "Get all tickets assigned to a release",
27800
+ description: "Get all tickets assigned to a release with their status. Use before mark_release_shipped to verify all tickets are complete.",
27608
27801
  inputSchema: {
27609
27802
  type: "object",
27610
27803
  properties: {
27611
27804
  projectId: {
27612
27805
  type: "string",
27613
- description: "Project ID"
27806
+ description: "Project ID (format: prj_xxxxx)"
27614
27807
  },
27615
27808
  releaseId: {
27616
27809
  type: "string",
27617
- description: "Release ID"
27810
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27618
27811
  }
27619
27812
  },
27620
27813
  required: ["projectId", "releaseId"]
@@ -27633,17 +27826,17 @@ var getReleaseTicketsTool = {
27633
27826
  var updateReleaseTool = {
27634
27827
  tool: {
27635
27828
  name: "update_release",
27636
- description: "Update release details (name, description, target date)",
27829
+ description: "Update release name, description, or target date. Requires the current version for optimistic locking (get from get_release).",
27637
27830
  inputSchema: {
27638
27831
  type: "object",
27639
27832
  properties: {
27640
27833
  projectId: {
27641
27834
  type: "string",
27642
- description: "Project ID"
27835
+ description: "Project ID (format: prj_xxxxx)"
27643
27836
  },
27644
27837
  releaseId: {
27645
27838
  type: "string",
27646
- description: "Release ID"
27839
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27647
27840
  },
27648
27841
  name: {
27649
27842
  type: "string",
@@ -27687,17 +27880,17 @@ var updateReleaseTool = {
27687
27880
  var deleteReleaseTool = {
27688
27881
  tool: {
27689
27882
  name: "delete_release",
27690
- description: "Delete a release (soft delete - can be restored)",
27883
+ description: "Soft-delete a release. Tickets remain but lose their release assignment. Can be restored with restore_release.",
27691
27884
  inputSchema: {
27692
27885
  type: "object",
27693
27886
  properties: {
27694
27887
  projectId: {
27695
27888
  type: "string",
27696
- description: "Project ID"
27889
+ description: "Project ID (format: prj_xxxxx)"
27697
27890
  },
27698
27891
  releaseId: {
27699
27892
  type: "string",
27700
- description: "Release ID"
27893
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27701
27894
  }
27702
27895
  },
27703
27896
  required: ["projectId", "releaseId"]
@@ -27722,11 +27915,11 @@ var reopenReleaseTool = {
27722
27915
  properties: {
27723
27916
  projectId: {
27724
27917
  type: "string",
27725
- description: "Project ID"
27918
+ description: "Project ID (format: prj_xxxxx)"
27726
27919
  },
27727
27920
  releaseId: {
27728
27921
  type: "string",
27729
- description: "Release ID"
27922
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27730
27923
  }
27731
27924
  },
27732
27925
  required: ["projectId", "releaseId"]
@@ -27751,11 +27944,11 @@ var restoreReleaseTool = {
27751
27944
  properties: {
27752
27945
  projectId: {
27753
27946
  type: "string",
27754
- description: "Project ID"
27947
+ description: "Project ID (format: prj_xxxxx)"
27755
27948
  },
27756
27949
  releaseId: {
27757
27950
  type: "string",
27758
- description: "Release ID"
27951
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27759
27952
  }
27760
27953
  },
27761
27954
  required: ["projectId", "releaseId"]
@@ -27774,17 +27967,17 @@ var restoreReleaseTool = {
27774
27967
  var getReleaseBurndownTool = {
27775
27968
  tool: {
27776
27969
  name: "get_release_burndown",
27777
- description: "Get burndown chart data for a release, showing progress over time",
27970
+ description: "Get burndown data for a release: total tickets, completed count, and daily progress. Use for sprint reviews and progress tracking.",
27778
27971
  inputSchema: {
27779
27972
  type: "object",
27780
27973
  properties: {
27781
27974
  projectId: {
27782
27975
  type: "string",
27783
- description: "Project ID"
27976
+ description: "Project ID (format: prj_xxxxx)"
27784
27977
  },
27785
27978
  releaseId: {
27786
27979
  type: "string",
27787
- description: "Release ID"
27980
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27788
27981
  }
27789
27982
  },
27790
27983
  required: ["projectId", "releaseId"]
@@ -27803,17 +27996,17 @@ var getReleaseBurndownTool = {
27803
27996
  var assignTicketsToReleaseTool = {
27804
27997
  tool: {
27805
27998
  name: "assign_tickets_to_release",
27806
- description: "Assign multiple tickets to a release at once (bulk operation)",
27999
+ description: "Assign multiple tickets to a release in one call. The primary tool for sprint planning. Use list_backlog_tickets to find ticket IDs.",
27807
28000
  inputSchema: {
27808
28001
  type: "object",
27809
28002
  properties: {
27810
28003
  projectId: {
27811
28004
  type: "string",
27812
- description: "Project ID"
28005
+ description: "Project ID (format: prj_xxxxx)"
27813
28006
  },
27814
28007
  releaseId: {
27815
28008
  type: "string",
27816
- description: "Release ID"
28009
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27817
28010
  },
27818
28011
  ticketIds: {
27819
28012
  type: "array",
@@ -27837,17 +28030,17 @@ var assignTicketsToReleaseTool = {
27837
28030
  var removeTicketsFromReleaseTool = {
27838
28031
  tool: {
27839
28032
  name: "remove_tickets_from_release",
27840
- description: "Remove multiple tickets from a release (bulk operation)",
28033
+ description: "Remove multiple tickets from a release in one call. Tickets stay in the project but lose their release assignment.",
27841
28034
  inputSchema: {
27842
28035
  type: "object",
27843
28036
  properties: {
27844
28037
  projectId: {
27845
28038
  type: "string",
27846
- description: "Project ID"
28039
+ description: "Project ID (format: prj_xxxxx)"
27847
28040
  },
27848
28041
  releaseId: {
27849
28042
  type: "string",
27850
- description: "Release ID"
28043
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27851
28044
  },
27852
28045
  ticketIds: {
27853
28046
  type: "array",
@@ -27871,13 +28064,13 @@ var removeTicketsFromReleaseTool = {
27871
28064
  var getReleaseDropdownTool = {
27872
28065
  tool: {
27873
28066
  name: "get_release_dropdown",
27874
- description: "Get a minimal list of releases (id and name only) for ticket assignment. Lighter than list_releases.",
28067
+ description: "Get a lightweight list of releases (id and name only). Faster than list_releases. Use when you just need a release ID for ticket assignment.",
27875
28068
  inputSchema: {
27876
28069
  type: "object",
27877
28070
  properties: {
27878
28071
  projectId: {
27879
28072
  type: "string",
27880
- description: "Project ID"
28073
+ description: "Project ID (format: prj_xxxxx)"
27881
28074
  }
27882
28075
  },
27883
28076
  required: ["projectId"]
@@ -27896,13 +28089,13 @@ var getReleaseDropdownTool = {
27896
28089
  var quickSearchReleasesTool = {
27897
28090
  tool: {
27898
28091
  name: "quick_search_releases",
27899
- description: "Search releases by name or description",
28092
+ description: "Search releases by name or description. Returns lightweight results for finding a specific release.",
27900
28093
  inputSchema: {
27901
28094
  type: "object",
27902
28095
  properties: {
27903
28096
  projectId: {
27904
28097
  type: "string",
27905
- description: "Project ID"
28098
+ description: "Project ID (format: prj_xxxxx)"
27906
28099
  },
27907
28100
  search: {
27908
28101
  type: "string",
@@ -27930,17 +28123,17 @@ var quickSearchReleasesTool = {
27930
28123
  var getReleaseHistoryTool = {
27931
28124
  tool: {
27932
28125
  name: "get_release_history",
27933
- description: "Get the changelog/history of a release (status changes, ticket additions, etc.)",
28126
+ description: "Get the audit trail for a release: status changes, ticket additions/removals, and edits.",
27934
28127
  inputSchema: {
27935
28128
  type: "object",
27936
28129
  properties: {
27937
28130
  projectId: {
27938
28131
  type: "string",
27939
- description: "Project ID"
28132
+ description: "Project ID (format: prj_xxxxx)"
27940
28133
  },
27941
28134
  releaseId: {
27942
28135
  type: "string",
27943
- description: "Release ID"
28136
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27944
28137
  },
27945
28138
  limit: {
27946
28139
  type: "number",
@@ -27964,17 +28157,17 @@ var getReleaseHistoryTool = {
27964
28157
  var getReleaseActivitiesTool = {
27965
28158
  tool: {
27966
28159
  name: "get_release_activities",
27967
- description: "Get ticket activities within a release (completions, status changes, etc.)",
28160
+ description: "Get ticket-level activity within a release: completions, status changes, and assignments. Use for sprint review summaries.",
27968
28161
  inputSchema: {
27969
28162
  type: "object",
27970
28163
  properties: {
27971
28164
  projectId: {
27972
28165
  type: "string",
27973
- description: "Project ID"
28166
+ description: "Project ID (format: prj_xxxxx)"
27974
28167
  },
27975
28168
  releaseId: {
27976
28169
  type: "string",
27977
- description: "Release ID"
28170
+ description: "Release ID (format: rel_xxxxx). Use list_releases to find IDs."
27978
28171
  },
27979
28172
  limit: {
27980
28173
  type: "number",
@@ -28019,21 +28212,21 @@ var releaseTools = [
28019
28212
  var getTicketHistoryTool = {
28020
28213
  tool: {
28021
28214
  name: "get_ticket_history",
28022
- description: "Get the change history for a ticket (status changes, assignments, updates, etc.)",
28215
+ description: "Get the full change history for a ticket: status changes, field updates, assignments, and more. Ordered newest-first. Useful for auditing and understanding ticket lifecycle.",
28023
28216
  inputSchema: {
28024
28217
  type: "object",
28025
28218
  properties: {
28026
28219
  projectId: {
28027
28220
  type: "string",
28028
- description: "Project ID"
28221
+ description: "Project ID (format: prj_xxxxx)"
28029
28222
  },
28030
28223
  ticketId: {
28031
28224
  type: "string",
28032
- description: "Ticket ID"
28225
+ description: "Ticket ID (format: tkt_xxxxx)"
28033
28226
  },
28034
28227
  limit: {
28035
28228
  type: "number",
28036
- description: "Maximum history entries to return (default: 50)",
28229
+ description: "Maximum history entries to return (default: 50, max: 200)",
28037
28230
  default: 50
28038
28231
  }
28039
28232
  },
@@ -28053,21 +28246,21 @@ var getTicketHistoryTool = {
28053
28246
  var getProjectActivityTool = {
28054
28247
  tool: {
28055
28248
  name: "get_project_activity",
28056
- description: "Get recent activity across a project (all ticket changes, comments, etc.)",
28249
+ description: "Get recent activity across all tickets in a project: creates, updates, comments, status changes. Useful for standup reports and daily digests. Filter by date range.",
28057
28250
  inputSchema: {
28058
28251
  type: "object",
28059
28252
  properties: {
28060
28253
  projectId: {
28061
28254
  type: "string",
28062
- description: "Project ID"
28255
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28063
28256
  },
28064
28257
  from: {
28065
28258
  type: "string",
28066
- description: "Start date in ISO format (optional)"
28259
+ description: 'Start date in ISO 8601 format (e.g., "2025-01-15T00:00:00Z"). Optional.'
28067
28260
  },
28068
28261
  to: {
28069
28262
  type: "string",
28070
- description: "End date in ISO format (optional)"
28263
+ description: 'End date in ISO 8601 format (e.g., "2025-01-31T23:59:59Z"). Optional.'
28071
28264
  }
28072
28265
  },
28073
28266
  required: ["projectId"]
@@ -28092,13 +28285,13 @@ var historyTools = [
28092
28285
  var getMemberAnalyticsTool = {
28093
28286
  tool: {
28094
28287
  name: "get_member_analytics",
28095
- description: "Get per-member statistics: tickets assigned, completed, and activity for each project member.",
28288
+ description: "Get per-member statistics: tickets assigned, completed, and activity for each project member. Useful for workload balancing and standup reports.",
28096
28289
  inputSchema: {
28097
28290
  type: "object",
28098
28291
  properties: {
28099
28292
  projectId: {
28100
28293
  type: "string",
28101
- description: "Project ID"
28294
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28102
28295
  }
28103
28296
  },
28104
28297
  required: ["projectId"]
@@ -28117,13 +28310,13 @@ var getMemberAnalyticsTool = {
28117
28310
  var getCycleTimeAnalyticsTool = {
28118
28311
  tool: {
28119
28312
  name: "get_cycle_time_analytics",
28120
- description: "Get cycle time analytics: how long tickets take to complete, broken down by status transitions.",
28313
+ description: "Get cycle time analytics: average time tickets spend in each status and total time to completion. Useful for identifying workflow bottlenecks.",
28121
28314
  inputSchema: {
28122
28315
  type: "object",
28123
28316
  properties: {
28124
28317
  projectId: {
28125
28318
  type: "string",
28126
- description: "Project ID"
28319
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28127
28320
  }
28128
28321
  },
28129
28322
  required: ["projectId"]
@@ -28142,13 +28335,13 @@ var getCycleTimeAnalyticsTool = {
28142
28335
  var getDistributionAnalyticsTool = {
28143
28336
  tool: {
28144
28337
  name: "get_distribution_analytics",
28145
- description: "Get distribution charts: tickets by priority, type, tag, assignee, and size.",
28338
+ description: "Get ticket distribution breakdowns: count by priority, type, tag, assignee, and size. Useful for understanding project composition and identifying imbalances.",
28146
28339
  inputSchema: {
28147
28340
  type: "object",
28148
28341
  properties: {
28149
28342
  projectId: {
28150
28343
  type: "string",
28151
- description: "Project ID"
28344
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28152
28345
  }
28153
28346
  },
28154
28347
  required: ["projectId"]
@@ -28174,13 +28367,13 @@ var analyticsTools = [
28174
28367
  var listNotificationsTool = {
28175
28368
  tool: {
28176
28369
  name: "list_notifications",
28177
- description: "List recent notifications for the current user",
28370
+ description: "List recent notifications for the current user (ticket assignments, comments, status changes). Use get_unread_count to check if there are new notifications first.",
28178
28371
  inputSchema: {
28179
28372
  type: "object",
28180
28373
  properties: {
28181
28374
  limit: {
28182
28375
  type: "number",
28183
- description: "Maximum notifications to return (default: 20)",
28376
+ description: "Maximum notifications to return (default: 20, max: 100)",
28184
28377
  default: 20
28185
28378
  }
28186
28379
  }
@@ -28199,7 +28392,7 @@ var listNotificationsTool = {
28199
28392
  var getUnreadCountTool = {
28200
28393
  tool: {
28201
28394
  name: "get_unread_count",
28202
- description: "Get the count of unread notifications",
28395
+ description: "Get the total count of unread notifications. Use this for a quick check before fetching the full list with list_notifications.",
28203
28396
  inputSchema: {
28204
28397
  type: "object",
28205
28398
  properties: {}
@@ -28218,13 +28411,13 @@ var getUnreadCountTool = {
28218
28411
  var markNotificationReadTool = {
28219
28412
  tool: {
28220
28413
  name: "mark_notification_read",
28221
- description: "Mark a specific notification as read",
28414
+ description: "Mark a specific notification as read. Use mark_all_notifications_read to clear all at once.",
28222
28415
  inputSchema: {
28223
28416
  type: "object",
28224
28417
  properties: {
28225
28418
  notificationId: {
28226
28419
  type: "string",
28227
- description: "Notification ID"
28420
+ description: "Notification ID (from list_notifications response)"
28228
28421
  }
28229
28422
  },
28230
28423
  required: ["notificationId"]
@@ -28243,7 +28436,7 @@ var markNotificationReadTool = {
28243
28436
  var markAllNotificationsReadTool = {
28244
28437
  tool: {
28245
28438
  name: "mark_all_notifications_read",
28246
- description: "Mark all notifications as read",
28439
+ description: "Mark all notifications as read in one call. Use this to clear the notification badge.",
28247
28440
  inputSchema: {
28248
28441
  type: "object",
28249
28442
  properties: {}
@@ -28262,7 +28455,7 @@ var markAllNotificationsReadTool = {
28262
28455
  var getUnreadCountsTool = {
28263
28456
  tool: {
28264
28457
  name: "get_unread_counts",
28265
- description: "Get unread notification counts with per-project breakdown",
28458
+ description: "Get unread notification counts with per-project breakdown. More detailed than get_unread_count — shows which projects have pending notifications.",
28266
28459
  inputSchema: {
28267
28460
  type: "object",
28268
28461
  properties: {}
@@ -28290,7 +28483,7 @@ var notificationTools = [
28290
28483
  var polishTitleTool = {
28291
28484
  tool: {
28292
28485
  name: "polish_title",
28293
- description: "Use AI to improve a ticket title - make it clearer and more actionable",
28486
+ description: "AI-powered title improvement. Makes titles clearer and more actionable. Use before create_ticket when the user provides a vague title. Consumes AI token quota (check with get_ai_usage).",
28294
28487
  inputSchema: {
28295
28488
  type: "object",
28296
28489
  properties: {
@@ -28319,7 +28512,7 @@ var polishTitleTool = {
28319
28512
  var generateDescriptionTool = {
28320
28513
  tool: {
28321
28514
  name: "generate_description",
28322
- description: "Use AI to generate a detailed ticket description from a title",
28515
+ description: "AI-generated structured ticket description from a title. Returns markdown with headings and bullet points. Use as a starting point, then refine with refine_description if needed. Consumes AI token quota.",
28323
28516
  inputSchema: {
28324
28517
  type: "object",
28325
28518
  properties: {
@@ -28352,7 +28545,7 @@ var generateDescriptionTool = {
28352
28545
  var findSimilarTicketsTool = {
28353
28546
  tool: {
28354
28547
  name: "find_similar_tickets",
28355
- description: "Find tickets similar to a given query using semantic search. Useful for finding duplicates or related work.",
28548
+ description: "Semantic search for similar tickets. Use BEFORE creating a ticket to check for duplicates. Also useful for finding related work. Returns similarity scores.",
28356
28549
  inputSchema: {
28357
28550
  type: "object",
28358
28551
  properties: {
@@ -28386,7 +28579,7 @@ var findSimilarTicketsTool = {
28386
28579
  var fixGrammarTool = {
28387
28580
  tool: {
28388
28581
  name: "fix_grammar",
28389
- description: "Use AI to fix grammar and spelling in text",
28582
+ description: "AI grammar and spelling correction. Use on ticket descriptions or comments before saving. Preserves markdown formatting. Max 5000 chars input. Consumes AI quota.",
28390
28583
  inputSchema: {
28391
28584
  type: "object",
28392
28585
  properties: {
@@ -28415,7 +28608,7 @@ var fixGrammarTool = {
28415
28608
  var improveClarityTool = {
28416
28609
  tool: {
28417
28610
  name: "improve_clarity",
28418
- description: "Use AI to make text clearer and more concise",
28611
+ description: "AI rewrite for clarity and conciseness. Use on verbose or unclear descriptions. Preserves structure and markdown. Max 5000 chars input. Consumes AI quota.",
28419
28612
  inputSchema: {
28420
28613
  type: "object",
28421
28614
  properties: {
@@ -28444,7 +28637,7 @@ var improveClarityTool = {
28444
28637
  var checkClarityTool = {
28445
28638
  tool: {
28446
28639
  name: "check_clarity",
28447
- description: "Use AI to check if a ticket title needs clarification questions before generating a description",
28640
+ description: "AI check whether a ticket title is clear enough to generate a good description. If unclear, returns clarifying questions to ask the user. Call this before generate_description when the title might be ambiguous.",
28448
28641
  inputSchema: {
28449
28642
  type: "object",
28450
28643
  properties: {
@@ -28473,7 +28666,7 @@ var checkClarityTool = {
28473
28666
  var refineDescriptionTool = {
28474
28667
  tool: {
28475
28668
  name: "refine_description",
28476
- description: "Use AI to refine an existing ticket description based on feedback",
28669
+ description: 'AI refinement of an existing description based on feedback. Pass the current description and natural-language instructions (e.g., "add error handling details", "make it shorter"). Max 1000 chars feedback. Consumes AI quota.',
28477
28670
  inputSchema: {
28478
28671
  type: "object",
28479
28672
  properties: {
@@ -28506,7 +28699,7 @@ var refineDescriptionTool = {
28506
28699
  var suggestAttributesTool = {
28507
28700
  tool: {
28508
28701
  name: "suggest_attributes",
28509
- description: "Use AI to suggest ticket attributes (priority, size, type, tags) based on title and optional description",
28702
+ description: "AI-suggested priority, size, type, and tags based on title and description. Returns IDs matching the project's configured values. Use after writing the description but before create_ticket to auto-fill attributes.",
28510
28703
  inputSchema: {
28511
28704
  type: "object",
28512
28705
  properties: {
@@ -28551,7 +28744,7 @@ var aiTools = [
28551
28744
  var getMCPUsageTool = {
28552
28745
  tool: {
28553
28746
  name: "get_mcp_usage",
28554
- description: "Check MCP usage status - how many requests used today and remaining quota",
28747
+ description: "Check MCP API usage status: requests used today, daily quota, and remaining calls. Call this if you get rate-limit errors.",
28555
28748
  inputSchema: {
28556
28749
  type: "object",
28557
28750
  properties: {}
@@ -28570,7 +28763,7 @@ var getMCPUsageTool = {
28570
28763
  var getAIUsageTool = {
28571
28764
  tool: {
28572
28765
  name: "get_ai_usage",
28573
- description: "Check AI usage status - tokens used this week and remaining quota",
28766
+ description: "Check AI feature usage: tokens consumed this week, weekly quota, and remaining capacity. AI tools (check_clarity, generate_description, etc.) consume tokens from this quota.",
28574
28767
  inputSchema: {
28575
28768
  type: "object",
28576
28769
  properties: {}
@@ -28595,7 +28788,7 @@ var usageTools = [
28595
28788
  var listOrganizationsTool = {
28596
28789
  tool: {
28597
28790
  name: "list_organizations",
28598
- description: "List all organizations the current user belongs to",
28791
+ description: "List all organizations the current user belongs to. Call this first during setup, then use set_organization to pick the active org.",
28599
28792
  inputSchema: {
28600
28793
  type: "object",
28601
28794
  properties: {}
@@ -28617,13 +28810,13 @@ var listOrganizationsTool = {
28617
28810
  var setOrganizationTool = {
28618
28811
  tool: {
28619
28812
  name: "set_organization",
28620
- description: "Set the active organization context for subsequent API calls. Use list_organizations to see available orgs.",
28813
+ description: "Set the active organization context. All subsequent API calls (list_projects, create_ticket, etc.) operate within this org. Call list_organizations first to get available org IDs.",
28621
28814
  inputSchema: {
28622
28815
  type: "object",
28623
28816
  properties: {
28624
28817
  orgId: {
28625
28818
  type: "string",
28626
- description: "Organization ID to set as active"
28819
+ description: "Organization ID to set as active (format: org_xxxxx). Use list_organizations to find IDs."
28627
28820
  }
28628
28821
  },
28629
28822
  required: ["orgId"]
@@ -28650,7 +28843,7 @@ var setOrganizationTool = {
28650
28843
  var getCurrentOrganizationTool = {
28651
28844
  tool: {
28652
28845
  name: "get_current_organization",
28653
- description: "Get the currently active organization context",
28846
+ description: "Get the currently active organization. Returns the org set via set_organization, or the default org if none was set.",
28654
28847
  inputSchema: {
28655
28848
  type: "object",
28656
28849
  properties: {}
@@ -28674,13 +28867,13 @@ var getCurrentOrganizationTool = {
28674
28867
  var listOrgMembersTool = {
28675
28868
  tool: {
28676
28869
  name: "list_organization_members",
28677
- description: "List all members in the current organization",
28870
+ description: "List all members in the current organization. Returns user IDs needed for add_project_member and assigneeId in create_ticket.",
28678
28871
  inputSchema: {
28679
28872
  type: "object",
28680
28873
  properties: {
28681
28874
  search: {
28682
28875
  type: "string",
28683
- description: "Search by name or email (optional)"
28876
+ description: "Filter by name or email substring (optional)"
28684
28877
  }
28685
28878
  }
28686
28879
  }
@@ -28698,13 +28891,13 @@ var listOrgMembersTool = {
28698
28891
  var getMemberProfileTool = {
28699
28892
  tool: {
28700
28893
  name: "get_member_profile",
28701
- description: "Get detailed profile of a specific team member",
28894
+ description: "Get detailed profile of a specific team member including name, email, and avatar.",
28702
28895
  inputSchema: {
28703
28896
  type: "object",
28704
28897
  properties: {
28705
28898
  userId: {
28706
28899
  type: "string",
28707
- description: "User ID to look up"
28900
+ description: "User ID (format: usr_xxxxx). Use list_organization_members to find IDs."
28708
28901
  }
28709
28902
  },
28710
28903
  required: ["userId"]
@@ -28723,7 +28916,7 @@ var getMemberProfileTool = {
28723
28916
  var getMyProfileTool = {
28724
28917
  tool: {
28725
28918
  name: "get_my_profile",
28726
- description: "Get the current user's profile information",
28919
+ description: "Get the current authenticated user's profile: name, email, username, and avatar. Useful to get your own user ID for filtering (e.g., get_my_tickets).",
28727
28920
  inputSchema: {
28728
28921
  type: "object",
28729
28922
  properties: {}
@@ -28759,17 +28952,17 @@ var organizationTools = [
28759
28952
  var getWatchStatusTool = {
28760
28953
  tool: {
28761
28954
  name: "get_watch_status",
28762
- description: "Check if you are watching a ticket",
28955
+ description: "Check if the current user is watching a ticket. Watched tickets send notifications on status changes, comments, and assignments.",
28763
28956
  inputSchema: {
28764
28957
  type: "object",
28765
28958
  properties: {
28766
28959
  projectId: {
28767
28960
  type: "string",
28768
- description: "Project ID"
28961
+ description: "Project ID (format: prj_xxxxx)"
28769
28962
  },
28770
28963
  ticketId: {
28771
28964
  type: "string",
28772
- description: "Ticket ID"
28965
+ description: "Ticket ID (format: tkt_xxxxx)"
28773
28966
  }
28774
28967
  },
28775
28968
  required: ["projectId", "ticketId"]
@@ -28788,17 +28981,17 @@ var getWatchStatusTool = {
28788
28981
  var toggleWatchTool = {
28789
28982
  tool: {
28790
28983
  name: "toggle_watch",
28791
- description: "Toggle watching a ticket. If watching, stops watching. If not watching, starts watching.",
28984
+ description: "Toggle watching a ticket. If currently watching, stops watching (no more notifications). If not watching, starts watching. Use get_watch_status to check current state.",
28792
28985
  inputSchema: {
28793
28986
  type: "object",
28794
28987
  properties: {
28795
28988
  projectId: {
28796
28989
  type: "string",
28797
- description: "Project ID"
28990
+ description: "Project ID (format: prj_xxxxx)"
28798
28991
  },
28799
28992
  ticketId: {
28800
28993
  type: "string",
28801
- description: "Ticket ID"
28994
+ description: "Ticket ID (format: tkt_xxxxx)"
28802
28995
  }
28803
28996
  },
28804
28997
  required: ["projectId", "ticketId"]
@@ -28842,22 +29035,22 @@ async function mapWithConcurrency(items, fn, concurrency = BATCH_CONCURRENCY_LIM
28842
29035
  var batchMoveTicketsTool = {
28843
29036
  tool: {
28844
29037
  name: "batch_move_tickets",
28845
- description: `Move multiple tickets to a new status at once. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch.`,
29038
+ description: `Move multiple tickets to a new status in one call. Use list_statuses to get valid status IDs. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch. Skips tickets where the transition is invalid.`,
28846
29039
  inputSchema: {
28847
29040
  type: "object",
28848
29041
  properties: {
28849
29042
  projectId: {
28850
29043
  type: "string",
28851
- description: "Project ID"
29044
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28852
29045
  },
28853
29046
  ticketIds: {
28854
29047
  type: "array",
28855
29048
  items: { type: "string" },
28856
- description: `Array of ticket IDs to move (max ${LIMITS.BATCH_SIZE_MAX})`
29049
+ description: `Array of ticket IDs to move (format: tkt_xxxxx each, max ${LIMITS.BATCH_SIZE_MAX})`
28857
29050
  },
28858
29051
  toStatusId: {
28859
29052
  type: "string",
28860
- description: "Target status ID"
29053
+ description: "Target status ID (format: sts_xxxxx). Use list_statuses to get valid IDs."
28861
29054
  }
28862
29055
  },
28863
29056
  required: ["projectId", "ticketIds", "toStatusId"]
@@ -28880,18 +29073,18 @@ var batchMoveTicketsTool = {
28880
29073
  var batchCompleteTicketsTool = {
28881
29074
  tool: {
28882
29075
  name: "batch_complete_tickets",
28883
- description: `Complete multiple tickets at once. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch.`,
29076
+ description: `Mark multiple tickets as completed in one call. Equivalent to calling complete_ticket for each. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch. Returns per-ticket success/failure results.`,
28884
29077
  inputSchema: {
28885
29078
  type: "object",
28886
29079
  properties: {
28887
29080
  projectId: {
28888
29081
  type: "string",
28889
- description: "Project ID"
29082
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28890
29083
  },
28891
29084
  ticketIds: {
28892
29085
  type: "array",
28893
29086
  items: { type: "string" },
28894
- description: `Array of ticket IDs to complete (max ${LIMITS.BATCH_SIZE_MAX})`
29087
+ description: `Array of ticket IDs to complete (format: tkt_xxxxx each, max ${LIMITS.BATCH_SIZE_MAX})`
28895
29088
  }
28896
29089
  },
28897
29090
  required: ["projectId", "ticketIds"]
@@ -28928,22 +29121,22 @@ var batchCompleteTicketsTool = {
28928
29121
  var batchAssignTicketsTool = {
28929
29122
  tool: {
28930
29123
  name: "batch_assign_tickets",
28931
- description: `Assign multiple tickets to a user at once. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch.`,
29124
+ description: `Assign multiple tickets to a single user in one call, or pass null to unassign all. Use get_project_members to find valid user IDs. Maximum ${LIMITS.BATCH_SIZE_MAX} tickets per batch.`,
28932
29125
  inputSchema: {
28933
29126
  type: "object",
28934
29127
  properties: {
28935
29128
  projectId: {
28936
29129
  type: "string",
28937
- description: "Project ID"
29130
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
28938
29131
  },
28939
29132
  ticketIds: {
28940
29133
  type: "array",
28941
29134
  items: { type: "string" },
28942
- description: `Array of ticket IDs to assign (max ${LIMITS.BATCH_SIZE_MAX})`
29135
+ description: `Array of ticket IDs to assign (format: tkt_xxxxx each, max ${LIMITS.BATCH_SIZE_MAX})`
28943
29136
  },
28944
29137
  assigneeId: {
28945
29138
  type: ["string", "null"],
28946
- description: "User ID to assign to, or null to unassign all"
29139
+ description: "User ID to assign to (format: usr_xxxxx), or null to unassign all. Use get_project_members to find user IDs."
28947
29140
  }
28948
29141
  },
28949
29142
  required: ["projectId", "ticketIds", "assigneeId"]
@@ -28983,17 +29176,17 @@ var batchTools = [
28983
29176
  var listAttachmentsTool = {
28984
29177
  tool: {
28985
29178
  name: "list_attachments",
28986
- description: "List all attachments on a ticket (read-only)",
29179
+ description: "List all file attachments on a ticket (read-only). Returns file names, sizes, and URLs. Attachments are uploaded via the web UI — this tool only reads them.",
28987
29180
  inputSchema: {
28988
29181
  type: "object",
28989
29182
  properties: {
28990
29183
  projectId: {
28991
29184
  type: "string",
28992
- description: "Project ID"
29185
+ description: "Project ID (format: prj_xxxxx)"
28993
29186
  },
28994
29187
  ticketId: {
28995
29188
  type: "string",
28996
- description: "Ticket ID"
29189
+ description: "Ticket ID (format: tkt_xxxxx)"
28997
29190
  }
28998
29191
  },
28999
29192
  required: ["projectId", "ticketId"]
@@ -29017,13 +29210,13 @@ var attachmentTools = [
29017
29210
  var getAvailableProjectMembersTool = {
29018
29211
  tool: {
29019
29212
  name: "get_available_project_members",
29020
- description: "Get organization members who are NOT yet members of a project. Use this to find users to add to a project.",
29213
+ description: "Get organization members who are NOT yet members of a project. Call this before add_project_member to find users you can add.",
29021
29214
  inputSchema: {
29022
29215
  type: "object",
29023
29216
  properties: {
29024
29217
  projectId: {
29025
29218
  type: "string",
29026
- description: "Project ID"
29219
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
29027
29220
  }
29028
29221
  },
29029
29222
  required: ["projectId"]
@@ -29042,22 +29235,22 @@ var getAvailableProjectMembersTool = {
29042
29235
  var addProjectMemberTool = {
29043
29236
  tool: {
29044
29237
  name: "add_project_member",
29045
- description: "Add an organization member to a project. The user must already be an org member.",
29238
+ description: "Add an organization member to a project. The user must already be an org member — use get_available_project_members to find eligible users.",
29046
29239
  inputSchema: {
29047
29240
  type: "object",
29048
29241
  properties: {
29049
29242
  projectId: {
29050
29243
  type: "string",
29051
- description: "Project ID"
29244
+ description: "Project ID (format: prj_xxxxx). Use list_projects to find IDs."
29052
29245
  },
29053
29246
  userId: {
29054
29247
  type: "string",
29055
- description: "User ID to add (use get_available_project_members to find available users)"
29248
+ description: "User ID to add (format: usr_xxxxx). Use get_available_project_members to find eligible users."
29056
29249
  },
29057
29250
  role: {
29058
29251
  type: "string",
29059
29252
  enum: ["member", "admin"],
29060
- description: "Role in the project (default: member)",
29253
+ description: 'Role in the project: "member" (default) or "admin" (can manage project settings)',
29061
29254
  default: "member"
29062
29255
  }
29063
29256
  },
@@ -29077,22 +29270,22 @@ var addProjectMemberTool = {
29077
29270
  var updateProjectMemberRoleTool = {
29078
29271
  tool: {
29079
29272
  name: "update_project_member_role",
29080
- description: "Update a member's role in a project (e.g., promote to admin or demote to member)",
29273
+ description: "Update a project member's role (promote to admin or demote to member). Requires project admin role.",
29081
29274
  inputSchema: {
29082
29275
  type: "object",
29083
29276
  properties: {
29084
29277
  projectId: {
29085
29278
  type: "string",
29086
- description: "Project ID"
29279
+ description: "Project ID (format: prj_xxxxx)"
29087
29280
  },
29088
29281
  userId: {
29089
29282
  type: "string",
29090
- description: "User ID to update"
29283
+ description: "User ID to update (format: usr_xxxxx). Use get_project_members to find current members."
29091
29284
  },
29092
29285
  role: {
29093
29286
  type: "string",
29094
29287
  enum: ["member", "admin"],
29095
- description: "New role"
29288
+ description: 'New role: "member" or "admin"'
29096
29289
  }
29097
29290
  },
29098
29291
  required: ["projectId", "userId", "role"]
@@ -29111,17 +29304,17 @@ var updateProjectMemberRoleTool = {
29111
29304
  var removeProjectMemberTool = {
29112
29305
  tool: {
29113
29306
  name: "remove_project_member",
29114
- description: "Remove a member from a project. They will lose access to the project but remain in the organization.",
29307
+ description: "Remove a member from a project. They lose project access but remain in the organization. Requires project admin role.",
29115
29308
  inputSchema: {
29116
29309
  type: "object",
29117
29310
  properties: {
29118
29311
  projectId: {
29119
29312
  type: "string",
29120
- description: "Project ID"
29313
+ description: "Project ID (format: prj_xxxxx)"
29121
29314
  },
29122
29315
  userId: {
29123
29316
  type: "string",
29124
- description: "User ID to remove"
29317
+ description: "User ID to remove (format: usr_xxxxx). Use get_project_members to find current members."
29125
29318
  }
29126
29319
  },
29127
29320
  required: ["projectId", "userId"]
@@ -29148,13 +29341,41 @@ var projectMemberTools = [
29148
29341
  var TOOL_INDEX = {
29149
29342
  getting_started: {
29150
29343
  description: "Start here. Set your organization context before using other tools.",
29344
+ setup: 'Run "npx @kanbodev/mcp login" to authenticate and auto-register the MCP server with your editor. Use "npx @kanbodev/mcp install" to re-register with newly installed editors.',
29151
29345
  steps: [
29152
29346
  "1. list_organizations — find your orgs",
29153
29347
  "2. set_organization — set active org (required before most tools)",
29154
29348
  "3. list_projects — discover projects",
29155
- "4. list_statuses see workflow columns for a project"
29349
+ "4. Cache IDs: list_statuses + list_priorities + list_sizes + list_ticket_types + list_tags"
29156
29350
  ]
29157
29351
  },
29352
+ content_quality_guidelines: {
29353
+ description: "Follow these guidelines when creating or updating tickets for professional-quality output.",
29354
+ ticket_title: 'Concise, action-oriented. Start with a verb for tasks/bugs. 1-200 chars. Example: "Implement Google OAuth login flow"',
29355
+ ticket_description: [
29356
+ "Use markdown. Max 5000 chars. Structure with ## headings:",
29357
+ "",
29358
+ "As a [role], I want [goal], so that [benefit].",
29359
+ "",
29360
+ "## Requirements",
29361
+ "- Bullet points of what needs to happen",
29362
+ "",
29363
+ "## Technical Notes",
29364
+ "- Implementation hints, APIs, constraints, `code` references",
29365
+ "",
29366
+ "Use **bold** for key terms, `code` for identifiers, and bullet lists for readability."
29367
+ ].join(`
29368
+ `),
29369
+ acceptance_criteria: [
29370
+ 'JSON string of array: [{"id":"ac-1","text":"Given... When... Then...","isChecked":false}]',
29371
+ "Write 3-8 criteria per ticket in Given/When/Then format.",
29372
+ 'Example: [{"id":"ac-1","text":"Given a user on the login page, When they click Sign in with Google, Then they are redirected to Google OAuth consent screen","isChecked":false}]',
29373
+ "Use unique IDs (ac-1, ac-2, etc.). Set isChecked to false for new tickets. Max 10000 chars total."
29374
+ ].join(`
29375
+ `),
29376
+ tags: "Apply 2-5 tags per ticket after creation using set_ticket_tags. Use lowercase-kebab-case. Common categories: feature area (auth, billing), technology (react, api), work type (feature, bug, refactor). Create missing tags with create_tag first.",
29377
+ ticket_type: "Always set typeSlug when creating tickets. Common types: feature, bug, task, improvement. Use list_ticket_types to see project-specific types."
29378
+ },
29158
29379
  categories: {
29159
29380
  "Organization & Context": {
29160
29381
  tools: ["list_organizations", "set_organization", "get_current_organization", "list_organization_members", "get_member_profile", "get_my_profile"],
@@ -29234,19 +29455,21 @@ var TOOL_INDEX = {
29234
29455
  }
29235
29456
  },
29236
29457
  common_workflows: {
29237
- "Create a ticket": "list_statuses list_priorities list_sizes → create_ticket",
29238
- "Move through workflow": "get_available_transitionsmove_ticket (or complete_ticket)",
29239
- "Sprint planning": "create_releaselist_tickets (backlog) assign_tickets_to_release",
29458
+ "Create a high-quality ticket": "list_statuses + list_priorities + list_sizes + list_ticket_types + list_tags (cache IDs) find_similar_tickets (check duplicates) → create_ticket (with description, acceptanceCriteria, typeSlug) → set_ticket_tags (add 2-5 tags)",
29459
+ "AI-assisted ticket creation": "check_claritypolish_title generate_description → suggest_attributes → create_ticket → set_ticket_tags",
29460
+ "Move through workflow": "get_available_transitionsmove_ticket (or complete_ticket / abandon_ticket)",
29461
+ "Sprint planning": "create_release → list_backlog_tickets → assign_tickets_to_release",
29240
29462
  "Daily standup": "get_my_tickets + get_overdue_tickets + get_tickets_due_soon",
29241
- "AI-assisted creation": "polish_title generate_description suggest_attributes create_ticket",
29242
- "Bulk cleanup": "list_tickets (filter) → batch_complete_tickets or batch_move_tickets"
29463
+ "Release shipping": "get_release_tickets (verify all complete)mark_release_shipped",
29464
+ "Bulk cleanup": "list_tickets (filter) → batch_complete_tickets or batch_move_tickets",
29465
+ "Team workload review": "get_member_analytics + get_distribution_analytics"
29243
29466
  }
29244
29467
  };
29245
29468
  var helpTools = [
29246
29469
  {
29247
29470
  tool: {
29248
29471
  name: "get_help",
29249
- description: "Get a categorized index of all available Kanbo MCP tools and common workflows. Call this first to understand what capabilities are available.",
29472
+ description: "Get the full Kanbo tool index, content quality guidelines, and multi-step workflows. Call this to understand available capabilities, how to create high-quality tickets, or which tools to chain together. Includes guidelines for descriptions, acceptance criteria, and tags.",
29250
29473
  inputSchema: {
29251
29474
  type: "object",
29252
29475
  properties: {
@@ -29340,19 +29563,31 @@ function createMCPServer() {
29340
29563
  instructions: [
29341
29564
  "Kanbo MCP Server — AI-native project management.",
29342
29565
  "",
29343
- "GETTING STARTED:",
29344
- "1. Call list_organizations to see available orgs",
29345
- "2. Call set_organization to set the active org context",
29346
- "3. Call list_projects to discover projects",
29566
+ "DOMAIN MODEL:",
29567
+ "Organization → Projects → Tickets. Tickets live on a Board (active columns), in Backlog, or in Completed/Abandoned areas.",
29568
+ "Each ticket has: title, description (markdown), status, priority, size, type, tags, assignee, acceptance criteria, due date, release, and parent (for subtasks).",
29569
+ "Workflow transitions control which status moves are valid. Tags, priorities, sizes, and types are project-level configuration.",
29570
+ "",
29571
+ "SETUP (required before other calls):",
29572
+ "1. list_organizations → set_organization (sets active org context)",
29573
+ "2. list_projects → pick a project",
29574
+ "3. Cache IDs for the session: list_statuses + list_priorities + list_sizes + list_ticket_types + list_tags",
29347
29575
  "",
29348
- "COMMON WORKFLOWS:",
29349
- "- Create ticket: get statusId from list_statuses, priorityId from list_priorities, sizeId from list_sizes, then call create_ticket",
29350
- "- Move ticket: call move_ticket with toStatusId (check get_available_transitions for valid moves)",
29351
- "- Complete ticket: call complete_ticket",
29352
- "- Find my work: call get_my_tickets",
29353
- "- Sprint planning: create_release, then assign_tickets_to_release",
29576
+ "CREATING HIGH-QUALITY TICKETS:",
29577
+ "Every ticket should have: title, statusId, priorityId, sizeId, typeSlug, description (markdown with ## headings), acceptanceCriteria (Given/When/Then JSON), and tags.",
29578
+ "Description: Use markdown ## Requirements, ## Technical Notes, bullet points, **bold** for key terms, `code` for identifiers. Max 5000 chars.",
29579
+ 'Acceptance criteria: JSON array of [{"id":"ac-1","text":"Given X, When Y, Then Z","isChecked":false}]. Include 3-8 criteria.',
29580
+ "Tags: After create_ticket, call set_ticket_tags (use list_tags first; create missing tags with create_tag).",
29581
+ "Duplicate check: Call find_similar_tickets before creating to avoid duplicates.",
29354
29582
  "",
29355
- "TOOL INDEX: Call get_help for a full categorized list of all available tools."
29583
+ "WORKFLOWS:",
29584
+ "- Create ticket: cache lookups → find_similar_tickets → create_ticket (with description + acceptanceCriteria + typeSlug) → set_ticket_tags",
29585
+ "- AI-assisted: check_clarity → polish_title → generate_description → suggest_attributes → create_ticket → set_ticket_tags",
29586
+ "- Move ticket: get_available_transitions → move_ticket (or complete_ticket / abandon_ticket)",
29587
+ "- Sprint planning: create_release → list_backlog_tickets → assign_tickets_to_release",
29588
+ "- Daily standup: get_my_tickets + get_overdue_tickets + get_tickets_due_soon",
29589
+ "",
29590
+ "TOOL INDEX: Call get_help for full tool list, content quality guidelines, and workflow chains."
29356
29591
  ].join(`
29357
29592
  `)
29358
29593
  });
@@ -43822,6 +44057,9 @@ async function handleCliCommand(command) {
43822
44057
  case "whoami":
43823
44058
  await Promise.resolve().then(() => (init_whoami(), exports_whoami)).then((m) => m.whoami());
43824
44059
  return true;
44060
+ case "install":
44061
+ await Promise.resolve().then(() => (init_install(), exports_install)).then((m) => m.install());
44062
+ return true;
43825
44063
  case "help":
43826
44064
  case "--help":
43827
44065
  case "-h":
@@ -43845,7 +44083,8 @@ function showHelp() {
43845
44083
 
43846
44084
  Commands:
43847
44085
  (none) Start the MCP server (default)
43848
- login Authenticate via browser OAuth
44086
+ login Authenticate via browser OAuth + register MCP server
44087
+ install Register MCP server with detected editors
43849
44088
  logout Remove stored credentials
43850
44089
  whoami Show current authentication status
43851
44090
  help Show this help message
@@ -43859,7 +44098,8 @@ function showHelp() {
43859
44098
  PORT HTTP server port (default: 8081)
43860
44099
 
43861
44100
  Examples:
43862
- kanbo-mcp login # Authenticate via browser
44101
+ kanbo-mcp login # Authenticate + auto-register MCP server
44102
+ kanbo-mcp install # Register MCP server with editors
43863
44103
  kanbo-mcp # Start MCP server
43864
44104
  kanbo-mcp whoami # Check auth status
43865
44105
  `);