mcp-sunsama 0.16.0 → 0.17.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/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # mcp-sunsama
2
2
 
3
+ ## 0.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 26000bd: Add subtask management support
8
+
9
+ - Update sunsama-api dependency to 0.13.1
10
+ - Add 5 new subtask management tools:
11
+ - `add-subtask` - Create a subtask with a title in one call (recommended)
12
+ - `create-subtasks` - Create multiple subtasks for a task (bulk operations)
13
+ - `update-subtask-title` - Update the title of a subtask
14
+ - `complete-subtask` - Mark a subtask as complete
15
+ - `uncomplete-subtask` - Mark a subtask as incomplete
16
+ - Update README and CLAUDE.md documentation
17
+
18
+ - e3336cf: Add session token authentication support for users with SSO/OAuth login. Users can now authenticate using `SUNSAMA_SESSION_TOKEN` environment variable (stdio) or Bearer token authentication (HTTP) as an alternative to email/password credentials.
19
+
20
+ ## 0.16.1
21
+
22
+ ### Patch Changes
23
+
24
+ - 5df00f4: Bump sunsama-api dependency from 0.12.0 to 0.12.1
25
+ - 14c0713: Fix update-task-notes tool failing with MCP error -32603. Removed Zod `.refine()` from schema which was causing MCP SDK to fail parsing the tool parameters. XOR validation between html/markdown is now handled at runtime.
26
+
3
27
  ## 0.16.0
4
28
 
5
29
  ### Minor Changes
package/CLAUDE.md CHANGED
@@ -28,6 +28,31 @@ bun run version # Apply changesets and update version
28
28
  bun run release # Build and publish to npm
