@togglhq/mcp 1.11.223 → 1.11.225

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/build/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as getProductAnalyticsDistinctId, c as resolvePublicSentryDsn, i as captureToolInvocation, l as shutdownProductAnalytics, n as runMcpCli, o as initProductAnalytics, r as PUBLIC_SENTRY_PRIVACY_OPTIONS, s as resolveProductAnalyticsDistinctId } from "./src-DldEugLk.js";
2
+ import { a as getProductAnalyticsDistinctId, c as resolvePublicSentryDsn, i as captureToolInvocation, l as shutdownProductAnalytics, n as runMcpCli, o as initProductAnalytics, r as PUBLIC_SENTRY_PRIVACY_OPTIONS, s as resolveProductAnalyticsDistinctId } from "./src-H-pxotgE.js";
3
3
  import * as Sentry from "@sentry/node";
4
4
  //#region src/analytics-tool-metadata.ts
5
5
  /**
@@ -162,7 +162,7 @@ function wrapServerWithProductAnalytics(server) {
162
162
  }
163
163
  //#endregion
164
164
  //#region src/cli.ts
165
- const packageVersion = "1.11.223";
165
+ const packageVersion = "1.11.225";
166
166
  let sentryEnabled = false;
167
167
  let productAnalyticsEnabled = false;
168
168
  runMcpCli({
package/build/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import { n as runMcpCli, t as bootstrapServer } from "./src-DldEugLk.js";
2
+ import { n as runMcpCli, t as bootstrapServer } from "./src-H-pxotgE.js";
3
3
  export { bootstrapServer, runMcpCli };
@@ -35325,7 +35325,7 @@ const TaskCreatePayloadSchema = /* @__PURE__ */ object({
35325
35325
  color: /* @__PURE__ */ optional(/* @__PURE__ */ string()),
35326
35326
  custom_fields: /* @__PURE__ */ optional(/* @__PURE__ */ record(/* @__PURE__ */ string(), /* @__PURE__ */ unknown())),
35327
35327
  description: /* @__PURE__ */ optional(/* @__PURE__ */ string()),
35328
- end_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())),
35328
+ end_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()), /* @__PURE__ */ description("Send together with start_date; must be on or after start_date."))),
35329
35329
  estimate_type: /* @__PURE__ */ optional(/* @__PURE__ */ picklist(["daily", "total"])),
35330
35330
  estimated_mins: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ number(), /* @__PURE__ */ minValue(0))),
35331
35331
  notes: /* @__PURE__ */ optional(/* @__PURE__ */ string()),
@@ -35343,7 +35343,7 @@ const TaskCreatePayloadSchema = /* @__PURE__ */ object({
35343
35343
  project_id: /* @__PURE__ */ optional(/* @__PURE__ */ number()),
35344
35344
  rollup_enabled: /* @__PURE__ */ optional(/* @__PURE__ */ boolean()),
35345
35345
  rrule: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35346
- start_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())),
35346
+ start_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()), /* @__PURE__ */ description("Send together with end_date; a date without the other is rejected."))),
35347
35347
  status_id: /* @__PURE__ */ optional(/* @__PURE__ */ number()),
35348
35348
  tag_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number()))),
35349
35349
  team_assignee_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number())))
@@ -35365,7 +35365,7 @@ const TaskPartialUpdatePayloadSchema = /* @__PURE__ */ object({
35365
35365
  color: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35366
35366
  custom_fields: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ object({}))),
35367
35367
  description: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35368
- end_date: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()))),
35368
+ end_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())), /* @__PURE__ */ description("Send together with start_date; must be on or after start_date."))),
35369
35369
  estimate_type: /* @__PURE__ */ optional(/* @__PURE__ */ picklist(["daily", "total"])),
35370
35370
  estimated_mins: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ number(), /* @__PURE__ */ minValue(0)))),
35371
35371
  name: /* @__PURE__ */ optional(/* @__PURE__ */ string()),
