tododdle-mcp 3.8.0 → 3.9.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.
@@ -5,17 +5,17 @@
5
5
  "url": "https://tododdle.com"
6
6
  },
7
7
  "description": "Agent workflow plugins for ToDoddle.",
8
- "version": "3.8.0",
8
+ "version": "3.9.0",
9
9
  "plugins": [
10
10
  {
11
11
  "name": "tododdle",
12
12
  "displayName": "ToDoddle",
13
13
  "description": "Connect repositories and use ToDoddle for project context and ticket execution.",
14
- "version": "3.8.0",
14
+ "version": "3.9.0",
15
15
  "source": {
16
16
  "source": "npm",
17
17
  "package": "tododdle-mcp",
18
- "version": "3.8.0"
18
+ "version": "3.9.0"
19
19
  },
20
20
  "category": "productivity",
21
21
  "tags": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tododdle",
3
3
  "displayName": "ToDoddle",
4
- "version": "3.8.0",
4
+ "version": "3.9.0",
5
5
  "description": "Connect repositories and run disciplined agent workflows in ToDoddle.",
6
6
  "author": {
7
7
  "name": "ToDoddle",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tododdle",
3
- "version": "3.8.0",
3
+ "version": "3.9.0",
4
4
  "description": "Disciplined agent workflows for projects managed in ToDoddle.",
5
5
  "author": {
6
6
  "name": "ToDoddle",
package/README.md CHANGED
@@ -223,6 +223,7 @@ Ticket attributes hold small typed integration and handoff facts. Read them befo
223
223
  - `claim_next_ticket`
224
224
  - `renew_ticket_claim`
225
225
  - `finish_agent_run`
226
+ - `log_completed_work`
226
227
  - `record_work_event`
227
228
  - `record_assessment`
228
229
  - `record_verification`
@@ -237,7 +238,7 @@ Ticket attributes hold small typed integration and handoff facts. Read them befo
237
238
  - `acknowledge_agent_reply`
238
239
  - `archive_ticket`
239
240
 
240
- `list_available_work` reads only unblocked, currently unclaimed work in one project. `claim_next_ticket` selects the highest-ranked eligible ticket. `claim_ticket` and `renew_ticket_claim` manage its agent lease without changing human assignment. `finish_agent_run` records the terminal result and releases the matching lease. `release_ticket` stops work without a result and records the run as cancelled. None of these tools changes ticket status. `preview_ticket_move` reports lane automation and hierarchy blockers before a board move. `move_ticket` and `archive_ticket` are destructive because a destination lane can archive the ticket. Ticket deletion is unavailable.
241
+ `list_available_work` reads only unblocked, currently unclaimed work in one project. `claim_next_ticket` selects the highest-ranked eligible ticket. `claim_ticket` and `renew_ticket_claim` manage its agent lease without changing human assignment. `finish_agent_run` records the terminal result and releases the matching lease. `release_ticket` stops work without a result and records the run as cancelled. None of these tools changes ticket status. `log_completed_work` is the exception for ad-hoc work done in conversation: in one call it finds or creates the ticket, claims it, sets `COMPLETE` (or `REVIEW` when another user created the ticket, with a warning), and records a finished run with the outcome and evidence. It needs `tasks:write` and the matching ToDoddle API route. `preview_ticket_move` reports lane automation and hierarchy blockers before a board move. `move_ticket` and `archive_ticket` are destructive because a destination lane can archive the ticket. Ticket deletion is unavailable.
241
242
 
242
243
  Supported run-bound tools accept the stable `runId` and `projectId` needed to send the complete `X-ToDoddle-Run-*` header set. The API then binds the request to the stored workspace, project, Ticket, Agent Connection, allowed action, and expiry. Keep the same run ID from claim through completion. A run cannot approve itself or expand its own authority. Besides ticket updates, comments, and evidence, these tools also send run context when you pass `runId` and `projectId`: `move_ticket` and `archive_ticket` (`UPDATE_INTERNAL_WORKFLOW`), `set_ticket_attribute` and `delete_ticket_attribute` (`UPDATE_TICKET`), and `start_ticket_timer`, `log_ticket_time`, `stop_ticket_timer`, `update_time_entry`, and `archive_time_entry` (`TRACK_INTERNAL_TIME`). When the same connection has an active or waiting run on a ticket, the server returns `403` with `RUN_ENVELOPE_REQUIRED` for these calls without run context. `attach_file_to_ticket` uses the upload-session and finalize routes, which are not run-bound.
243
244
 
@@ -341,7 +342,7 @@ Omit `projectId` to work with workspace Notes. Supply `projectId` to work with N
341
342
  - `begin_upload`
342
343
  - `complete_upload`
343
344
 
344
- Each tool accepts either an approved local `filePath` or an HTTPS `sourceUrl`. Local files must be regular files in the system temporary directory (`os.tmpdir()`, resolved through symlinks) or in an optional `TODODDLE_UPLOAD_ROOTS` root, and the current user must own them. The MCP rejects symlinks, directories, devices, and files owned by another user. Files stream directly from this local MCP process to ToDoddle's short-lived Bunny upload URL; file bodies are never placed in MCP JSON messages.
345
+ Each tool accepts either an approved local `filePath` or an HTTPS `sourceUrl`. A missing file, or a file outside the system temporary directory, returns a message that names that directory. ToDoddle stores SVG, HTML, and other active content as `application/octet-stream` so it can never run in a browser; when the stored type differs from the requested one, the upload result includes a `notice` that says so. Image uploads (PNG, JPEG, GIF, WebP, and SVG) also return `embedMarkdown`, such as `![map.png](/api/documents/<id>/embed)`, to paste into a Note or Context; an SVG embeds through its PNG rendering at `/thumbnail`. The image shows only to people who can open that document. Local files must be regular files in the system temporary directory (`os.tmpdir()`, resolved through symlinks), and the current user must own them. The MCP rejects symlinks, directories, devices, and files owned by another user. Files stream directly from this local MCP process to ToDoddle's short-lived Bunny upload URL; file bodies are never placed in MCP JSON messages.
345
346
 
346
347
  If an agent copies a source file into a dedicated ToDoddle upload directory only to satisfy the local path restriction, it should remove that temporary copy after the tool confirms success. It should retain the copy after a failed or uncertain upload so the upload can be retried. It must never remove the original source or a pre-existing file. Temporary files that the MCP creates for HTTPS sources are removed automatically.
347
348
 
@@ -384,10 +385,9 @@ Uploading a project document requires `projects:read` and `documents:write`. Att
384
385
  | `TODODDLE_CLIENT_ID` | Yes | None | Agent Connection identifier |
385
386
  | `TODODDLE_CLIENT_SECRET` | Yes | None | Agent Connection secret |
386
387
  | `TODODDLE_BASE_URL` | No | `https://app.tododdle.com` | Application API origin; HTTPS is required except for loopback development |
387
- | `TODODDLE_UPLOAD_ROOTS` | No | None | Optional platform path-delimited list of additional directories the MCP may read for uploads |
388
388
  | `TODODDLE_MAX_UPLOAD_BYTES` | No | `1073741824` | Local safety ceiling; the hosted API may enforce a lower limit |
389
389
 
390
- No upload-root configuration is needed for normal local use. Put temporary files in the system temporary directory; it is always an allowed root. On macOS and Linux, separate optional roots with `:`; on Windows, use `;`. The server resolves symlinks and rejects files outside the system temporary directory and approved roots, and files not owned by the current user. Add optional roots only for Docker, sandboxes, or directories whose contents you approve for upload. HTTPS sources reject embedded credentials, private-network destinations, unsafe redirects, oversized responses, and empty files.
390
+ Local uploads come only from the system temporary directory; no upload configuration is needed. The server resolves symlinks and rejects files outside that directory and files not owned by the current user. `TODODDLE_UPLOAD_ROOTS` is no longer used; if it is still set, the server writes a notice to stderr and ignores it. HTTPS sources reject embedded credentials, private-network destinations, unsafe redirects, oversized responses, and empty files.
391
391
 
392
392
  Use the final application API origin directly. The public `tododdle.com` and `www.tododdle.com` hosts serve the marketing site and are rejected. Legacy `trackingti.me` hosts are also rejected because cross-origin redirects must not forward bearer credentials.
393
393
 
@@ -467,3 +467,18 @@ Adds release tools (`list_releases`, `get_release`, `create_release`, `update_re
467
467
  This release also includes changes made since 3.7.0: the read-only `list_security_events` tool (`security:read`); the system temporary directory as the default upload root, with per-file ownership checks and validated DNS answers pinned on HTTPS upload fetches; Agent Run context on move, archive, attribute, and time tools; a pending-approval result for customer-visible Support replies; and GitHub Actions pinned to commit SHAs.
468
468
 
469
469
  The release raises `@modelcontextprotocol/sdk` to `^1.32.1` to fix [GHSA-6qxp-vccf-f47h](https://github.com/advisories/GHSA-6qxp-vccf-f47h), where SDK versions before 1.31.0 could send OAuth client credentials to an authorization server chosen by the MCP server.
470
+
471
+ ### 3.9.0 release
472
+
473
+ Deploy the matching ToDoddle API first: `log_completed_work` needs the new completed-work route, and `contentEdits` and slim artifact responses need the updated artifact route (an older server makes `update_project_artifact` with `contentEdits` fail clearly rather than silently). The compatibility level stays at 3 because every change is additive. The hosted gateway must install this package and map `log_completed_work` to `tasks:write` before it advertises the tool.
474
+
475
+ - Tool results now carry absolute web links (`uiUrl`, `href`) on the configured app origin, so clients no longer guess `www.tododdle.com`, the marketing site.
476
+
477
+ - API errors keep their details. A tool error is now JSON with `error`, `status`, `message`, and, for `scope_required`, `missingScopes`, `requiredScopes`, and a `hint` that says where to enable the scope. Before, agents saw only "Insufficient permissions".
478
+ - New `log_completed_work` records finished ad-hoc work in one call (ticket, claim, status, and a finished Agent Run with evidence). It needs the matching ToDoddle API route.
479
+ - `TODODDLE_UPLOAD_ROOTS` is removed: local uploads come only from the system temporary directory, and a leftover setting is ignored with a notice on stderr.
480
+ - Local uploads explain a missing file or a file outside the temporary directory instead of a raw `ENOENT`, `.svg` files are sent as `image/svg+xml`, and the result includes a `notice` when the server stores a different type.
481
+ - `search_project` describes the new `relevance` and `matchedTerms` result fields.
482
+ - Image uploads and `complete_upload` return `embedMarkdown` for Notes and Context. `create_note` and `update_note` describe the embed syntax.
483
+ - The server instructions say where project knowledge lives (brief, decision artifacts, Notes, ticket comments, repository docs) and tell agents to refresh the brief when `get_project_context` reports `briefFreshness.stale`.
484
+ - `update_project_artifact` accepts `contentEdits` (`replace_section`, `append_section`, `find_replace`) and `baseVersion`, so agents change one section of a long brief without resending it. It returns a slim summary unless `verbose` is true. An older server that ignores `contentEdits` returns an error instead of a silent success.
@@ -88,6 +88,7 @@
88
88
  "list_agent_runs": ["GET /api/external/tasks/[taskId]/agent-runs"],
89
89
  "get_agent_run": ["GET /api/external/tasks/[taskId]/agent-runs/[runId]"],
90
90
  "finish_agent_run": ["POST /api/external/tasks/[taskId]/agent-runs/[runId]"],
91
+ "log_completed_work": ["POST /api/external/projects/[projectId]/completed-work"],
91
92
  "get_supervisor_state": ["GET /api/external/tasks/[taskId]/supervisor-state"],
92
93
  "record_work_event": ["POST /api/external/tasks/[taskId]/work-events"],
93
94
  "record_assessment": ["POST /api/external/tasks/[taskId]/assessments"],
@@ -5,11 +5,18 @@ export interface AgentRunRequestContext {
5
5
  taskId: string;
6
6
  action: 'READ_PROJECT_DATA' | 'UPDATE_TICKET' | 'ADD_INTERNAL_COMMENT' | 'UPDATE_INTERNAL_WORKFLOW' | 'RECORD_EVIDENCE' | 'UPLOAD_INTERNAL_ATTACHMENT' | 'TRACK_INTERNAL_TIME';
7
7
  }
8
+ /** Scope names a denied request needed, when the API reports them. */
9
+ export interface ToDoddleScopeDenial {
10
+ requiredScopes?: string[];
11
+ missingScopes?: string[];
12
+ grantedScopes?: string[];
13
+ }
8
14
  export declare class ToDoddleApiError extends Error {
9
15
  readonly status: number;
10
16
  readonly code: string;
11
17
  readonly details?: unknown;
12
- constructor(status: number, code: string, message: string, details?: unknown);
18
+ readonly scopes?: ToDoddleScopeDenial | undefined;
19
+ constructor(status: number, code: string, message: string, details?: unknown, scopes?: ToDoddleScopeDenial | undefined);
13
20
  }
14
21
  export interface ToDoddleApi {
15
22
  get(path: string, query?: Record<string, string | number | boolean | undefined>, runContext?: AgentRunRequestContext): Promise<Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,36 @@ export class ToDoddleApiError extends Error {
4
4
  status;
5
5
  code;
6
6
  details;
7
- constructor(status, code, message, details) {
7
+ scopes;
8
+ constructor(status, code, message, details, scopes) {
8
9
  super(message);
9
10
  this.status = status;
10
11
  this.code = code;
11
12
  this.details = details;
13
+ this.scopes = scopes;
12
14
  this.name = 'ToDoddleApiError';
13
15
  }
14
16
  }
17
+ function stringList(value) {
18
+ return Array.isArray(value) && value.every((item) => typeof item === 'string')
19
+ ? value
20
+ : undefined;
21
+ }
22
+ function scopeDenial(payload) {
23
+ // Some routes report the scopes inside `details` instead of at the top level.
24
+ const details = payload.details && typeof payload.details === 'object'
25
+ ? payload.details
26
+ : {};
27
+ const requiredScopes = stringList(payload.required_scopes) ?? stringList(details.required_scopes);
28
+ const grantedScopes = stringList(payload.granted_scopes);
29
+ const missingScopes = stringList(payload.missing_scopes) ??
30
+ (requiredScopes && grantedScopes
31
+ ? requiredScopes.filter((scope) => !grantedScopes.includes(scope))
32
+ : undefined);
33
+ if (!requiredScopes && !missingScopes)
34
+ return undefined;
35
+ return { requiredScopes, missingScopes, grantedScopes };
36
+ }
15
37
  export class ToDoddleApiClient {
16
38
  config;
17
39
  accessToken = null;
@@ -112,7 +134,7 @@ export class ToDoddleApiClient {
112
134
  : `ToDoddle request failed (${status})`;
113
135
  return new ToDoddleApiError(status, code, code === 'MCP_UPDATE_REQUIRED'
114
136
  ? formatMcpUpdateRequiredMessage(message, payload.details)
115
- : message, payload.details);
137
+ : message, payload.details, scopeDenial(payload));
116
138
  }
117
139
  get(path, query, runContext) {
118
140
  return this.request('GET', path, undefined, query, undefined, true, runContext);
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- export declare const MCP_PACKAGE_VERSION = "3.8.0";
1
+ export declare const MCP_PACKAGE_VERSION = "3.9.0";
2
2
  export declare const MCP_COMPATIBILITY_LEVEL = 3;
3
3
  export declare const MCP_VERSION_HEADER = "x-tododdle-mcp-version";
4
4
  export declare const MCP_COMPATIBILITY_HEADER = "x-tododdle-mcp-compatibility";
5
5
  export declare const MCP_REQUEST_HEADERS: {
6
- readonly "x-tododdle-mcp-version": "3.8.0";
6
+ readonly "x-tododdle-mcp-version": "3.9.0";
7
7
  readonly "x-tododdle-mcp-compatibility": string;
8
8
  };
9
9
  export declare function formatMcpUpdateRequiredMessage(message: string, details: unknown): string;
@@ -1,4 +1,4 @@
1
- export const MCP_PACKAGE_VERSION = '3.8.0';
1
+ export const MCP_PACKAGE_VERSION = '3.9.0';
2
2
  export const MCP_COMPATIBILITY_LEVEL = 3;
3
3
  export const MCP_VERSION_HEADER = 'x-tododdle-mcp-version';
4
4
  export const MCP_COMPATIBILITY_HEADER = 'x-tododdle-mcp-compatibility';
package/dist/config.d.ts CHANGED
@@ -2,11 +2,9 @@ export interface McpConfig {
2
2
  baseUrl: string;
3
3
  clientId: string;
4
4
  clientSecret: string;
5
- uploadRoots: string[];
6
5
  managedUploadRoot: string;
7
6
  maxUploadBytes: number;
8
7
  }
9
- export declare function parseUploadRoots(value: string | undefined, platform?: NodeJS.Platform): string[];
10
8
  /**
11
9
  * The managed upload root is the system temporary directory itself, resolved through symlinks
12
10
  * (for example macOS /var/folders/.../T becomes /private/var/folders/.../T). No subfolder is
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,kBAAmB,GAAG,MAAM,EAAE,CAKjG;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,kBAAkB,SAAW,GAAG,MAAM,CAMjF;AAsCD,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAwBrF"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,kBAAkB,SAAW,GAAG,MAAM,CAMjF;AAsCD,wBAAgB,aAAa,CAAC,WAAW,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CA6BrF"}
package/dist/config.js CHANGED
@@ -1,12 +1,6 @@
1
1
  import { realpathSync } from 'node:fs';
2
2
  import { tmpdir } from 'node:os';
3
3
  import { resolve } from 'node:path';
4
- export function parseUploadRoots(value, platform = process.platform) {
5
- return (value || '')
6
- .split(platform === 'win32' ? ';' : ':')
7
- .map((root) => root.trim())
8
- .filter(Boolean);
9
- }
10
4
  /**
11
5
  * The managed upload root is the system temporary directory itself, resolved through symlinks
12
6
  * (for example macOS /var/folders/.../T becomes /private/var/folders/.../T). No subfolder is
@@ -49,7 +43,6 @@ export function loadMcpConfig(environment = process.env) {
49
43
  const baseUrl = normalizeBaseUrl(environment.TODODDLE_BASE_URL);
50
44
  const clientId = environment.TODODDLE_CLIENT_ID;
51
45
  const clientSecret = environment.TODODDLE_CLIENT_SECRET;
52
- const uploadRoots = parseUploadRoots(environment.TODODDLE_UPLOAD_ROOTS);
53
46
  const managedUploadRoot = getDefaultManagedUploadRoot();
54
47
  const configuredMax = Number(environment.TODODDLE_MAX_UPLOAD_BYTES || 1024 * 1024 * 1024);
55
48
  if (!clientId || !clientSecret) {
@@ -58,11 +51,14 @@ export function loadMcpConfig(environment = process.env) {
58
51
  if (!Number.isSafeInteger(configuredMax) || configuredMax <= 0) {
59
52
  throw new Error('TODODDLE_MAX_UPLOAD_BYTES must be a positive integer');
60
53
  }
54
+ if (environment.TODODDLE_UPLOAD_ROOTS) {
55
+ // stderr is safe for a stdio MCP server; stdout carries the protocol.
56
+ console.error('TODODDLE_UPLOAD_ROOTS is no longer used and can be removed. Local uploads come from the system temporary directory.');
57
+ }
61
58
  return {
62
59
  baseUrl,
63
60
  clientId,
64
61
  clientSecret,
65
- uploadRoots,
66
62
  managedUploadRoot,
67
63
  maxUploadBytes: configuredMax,
68
64
  };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,kBAAkB,GAAG,MAAM,EAAE;IACvE,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB;IACjD,MAAM,QAAQ,GAAG,KAAK,IAAI,0BAA0B,CAAC;IACrD,IAAI,GAAQ,CAAC;IAEb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5E,IACE,CAAC,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CACjF,GAAG,CAAC,QAAQ,CACb,EACD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAChG,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,IACE,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,QAAQ;QACZ,GAAG,CAAC,MAAM;QACV,GAAG,CAAC,IAAI;QACR,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,EACtC,CAAC;QACD,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAW,GAAsB,OAAO,CAAC,GAAG;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,kBAAkB,CAAC;IAChD,MAAM,YAAY,GAAG,WAAW,CAAC,sBAAsB,CAAC;IACxD,MAAM,iBAAiB,GAAG,2BAA2B,EAAE,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,yBAAyB,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;IAE1F,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,WAAW,CAAC,qBAAqB,EAAE,CAAC;QACtC,sEAAsE;QACtE,OAAO,CAAC,KAAK,CACX,qHAAqH,CACtH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,iBAAiB;QACjB,cAAc,EAAE,aAAa;KAC9B,CAAC;AACJ,CAAC"}
package/dist/index.js CHANGED
@@ -6,8 +6,8 @@ import { createToDoddleMcpServer } from './server.js';
6
6
  async function main() {
7
7
  const config = loadMcpConfig();
8
8
  const server = createToDoddleMcpServer(new ToDoddleApiClient(config), {
9
- uploadRoots: config.uploadRoots,
10
9
  managedUploadRoot: config.managedUploadRoot,
10
+ appOrigin: config.baseUrl,
11
11
  maxUploadBytes: config.maxUploadBytes,
12
12
  });
13
13
  await server.connect(new StdioServerTransport());
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE;QACpE,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE;QACpE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,SAAS,EAAE,MAAM,CAAC,OAAO;QACzB,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;AAC5D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,8 +1,27 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { ToDoddleApi } from './api-client.js';
2
+ import { ToDoddleApiError, type ToDoddleApi } from './api-client.js';
3
+ /**
4
+ * Turns a ToDoddle API failure into a tool error the agent can act on. The SDK
5
+ * default keeps only the message, which dropped the scope an owner must grant.
6
+ */
7
+ export declare function apiErrorResult(error: ToDoddleApiError): {
8
+ isError: boolean;
9
+ content: {
10
+ type: 'text';
11
+ text: string;
12
+ }[];
13
+ };
14
+ /**
15
+ * The API returns web links as paths such as /dashboard/project/x. Left
16
+ * relative, a client guesses the host and often picks www.tododdle.com, which
17
+ * is the marketing site. Turn them into absolute links on the app origin.
18
+ * In-app embed paths (/api/documents/...) are left alone.
19
+ */
20
+ export declare function absolutizeLinks(value: unknown, appOrigin: string): unknown;
3
21
  export interface ToDoddleMcpServerOptions {
4
- uploadRoots?: string[];
5
22
  managedUploadRoot?: string;
23
+ /** Web app origin, such as https://app.tododdle.com, for absolute links in results. */
24
+ appOrigin?: string;
6
25
  maxUploadBytes?: number;
7
26
  }
8
27
  export declare function createToDoddleMcpServer(api: ToDoddleApi, serverOptions?: ToDoddleMcpServerOptions): McpServer;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAEtF,OAAO,KAAK,EAA0B,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA2T3E,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAmLD,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,aAAa,GAAE,wBAA6B,GAC3C,SAAS,CAu8FX"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAA+B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA2OlG;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB;;;cAiBV,MAAM;;;EACjD;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAc1E;AA2HD,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgND,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,WAAW,EAChB,aAAa,GAAE,wBAA6B,GAC3C,SAAS,CA4iGX"}