29
29
  ```
30
30
 
31
+ ## Contribution Workflow
32
+
33
+ **IMPORTANT**: When making changes that affect package users, always create a changeset.
34
+
35
+ ### When to Create a Changeset
36
+ - ✅ New user-facing features or tools
37
+ - ✅ Bug fixes that affect npm package users
38
+ - ✅ API changes or breaking changes
39
+ - ✅ Dependency updates that change behavior
40
+
41
+ ### When NOT to Create a Changeset
42
+ - ❌ Infrastructure/deployment changes (CI/CD, Docker, Smithery config)
43
+ - ❌ Internal refactoring with no behavior changes
44
+ - ❌ Documentation updates
45
+ - ❌ Development tooling changes
46
+
47
+ ### Standard Workflow
48
+ 1. Create a branch: `git checkout -b {type}/{short-name}`
49
+ 2. Make changes and test: `bun test && bun run typecheck`
50
+ 3. **Create a changeset**: `bun run changeset` (if changes affect users)
51
+ 4. Commit with conventional format: `git commit -m "fix: description"`
52
+ 5. Push and create PR
53
+
54
+ See `CONTRIBUTING.md` for full details.
55
+
31
56
  ## Architecture Overview
32
57
 
33
58
  ### Dual Transport MCP Server
@@ -87,8 +112,8 @@ All tools use Zod schemas from `schemas.ts`:
87
112
  - Automatic TypeScript inference
88
113
  - Comprehensive parameter documentation
89
114
  - Union types for completion filters
90
- - XOR schema patterns for mutually exclusive parameters using `.refine()` for MCP Inspector compatibility
91
- - Example: `update-task-notes` requires either `html` OR `markdown`, but not both
115
+ - **Important**: Avoid using `.refine()` on schemas - it transforms `ZodObject` into `ZodEffects` which the MCP SDK cannot parse (results in empty `properties`). Handle complex validation (e.g., XOR between fields) in the tool's `execute` function instead.
116
+ - Example: `update-task-notes` requires either `html` OR `markdown`, validated at runtime
92
117
  - Discriminated unions for task integrations (GitHub, Gmail)
93
118
 
94
119
  ### Integration Support
@@ -157,7 +182,7 @@ src/
157
182
  ├── tools/
158
183
  │ ├── shared.ts # Common utilities and tool wrapper patterns
159
184
  │ ├── user-tools.ts # User operations (get-user)
160
- │ ├── task-tools.ts # Task operations (15 tools)
185
+ │ ├── task-tools.ts # Task operations (20 tools)
161
186
  │ ├── stream-tools.ts # Stream operations (get-streams)
162
187
  │ └── index.ts # Export all tools
163
188
  ├── resources/
@@ -201,7 +226,7 @@ __tests__/
201
226
 
202
227
  **Resource-Based Organization**:
203
228
  - **User Tools**: Single tool for user operations
204
- - **Task Tools**: 15 tools organized by function (query, lifecycle, update)
229
+ - **Task Tools**: 20 tools organized by function (query, lifecycle, update, subtasks)
205
230
  - **Stream Tools**: Single tool for stream operations
206
231
 
207
232
  **Type Safety Improvements**:
@@ -235,7 +260,7 @@ Tests are organized in the `__tests__/` directory following standard conventions
235
260
  ## Important Notes
236
261
 
237
262
  ### Version Synchronization
238
- Always keep FastMCP server version in `src/main.ts` (line 19) synchronized with `package.json` version.
263
+ The MCP server version in `src/constants.ts` is automatically synced from `package.json` when running `bun run version`.
239
264
 
240
265
  ### Environment Variables
241
266
  Required for stdio transport:
@@ -253,6 +278,7 @@ Optional:
253
278
  Full CRUD support:
254
279
  - **Read**: `get-tasks-by-day`, `get-tasks-backlog`, `get-archived-tasks`, `get-task-by-id`, `get-streams`
255
280
  - **Write**: `create-task` (with GitHub/Gmail integration support), `update-task-complete`, `update-task-planned-time`, `update-task-notes`, `update-task-snooze-date`, `update-task-backlog`, `update-task-stream`, `update-task-text`, `update-task-due-date`, `delete-task`
281
+ - **Subtasks**: `add-subtask` (recommended), `create-subtasks` (bulk), `update-subtask-title`, `complete-subtask`, `uncomplete-subtask`
256
282
 
257
283
  Task read operations support response trimming. `get-tasks-by-day` includes completion filtering. `get-archived-tasks` includes enhanced pagination with hasMore flag for LLM decision-making.
258
284
 
@@ -262,12 +288,11 @@ Configure different server variants in `mcp-inspector.json` for testing various
262
288
 
263
289
  ## Version Management
264
290
 
265
- **IMPORTANT**: Keep the FastMCP server version in sync with package.json version.
291
+ Version is managed automatically via changesets. When you run `bun run version`:
292
+ 1. Changesets updates `package.json` version
293
+ 2. `scripts/sync-version.ts` automatically syncs the version to `src/constants.ts`
266
294
 
267
- When updating the version:
268
- 1. Update `package.json` version (done automatically by changesets)
269
- 2. Manually update the FastMCP server version in `src/main.ts` (line 19)
270
- 3. Both versions must be identical for consistency
295
+ No manual version updates needed.
271
296
 
272
297
  ## Git Rules
273
298
 
package/README.md CHANGED
@@ -12,6 +12,7 @@ A Model Context Protocol (MCP) server that provides comprehensive task managemen
12
12
  - **Create Tasks** - Create new tasks with notes, time estimates, due dates, stream assignments, and GitHub/Gmail integrations
13
13
  - **Read Tasks** - Get tasks by day with completion filtering, access backlog tasks, retrieve archived task history
14
14
  - **Update Tasks** - Mark tasks as complete with custom timestamps, reschedule tasks or move to backlog
15
+ - **Subtasks** - Add, update, complete, and manage subtasks within tasks
15
16
  - **Delete Tasks** - Permanently remove tasks from your workspace
16
17
 
17
18
  ### User & Stream Operations
@@ -111,6 +112,23 @@ Add this configuration to your Claude Desktop MCP settings:
111
112
  }
112
113
  ```
113
114
 
115
+ ### Claude Code Configuration
116
+
117
+ Add the Sunsama MCP server using the Claude Code CLI:
118
+
119
+ ```bash
120
+ claude mcp add sunsama --scope user \
121
+ -e SUNSAMA_EMAIL=your-email@example.com \
122
+ -e SUNSAMA_PASSWORD=your-password \
123
+ -- npx mcp-sunsama
124
+ ```
125
+
126
+ **Scope Options:**
127
+ - `--scope user` - Available across all projects (recommended)
128
+ - `--scope project` - Only available in the current project
129
+
130
+ After adding the server, restart Claude Code to connect to the Sunsama MCP server.
131
+
114
132
  ## API Tools
115
133
 
116
134
  ### Task Management