@@ -35388,7 +35388,7 @@ const TaskPartialUpdatePayloadSchema = /* @__PURE__ */ object({
35388
35388
  repeat_planned_time_entry_id: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ number()), /* @__PURE__ */ description("RepeatPlannedTimeEntryID is the declared initial-selection input that will start a series from an existing planned entry (PR 11). Any supplied value — an ID or JSON null — is rejected until then; the contract is declared in docs/recurring-pr2a-additive-schema.md. json.RawMessage keeps absent distinguishable from explicit null on decode and is omitted on marshal when never set."))),
35389
35389
  rollup_enabled: /* @__PURE__ */ optional(/* @__PURE__ */ boolean()),
35390
35390
  rrule: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35391
- start_date: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()))),
35391
+ start_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())), /* @__PURE__ */ description("Send together with end_date; a date without the other is rejected."))),
35392
35392
  status_id: /* @__PURE__ */ optional(/* @__PURE__ */ number()),
35393
35393
  tag_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number()))),
35394
35394
  team_assignee_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number())))
@@ -35403,7 +35403,7 @@ const TaskPartialUpdatePayloadWithIDSchema = /* @__PURE__ */ object({
35403
35403
  color: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35404
35404
  custom_fields: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ object({}))),
35405
35405
  description: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35406
- end_date: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()))),
35406
+ end_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())), /* @__PURE__ */ description("Send together with start_date; must be on or after start_date."))),
35407
35407
  estimate_type: /* @__PURE__ */ optional(/* @__PURE__ */ picklist(["daily", "total"])),
35408
35408
  estimated_mins: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ number(), /* @__PURE__ */ minValue(0)))),
35409
35409
  name: /* @__PURE__ */ optional(/* @__PURE__ */ string()),
@@ -35425,7 +35425,7 @@ const TaskPartialUpdatePayloadWithIDSchema = /* @__PURE__ */ object({
35425
35425
  repeat_planned_time_entry_id: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ number()), /* @__PURE__ */ description("RepeatPlannedTimeEntryID is the declared initial-selection input that will start a series from an existing planned entry (PR 11). Any supplied value — an ID or JSON null — is rejected until then; the contract is declared in docs/recurring-pr2a-additive-schema.md. json.RawMessage keeps absent distinguishable from explicit null on decode and is omitted on marshal when never set."))),
35426
35426
  rollup_enabled: /* @__PURE__ */ optional(/* @__PURE__ */ boolean()),
35427
35427
  rrule: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ string())),
35428
- start_date: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate()))),
35428
+ start_date: /* @__PURE__ */ optional(/* @__PURE__ */ pipe(/* @__PURE__ */ nullable(/* @__PURE__ */ pipe(/* @__PURE__ */ string(), /* @__PURE__ */ isoDate())), /* @__PURE__ */ description("Send together with end_date; a date without the other is rejected."))),
35429
35429
  status_id: /* @__PURE__ */ optional(/* @__PURE__ */ number()),
35430
35430
  tag_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number()))),
35431
35431
  team_assignee_ids: /* @__PURE__ */ optional(/* @__PURE__ */ nullable(/* @__PURE__ */ array(/* @__PURE__ */ number())))
@@ -40592,7 +40592,7 @@ function createAuthenticatedClientProxy() {
40592
40592
  } });
40593
40593
  }
40594
40594
  //#endregion
40595
- //#region ../operations/build/validation-CLozpAO5.js
40595
+ //#region ../operations/build/validation-B7kaDM75.js
40596
40596
  const optionalNumber = /* @__PURE__ */ optional$1(/* @__PURE__ */ number$2());
40597
40597
  const perPageField = (max) => /* @__PURE__ */ optional$1(/* @__PURE__ */ pipe$2(/* @__PURE__ */ number$2(), /* @__PURE__ */ integer(), /* @__PURE__ */ minValue$1(1), /* @__PURE__ */ maxValue$1(max), /* @__PURE__ */ description$1(`Results per page (1-${max})`)));
40598
40598
  const perPageSchema = perPageField(100);
