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/dist/index.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Ponlo.ai MCP Server
|
|
4
|
+
* Exposes Ponlo.ai functionality (tasks, calendar, notes) as MCP tools
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { PonloClient } from './client.js';
|
|
10
|
+
import { loadConfig } from './config.js';
|
|
11
|
+
import { registerTaskTools, handleTaskToolCall } from './tools/tasks.js';
|
|
12
|
+
import { registerCalendarTools, handleCalendarToolCall } from './tools/calendar.js';
|
|
13
|
+
import { registerNotesTools, handleNotesToolCall } from './tools/notes.js';
|
|
14
|
+
/**
|
|
15
|
+
* Main server setup
|
|
16
|
+
*/
|
|
17
|
+
async function main() {
|
|
18
|
+
// Load configuration
|
|
19
|
+
let config;
|
|
20
|
+
try {
|
|
21
|
+
config = loadConfig();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error('Configuration error:', error.message);
|
|
25
|
+
console.error('\nRequired environment variables:');
|
|
26
|
+
console.error(' PONLO_API_URL - Your Ponlo.ai instance URL (e.g., https://ponlo.yourfamily.com)');
|
|
27
|
+
console.error(' PONLO_API_KEY - Your Ponlo.ai API key (generate from Settings → API Keys)');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
// Initialize Ponlo API client
|
|
31
|
+
const client = new PonloClient(config.apiUrl, config.apiKey);
|
|
32
|
+
// Create MCP server
|
|
33
|
+
const server = new Server({
|
|
34
|
+
name: 'ponlo-ai',
|
|
35
|
+
version: '1.0.0',
|
|
36
|
+
}, {
|
|
37
|
+
capabilities: {
|
|
38
|
+
tools: {},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
// Register all tools
|
|
42
|
+
const tools = [
|
|
43
|
+
...registerTaskTools(),
|
|
44
|
+
...registerCalendarTools(),
|
|
45
|
+
...registerNotesTools(),
|
|
46
|
+
];
|
|
47
|
+
// Handle list_tools request
|
|
48
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
49
|
+
return { tools };
|
|
50
|
+
});
|
|
51
|
+
// Handle tool execution
|
|
52
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
53
|
+
const { name, arguments: args } = request.params;
|
|
54
|
+
try {
|
|
55
|
+
// Route to appropriate tool handler
|
|
56
|
+
if (name.startsWith('ponlo_tasks_')) {
|
|
57
|
+
return await handleTaskToolCall(name, args || {}, client);
|
|
58
|
+
}
|
|
59
|
+
else if (name.startsWith('ponlo_calendar_')) {
|
|
60
|
+
return await handleCalendarToolCall(name, args || {}, client);
|
|
61
|
+
}
|
|
62
|
+
else if (name.startsWith('ponlo_notes_')) {
|
|
63
|
+
return await handleNotesToolCall(name, args || {}, client);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: `Error: ${errorMessage}`,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
isError: true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// Start server with stdio transport
|
|
83
|
+
const transport = new StdioServerTransport();
|
|
84
|
+
await server.connect(transport);
|
|
85
|
+
console.error('Ponlo.ai MCP server running on stdio');
|
|
86
|
+
console.error(`Connected to: ${config.apiUrl}`);
|
|
87
|
+
}
|
|
88
|
+
// Run the server
|
|
89
|
+
main().catch((error) => {
|
|
90
|
+
console.error('Fatal error:', error);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar Tools for Ponlo.ai MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import type { PonloClient } from '../client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register all calendar management tools
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerCalendarTools(): Tool[];
|
|
10
|
+
/**
|
|
11
|
+
* Handle calendar tool calls
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleCalendarToolCall(toolName: string, args: Record<string, unknown>, client: PonloClient): Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../tools/calendar.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,EAAE,CAgH9C;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW;;;;;GAiHpB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calendar Tools for Ponlo.ai MCP Server
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Register all calendar management tools
|
|
6
|
+
*/
|
|
7
|
+
export function registerCalendarTools() {
|
|
8
|
+
return [
|
|
9
|
+
{
|
|
10
|
+
name: 'ponlo_calendar_list_events',
|
|
11
|
+
description: 'List calendar events in a date range. Returns events from all enabled calendars.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {
|
|
15
|
+
start: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
description: 'Start date in ISO 8601 format (e.g., "2024-12-01T00:00:00Z"). Defaults to today.',
|
|
18
|
+
},
|
|
19
|
+
end: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'End date in ISO 8601 format (e.g., "2024-12-31T23:59:59Z"). Defaults to 7 days from now.',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
required: [],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: 'ponlo_calendar_create_event',
|
|
29
|
+
description: 'Create a new calendar event. The event will be added to your manual events calendar.',
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: {
|
|
33
|
+
title: {
|
|
34
|
+
type: 'string',
|
|
35
|
+
description: 'Event title (required)',
|
|
36
|
+
},
|
|
37
|
+
startTime: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'Event start time in ISO 8601 format (required)',
|
|
40
|
+
},
|
|
41
|
+
endTime: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'Event end time in ISO 8601 format. If not provided, defaults to 1 hour after start.',
|
|
44
|
+
},
|
|
45
|
+
allDay: {
|
|
46
|
+
type: 'boolean',
|
|
47
|
+
description: 'Whether this is an all-day event (default: false)',
|
|
48
|
+
},
|
|
49
|
+
location: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'Event location (optional)',
|
|
52
|
+
},
|
|
53
|
+
description: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'Event description (optional)',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
required: ['title', 'startTime'],
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'ponlo_calendar_update_event',
|
|
63
|
+
description: 'Update an existing calendar event\'s details.',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
id: {
|
|
68
|
+
type: 'string',
|
|
69
|
+
description: 'Event ID (required)',
|
|
70
|
+
},
|
|
71
|
+
title: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description: 'New event title',
|
|
74
|
+
},
|
|
75
|
+
startTime: {
|
|
76
|
+
type: 'string',
|
|
77
|
+
description: 'New start time in ISO 8601 format',
|
|
78
|
+
},
|
|
79
|
+
endTime: {
|
|
80
|
+
type: 'string',
|
|
81
|
+
description: 'New end time in ISO 8601 format',
|
|
82
|
+
},
|
|
83
|
+
location: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'New location',
|
|
86
|
+
},
|
|
87
|
+
description: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
description: 'New description',
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
required: ['id'],
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'ponlo_calendar_delete_event',
|
|
97
|
+
description: 'Delete a calendar event permanently.',
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: {
|
|
101
|
+
id: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
description: 'Event ID to delete (required)',
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
required: ['id'],
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'ponlo_calendar_sync',
|
|
111
|
+
description: 'Manually trigger a sync with connected Google Calendar accounts to fetch latest events.',
|
|
112
|
+
inputSchema: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: {},
|
|
115
|
+
required: [],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Handle calendar tool calls
|
|
122
|
+
*/
|
|
123
|
+
export async function handleCalendarToolCall(toolName, args, client) {
|
|
124
|
+
switch (toolName) {
|
|
125
|
+
case 'ponlo_calendar_list_events': {
|
|
126
|
+
const events = await client.listEvents(args.start, args.end);
|
|
127
|
+
if (events.length === 0) {
|
|
128
|
+
return {
|
|
129
|
+
content: [
|
|
130
|
+
{
|
|
131
|
+
type: 'text',
|
|
132
|
+
text: 'No events found in the specified date range.',
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const eventList = events.map((event) => {
|
|
138
|
+
const startDate = new Date(event.startTime);
|
|
139
|
+
const endDate = event.endTime ? new Date(event.endTime) : null;
|
|
140
|
+
if (event.allDay) {
|
|
141
|
+
return `📅 ${event.title} (All day on ${startDate.toLocaleDateString()})${event.location ? ` @ ${event.location}` : ''}`;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const timeRange = endDate
|
|
145
|
+
? `${startDate.toLocaleString()} - ${endDate.toLocaleTimeString()}`
|
|
146
|
+
: startDate.toLocaleString();
|
|
147
|
+
return `📅 ${event.title} (${timeRange})${event.location ? ` @ ${event.location}` : ''}`;
|
|
148
|
+
}
|
|
149
|
+
}).join('\n');
|
|
150
|
+
return {
|
|
151
|
+
content: [
|
|
152
|
+
{
|
|
153
|
+
type: 'text',
|
|
154
|
+
text: `Events (${events.length}):\n${eventList}`,
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
case 'ponlo_calendar_create_event': {
|
|
160
|
+
const event = await client.createEvent({
|
|
161
|
+
title: args.title,
|
|
162
|
+
startTime: args.startTime,
|
|
163
|
+
endTime: args.endTime,
|
|
164
|
+
allDay: args.allDay,
|
|
165
|
+
location: args.location,
|
|
166
|
+
description: args.description,
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
content: [
|
|
170
|
+
{
|
|
171
|
+
type: 'text',
|
|
172
|
+
text: `Event created successfully: "${event.title}" on ${new Date(event.startTime).toLocaleString()}`,
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
case 'ponlo_calendar_update_event': {
|
|
178
|
+
const updateData = {};
|
|
179
|
+
if (args.title !== undefined)
|
|
180
|
+
updateData.title = args.title;
|
|
181
|
+
if (args.startTime !== undefined)
|
|
182
|
+
updateData.startTime = args.startTime;
|
|
183
|
+
if (args.endTime !== undefined)
|
|
184
|
+
updateData.endTime = args.endTime;
|
|
185
|
+
if (args.location !== undefined)
|
|
186
|
+
updateData.location = args.location;
|
|
187
|
+
if (args.description !== undefined)
|
|
188
|
+
updateData.description = args.description;
|
|
189
|
+
await client.updateEvent(args.id, updateData);
|
|
190
|
+
return {
|
|
191
|
+
content: [
|
|
192
|
+
{
|
|
193
|
+
type: 'text',
|
|
194
|
+
text: 'Event updated successfully',
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
case 'ponlo_calendar_delete_event': {
|
|
200
|
+
await client.deleteEvent(args.id);
|
|
201
|
+
return {
|
|
202
|
+
content: [
|
|
203
|
+
{
|
|
204
|
+
type: 'text',
|
|
205
|
+
text: 'Event deleted successfully',
|
|
206
|
+
},
|
|
207
|
+
],
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
case 'ponlo_calendar_sync': {
|
|
211
|
+
await client.syncCalendars();
|
|
212
|
+
return {
|
|
213
|
+
content: [
|
|
214
|
+
{
|
|
215
|
+
type: 'text',
|
|
216
|
+
text: 'Calendar sync triggered successfully. Events are being updated from Google Calendar.',
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
default:
|
|
222
|
+
throw new Error(`Unknown calendar tool: ${toolName}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../tools/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes Tools for Ponlo.ai MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import type { PonloClient } from '../client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register all notes management tools
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerNotesTools(): Tool[];
|
|
10
|
+
/**
|
|
11
|
+
* Handle notes tool calls
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleNotesToolCall(toolName: string, args: Record<string, unknown>, client: PonloClient): Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../tools/notes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,EAAE,CA6C3C;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW;;;;;GA2DpB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes Tools for Ponlo.ai MCP Server
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Register all notes management tools
|
|
6
|
+
*/
|
|
7
|
+
export function registerNotesTools() {
|
|
8
|
+
return [
|
|
9
|
+
{
|
|
10
|
+
name: 'ponlo_notes_get',
|
|
11
|
+
description: 'Get the current sticky note. Only one note is displayed at a time in Ponlo.ai.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: {},
|
|
15
|
+
required: [],
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'ponlo_notes_create',
|
|
20
|
+
description: 'Create a new sticky note. This will replace the currently displayed note.',
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
content: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Note content (required)',
|
|
27
|
+
},
|
|
28
|
+
color: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
enum: ['yellow', 'pink', 'blue', 'green'],
|
|
31
|
+
description: 'Note color (default: yellow)',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
required: ['content'],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'ponlo_notes_delete',
|
|
39
|
+
description: 'Delete a sticky note by ID.',
|
|
40
|
+
inputSchema: {
|
|
41
|
+
type: 'object',
|
|
42
|
+
properties: {
|
|
43
|
+
id: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
description: 'Note ID to delete (required)',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
required: ['id'],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Handle notes tool calls
|
|
55
|
+
*/
|
|
56
|
+
export async function handleNotesToolCall(toolName, args, client) {
|
|
57
|
+
switch (toolName) {
|
|
58
|
+
case 'ponlo_notes_get': {
|
|
59
|
+
const note = await client.getCurrentNote();
|
|
60
|
+
if (!note) {
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: 'No note currently displayed.',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: 'text',
|
|
74
|
+
text: `Current note (${note.color}):\n${note.content}`,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
case 'ponlo_notes_create': {
|
|
80
|
+
const note = await client.createNote({
|
|
81
|
+
content: args.content,
|
|
82
|
+
color: args.color,
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: 'text',
|
|
88
|
+
text: `Note created successfully (${note.color}): "${note.content.substring(0, 50)}${note.content.length > 50 ? '...' : ''}"`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
case 'ponlo_notes_delete': {
|
|
94
|
+
await client.deleteNote(args.id);
|
|
95
|
+
return {
|
|
96
|
+
content: [
|
|
97
|
+
{
|
|
98
|
+
type: 'text',
|
|
99
|
+
text: 'Note deleted successfully',
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
throw new Error(`Unknown notes tool: ${toolName}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["../../tools/notes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL;YACE,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,gFAAgF;YAC7F,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,2EAA2E;YACxF,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,yBAAyB;qBACvC;oBACD,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;wBACzC,WAAW,EAAE,8BAA8B;qBAC5C;iBACF;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;SACF;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,6BAA6B;YAC1C,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,EAAE,EAAE;wBACF,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,8BAA8B;qBAC5C;iBACF;gBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;aACjB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,IAA6B,EAC7B,MAAmB;IAEnB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,iBAAiB,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;YAE3C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,8BAA8B;yBACrC;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iBAAiB,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,OAAO,EAAE;qBACvD;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACnC,OAAO,EAAE,IAAI,CAAC,OAAiB;gBAC/B,KAAK,EAAE,IAAI,CAAC,KAA2B;aACxC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8BAA8B,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;qBAC9H;iBACF;aACF,CAAC;QACJ,CAAC;QAED,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;YAE3C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B;qBAClC;iBACF;aACF,CAAC;QACJ,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Management Tools for Ponlo.ai MCP Server
|
|
3
|
+
*/
|
|
4
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import type { PonloClient } from '../client.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register all task management tools
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerTaskTools(): Tool[];
|
|
10
|
+
/**
|
|
11
|
+
* Handle task tool calls
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleTaskToolCall(toolName: string, args: Record<string, unknown>, client: PonloClient): Promise<{
|
|
14
|
+
content: {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../tools/tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CA4J1C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW;;;;;GAgIpB"}
|