@@ -129,6 +147,13 @@ Add this configuration to your Claude Desktop MCP settings:
129
147
  - `update-task-backlog` - Move tasks to the backlog
130
148
  - `delete-task` - Delete tasks permanently
131
149
 
150
+ #### Subtask Management
151
+ - `add-subtask` - Create a subtask with a title in one call (recommended for single subtask creation)
152
+ - `create-subtasks` - Create multiple subtasks for a task (low-level API for bulk operations)
153
+ - `update-subtask-title` - Update the title of a subtask
154
+ - `complete-subtask` - Mark a subtask as complete with optional completion timestamp
155
+ - `uncomplete-subtask` - Mark a subtask as incomplete
156
+
132
157
  ### User & Stream Operations
133
158
  - `get-user` - Get current user information
134
159
  - `get-streams` - Get streams/channels for project organization
package/bun.lock CHANGED
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "lockfileVersion": 1,
3
+ "configVersion": 0,
3
4
  "workspaces": {
4
5
  "": {
5
6
  "name": "mcp-sunsama",
@@ -9,7 +10,7 @@
9
10
  "cors": "^2.8.5",
10
11
  "express": "^5.1.0",
11
12
  "papaparse": "^5.5.3",
12
- "sunsama-api": "0.12.0",
13
+ "sunsama-api": "0.13.1",
13
14
  "zod": "3.24.4",
14
15
  },
15
16
  "devDependencies": {
@@ -396,7 +397,7 @@
396
397
 
397
398
  "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
398
399
 
399
- "sunsama-api": ["sunsama-api@0.12.0", "", { "dependencies": { "graphql": "^16.11.0", "graphql-tag": "^2.12.6", "marked": "^14.1.3", "tough-cookie": "^5.1.2", "tslib": "^2.8.1", "turndown": "^7.2.0", "yjs": "^13.6.27", "zod": "^3.25.64" } }, "sha512-J2nXZAlYnlA567fmfpwWAOqZnOO0FLVfRwskJQ+gngrjpq26E5TamGSQZ4317/UdJ3U87ZnJdyoHnBRjjBdtvA=="],
400
+ "sunsama-api": ["sunsama-api@0.13.1", "", { "dependencies": { "graphql": "^16.11.0", "graphql-tag": "^2.12.6", "marked": "^14.1.3", "tough-cookie": "^5.1.2", "tslib": "^2.8.1", "turndown": "^7.2.0", "yjs": "^13.6.27", "zod": "^3.25.64" } }, "sha512-d60j9tLvH/HoF1K/CD8B5rphQ6UW+9XOkJHdABFVfmKCRvA+XNhN73ZzSm78dd+nRJXzaZqKG96+saN8jyBjCg=="],
400
401
 
401
402
  "term-size": ["term-size@2.2.1", "", {}, "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="],
402
403
 
@@ -17,6 +17,7 @@ export declare function stopClientCacheCleanup(): void;
17
17
  export declare function cleanupAllClients(): void;
18
18
  /**
19
19
  * Authenticate HTTP request and get or create cached client
20
+ * Supports both Basic Auth (email/password) and Bearer token authentication
20
21
  * Uses secure cache key (password hash) and race condition protection
21
22
  */
22
23
  export declare function authenticateHttpRequest(authHeader?: string): Promise<SessionData>;
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/auth/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiBtF;AA+CD,wBAAgB,uBAAuB,IAAI,IAAI,CAQ9C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAYxC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAiEtB"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/auth/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAe9C;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiBtF;AAwDD,wBAAgB,uBAAuB,IAAI,IAAI,CAQ9C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAM7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAYxC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAsItB"}
package/dist/auth/http.js CHANGED
@@ -36,6 +36,14 @@ function getCacheKey(email, password) {
36
36
  .update(`${email}:${password}`)
37
37
  .digest('hex');
38
38
  }
39
+ /**
40
+ * Generate secure cache key from session token
41
+ */
42
+ function getTokenCacheKey(token) {
43
+ return createHash('sha256')
44
+ .update(`token:${token}`)
45
+ .digest('hex');
46
+ }
39
47
  /**
40
48
  * Check if a cached client is still valid based on TTL
41
49
  */
@@ -102,18 +110,80 @@ export function cleanupAllClients() {
102
110
  }
103
111
  /**
104
112
  * Authenticate HTTP request and get or create cached client
113
+ * Supports both Basic Auth (email/password) and Bearer token authentication
105
114
  * Uses secure cache key (password hash) and race condition protection
106
115
  */
107
116
  export async function authenticateHttpRequest(authHeader) {
108
- if (!authHeader || !authHeader.startsWith('Basic ')) {
109
- throw new Error("Basic Auth required");
117
+ if (!authHeader) {
118
+ throw new Error("Authorization header required (Basic or Bearer)");
119
+ }
120
+ const isBearer = authHeader.startsWith('Bearer ');
121
+ const isBasic = authHeader.startsWith('Basic ');
122
+ if (!isBearer && !isBasic) {
123
+ throw new Error("Authorization header must be Basic or Bearer");
110
124
  }
111
- const { email, password } = parseBasicAuth(authHeader);
112
- const cacheKey = getCacheKey(email, password);
113
125
  const now = Date.now();
126
+ let cacheKey;
127
+ let identifier;
128
+ if (isBearer) {
129
+ const token = authHeader.replace('Bearer ', '').trim();
130
+ if (!token) {
131
+ throw new Error("Invalid Bearer token");
132
+ }
133
+ cacheKey = getTokenCacheKey(token);
134
+ identifier = 'token-user';
135
+ // Check for pending authentication (race condition protection)
136
+ if (authPromises.has(cacheKey)) {
137
+ console.error(`[Client Cache] Waiting for pending authentication for ${identifier}`);
138
+ return await authPromises.get(cacheKey);
139
+ }
140
+ // Check cache first
141
+ if (clientCache.has(cacheKey)) {
142
+ const cached = clientCache.get(cacheKey);
143
+ if (isClientValid(cached)) {
144
+ console.error(`[Client Cache] Reusing cached client for ${identifier}`);
145
+ cached.lastAccessedAt = now;
146
+ return cached;
147
+ }
148
+ else {
149
+ console.error(`[Client Cache] Cached client expired for ${identifier}, re-authenticating`);
150
+ try {
151
+ cached.sunsamaClient.logout();
152
+ }
153
+ catch (err) {
154
+ console.error(`[Client Cache] Error logging out expired client:`, err);
155
+ }
156
+ clientCache.delete(cacheKey);
157
+ }
158
+ }
159
+ // Create authentication promise for Bearer token
160
+ console.error(`[Client Cache] Creating new client for ${identifier}`);
161
+ const authPromise = (async () => {
162
+ try {
163
+ const sunsamaClient = new SunsamaClient({ sessionToken: token });
164
+ const sessionData = {
165
+ sunsamaClient,
166
+ createdAt: now,
167
+ lastAccessedAt: now
168
+ };
169
+ clientCache.set(cacheKey, sessionData);
170
+ console.error(`[Client Cache] Cached new client for ${identifier} (total: ${clientCache.size})`);
171
+ return sessionData;
172
+ }
173
+ finally {
174
+ authPromises.delete(cacheKey);
175
+ }
176
+ })();
177
+ authPromises.set(cacheKey, authPromise);
178
+ return authPromise;
179
+ }
180
+ // Basic Auth flow
181
+ const { email, password } = parseBasicAuth(authHeader);
182
+ cacheKey = getCacheKey(email, password);
183
+ identifier = email;
114
184
  // Check for pending authentication (race condition protection)
115
185
  if (authPromises.has(cacheKey)) {
116
- console.error(`[Client Cache] Waiting for pending authentication for ${email}`);
186
+ console.error(`[Client Cache] Waiting for pending authentication for ${identifier}`);
117
187
  return await authPromises.get(cacheKey);
118
188
  }
119
189
  // Check cache first
@@ -121,13 +191,13 @@ export async function authenticateHttpRequest(authHeader) {
121
191
  const cached = clientCache.get(cacheKey);
122
192
  // Check if still valid (lazy expiration)
123
193
  if (isClientValid(cached)) {
124
- console.error(`[Client Cache] Reusing cached client for ${email}`);
194
+ console.error(`[Client Cache] Reusing cached client for ${identifier}`);
125
195
  // Update last accessed time (sliding window)
126
196
  cached.lastAccessedAt = now;
127
197
  return cached;
128
198
  }
129
199
  else {
130
- console.error(`[Client Cache] Cached client expired for ${email}, re-authenticating`);
200
+ console.error(`[Client Cache] Cached client expired for ${identifier}, re-authenticating`);
131
201
  // Cleanup expired client
132
202
  try {
133
203
  cached.sunsamaClient.logout();
@@ -139,7 +209,7 @@ export async function authenticateHttpRequest(authHeader) {
139
209
  }
140
210
  }
141
211
  // Create authentication promise to prevent concurrent authentications
142
- console.error(`[Client Cache] Creating new client for ${email}`);
212
+ console.error(`[Client Cache] Creating new client for ${identifier}`);
143
213
  const authPromise = (async () => {
144
214
  try {
145
215
  const sunsamaClient = new SunsamaClient();
@@ -151,7 +221,7 @@ export async function authenticateHttpRequest(authHeader) {
151
221
  lastAccessedAt: now
152
222
  };
153
223
  clientCache.set(cacheKey, sessionData);
154
- console.error(`[Client Cache] Cached new client for ${email} (total: ${clientCache.size})`);
224
+ console.error(`[Client Cache] Cached new client for ${identifier} (total: ${clientCache.size})`);
155
225
  return sessionData;
156
226
  }
157
227
  finally {
@@ -1,6 +1,7 @@
1
1
  import { SunsamaClient } from "sunsama-api/client";
2
2
  /**
3
3
  * Initialize stdio authentication using environment variables
4
+ * Supports session token (SUNSAMA_SESSION_TOKEN) or email/password (SUNSAMA_EMAIL, SUNSAMA_PASSWORD)
4
5
  * @throws {Error} If credentials are missing or authentication fails
5
6
  */
6
7
  export declare function initializeStdioAuth(): Promise<SunsamaClient>;
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/auth/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAWlE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,aAAa,CAAC,CAMrE"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/auth/stdio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,aAAa,CAAC,CAoBlE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,aAAa,CAAC,CAMrE"}
@@ -5,11 +5,20 @@ import { SunsamaClient } from "sunsama-api/client";
5
5
  let authenticationPromise = null;
6
6
  /**
7
7
  * Initialize stdio authentication using environment variables
8
+ * Supports session token (SUNSAMA_SESSION_TOKEN) or email/password (SUNSAMA_EMAIL, SUNSAMA_PASSWORD)
8
9
  * @throws {Error} If credentials are missing or authentication fails
9
10
  */
10
11
  export async function initializeStdioAuth() {
12
+ // Prefer session token if available (useful for Google SSO users)
13
+ if (process.env.SUNSAMA_SESSION_TOKEN) {
14
+ const sunsamaClient = new SunsamaClient({
15
+ sessionToken: process.env.SUNSAMA_SESSION_TOKEN
16
+ });
17
+ return sunsamaClient;
18
+ }
19
+ // Fall back to email/password authentication
11
20
  if (!process.env.SUNSAMA_EMAIL || !process.env.SUNSAMA_PASSWORD) {
12
- throw new Error("Sunsama credentials not configured. Please set SUNSAMA_EMAIL and SUNSAMA_PASSWORD environment variables.");
21
+ throw new Error("Sunsama credentials not configured. Please set SUNSAMA_SESSION_TOKEN or both SUNSAMA_EMAIL and SUNSAMA_PASSWORD environment variables.");
13
22
  }
14
23
  const sunsamaClient = new SunsamaClient();
15
24
  await sunsamaClient.login(process.env.SUNSAMA_EMAIL, process.env.SUNSAMA_PASSWORD);
@@ -4,7 +4,7 @@ import { SunsamaClient } from "sunsama-api/client";
4
4
  */
5
5
  export interface SessionData extends Record<string, unknown> {
6
6
  sunsamaClient: SunsamaClient;
7
- email: string;
7
+ email?: string;
8
8
  createdAt: number;
9
9
  lastAccessedAt: number;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * Application constants
3
3
  *
4
- * IMPORTANT: Keep VERSION in sync with package.json version
4
+ * VERSION is automatically synced from package.json by scripts/sync-version.ts
5
+ * when running `bun run version`
5
6
  */
6
- export declare const VERSION = "0.16.0";
7
+ export declare const VERSION = "0.17.0";
7
8
  export declare const SERVER_NAME = "Sunsama API Server";
8
9
  export declare const PACKAGE_NAME = "mcp-sunsama";
9
10
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,OAAO,WAAW,CAAC;AAChC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,YAAY,gBAAgB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,WAAW,CAAC;AAChC,eAAO,MAAM,WAAW,uBAAuB,CAAC;AAChD,eAAO,MAAM,YAAY,gBAAgB,CAAC"}
package/dist/constants.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Application constants
3
3
  *
4
- * IMPORTANT: Keep VERSION in sync with package.json version
4
+ * VERSION is automatically synced from package.json by scripts/sync-version.ts
5
+ * when running `bun run version`
5
6
  */
6
- export const VERSION = "0.16.0";
7
+ export const VERSION = "0.17.0";
7
8
  export const SERVER_NAME = "Sunsama API Server";
8
9
  export const PACKAGE_NAME = "mcp-sunsama";
package/dist/schemas.d.ts CHANGED
@@ -282,7 +282,7 @@ export declare const updateTaskPlannedTimeSchema: z.ZodObject<{
282
282
  timeEstimateMinutes: number;
283
283
  limitResponsePayload?: boolean | undefined;
284
284
  }>;
285
- export declare const updateTaskNotesSchema: z.ZodEffects<z.ZodObject<{
285
+ export declare const updateTaskNotesSchema: z.ZodObject<{
286
286
  taskId: z.ZodString;
287
287
  html: z.ZodOptional<z.ZodString>;
288
288
  markdown: z.ZodOptional<z.ZodString>;
@@ -297,16 +297,6 @@ export declare const updateTaskNotesSchema: z.ZodEffects<z.ZodObject<{
297
297
  limitResponsePayload?: boolean | undefined;
298
298
  html?: string | undefined;
299
299
  markdown?: string | undefined;
300
- }>, {
301
- taskId: string;
302
- limitResponsePayload?: boolean | undefined;
303
- html?: string | undefined;
304
- markdown?: string | undefined;
305
- }, {
306
- taskId: string;
307
- limitResponsePayload?: boolean | undefined;
308
- html?: string | undefined;
309
- markdown?: string | undefined;
310
300
  }>;
311
301
  export declare const updateTaskDueDateSchema: z.ZodObject<{
312
302
  taskId: z.ZodString;
@@ -350,6 +340,74 @@ export declare const updateTaskStreamSchema: z.ZodObject<{
350
340
  streamId: string;
351
341
  limitResponsePayload?: boolean | undefined;
352
342
  }>;
343
+ /**
344
+ * Subtask Operation Schemas
345
+ */
346
+ export declare const createSubtasksSchema: z.ZodObject<{
347
+ taskId: z.ZodString;
348
+ subtaskIds: z.ZodArray<z.ZodString, "many">;
349
+ limitResponsePayload: z.ZodOptional<z.ZodBoolean>;
350
+ }, "strip", z.ZodTypeAny, {
351
+ taskId: string;
352
+ subtaskIds: string[];
353
+ limitResponsePayload?: boolean | undefined;
354
+ }, {
355
+ taskId: string;
356
+ subtaskIds: string[];
357
+ limitResponsePayload?: boolean | undefined;
358
+ }>;
359
+ export declare const updateSubtaskTitleSchema: z.ZodObject<{
360
+ taskId: z.ZodString;
361
+ subtaskId: z.ZodString;
362
+ title: z.ZodString;
363
+ }, "strip", z.ZodTypeAny, {
364
+ taskId: string;
365
+ subtaskId: string;
366
+ title: string;
367
+ }, {
368
+ taskId: string;
369
+ subtaskId: string;
370
+ title: string;
371
+ }>;
372
+ export declare const completeSubtaskSchema: z.ZodObject<{
373
+ taskId: z.ZodString;
374
+ subtaskId: z.ZodString;
375
+ completedDate: z.ZodOptional<z.ZodString>;
376
+ limitResponsePayload: z.ZodOptional<z.ZodBoolean>;
377
+ }, "strip", z.ZodTypeAny, {
378
+ taskId: string;
379
+ subtaskId: string;
380
+ limitResponsePayload?: boolean | undefined;
381
+ completedDate?: string | undefined;
382
+ }, {
383
+ taskId: string;
384
+ subtaskId: string;
385
+ limitResponsePayload?: boolean | undefined;
386
+ completedDate?: string | undefined;
387
+ }>;
388
+ export declare const uncompleteSubtaskSchema: z.ZodObject<{
389
+ taskId: z.ZodString;
390
+ subtaskId: z.ZodString;
391
+ limitResponsePayload: z.ZodOptional<z.ZodBoolean>;
392
+ }, "strip", z.ZodTypeAny, {
393
+ taskId: string;
394
+ subtaskId: string;
395
+ limitResponsePayload?: boolean | undefined;
396
+ }, {
397
+ taskId: string;
398
+ subtaskId: string;
399
+ limitResponsePayload?: boolean | undefined;
400
+ }>;
401
+ export declare const addSubtaskSchema: z.ZodObject<{
402
+ taskId: z.ZodString;
403
+ title: z.ZodString;
404
+ }, "strip", z.ZodTypeAny, {
405
+ taskId: string;
406
+ title: string;
407
+ }, {
408
+ taskId: string;
409
+ title: string;
410
+ }>;
353
411
  /**
354
412
  * Response Type Schemas (for validation and documentation)
355
413
  */
@@ -474,9 +532,9 @@ export declare const taskSchema: z.ZodObject<{
474
532
  }, "strip", z.ZodTypeAny, {
475
533
  status: string;
476
534
  createdAt: string;
535
+ title: string;
477
536
  _id: string;
478
537
  groupId: string;
479
- title: string;
480
538
  updatedAt: string;
481
539
  userId: string;
482
540
  streamId?: string | undefined;
@@ -486,9 +544,9 @@ export declare const taskSchema: z.ZodObject<{
486
544
  }, {
487
545
  status: string;
488
546
  createdAt: string;
547
+ title: string;
489
548
  _id: string;
490
549
  groupId: string;
491
- title: string;
492
550
  updatedAt: string;
493
551
  userId: string;
494
552
  streamId?: string | undefined;
@@ -649,9 +707,9 @@ export declare const tasksResponseSchema: z.ZodObject<{
649
707
  }, "strip", z.ZodTypeAny, {
650
708
  status: string;
651
709
  createdAt: string;
710
+ title: string;
652
711
  _id: string;
653
712
  groupId: string;
654
- title: string;
655
713
  updatedAt: string;
656
714
  userId: string;
657
715
  streamId?: string | undefined;
@@ -661,9 +719,9 @@ export declare const tasksResponseSchema: z.ZodObject<{
661
719
  }, {
662
720
  status: string;
663
721
  createdAt: string;
722
+ title: string;
664
723
  _id: string;
665
724
  groupId: string;
666
- title: string;
667
725
  updatedAt: string;
668
726
  userId: string;
669
727
  streamId?: string | undefined;
@@ -676,9 +734,9 @@ export declare const tasksResponseSchema: z.ZodObject<{
676
734
  tasks: {
677
735
  status: string;
678
736
  createdAt: string;
737
+ title: string;
679
738
  _id: string;
680
739
  groupId: string;
681
- title: string;
682
740
  updatedAt: string;
683
741
  userId: string;
684
742
  streamId?: string | undefined;
@@ -691,9 +749,9 @@ export declare const tasksResponseSchema: z.ZodObject<{
691
749
  tasks: {
692
750
  status: string;
693
751
  createdAt: string;
752
+ title: string;
694
753
  _id: string;
695
754
  groupId: string;
696
- title: string;
697
755
  updatedAt: string;
698
756
  userId: string;
699
757
  streamId?: string | undefined;
@@ -789,6 +847,11 @@ export type UpdateTaskNotesInput = z.infer<typeof updateTaskNotesSchema>;
789
847
  export type UpdateTaskDueDateInput = z.infer<typeof updateTaskDueDateSchema>;
790
848
  export type UpdateTaskTextInput = z.infer<typeof updateTaskTextSchema>;
791
849
  export type UpdateTaskStreamInput = z.infer<typeof updateTaskStreamSchema>;
850
+ export type CreateSubtasksInput = z.infer<typeof createSubtasksSchema>;
851
+ export type UpdateSubtaskTitleInput = z.infer<typeof updateSubtaskTitleSchema>;
852
+ export type CompleteSubtaskInput = z.infer<typeof completeSubtaskSchema>;
853
+ export type UncompleteSubtaskInput = z.infer<typeof uncompleteSubtaskSchema>;
854
+ export type AddSubtaskInput = z.infer<typeof addSubtaskSchema>;
792
855
  export type User = z.infer<typeof userSchema>;
793
856
  export type Task = z.infer<typeof taskSchema>;
794
857
  export type Stream = z.infer<typeof streamSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}