@doist/todoist-mcp 13.2.4 → 13.2.5

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
@@ -1,6 +1,6 @@
1
- import { t as s } from "./mcp-server-BSP_a2Pt.js";
2
- import { F as r, a as d, b as i, c as n, d as c, e as l, f as m, h as p, i as f, j as T, k as j, l as g, m as k, n as u, o as v, p as P, q as h, r as b, s as S, u as y, v as A, w as C, x as R, y as x, z as F, g as M, A as O, B as E, C as L, D as w, E as H, G as I, H as W, I as q, J as z, K as B, L as D, M as N, N as U, O as V, P as G, Q as J, R as K, S as Q, T as X, U as Y, V as _, W as Z, X as $, Y as ss } from "./mcp-server-BSP_a2Pt.js";
3
- import { r as es, v as ts } from "./require-valid-todoist-token-DADxW2RL.js";
1
+ import { t as s } from "./mcp-server-B1r-n81f.js";
2
+ import { F as r, a as d, b as i, c as n, d as c, e as l, f as m, h as p, i as f, j as T, k as j, l as g, m as k, n as u, o as v, p as P, q as h, r as b, s as S, u as y, v as A, w as C, x as R, y as x, z as F, g as M, A as O, B as E, C as L, D as w, E as H, G as I, H as W, I as q, J as z, K as B, L as D, M as N, N as U, O as V, P as G, Q as J, R as K, S as Q, T as X, U as Y, V as _, W as Z, X as $, Y as ss } from "./mcp-server-B1r-n81f.js";
3
+ import { r as es, v as ts } from "./require-valid-todoist-token-EELznAMG.js";
4
4
  const e = s;
5
5
  export {
6
6
  r as FEATURE_NAMES,
package/dist/main-http.js CHANGED
@@ -3,8 +3,8 @@ import { isIP as p } from "node:net";
3
3
  import O from "dotenv";
4
4
  import { NodeStreamableHTTPServerTransport as S } from "@modelcontextprotocol/node";
5
5
  import m from "express";
6
- import { g as v } from "./mcp-server-BSP_a2Pt.js";
7
- import { r as w } from "./require-valid-todoist-token-DADxW2RL.js";
6
+ import { g as v } from "./mcp-server-B1r-n81f.js";
7
+ import { r as w } from "./require-valid-todoist-token-EELznAMG.js";
8
8
  function f(t) {
9
9
  return t.startsWith("[") && t.endsWith("]") ? t.slice(1, -1) : t;
10
10
  }
package/dist/main.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport as s } from "@modelcontextprotocol/server/stdio";
3
3
  import c from "dotenv";
