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 +24 -0
- package/CLAUDE.md +35 -10
- package/README.md +25 -0
- package/bun.lock +3 -2
- package/dist/auth/http.d.ts +1 -0
- package/dist/auth/http.d.ts.map +1 -1
- package/dist/auth/http.js +79 -9
- package/dist/auth/stdio.d.ts +1 -0
- package/dist/auth/stdio.d.ts.map +1 -1
- package/dist/auth/stdio.js +10 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/constants.d.ts +3 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -2
- package/dist/schemas.d.ts +80 -17
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +36 -9
- package/dist/schemas.test.js +8 -6
- package/dist/tools/task-tools.d.ts +30 -0
- package/dist/tools/task-tools.d.ts.map +1 -1
- package/dist/tools/task-tools.js +93 -1
- package/package.json +4 -4
- package/scripts/sync-version.ts +35 -0
- package/src/auth/http.ts +88 -9
- package/src/auth/stdio.ts +11 -1
- package/src/auth/types.ts +1 -1
- package/src/constants.ts +3 -2
- package/src/schemas.test.ts +8 -6
- package/src/schemas.ts +79 -13
- package/src/tools/task-tools.ts +146 -0
- package/tsconfig.json +2 -1
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
|
-
-
|
|
91
|
-
- Example: `update-task-notes` requires either `html` OR `markdown`,
|
|
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 (
|
|
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**:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
package/dist/auth/http.d.ts
CHANGED
|
@@ -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>;
|
package/dist/auth/http.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
109
|
-
throw new Error("Basic
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
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 ${
|
|
224
|
+
console.error(`[Client Cache] Cached new client for ${identifier} (total: ${clientCache.size})`);
|
|
155
225
|
return sessionData;
|
|
156
226
|
}
|
|
157
227
|
finally {
|
package/dist/auth/stdio.d.ts
CHANGED
|
@@ -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>;
|
package/dist/auth/stdio.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/auth/stdio.js
CHANGED
|
@@ -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);
|
package/dist/auth/types.d.ts
CHANGED
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Application constants
|
|
3
3
|
*
|
|
4
|
-
*
|
|
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.
|
|
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
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA
|
|
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
|
-
*
|
|
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.
|
|
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.
|
|
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>;
|
package/dist/schemas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAGH,eAAO,MAAM,sBAAsB,+CAIjC,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAW9B,CAAC;AAGH,eAAO,MAAM,qBAAqB,gDAAe,CAAC;AAGlD,eAAO,MAAM,sBAAsB;;;;;;;;;EAOjC,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;EAI5B,CAAC;AAEH;;GAEG;AAGH,eAAO,MAAM,aAAa,gDAAe,CAAC;AAE1C;;GAEG;AAGH,eAAO,MAAM,gBAAgB,gDAAe,CAAC;AA8C7C;;GAEG;AAGH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsB3B,CAAC;AAGH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;EAUnC,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAU3B,CAAC;AAGH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;EAarC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;EAUlC,CAAC;AAGH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;EAUtC,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|