ponlo-ai 1.0.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/README.md +418 -0
- package/dist/client.d.ts +64 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +94 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/calendar.d.ts +19 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +225 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/notes.d.ts +19 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +108 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/tasks.d.ts +19 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +284 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
# Ponlo.ai MCP Server
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) server that exposes Ponlo.ai's functionality (tasks, calendar, notes) as tools for Claude Code and other MCP clients.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Start
|
|
6
|
+
|
|
7
|
+
### 1. Generate an API Key
|
|
8
|
+
|
|
9
|
+
1. Log into your Ponlo.ai instance
|
|
10
|
+
2. Go to **Admin → API Keys**
|
|
11
|
+
3. Click **"Generate API Key"**
|
|
12
|
+
4. Give it a name (e.g., "Claude Code - MacBook")
|
|
13
|
+
5. **Copy the key immediately** - it won't be shown again!
|
|
14
|
+
|
|
15
|
+
Your key will look like: `ponlo_godoy_family_abc123_xyz789...`
|
|
16
|
+
|
|
17
|
+
### 2. Configure Claude Code
|
|
18
|
+
|
|
19
|
+
Add to your `~/.claude/config.json`:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"mcpServers": {
|
|
24
|
+
"ponlo": {
|
|
25
|
+
"command": "npx",
|
|
26
|
+
"args": ["tsx", "/full/path/to/ponlo-ai/mcp-server/index.ts"],
|
|
27
|
+
"env": {
|
|
28
|
+
"PONLO_API_KEY": "ponlo_godoy_family_abc123_xyz789...",
|
|
29
|
+
"PONLO_API_URL": "http://localhost:3000"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Important:** Replace:
|
|
37
|
+
- `/full/path/to/ponlo-ai` with the actual path to your Ponlo.ai repository
|
|
38
|
+
- `ponlo_godoy_family_abc123_xyz789...` with your actual API key
|
|
39
|
+
- `http://localhost:3000` with your Ponlo.ai URL (use `https://` in production)
|
|
40
|
+
|
|
41
|
+
### 3. Restart Claude Code
|
|
42
|
+
|
|
43
|
+
Restart Claude Code to load the new MCP server configuration.
|
|
44
|
+
|
|
45
|
+
### 4. Test It!
|
|
46
|
+
|
|
47
|
+
Try these commands in Claude Code:
|
|
48
|
+
- "List my ponlo tasks"
|
|
49
|
+
- "Add a task: Buy groceries"
|
|
50
|
+
- "What's on my ponlo calendar tomorrow?"
|
|
51
|
+
- "Create a ponlo note: Call dentist"
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 📚 Available Tools
|
|
56
|
+
|
|
57
|
+
### Task Management (7 tools)
|
|
58
|
+
|
|
59
|
+
#### `ponlo_tasks_list`
|
|
60
|
+
List all tasks in your workspace.
|
|
61
|
+
|
|
62
|
+
**Example:**
|
|
63
|
+
```
|
|
64
|
+
List my tasks
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### `ponlo_tasks_create`
|
|
68
|
+
Create a new task or chore.
|
|
69
|
+
|
|
70
|
+
**Parameters:**
|
|
71
|
+
- `title` (required): Task title
|
|
72
|
+
- `description` (optional): Detailed description
|
|
73
|
+
- `deadline` (optional): ISO 8601 date (e.g., "2024-12-25T10:00:00Z")
|
|
74
|
+
- `resetMode` (optional): "once", "daily", "weekly", "monthly", "manual"
|
|
75
|
+
- `resetDay` (optional): For weekly (0-6), for monthly (1-31)
|
|
76
|
+
- `assignedTo` (optional): Person's name
|
|
77
|
+
|
|
78
|
+
**Example:**
|
|
79
|
+
```
|
|
80
|
+
Create a task: Take out trash, recurring daily
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### `ponlo_tasks_update`
|
|
84
|
+
Update task details without changing completion status.
|
|
85
|
+
|
|
86
|
+
**Parameters:**
|
|
87
|
+
- `id` (required): Task ID
|
|
88
|
+
- `title`, `description`, `deadline`, `resetMode`, `resetDay`, `assignedTo` (all optional)
|
|
89
|
+
|
|
90
|
+
**Example:**
|
|
91
|
+
```
|
|
92
|
+
Update task abc123 to be due on Friday
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
#### `ponlo_tasks_complete`
|
|
96
|
+
Mark a task as completed.
|
|
97
|
+
|
|
98
|
+
**Parameters:**
|
|
99
|
+
- `id` (required): Task ID
|
|
100
|
+
|
|
101
|
+
**Example:**
|
|
102
|
+
```
|
|
103
|
+
Mark task abc123 as complete
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### `ponlo_tasks_uncomplete`
|
|
107
|
+
Mark a completed task as incomplete.
|
|
108
|
+
|
|
109
|
+
**Parameters:**
|
|
110
|
+
- `id` (required): Task ID
|
|
111
|
+
|
|
112
|
+
#### `ponlo_tasks_delete`
|
|
113
|
+
Permanently delete a task.
|
|
114
|
+
|
|
115
|
+
**Parameters:**
|
|
116
|
+
- `id` (required): Task ID
|
|
117
|
+
|
|
118
|
+
**Example:**
|
|
119
|
+
```
|
|
120
|
+
Delete task abc123
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### `ponlo_tasks_reorder`
|
|
124
|
+
Change the display order of tasks.
|
|
125
|
+
|
|
126
|
+
**Parameters:**
|
|
127
|
+
- `tasks` (required): Array of `{id, order}` objects
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### Calendar Management (5 tools)
|
|
132
|
+
|
|
133
|
+
#### `ponlo_calendar_list_events`
|
|
134
|
+
List calendar events in a date range.
|
|
135
|
+
|
|
136
|
+
**Parameters:**
|
|
137
|
+
- `start` (optional): ISO 8601 date (defaults to today)
|
|
138
|
+
- `end` (optional): ISO 8601 date (defaults to 7 days from now)
|
|
139
|
+
|
|
140
|
+
**Example:**
|
|
141
|
+
```
|
|
142
|
+
What's on my calendar this week?
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### `ponlo_calendar_create_event`
|
|
146
|
+
Create a new calendar event.
|
|
147
|
+
|
|
148
|
+
**Parameters:**
|
|
149
|
+
- `title` (required): Event title
|
|
150
|
+
- `startTime` (required): ISO 8601 date/time
|
|
151
|
+
- `endTime` (optional): ISO 8601 date/time
|
|
152
|
+
- `allDay` (optional): Boolean
|
|
153
|
+
- `location` (optional): Location string
|
|
154
|
+
- `description` (optional): Event description
|
|
155
|
+
|
|
156
|
+
**Example:**
|
|
157
|
+
```
|
|
158
|
+
Add a calendar event: Team meeting tomorrow at 2pm
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### `ponlo_calendar_update_event`
|
|
162
|
+
Update an existing event.
|
|
163
|
+
|
|
164
|
+
**Parameters:**
|
|
165
|
+
- `id` (required): Event ID
|
|
166
|
+
- `title`, `startTime`, `endTime`, `location`, `description` (all optional)
|
|
167
|
+
|
|
168
|
+
#### `ponlo_calendar_delete_event`
|
|
169
|
+
Delete a calendar event.
|
|
170
|
+
|
|
171
|
+
**Parameters:**
|
|
172
|
+
- `id` (required): Event ID
|
|
173
|
+
|
|
174
|
+
#### `ponlo_calendar_sync`
|
|
175
|
+
Manually sync with Google Calendar.
|
|
176
|
+
|
|
177
|
+
**Example:**
|
|
178
|
+
```
|
|
179
|
+
Sync my ponlo calendar
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
### Notes Management (3 tools)
|
|
185
|
+
|
|
186
|
+
#### `ponlo_notes_get`
|
|
187
|
+
Get the current sticky note.
|
|
188
|
+
|
|
189
|
+
**Example:**
|
|
190
|
+
```
|
|
191
|
+
What's my current ponlo note?
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
#### `ponlo_notes_create`
|
|
195
|
+
Create a new sticky note.
|
|
196
|
+
|
|
197
|
+
**Parameters:**
|
|
198
|
+
- `content` (required): Note text
|
|
199
|
+
- `color` (optional): "yellow", "pink", "blue", "green"
|
|
200
|
+
|
|
201
|
+
**Example:**
|
|
202
|
+
```
|
|
203
|
+
Create a ponlo note: Remember to call mom
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
#### `ponlo_notes_delete`
|
|
207
|
+
Delete a sticky note.
|
|
208
|
+
|
|
209
|
+
**Parameters:**
|
|
210
|
+
- `id` (required): Note ID
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 🔧 Development Setup
|
|
215
|
+
|
|
216
|
+
### Build the MCP Server
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# Install dependencies (if not already done)
|
|
220
|
+
npm install
|
|
221
|
+
|
|
222
|
+
# Build TypeScript to JavaScript
|
|
223
|
+
npm run mcp:build
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Run in Development Mode
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# Run with tsx (no build needed)
|
|
230
|
+
npm run mcp:dev
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Run in Production
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# After building
|
|
237
|
+
npm run mcp:start
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## 🔐 Security
|
|
243
|
+
|
|
244
|
+
### API Key Security
|
|
245
|
+
|
|
246
|
+
- API keys are hashed with SHA-256 before storage
|
|
247
|
+
- Keys are shown only once at generation
|
|
248
|
+
- Use HTTPS in production (not HTTP)
|
|
249
|
+
- Each workspace member can generate their own keys
|
|
250
|
+
- Keys can be revoked at any time
|
|
251
|
+
|
|
252
|
+
### Audit Trails
|
|
253
|
+
|
|
254
|
+
All actions via MCP are tracked:
|
|
255
|
+
- `createdBy` - Who created the resource
|
|
256
|
+
- `updatedBy` - Who last updated it
|
|
257
|
+
- `completedBy` - Who marked a task complete
|
|
258
|
+
|
|
259
|
+
Check the database to see audit trails:
|
|
260
|
+
```sql
|
|
261
|
+
SELECT title, created_by, completed_by FROM tasks;
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 🐛 Troubleshooting
|
|
267
|
+
|
|
268
|
+
### "Configuration error: PONLO_API_KEY is required"
|
|
269
|
+
|
|
270
|
+
**Solution:** Make sure you've set the `PONLO_API_KEY` environment variable in your Claude Code config.
|
|
271
|
+
|
|
272
|
+
### "API request failed: 401 Unauthorized"
|
|
273
|
+
|
|
274
|
+
**Solution:** Your API key is invalid or has been revoked. Generate a new key in Ponlo.ai settings.
|
|
275
|
+
|
|
276
|
+
### "API request failed: 500"
|
|
277
|
+
|
|
278
|
+
**Solution:** Check that:
|
|
279
|
+
1. Your Ponlo.ai instance is running
|
|
280
|
+
2. The `PONLO_API_URL` is correct
|
|
281
|
+
3. The database is accessible
|
|
282
|
+
|
|
283
|
+
### "Module not found" errors
|
|
284
|
+
|
|
285
|
+
**Solution:**
|
|
286
|
+
```bash
|
|
287
|
+
# Make sure all dependencies are installed
|
|
288
|
+
npm install
|
|
289
|
+
|
|
290
|
+
# Make sure you're using the right paths
|
|
291
|
+
# In Claude Code config, use absolute paths
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### MCP server not showing up in Claude Code
|
|
295
|
+
|
|
296
|
+
**Solution:**
|
|
297
|
+
1. Check your `~/.claude/config.json` syntax is valid JSON
|
|
298
|
+
2. Restart Claude Code completely
|
|
299
|
+
3. Check Claude Code logs for errors
|
|
300
|
+
4. Make sure the file paths are absolute (not relative)
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 📊 Usage Examples
|
|
305
|
+
|
|
306
|
+
### Morning Routine
|
|
307
|
+
```
|
|
308
|
+
User: What do I need to do today on ponlo?
|
|
309
|
+
Claude: [Lists today's tasks and calendar events]
|
|
310
|
+
|
|
311
|
+
User: Add a task: Water plants, recurring daily
|
|
312
|
+
Claude: [Creates the task with daily reset]
|
|
313
|
+
|
|
314
|
+
User: What's on my calendar for the rest of the week?
|
|
315
|
+
Claude: [Shows upcoming events]
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Task Management
|
|
319
|
+
```
|
|
320
|
+
User: Show my ponlo tasks
|
|
321
|
+
Claude: [Lists all tasks with completion status]
|
|
322
|
+
|
|
323
|
+
User: Mark task abc123 as done
|
|
324
|
+
Claude: [Marks complete and tracks who completed it]
|
|
325
|
+
|
|
326
|
+
User: Delete the task about buying milk
|
|
327
|
+
Claude: [Finds and deletes the task]
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Quick Notes
|
|
331
|
+
```
|
|
332
|
+
User: Create a ponlo note: Don't forget to submit timesheet
|
|
333
|
+
Claude: [Creates the note]
|
|
334
|
+
|
|
335
|
+
User: What's my current ponlo note?
|
|
336
|
+
Claude: [Shows the note]
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 🚢 Publishing to NPM (Future)
|
|
342
|
+
|
|
343
|
+
To make installation easier, you can publish this as an NPM package:
|
|
344
|
+
|
|
345
|
+
1. Update `package.json`:
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"name": "ponlo-ai",
|
|
349
|
+
"version": "1.0.0",
|
|
350
|
+
"bin": {
|
|
351
|
+
"ponlo-ai": "./dist/mcp-server/index.js"
|
|
352
|
+
},
|
|
353
|
+
"files": [
|
|
354
|
+
"dist/mcp-server"
|
|
355
|
+
]
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
2. Build and publish:
|
|
360
|
+
```bash
|
|
361
|
+
npm run mcp:build
|
|
362
|
+
npm publish
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
3. Users can then install with:
|
|
366
|
+
```bash
|
|
367
|
+
npm install -g ponlo-ai
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
4. And configure Claude Code with:
|
|
371
|
+
```json
|
|
372
|
+
{
|
|
373
|
+
"mcpServers": {
|
|
374
|
+
"ponlo": {
|
|
375
|
+
"command": "ponlo-ai",
|
|
376
|
+
"env": {
|
|
377
|
+
"PONLO_API_KEY": "...",
|
|
378
|
+
"PONLO_API_URL": "..."
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 🤝 Contributing
|
|
388
|
+
|
|
389
|
+
This MCP server is part of the Ponlo.ai project. To add new tools:
|
|
390
|
+
|
|
391
|
+
1. Add tool definitions in `mcp-server/tools/*.ts`
|
|
392
|
+
2. Implement the handler function
|
|
393
|
+
3. Register the tool in `mcp-server/index.ts`
|
|
394
|
+
4. Update this README with the new tool documentation
|
|
395
|
+
5. Add corresponding API endpoints if needed
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
## 📝 License
|
|
400
|
+
|
|
401
|
+
Same as Ponlo.ai main project.
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## 💡 Tips
|
|
406
|
+
|
|
407
|
+
- **Use natural language** - Claude Code will map your requests to the right tools
|
|
408
|
+
- **Be specific with dates** - Use "tomorrow", "next Friday", etc. and Claude will convert to ISO format
|
|
409
|
+
- **Task IDs** - You don't need to remember them, just describe the task
|
|
410
|
+
- **Audit trails** - Check the database to see who did what and when
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## 🔗 Links
|
|
415
|
+
|
|
416
|
+
- [Ponlo.ai Main Project](../)
|
|
417
|
+
- [Model Context Protocol Documentation](https://modelcontextprotocol.io)
|
|
418
|
+
- [Claude Code Documentation](https://docs.anthropic.com/claude/docs/claude-code)
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for Ponlo.ai API
|
|
3
|
+
* Handles all API requests with API key authentication
|
|
4
|
+
*/
|
|
5
|
+
import type { Task, CalendarEvent, StickyNote } from './types.js';
|
|
6
|
+
export declare class PonloClient {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
private apiKey;
|
|
9
|
+
constructor(baseUrl: string, apiKey: string);
|
|
10
|
+
/**
|
|
11
|
+
* Make an authenticated API request
|
|
12
|
+
*/
|
|
13
|
+
private request;
|
|
14
|
+
listTasks(): Promise<Task[]>;
|
|
15
|
+
createTask(data: {
|
|
16
|
+
title: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
deadline?: string;
|
|
19
|
+
resetMode?: 'once' | 'daily' | 'weekly' | 'monthly' | 'manual';
|
|
20
|
+
resetDay?: number;
|
|
21
|
+
assignedTo?: string;
|
|
22
|
+
}): Promise<Task>;
|
|
23
|
+
updateTask(data: {
|
|
24
|
+
id: string;
|
|
25
|
+
title?: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
deadline?: string;
|
|
28
|
+
resetMode?: string;
|
|
29
|
+
resetDay?: number;
|
|
30
|
+
assignedTo?: string;
|
|
31
|
+
completed?: boolean;
|
|
32
|
+
order?: number;
|
|
33
|
+
}): Promise<Task>;
|
|
34
|
+
deleteTask(id: string): Promise<void>;
|
|
35
|
+
reorderTasks(tasks: {
|
|
36
|
+
id: string;
|
|
37
|
+
order: number;
|
|
38
|
+
}[]): Promise<void>;
|
|
39
|
+
listEvents(start?: string, end?: string): Promise<CalendarEvent[]>;
|
|
40
|
+
createEvent(data: {
|
|
41
|
+
title: string;
|
|
42
|
+
startTime: string;
|
|
43
|
+
endTime?: string;
|
|
44
|
+
allDay?: boolean;
|
|
45
|
+
location?: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
}): Promise<CalendarEvent>;
|
|
48
|
+
updateEvent(id: string, data: {
|
|
49
|
+
title?: string;
|
|
50
|
+
startTime?: string;
|
|
51
|
+
endTime?: string;
|
|
52
|
+
location?: string;
|
|
53
|
+
description?: string;
|
|
54
|
+
}): Promise<void>;
|
|
55
|
+
deleteEvent(id: string): Promise<void>;
|
|
56
|
+
syncCalendars(): Promise<void>;
|
|
57
|
+
getCurrentNote(): Promise<StickyNote | null>;
|
|
58
|
+
createNote(data: {
|
|
59
|
+
content: string;
|
|
60
|
+
color?: string;
|
|
61
|
+
}): Promise<StickyNote>;
|
|
62
|
+
deleteNote(id: string): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAIV,IAAI,EACJ,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAK3C;;OAEG;YACW,OAAO;IAmCf,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAK5B,UAAU,CAAC,IAAI,EAAE;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;QAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKX,UAAU,CAAC,IAAI,EAAE;QACrB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKX,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,YAAY,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnE,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAelE,WAAW,CAAC,IAAI,EAAE;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;IASpB,WAAW,CACf,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAK5C,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAK1E,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG5C"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for Ponlo.ai API
|
|
3
|
+
* Handles all API requests with API key authentication
|
|
4
|
+
*/
|
|
5
|
+
export class PonloClient {
|
|
6
|
+
baseUrl;
|
|
7
|
+
apiKey;
|
|
8
|
+
constructor(baseUrl, apiKey) {
|
|
9
|
+
this.baseUrl = baseUrl.replace(/\/$/, ''); // Remove trailing slash
|
|
10
|
+
this.apiKey = apiKey;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Make an authenticated API request
|
|
14
|
+
*/
|
|
15
|
+
async request(method, path, body) {
|
|
16
|
+
const url = `${this.baseUrl}${path}`;
|
|
17
|
+
const headers = {
|
|
18
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
};
|
|
21
|
+
const options = {
|
|
22
|
+
method,
|
|
23
|
+
headers,
|
|
24
|
+
};
|
|
25
|
+
if (body) {
|
|
26
|
+
options.body = JSON.stringify(body);
|
|
27
|
+
}
|
|
28
|
+
const response = await fetch(url, options);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
const errorText = await response.text();
|
|
31
|
+
throw new Error(`API request failed: ${response.status} ${response.statusText}\n${errorText}`);
|
|
32
|
+
}
|
|
33
|
+
return response.json();
|
|
34
|
+
}
|
|
35
|
+
// ===== Task Methods =====
|
|
36
|
+
async listTasks() {
|
|
37
|
+
const response = await this.request('GET', '/api/tasks');
|
|
38
|
+
return response.tasks;
|
|
39
|
+
}
|
|
40
|
+
async createTask(data) {
|
|
41
|
+
const response = await this.request('POST', '/api/tasks', data);
|
|
42
|
+
return response.task;
|
|
43
|
+
}
|
|
44
|
+
async updateTask(data) {
|
|
45
|
+
const response = await this.request('PATCH', '/api/tasks', data);
|
|
46
|
+
return response.task;
|
|
47
|
+
}
|
|
48
|
+
async deleteTask(id) {
|
|
49
|
+
await this.request('DELETE', '/api/tasks', { id });
|
|
50
|
+
}
|
|
51
|
+
async reorderTasks(tasks) {
|
|
52
|
+
await this.request('POST', '/api/tasks/reorder', { tasks });
|
|
53
|
+
}
|
|
54
|
+
// ===== Calendar Methods =====
|
|
55
|
+
async listEvents(start, end) {
|
|
56
|
+
let path = '/api/calendar/events';
|
|
57
|
+
const params = new URLSearchParams();
|
|
58
|
+
if (start)
|
|
59
|
+
params.append('start', start);
|
|
60
|
+
if (end)
|
|
61
|
+
params.append('end', end);
|
|
62
|
+
if (params.toString()) {
|
|
63
|
+
path += `?${params.toString()}`;
|
|
64
|
+
}
|
|
65
|
+
const response = await this.request('GET', path);
|
|
66
|
+
return response.events;
|
|
67
|
+
}
|
|
68
|
+
async createEvent(data) {
|
|
69
|
+
const response = await this.request('POST', '/api/calendar/events', data);
|
|
70
|
+
return response.event;
|
|
71
|
+
}
|
|
72
|
+
async updateEvent(id, data) {
|
|
73
|
+
await this.request('PATCH', `/api/calendar/events/${id}`, data);
|
|
74
|
+
}
|
|
75
|
+
async deleteEvent(id) {
|
|
76
|
+
await this.request('DELETE', `/api/calendar/events/${id}`);
|
|
77
|
+
}
|
|
78
|
+
async syncCalendars() {
|
|
79
|
+
await this.request('POST', '/api/calendar/sync');
|
|
80
|
+
}
|
|
81
|
+
// ===== Notes Methods =====
|
|
82
|
+
async getCurrentNote() {
|
|
83
|
+
const response = await this.request('GET', '/api/notes');
|
|
84
|
+
return response.note;
|
|
85
|
+
}
|
|
86
|
+
async createNote(data) {
|
|
87
|
+
const response = await this.request('POST', '/api/notes', data);
|
|
88
|
+
return response.note;
|
|
89
|
+
}
|
|
90
|
+
async deleteNote(id) {
|
|
91
|
+
await this.request('DELETE', '/api/notes', { id });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Configuration
|
|
3
|
+
* Loads configuration from environment variables
|
|
4
|
+
*/
|
|
5
|
+
export interface MCPConfig {
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Load configuration from environment variables
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadConfig(): MCPConfig;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,SAAS,CAgBtC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server Configuration
|
|
3
|
+
* Loads configuration from environment variables
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Load configuration from environment variables
|
|
7
|
+
*/
|
|
8
|
+
export function loadConfig() {
|
|
9
|
+
const apiUrl = process.env.PONLO_API_URL;
|
|
10
|
+
const apiKey = process.env.PONLO_API_KEY;
|
|
11
|
+
if (!apiUrl) {
|
|
12
|
+
throw new Error('PONLO_API_URL environment variable is required');
|
|
13
|
+
}
|
|
14
|
+
if (!apiKey) {
|
|
15
|
+
throw new Error('PONLO_API_KEY environment variable is required');
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
apiUrl: apiUrl.trim(),
|
|
19
|
+
apiKey: apiKey.trim(),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|