4
- import { g as i } from "./mcp-server-BSP_a2Pt.js";
4
+ import { g as i } from "./mcp-server-B1r-n81f.js";
5
5
  function p() {
6
6
  const e = process.env.TODOIST_BASE_URL, r = process.env.TODOIST_API_KEY;
7
7
  if (!r)
@@ -119,7 +119,7 @@ function Ye(e) {
119
119
  const t = e.trim();
120
120
  return /\bHTTP\s*\d{3}\b/i.test(t) || /\bstatus code \d{3}\b/i.test(t) || /^bad request$/i.test(t) || /^unauthorized$/i.test(t) || /^forbidden$/i.test(t) || /^not found$/i.test(t);
121
121
  }
122
- function _e(e) {
122
+ function Pe(e) {
123
123
  if (!e)
124
124
  return;
125
125
  const t = e.match(/\b(?:HTTP|status code)\s*[:#-]?\s*(\d{3})\b/i);
@@ -277,9 +277,9 @@ function st(e) {
277
277
  O(n?.status),
278
278
  O(n?.httpCode),
279
279
  O(n?.http_code),
280
- _e(v(t?.message)),
281
- _e(v(r?.message)),
282
- _e(typeof e == "string" ? e : void 0)
280
+ Pe(v(t?.message)),
281
+ Pe(v(r?.message)),
282
+ Pe(typeof e == "string" ? e : void 0)
283
283
  ), a = F(
284
284
  de(n?.errorCode),
285
285
  de(n?.error_code),
@@ -371,7 +371,7 @@ function yr(e) {
371
371
  const t = st(e);
372
372
  return t ? br(t) : ts(e);
373
373
  }
374
- const Tr = "13.2.4", kr = {
374
+ const Tr = "13.2.5", kr = {
375
375
  version: Tr
376
376
  }, j = {
377
377
  /** Default limit for task listings */
@@ -574,10 +574,10 @@ function as(e, t) {
574
574
  }
575
575
  }) : Cr()[t];
576
576
  }
577
- function Pr(e) {
577
+ function _r(e) {
578
578
  return as(e, "moves");
579
579
  }
580
- function _r(e) {
580
+ function Pr(e) {
581
581
  return as(e, "writes");
582
582
  }
583
583
  const Ur = "todoist-mcp", ot = kr.version, cs = new Gs(), jt = Vs(import.meta.url);
@@ -743,7 +743,7 @@ function so({
743
743
  function ro(e) {
744
744
  return new Promise((t) => setTimeout(t, e));
745
745
  }
746
- async function P(e, t = {}) {
746
+ async function _(e, t = {}) {
747
747
  const r = t.maxRetries ?? Vr, o = t.baseDelayMs ?? Jr, n = t.maxDelayMs ?? Xr, i = t.random;
748
748
  let a;
749
749
  for (let c = 0; c <= r; c++)
@@ -941,7 +941,7 @@ function go({
941
941
  try {
942
942
  let { textContent: h, structuredContent: m, contentItems: y } = await Mr(
943
943
  e.name,
944
- () => P(() => i(l, r))
944
+ () => _(() => i(l, r))
945
945
  );
946
946
  return n && (h && (h = bo(h)), m && (m = Xe(m))), io({ textContent: h, structuredContent: m, contentItems: y });
947
947
  } catch (h) {
@@ -1428,7 +1428,7 @@ async function Oo(e) {
1428
1428
  limit: j.PROJECTS_MAX
1429
1429
  });
1430
1430
  }
1431
- function Po(e) {
1431
+ function _o(e) {
1432
1432
  const t = (i) => i.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&"), r = /(?<!\\)(?:\\\\)*\*/.test(e), o = [...e];
1433
1433
  let n = "";
1434
1434
  for (let i = 0; i < o.length; i++) {
@@ -1437,7 +1437,7 @@ function Po(e) {
1437
1437
  }
1438
1438
  return new RegExp(r ? `^${n}$` : n, "iu");
1439
1439
  }
1440
- async function _o(e, t) {
1440
+ async function Po(e, t) {
1441
1441
  return z({
1442
1442
  apiMethod: e.searchLabels.bind(e),
1443
1443
  args: { query: ct(t) },
@@ -1459,7 +1459,7 @@ async function Ro(e, t, r) {
1459
1459
  limit: j.SECTIONS_MAX
1460
1460
  });
1461
1461
  }
1462
- function _(e) {
1462
+ function P(e) {
1463
1463
  return {
1464
1464
  id: e.id,
1465
1465
  content: e.content,
@@ -1555,7 +1555,7 @@ async function dt({
1555
1555
  }) {
1556
1556
  try {
1557
1557
  const { results: n, nextCursor: i } = await e.getTasksByFilter({ query: t, cursor: o, limit: r });
1558
- return { tasks: n.map(_), nextCursor: i };
1558
+ return { tasks: n.map(P), nextCursor: i };
1559
1559
  } catch (n) {
1560
1560
  const i = No.safeParse(n);
1561
1561
  if (!i.success)
@@ -2223,13 +2223,13 @@ const vs = new kn(), wn = s.object({
2223
2223
  if (!u)
2224
2224
  return Promise.resolve(void 0);
2225
2225
  let l = r.get(u);
2226
- return l || (l = P(
2226
+ return l || (l = _(
2227
2227
  () => vs.resolveWorkspace(t, u)
2228
2228
  ).then(({ workspaceId: p }) => p), r.set(u, l)), l;
2229
2229
  }, n = await Promise.allSettled(
2230
2230
  e.map(async ({ workspace: u, ...l }) => {
2231
2231
  const p = await o(u);
2232
- return await P(
2232
+ return await _(
2233
2233
  () => t.addProject({ ...l, ...p ? { workspaceId: p } : {} })
2234
2234
  );
2235
2235
  })
@@ -2345,7 +2345,7 @@ const je = 25, Ee = s.enum(Qs), Is = s.object({
2345
2345
  }
2346
2346
  }), i = (await Promise.all(o)).map(ke);
2347
2347
  return {
2348
- textContent: Pn(i),
2348
+ textContent: _n(i),
2349
2349
  structuredContent: {
2350
2350
  reminders: i,
2351
2351
  totalCount: i.length,
@@ -2354,7 +2354,7 @@ const je = 25, Ee = s.enum(Qs), Is = s.object({
2354
2354
  };
2355
2355
  }
2356
2356
  };
2357
- function Pn(e) {
2357
+ function _n(e) {
2358
2358
  const { timeBasedCount: t, locationCount: r } = ys(e), o = [];
2359
2359
  if (t > 0) {
2360
2360
  const n = t > 1 ? "reminders" : "reminder";
@@ -2366,14 +2366,14 @@ function Pn(e) {
2366
2366
  }
2367
2367
  return o.length > 0 ? `Added ${o.join(" and ")}` : "No reminders added";
2368
2368
  }
2369
- const _n = s.object({
2369
+ const Pn = s.object({
2370
2370
  name: s.string().min(1).describe("The name of the section."),
2371
2371
  projectId: s.string().min(1).describe(
2372
2372
  'The ID of the project to add the section to. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
2373
2373
  ),
2374
2374
  description: s.string().optional().describe("The description of the section. Supports Markdown.")
2375
2375
  }), Un = {
2376
- sections: s.array(_n).min(1).describe("The array of sections to add.")
2376
+ sections: s.array(Pn).min(1).describe("The array of sections to add.")
2377
2377
  }, Rn = {
2378
2378
  sections: s.array(Y).describe("The created sections."),
2379
2379
  totalCount: s.number().describe("The total number of sections created."),
@@ -2390,14 +2390,14 @@ const _n = s.object({
2390
2390
  outputSchema: Rn,
2391
2391
  annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
2392
2392
  async execute({ sections: e }, t) {
2393
- const r = e.some((c) => B(c.projectId)) ? P(() => t.getUser()) : void 0, o = await Promise.allSettled(
2393
+ const r = e.some((c) => B(c.projectId)) ? _(() => t.getUser()) : void 0, o = await Promise.allSettled(
2394
2394
  e.map(async (c) => {
2395
2395
  const d = B(c.projectId) ? await r : void 0, u = await te({
2396
2396
  projectId: c.projectId,
2397
2397
  user: d,
2398
2398
  client: void 0
2399
2399
  }) ?? c.projectId;
2400
- return P(() => t.addSection({ ...c, projectId: u }));
2400
+ return _(() => t.addSection({ ...c, projectId: u }));
2401
2401
  })
2402
2402
  ), n = [], i = [];
2403
2403
  return o.forEach((c, d) => {
@@ -2675,7 +2675,7 @@ const ft = new Mn(), Ot = rs.TASKS_PER_OPERATION, Fn = s.object({
2675
2675
  isUncompletable: s.boolean().optional().describe(
2676
2676
  "Whether this task should be uncompletable (organizational header). Tasks with isUncompletable: true appear as organizational headers and cannot be completed."
2677
2677
  )
2678
- }), Pt = {
2678
+ }), _t = {
2679
2679
  tasks: s.array(Fn).min(1).max(Ot).describe(`The array of tasks to add (max ${Ot}).`)
2680
2680
  }, Hn = {
2681
2681
  tasks: s.array(K).describe("The created tasks."),
@@ -2687,11 +2687,11 @@ const ft = new Mn(), Ot = rs.TASKS_PER_OPERATION, Fn = s.object({
2687
2687
  }, Wn = {
2688
2688
  name: g.ADD_TASKS,
2689
2689
  description: "Add one or more tasks to a project, section, or parent. Supports assignment to project collaborators.",
2690
- parameters: Pt,
2690
+ parameters: _t,
2691
2691
  outputSchema: Hn,
2692
2692
  annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
2693
2693
  async execute(e, t) {
2694
- const { tasks: r } = s.object(Pt).parse(e), o = /* @__PURE__ */ new Map();
2694
+ const { tasks: r } = s.object(_t).parse(e), o = /* @__PURE__ */ new Map();
2695
2695
  r.forEach((h, m) => {
2696
2696
  const y = Bn(h), f = o.get(y);
2697
2697
  f ? f.push({ task: h, index: m }) : o.set(y, [{ task: h, index: m }]);
@@ -2725,7 +2725,7 @@ const ft = new Mn(), Ot = rs.TASKS_PER_OPERATION, Fn = s.object({
2725
2725
  const h = d.map((y) => `"${y.item}": ${y.error}`).join("; "), m = `All ${d.length} task(s) failed to create: ${h}`;
2726
2726
  throw u ? new ss(m) : new Error(m);
2727
2727
  }
2728
- const l = c.map(_);
2728
+ const l = c.map(P);
2729
2729
  return ne(g.ADD_TASKS, r.length, d, { redactItems: !0 }), {
2730
2730
  textContent: Kn({
2731
2731
  tasks: l,
@@ -3017,7 +3017,7 @@ const Cs = [
3017
3017
  }
3018
3018
  };
3019
3019
  }
3020
- }, _t = 5, js = ["file", "url"], si = {
3020
+ }, Pt = 5, js = ["file", "url"], si = {
3021
3021
  projectId: s.string().min(1).describe("The ID of the project to export as a template."),
3022
3022
  format: s.enum(js).default("file").describe(
3023
3023
  'How to return the template. "file" returns the CSV content, which can be passed straight back to import-project-template. "url" returns a shareable download link instead, and is the better choice for large projects because it does not return the whole file.'
@@ -3062,8 +3062,8 @@ ${c}`,
3062
3062
  }
3063
3063
  };
3064
3064
  function ni({ projectId: e, lines: t }) {
3065
- const r = `Exported project (id=${e}) as a template file (${t.length} row${t.length === 1 ? "" : "s"}).`, o = t.slice(0, _t).join(`
3066
- `), n = t.length - _t;
3065
+ const r = `Exported project (id=${e}) as a template file (${t.length} row${t.length === 1 ? "" : "s"}).`, o = t.slice(0, Pt).join(`
3066
+ `), n = t.length - Pt;
3067
3067
  return n > 0 ? `${r}
3068
3068
 
3069
3069
  ${o}
@@ -3179,7 +3179,7 @@ const $s = ["task", "project", "comment", "section"], ui = {
3179
3179
  const [i, a] = await Promise.all([
3180
3180
  t.getTask(o),
3181
3181
  n ? Ut(() => di(t, o)) : Promise.resolve({})
3182
- ]), c = _(i);
3182
+ ]), c = P(i);
3183
3183
  return {
3184
3184
  textContent: `Found task: ${c.content} • id=${c.id} • priority=${c.priority} • project=${c.projectId}${Rt("subtasks", a)}`,
3185
3185
  structuredContent: {
@@ -3258,7 +3258,7 @@ const $s = ["task", "project", "comment", "section"], ui = {
3258
3258
  );
3259
3259
  let i;
3260
3260
  if (o === "task") {
3261
- const a = await t.getTask(n), c = _(a), d = [c.content];
3261
+ const a = await t.getTask(n), c = P(a), d = [c.content];
3262
3262
  c.description && d.push(`
3263
3263
 
3264
3264
  Description: ${c.description}`), c.dueDate && d.push(`
@@ -3573,7 +3573,7 @@ function gt(e = [], t = "or") {
3573
3573
  return `(${e.map((i) => i.startsWith("@") ? i : `@${i}`).join(` ${r} `)})`;
3574
3574
  }
3575
3575
  const Oi = 7;
3576
- function Pi({
3576
+ function _i({
3577
3577
  since: e,
3578
3578
  until: t,
3579
3579
  userGmtOffset: r,
@@ -3585,7 +3585,7 @@ function Pi({
3585
3585
  until: c
3586
3586
  };
3587
3587
  }
3588
- const _i = {
3588
+ const Pi = {
3589
3589
  getBy: s.enum(["completion", "due"]).default("completion").describe(
3590
3590
  'The method to use to get the tasks: "completion" to get tasks by completion date (ie, when the task was actually completed), "due" to get tasks by due date (ie, when the task was due to be completed by).'
3591
3591
  ),
@@ -3618,7 +3618,7 @@ const _i = {
3618
3618
  }, Ri = {
3619
3619
  name: g.FIND_COMPLETED_TASKS,
3620
3620
  description: 'Get completed tasks in a date range. For "what did I complete/get done" questions, use find-activity instead — it reports completion events, including every occurrence of a recurring task, which this tool does not. since/until are optional and default to a 7-day window when omitted. Includes all collaborators by default. Person-specific queries (summaries, plans, reports) require responsibleUser.',
3621
- parameters: _i,
3621
+ parameters: Pi,
3622
3622
  outputSchema: Ui,
3623
3623
  annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
3624
3624
  async execute(e, t) {
@@ -3643,7 +3643,7 @@ const _i = {
3643
3643
  const w = await t.getUser(), C = w.tzInfo?.gmtString || "+00:00", D = await te({
3644
3644
  projectId: d,
3645
3645
  user: w
3646
- }), T = Pi({
3646
+ }), T = _i({
3647
3647
  since: i,
3648
3648
  until: a,
3649
3649
  userGmtOffset: C
@@ -3665,7 +3665,7 @@ const _i = {
3665
3665
  since: k,
3666
3666
  until: b,
3667
3667
  ...f ? { filterQuery: f, filterLang: "en" } : {}
3668
- }), E = A.map(_);
3668
+ }), E = A.map(P);
3669
3669
  return {
3670
3670
  textContent: Li({
3671
3671
  tasks: E,
@@ -3734,7 +3734,7 @@ const Ni = {
3734
3734
  annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
3735
3735
  async execute(e, t) {
3736
3736
  const [r, o] = await Promise.all([
3737
- e.searchText ? _o(t, e.searchText).then((c) => ({
3737
+ e.searchText ? Po(t, e.searchText).then((c) => ({
3738
3738
  results: c,
3739
3739
  nextCursor: null
3740
3740
  })) : t.getLabels({ limit: e.limit, cursor: e.cursor ?? null }),
@@ -3854,7 +3854,7 @@ const { FIND_PROJECTS: Ds, ADD_TASKS: xs, UPDATE_TASKS: Es } = g, Wi = {
3854
3854
  };
3855
3855
  const c = Os(a, o);
3856
3856
  return {
3857
- textContent: Ps({
3857
+ textContent: _s({
3858
3858
  collaborators: c,
3859
3859
  projectName: n,
3860
3860
  searchTerm: o,
@@ -3898,7 +3898,7 @@ async function Ki({
3898
3898
  };
3899
3899
  const i = Os(n, e);
3900
3900
  return {
3901
- textContent: Ps({
3901
+ textContent: _s({
3902
3902
  collaborators: i,
3903
3903
  projectName: void 0,
3904
3904
  searchTerm: e,
@@ -3932,7 +3932,7 @@ function Os(e, t) {
3932
3932
  (o) => o.name.toLowerCase().includes(r) || o.email.toLowerCase().includes(r)
3933
3933
  );
3934
3934
  }
3935
- function Ps({
3935
+ function _s({
3936
3936
  collaborators: e,
3937
3937
  projectName: t,
3938
3938
  searchTerm: r,
@@ -3992,7 +3992,7 @@ const { ADD_PROJECTS: Mt } = g, Yi = {
3992
3992
  const c = Promise.resolve([]), [d, u] = await Promise.all([
3993
3993
  o === "archived" ? c : r ? bs(t, r) : gs(t),
3994
3994
  o === "active" ? c : Oo(t)
3995
- ]), l = r ? Po(r) : null, p = l ? u.filter((h) => l.test(h.name)) : u;
3995
+ ]), l = r ? _o(r) : null, p = l ? u.filter((h) => l.test(h.name)) : u;
3996
3996
  n = [...d, ...p];
3997
3997
  } else {
3998
3998
  const c = o === "archived" ? await t.getArchivedProjects({
@@ -4178,7 +4178,7 @@ function ia({
4178
4178
  zeroReasonHints: o
4179
4179
  });
4180
4180
  }
4181
- function _s(e) {
4181
+ function Ps(e) {
4182
4182
  return /* @__PURE__ */ new Date(`${e}T00:00:00`);
4183
4183
  }
4184
4184
  const aa = {
@@ -4231,7 +4231,7 @@ const aa = {
4231
4231
  } else
4232
4232
  d = e.overdueOption === "exclude-overdue" ? "today" : "(today | overdue)";
4233
4233
  else if (e.startDate) {
4234
- const y = e.startDate, f = We(_s(y), e.daysCount), w = yt(f, { representation: "date" });
4234
+ const y = e.startDate, f = We(Ps(y), e.daysCount), w = yt(f, { representation: "date" });
4235
4235
  d = `(due after: ${y} | due: ${y}) & due before: ${w}`;
4236
4236
  }
4237
4237
  const u = gt(e.labels, e.labelsOperator);
@@ -4276,7 +4276,7 @@ function la({
4276
4276
  `today${c}${t.daysCount > 1 ? ` + ${t.daysCount - 1} more days` : ""}`
4277
4277
  );
4278
4278
  } else if (t.startDate) {
4279
- const c = t.daysCount > 1 ? ` to ${he(We(_s(t.startDate), t.daysCount))}` : "";
4279
+ const c = t.daysCount > 1 ? ` to ${he(We(Ps(t.startDate), t.daysCount))}` : "";
4280
4280
  n.push(`${t.startDate}${c}`);
4281
4281
  }
4282
4282
  if (t.labels && t.labels.length > 0) {
@@ -4446,7 +4446,7 @@ const ha = new pa(), { FIND_COMPLETED_TASKS: Ft, ADD_TASKS: Ht } = g, ma = {
4446
4446
  cursor: y ?? null
4447
4447
  };
4448
4448
  o && (E.projectId = await te({ projectId: o, user: f })), n && (E.sectionId = n), i && (E.parentId = i);
4449
- const { results: Ie, nextCursor: J } = await t.getTasks(E), ie = Ie.map(_);
4449
+ const { results: Ie, nextCursor: J } = await t.getTasks(E), ie = Ie.map(P);
4450
4450
  let M = r ? ie.filter(
4451
4451
  (ae) => ae.content.toLowerCase().includes(r.toLowerCase()) || ae.description?.toLowerCase().includes(r.toLowerCase())
4452
4452
  ) : ie;
@@ -4456,9 +4456,9 @@ const ha = new pa(), { FIND_COMPLETED_TASKS: Ft, ADD_TASKS: Ht } = g, ma = {
4456
4456
  currentUserId: f.id,
4457
4457
  responsibleUserFiltering: c
4458
4458
  }), l && l.length > 0 && (M = p === "and" ? M.filter(
4459
- (ae) => l.every((Pe) => ae.labels.includes(Pe))
4459
+ (ae) => l.every((_e) => ae.labels.includes(_e))
4460
4460
  ) : M.filter(
4461
- (ae) => l.some((Pe) => ae.labels.includes(Pe))
4461
+ (ae) => l.some((_e) => ae.labels.includes(_e))
4462
4462
  )), {
4463
4463
  textContent: Re({
4464
4464
  tasks: M,
@@ -4487,7 +4487,7 @@ const ha = new pa(), { FIND_COMPLETED_TASKS: Ft, ADD_TASKS: Ht } = g, ma = {
4487
4487
  lang: "en",
4488
4488
  limit: d,
4489
4489
  cursor: y ?? null
4490
- }), ie = Ie.map(_);
4490
+ }), ie = Ie.map(P);
4491
4491
  return {
4492
4492
  textContent: Re({
4493
4493
  tasks: ie,
@@ -4607,7 +4607,7 @@ function Re({
4607
4607
  }
4608
4608
  const ya = {
4609
4609
  projectId: s.string().min(1).optional().describe(
4610
- 'Optional project ID. Use "inbox" for the Inbox. If provided, shows detailed overview of that project. If omitted, shows overview of all projects.'
4610
+ `Optional project ID. Use "inbox" for the Inbox. If provided, returns that project's tasks grouped by section. If omitted, returns the project and section structure for the whole account with no tasks.`
4611
4611
  )
4612
4612
  }, Us = s.lazy(
4613
4613
  () => s.object({
@@ -4743,7 +4743,7 @@ async function va(e, t) {
4743
4743
  limit: j.TASKS_BATCH_SIZE,
4744
4744
  cursor: o ?? void 0
4745
4745
  });
4746
- r = r.concat(n.map(_)), o = i ?? void 0;
4746
+ r = r.concat(n.map(P)), o = i ?? void 0;
4747
4747
  } while (o);
4748
4748
  return r;
4749
4749
  }
@@ -4763,7 +4763,10 @@ async function Sa(e) {
4763
4763
  c.push(...Rs(p, a));
4764
4764
  else
4765
4765
  c.push("_No projects found._");
4766
- c.push("");
4766
+ c.push(""), c.push(
4767
+ `_Note: This overview lists projects and sections only; tasks are not included. Call ${g.GET_OVERVIEW} with a projectId (or "inbox") to see a project's tasks._`,
4768
+ ""
4769
+ );
4767
4770
  const d = n.some((p) => p.children.length > 0);
4768
4771
  d && c.push(
4769
4772
  "_Note: Indentation indicates that a project is a sub-project of the one above it. This allows for organizing projects hierarchically, with parent projects containing related sub-projects._",
@@ -4837,7 +4840,7 @@ async function Ca(e, t) {
4837
4840
  }
4838
4841
  const ja = {
4839
4842
  name: g.GET_OVERVIEW,
4840
- description: "Get a Markdown overview. If no projectId is provided, shows all projects with hierarchy and sections (useful for navigation). If projectId is provided, shows detailed overview of that specific project including all tasks grouped by sections.",
4843
+ description: `Get a Markdown overview. Called without a projectId, returns the account's project and section structure only no tasks — for navigation. Pass a projectId (or "inbox" for the Inbox) to get that project's tasks grouped by section.`,
4841
4844
  parameters: ya,
4842
4845
  outputSchema: Ta,
4843
4846
  annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
@@ -4994,7 +4997,7 @@ const Ea = {
4994
4997
  })
4995
4998
  ).optional().describe("Weekly completion rollups. Only included when includeWeeklyCounts is true.")
4996
4999
  };
4997
- function Pa(e, t) {
5000
+ function _a(e, t) {
4998
5001
  const r = [`# Activity Stats: Project ${e}`, ""];
4999
5002
  if (t.dayItems.length > 0) {
5000
5003
  r.push("## Daily Activity");
@@ -5010,7 +5013,7 @@ function Pa(e, t) {
5010
5013
  return r.join(`
5011
5014
  `);
5012
5015
  }
5013
- const _a = {
5016
+ const Pa = {
5014
5017
  name: g.GET_PROJECT_ACTIVITY_STATS,
5015
5018
  description: "Get daily and optional weekly task completion counts for a project over a configurable time window (1-12 weeks). Useful for identifying completion trends and patterns.",
5016
5019
  parameters: Ea,
@@ -5026,7 +5029,7 @@ const _a = {
5026
5029
  includeWeeklyCounts: n
5027
5030
  });
5028
5031
  return {
5029
- textContent: Pa(r, i),
5032
+ textContent: _a(r, i),
5030
5033
  structuredContent: {
5031
5034
  projectId: r,
5032
5035
  dayItems: i.dayItems,
@@ -5282,7 +5285,7 @@ const Ya = {
5282
5285
  projectId: e,
5283
5286
  file: r ?? "",
5284
5287
  fileName: "template.csv"
5285
- }), a = i.sections.map(G), c = i.tasks.map(_), d = i.comments.map(we), u = i.projects.length + a.length + c.length + d.length;
5288
+ }), a = i.sections.map(G), c = i.tasks.map(P), d = i.comments.map(we), u = i.projects.length + a.length + c.length + d.length;
5286
5289
  return {
5287
5290
  textContent: Ja({
5288
5291
  projectId: e,
@@ -5827,7 +5830,7 @@ const cc = {
5827
5830
  const u = d instanceof Error ? d.message : String(d);
5828
5831
  throw new Error(`Reschedule failed: ${u}`);
5829
5832
  }
5830
- const i = await Promise.all(r.map((d) => t.getTask(d.id))), a = i.map(_);
5833
+ const i = await Promise.all(r.map((d) => t.getTask(d.id))), a = i.map(P);
5831
5834
  return {
5832
5835
  textContent: pt("Rescheduled", a, {
5833
5836
  showDetails: a.length <= 5
@@ -5967,7 +5970,7 @@ const Dc = s.object({
5967
5970
  async execute(e, t) {
5968
5971
  const { comments: r } = e, o = r.map(async (c) => await t.updateComment(c.id, { content: c.content })), i = (await Promise.all(o)).map(we);
5969
5972
  return {
5970
- textContent: Pc({
5973
+ textContent: _c({
5971
5974
  comments: i
5972
5975
  }),
5973
5976
  structuredContent: {
@@ -5981,7 +5984,7 @@ const Dc = s.object({
5981
5984
  };
5982
5985
  }
5983
5986
  };
5984
- function Pc({ comments: e }) {
5987
+ function _c({ comments: e }) {
5985
5988
  const t = e.filter((i) => i.taskId).length, r = e.filter((i) => i.projectId).length, o = [];
5986
5989
  if (t > 0) {
5987
5990
  const i = t > 1 ? "comments" : "comment";
@@ -5993,7 +5996,7 @@ function Pc({ comments: e }) {
5993
5996
  }
5994
5997
  return o.length > 0 ? `Updated ${o.join(" and ")}` : "No comments updated";
5995
5998
  }
5996
- const _c = s.object({
5999
+ const Pc = s.object({
5997
6000
  id: s.string().min(1).describe("The ID of the filter to update."),
5998
6001
  name: s.string().min(1).optional().describe("The new name of the filter."),
5999
6002
  query: s.string().min(1).optional().describe(
@@ -6009,7 +6012,7 @@ const _c = s.object({
6009
6012
  color: fe,
6010
6013
  isFavorite: s.boolean().optional().describe("Whether to mark the filter as a favorite.")
6011
6014
  }), Uc = {
6012
- filters: s.array(_c).min(1).describe("The filters to update.")
6015
+ filters: s.array(Pc).min(1).describe("The filters to update.")
6013
6016
  }, Rc = {
6014
6017
  filters: s.array(ut).describe("The updated filters."),
6015
6018
  totalCount: s.number().describe("The total number of filters updated."),
@@ -6239,7 +6242,7 @@ const Vc = s.object({
6239
6242
  const l = ed(u);
6240
6243
  if (l !== null) return { kind: "skipped", reason: l };
6241
6244
  const { id: p, ...h } = u;
6242
- return { kind: "updated", project: await P(() => t.updateProject(p, h)) };
6245
+ return { kind: "updated", project: await _(() => t.updateProject(p, h)) };
6243
6246
  })
6244
6247
  ), n = [], i = [];
6245
6248
  let a = 0, c = 0;
@@ -6601,7 +6604,7 @@ const gd = s.object({
6601
6604
  const b = h.get(k.index);
6602
6605
  b && "task" in b && (o[k.index] = { kind: "updated", task: b.task });
6603
6606
  }
6604
- const { updatedTasks: w, failures: C, skippedCount: D } = Sd({ tasks: r, outcomes: o }), T = u.filter((k) => k.redundantMoveSkipped).length, I = w.map(_);
6607
+ const { updatedTasks: w, failures: C, skippedCount: D } = Sd({ tasks: r, outcomes: o }), T = u.filter((k) => k.redundantMoveSkipped).length, I = w.map(P);
6605
6608
  return ne(g.UPDATE_TASKS, r.length, C), {
6606
6609
  textContent: Ed({
6607
6610
  tasks: I,
@@ -6645,7 +6648,7 @@ async function Cd(e, t) {
6645
6648
  if (!e.some((r) => B(r.projectId)))
6646
6649
  return {};
6647
6650
  try {
6648
- return { projectId: (await P(() => t.getUser())).inboxProjectId };
6651
+ return { projectId: (await _(() => t.getUser())).inboxProjectId };
6649
6652
  } catch (r) {
6650
6653
  return { error: r };
6651
6654
  }
@@ -6661,7 +6664,7 @@ async function Hs({
6661
6664
  const o = new Set(t), n = {
6662
6665
  ids: t.join(","),
6663
6666
  limit: et
6664
- }, { results: i } = await P(() => e.getTasks(n));
6667
+ }, { results: i } = await _(() => e.getTasks(n));
6665
6668
  for (const a of i)
6666
6669
  o.has(a.id) && r.set(a.id, a);
6667
6670
  } catch {
@@ -6681,19 +6684,19 @@ async function jd({
6681
6684
  const d = md(c.move), u = n.get(d);
6682
6685
  u ? u.push(c) : n.set(d, [c]);
6683
6686
  }
6684
- const i = Pr(e), a = [];
6687
+ const i = _r(e), a = [];
6685
6688
  for (const c of n.values()) {
6686
6689
  const d = [...new Set(c.map(({ item: p }) => p.id))], u = c[0]?.move, l = c.length === 1 ? c[0] : void 0;
6687
6690
  try {
6688
6691
  if (l) {
6689
6692
  const f = await i(
6690
- () => P(() => e.moveTask(l.item.id, u))
6693
+ () => _(() => e.moveTask(l.item.id, u))
6691
6694
  );
6692
6695
  r.set(l.item.index, { task: f }), o(c);
6693
6696
  continue;
6694
6697
  }
6695
6698
  const p = await i(
6696
- () => P(() => e.moveTasks(d, u))
6699
+ () => _(() => e.moveTasks(d, u))
6697
6700
  ), h = new Map(p.map((f) => [f.id, f])), m = [], y = [];
6698
6701
  for (const f of c) {
6699
6702
  const w = h.get(f.item.id);
@@ -6738,12 +6741,12 @@ async function Ad({
6738
6741
  onUpdated: r,
6739
6742
  onFailed: o
6740
6743
  }) {
6741
- const n = _r(e);
6744
+ const n = Pr(e);
6742
6745
  await Promise.all(
6743
6746
  t.filter((i) => Fs(i.updateArgs)).map(async (i) => {
6744
6747
  try {
6745
6748
  const a = await n(
6746
- () => P(() => e.updateTask(i.id, i.updateArgs))
6749
+ () => _(() => e.updateTask(i.id, i.updateArgs))
6747
6750
  );
6748
6751
  r(i, a);
6749
6752
  } catch (a) {
@@ -6859,7 +6862,7 @@ function qt(e, t, r) {
6859
6862
  const o = e.trim().toLowerCase();
6860
6863
  return t.includes(o) ? r : e;
6861
6864
  }
6862
- const Pd = {}, _d = {
6865
+ const _d = {}, Pd = {
6863
6866
  type: s.literal("user_info").describe("The type of the response."),
6864
6867
  userId: s.string().describe("The user ID."),
6865
6868
  fullName: s.string().describe("The full name of the user."),
@@ -6963,8 +6966,8 @@ async function Wd(e) {
6963
6966
  const Bd = {
6964
6967
  name: g.USER_INFO,
6965
6968
  description: "Get comprehensive user information including user ID, full name, email, timezone with current local time, week start day preferences, current week dates, daily/weekly goal progress, and user plan (Free/Pro/Business).",
6966
- parameters: Pd,
6967
- outputSchema: _d,
6969
+ parameters: _d,
6970
+ outputSchema: Pd,
6968
6971
  annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
6969
6972
  async execute(e, t) {
6970
6973
  const r = await Wd(t);
@@ -7120,7 +7123,7 @@ const Xd = {
7120
7123
  getProductivityStats: Da,
7121
7124
  // Health and insights tools
7122
7125
  getProjectHealth: Fa,
7123
- getProjectActivityStats: _a,
7126
+ getProjectActivityStats: Pa,
7124
7127
  analyzeProjectHealth: Gn,
7125
7128
  getWorkspaceInsights: za,
7126
7129
  // General tools
@@ -7230,7 +7233,7 @@ export {
7230
7233
  eo as $,
7231
7234
  ja as A,
7232
7235
  Da as B,
7233
- _a as C,
7236
+ Pa as C,
7234
7237
  Fa as D,
7235
7238
  za as E,
7236
7239
  fl as F,
@@ -1,4 +1,4 @@
1
- import { Z as A, _, $ as T } from "./mcp-server-BSP_a2Pt.js";
1
+ import { Z as A, _, $ as T } from "./mcp-server-B1r-n81f.js";
2
2
  const v = /* @__PURE__ */ new Set([401, 403]);
3
3
  function y(e) {
4
4
  const t = T(e);
@@ -1 +1 @@
1
- {"version":3,"file":"get-overview.d.ts","sourceRoot":"","sources":["../../src/tools/get-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAuC,MAAM,oBAAoB,CAAA;AAEjF,OAAO,EAAiB,KAAK,cAAc,EAAoB,MAAM,4BAA4B,CAAA;AA4NjG,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC/B,CAAA;AAED,KAAK,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAA;IACxB,KAAK,CAAC,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,cAAc,EAAE,CAAA;KAC7B,CAAA;IACD,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG;QAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC,CAAA;IAChE,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,MAAM,CAAA;QACrB,mBAAmB,EAAE,MAAM,CAAA;KAC9B,CAAA;CACJ,CAAA;AAmKD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBArZT,MAAM;kBACJ,MAAM;uBACD,MAAM;uBACN,MAAM;wBACL,MAAM;sBACR,cAAc,EAAE;sBAChB,OAAO,EAAE;;gBANf,MAAM;kBACJ,MAAM;uBACD,MAAM;uBACN,MAAM;wBACL,MAAM;sBACR,cAAc,EAAE;sBAChB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiawC,CAAA;AAE/D,OAAO,EAAE,KAAK,yBAAyB,EAAE,WAAW,EAAE,KAAK,yBAAyB,EAAE,CAAA"}
1
+ {"version":3,"file":"get-overview.d.ts","sourceRoot":"","sources":["../../src/tools/get-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,UAAU,EAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAuC,MAAM,oBAAoB,CAAA;AAEjF,OAAO,EAAiB,KAAK,cAAc,EAAoB,MAAM,4BAA4B,CAAA;AA4NjG,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAA;CAC/B,CAAA;AAED,KAAK,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAA;IACxB,KAAK,CAAC,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,cAAc,EAAE,CAAA;KAC7B,CAAA;IACD,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,KAAK,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAA;IACxB,OAAO,EAAE;QACL,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG;QAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC,CAAA;IAChE,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,MAAM,CAAA;QACrB,mBAAmB,EAAE,MAAM,CAAA;KAC9B,CAAA;CACJ,CAAA;AAuKD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAzZT,MAAM;kBACJ,MAAM;uBACD,MAAM;uBACN,MAAM;wBACL,MAAM;sBACR,cAAc,EAAE;sBAChB,OAAO,EAAE;;gBANf,MAAM;kBACJ,MAAM;uBACD,MAAM;uBACN,MAAM;wBACL,MAAM;sBACR,cAAc,EAAE;sBAChB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqawC,CAAA;AAE/D,OAAO,EAAE,KAAK,yBAAyB,EAAE,WAAW,EAAE,KAAK,yBAAyB,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doist/todoist-mcp",
3
- "version": "13.2.4",
3
+ "version": "13.2.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -65,7 +65,7 @@
65
65
  "prepare": "husky"
66
66
  },
67
67
  "dependencies": {
68
- "@doist/todoist-sdk": "15.1.0",
68
+ "@doist/todoist-sdk": "15.2.0",
69
69
  "@modelcontextprotocol/ext-apps": "1.2.2",
70
70
  "date-fns": "4.1.0",
71
71
  "dompurify": "3.3.3",
@@ -89,7 +89,7 @@
89
89
  "@types/morgan": "1.9.10",
90
90
  "@types/node": "22.20.1",
91
91
  "@types/react": "19.2.18",
92
- "@types/react-dom": "19.2.5",
92
+ "@types/react-dom": "19.2.7",
93
93
  "@vitejs/plugin-react": "5.2.0",
94
94
  "concurrently": "9.2.4",
95
95
  "conventional-changelog-conventionalcommits": "9.3.1",