@@ -40874,6 +40874,107 @@ const rateOverrides = {
40874
40874
  "focus.rates.labor-upsert-workspace-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE },
40875
40875
  "focus.rates.labor-upsert-workspace-user-labor-cost-rate": { agentGuidance: RATE_SCHEDULE_GUIDANCE }
40876
40876
  };
40877
+ const TASK_DATES_RULE = "Send start_date and end_date together, with end_date on or after start_date";
40878
+ const TASK_DATES_CREATE_GUIDANCE = `${TASK_DATES_RULE}; for a single due date, send both as that day.`;
40879
+ const taskOverrides = {
40880
+ "focus.tasks.list": {
40881
+ aliases: ["ls"],
40882
+ agentGuidance: "Filter by start_date/end_date (ISO 8601, e.g. '2025-04-27') for date ranges, project_id, status_id, or assignee_user_id. Returns paginated results — use page/per_page for more. Use parent_task_id to list subtasks. Priority values: none, low, medium, high.",
40883
+ examples: [
40884
+ {
40885
+ description: "List tasks due today",
40886
+ data: {
40887
+ start_date: "2025-04-27",
40888
+ end_date: "2025-04-27"
40889
+ }
40890
+ },
40891
+ {
40892
+ description: "List tasks for a project",
40893
+ data: { project_id: 123456 }
40894
+ },
40895
+ {
40896
+ description: "List high-priority open tasks",
40897
+ data: { priority: "high" }
40898
+ }
40899
+ ]
40900
+ },
40901
+ "focus.tasks.get": { agentGuidance: "Fetch a single task with full detail including subtasks and time estimates." },
40902
+ "focus.tasks.create": {
40903
+ agentGuidance: `Required: name. Strongly recommended: project_id, status_id, assignee_user_ids. Use start_date/end_date for scheduling as date-only YYYY-MM-DD values; never pass RFC 3339 datetimes. ${TASK_DATES_CREATE_GUIDANCE} Set estimated_mins for time estimates.`,
40904
+ examples: [{
40905
+ description: "Create a minimal task",
40906
+ data: { name: "Dogfood the CLI" }
40907
+ }, {
40908
+ description: "Create a task with full metadata",
40909
+ data: {
40910
+ name: "Review PR",
40911
+ project_id: 123456,
40912
+ assignee_user_ids: [789],
40913
+ estimated_mins: 30
40914
+ }
40915
+ }]
40916
+ },
40917
+ "focus.tasks.update": {
40918
+ agentGuidance: `Partial update — only include fields to change in payload. Provide task_id at top level and the fields to update under payload. custom_fields writes values as a map keyed by custom field ID; reads return the same data as custom_field_values[], so the write shape is not the read shape. ${TASK_DATES_RULE}; to move one date, resend the task's current other date; if the task has none, or that breaks the order, send the new date as both.`,
40919
+ examples: [
40920
+ {
40921
+ description: "Change task status",
40922
+ data: {
40923
+ task_id: 12345,
40924
+ payload: { status_id: 456789 }
40925
+ }
40926
+ },
40927
+ {
40928
+ description: "Assign to a user and update estimate",
40929
+ data: {
40930
+ task_id: 12345,
40931
+ payload: {
40932
+ assignee_user_ids: [789],
40933
+ estimated_mins: 60
40934
+ }
40935
+ }
40936
+ },
40937
+ {
40938
+ description: "Set a select custom field value",
40939
+ data: {
40940
+ task_id: 12345,
40941
+ payload: { custom_fields: { "406": [1639] } }
40942
+ }
40943
+ }
40944
+ ]
40945
+ },
40946
+ "focus.tasks.full-update": { agentGuidance: "Follow the update action's date guidance." },
40947
+ "focus.tasks.delete": { agentGuidance: "Permanently deletes the task and all its subtasks. Cannot be undone." },
40948
+ "focus.tasks.bulk-patch": {
40949
+ agentGuidance: "Prefer over many single updates: pass a JSON array of { id: taskId, ...partial fields }. Same field names and date guidance as single task update.",
40950
+ examples: [{
40951
+ description: "Set status on two tasks",
40952
+ data: [{
40953
+ id: 111,
40954
+ status_id: 456789
40955
+ }, {
40956
+ id: 222,
40957
+ status_id: 456789
40958
+ }]
40959
+ }, {
40960
+ description: "Set a select custom field value on two tasks",
40961
+ data: [{
40962
+ id: 111,
40963
+ custom_fields: { "406": [1639] }
40964
+ }, {
40965
+ id: 222,
40966
+ custom_fields: { "406": [1640] }
40967
+ }]
40968
+ }]
40969
+ },
40970
+ "focus.tasks.bulk-delete": {
40971
+ agentGuidance: "Deletes all listed task IDs in one HTTP call. Requires confirm flow like single delete.",
40972
+ examples: [{
40973
+ description: "Delete two tasks",
40974
+ data: { ids: [111, 222] }
40975
+ }]
40976
+ }
40977
+ };
40877
40978
  const compositeOverrides = {
40878
40979
  "focus.composite.create-project": {
40879
40980
  description: "Create a project with related data such as members, milestones, rates, and billable rates.",
@@ -40887,6 +40988,7 @@ const compositeOverrides = {
40887
40988
  },
40888
40989
  "focus.composite.create-task": {
40889
40990
  description: "Create a task with related data such as subtasks and an initial time entry.",
40991
+ agentGuidance: `For payload.task and each payload.subtasks[] item: ${TASK_DATES_CREATE_GUIDANCE}`,
40890
40992
  cli: {
40891
40993
  group: ["tasks"],
40892
40994
  command: "create-with-children",
@@ -41377,104 +41479,6 @@ const tagOverrides = {
41377
41479
  }]
41378
41480
  }
41379
41481
  };
41380
- const taskOverrides = {
41381
- "focus.tasks.list": {
41382
- aliases: ["ls"],
41383
- agentGuidance: "Filter by start_date/end_date (ISO 8601, e.g. '2025-04-27') for date ranges, project_id, status_id, or assignee_user_id. Returns paginated results — use page/per_page for more. Use parent_task_id to list subtasks. Priority values: none, low, medium, high.",
41384
- examples: [
41385
- {
41386
- description: "List tasks due today",
41387
- data: {
41388
- start_date: "2025-04-27",
41389
- end_date: "2025-04-27"
41390
- }
41391
- },
41392
- {
41393
- description: "List tasks for a project",
41394
- data: { project_id: 123456 }
41395
- },
41396
- {
41397
- description: "List high-priority open tasks",
41398
- data: { priority: "high" }
41399
- }
41400
- ]
41401
- },
41402
- "focus.tasks.get": { agentGuidance: "Fetch a single task with full detail including subtasks and time estimates." },
41403
- "focus.tasks.create": {
41404
- agentGuidance: "Required: name. Strongly recommended: project_id, status_id, assignee_user_ids. Use start_date/end_date for scheduling as date-only YYYY-MM-DD values; never pass RFC 3339 datetimes. Set estimated_mins for time estimates.",
41405
- examples: [{
41406
- description: "Create a minimal task",
41407
- data: { name: "Dogfood the CLI" }
41408
- }, {
41409
- description: "Create a task with full metadata",
41410
- data: {
41411
- name: "Review PR",
41412
- project_id: 123456,
41413
- assignee_user_ids: [789],
41414
- estimated_mins: 30
41415
- }
41416
- }]
41417
- },
41418
- "focus.tasks.update": {
41419
- agentGuidance: "Partial update — only include fields to change in payload. Provide task_id at top level and the fields to update under payload. custom_fields writes values as a map keyed by custom field ID; reads return the same data as custom_field_values[], so the write shape is not the read shape.",
41420
- examples: [
41421
- {
41422
- description: "Change task status",
41423
- data: {
41424
- task_id: 12345,
41425
- payload: { status_id: 456789 }
41426
- }
41427
- },
41428
- {
41429
- description: "Assign to a user and update estimate",
41430
- data: {
41431
- task_id: 12345,
41432
- payload: {
41433
- assignee_user_ids: [789],
41434
- estimated_mins: 60
41435
- }
41436
- }
41437
- },
41438
- {
41439
- description: "Set a select custom field value",
41440
- data: {
41441
- task_id: 12345,
41442
- payload: { custom_fields: { "406": [1639] } }
41443
- }
41444
- }
41445
- ]
41446
- },
41447
- "focus.tasks.delete": { agentGuidance: "Permanently deletes the task and all its subtasks. Cannot be undone." },
41448
- "focus.tasks.bulk-patch": {
41449
- agentGuidance: "Prefer over many single updates: pass a JSON array of { id: taskId, ...partial fields }. Same field names as single task update.",
41450
- examples: [{
41451
- description: "Set status on two tasks",
41452
- data: [{
41453
- id: 111,
41454
- status_id: 456789
41455
- }, {
41456
- id: 222,
41457
- status_id: 456789
41458
- }]
41459
- }, {
41460
- description: "Set a select custom field value on two tasks",
41461
- data: [{
41462
- id: 111,
41463
- custom_fields: { "406": [1639] }
41464
- }, {
41465
- id: 222,
41466
- custom_fields: { "406": [1640] }
41467
- }]
41468
- }]
41469
- },
41470
- "focus.tasks.bulk-delete": {
41471
- agentGuidance: "Deletes all listed task IDs in one HTTP call. Requires confirm flow like single delete.",
41472
- examples: [{
41473
- description: "Delete two tasks",
41474
- data: { ids: [111, 222] }
41475
- }]
41476
- }
41477
- };
41478
41482
  const timeEntryOverrides = {
41479
41483
  "focus.time-entries.list": {
41480
41484
  agentGuidance: "Returns tracked time entries in a date range, including taskless entries (tracked on a project with no task). Requires date_from and date_to. Accepts date-only strings (YYYY-MM-DD) or RFC3339 datetimes — date-only is automatically expanded: date_from to T00:00:00Z, date_to to T23:59:59Z. Optional project_id keeps only entries on that project (sent to the API; client also scans up to 50 list pages of 100, then slices page/per_page; not a full workspace scan). If truncated is true, more unfiltered rows exist than were scanned — narrow date_from/date_to. Pass include_taskless:false to hide taskless rows. Includes task and project context.",
@@ -56221,7 +56225,7 @@ function registerWorkspaceTools(server) {
56221
56225
  //#region src/package-version.ts
56222
56226
  function mcpPackageVersion() {
56223
56227
  try {
56224
- return "1.11.223";
56228
+ return "1.11.225";
56225
56229
  } catch {
56226
56230
  return "unknown";
56227
56231
  }
@@ -56396,7 +56400,7 @@ import_main.default.config({
56396
56400
  quiet: true,
56397
56401
  ignore: ["MISSING_ENV_FILE"]
56398
56402
  });
56399
- const packageVersion = "1.11.223";
56403
+ const packageVersion = "1.11.225";
56400
56404
  function resolvePublicUrls() {
56401
56405
  return {
56402
56406
  focusApiUrl: process.env.TOGGL_FOCUS_API_URL ?? "https://focus.toggl.com",
@@ -56461,4 +56465,4 @@ function bootstrapServer(options = {}) {
56461
56465
  //#endregion
56462
56466
  export { getProductAnalyticsDistinctId as a, resolvePublicSentryDsn as c, captureToolInvocation as i, shutdownProductAnalytics as l, runMcpCli as n, initProductAnalytics as o, PUBLIC_SENTRY_PRIVACY_OPTIONS as r, resolveProductAnalyticsDistinctId as s, bootstrapServer as t };
56463
56467
 
56464
- //# sourceMappingURL=src-DldEugLk.js.map
56468
+ //# sourceMappingURL=src-H-pxotgE.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@togglhq/mcp",
3
- "version": "1.11.223",
3
+ "version": "1.11.225",
4
4
  "description": "Toggl 2.0 MCP server for Claude Code, Claude Desktop, and other MCP clients.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",