@nylas/helix-mcp-server 0.1.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.
Files changed (41) hide show
  1. package/dist/cli.d.ts +10 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +233 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/html-to-markdown.d.ts +15 -0
  6. package/dist/html-to-markdown.d.ts.map +1 -0
  7. package/dist/html-to-markdown.js +234 -0
  8. package/dist/html-to-markdown.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +7 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/server.d.ts +49 -0
  14. package/dist/server.d.ts.map +1 -0
  15. package/dist/server.js +323 -0
  16. package/dist/server.js.map +1 -0
  17. package/dist/shape-response.d.ts +19 -0
  18. package/dist/shape-response.d.ts.map +1 -0
  19. package/dist/shape-response.js +172 -0
  20. package/dist/shape-response.js.map +1 -0
  21. package/dist/tools/calendar.d.ts +3 -0
  22. package/dist/tools/calendar.d.ts.map +1 -0
  23. package/dist/tools/calendar.js +46 -0
  24. package/dist/tools/calendar.js.map +1 -0
  25. package/dist/tools/contacts.d.ts +3 -0
  26. package/dist/tools/contacts.d.ts.map +1 -0
  27. package/dist/tools/contacts.js +23 -0
  28. package/dist/tools/contacts.js.map +1 -0
  29. package/dist/tools/email.d.ts +3 -0
  30. package/dist/tools/email.d.ts.map +1 -0
  31. package/dist/tools/email.js +54 -0
  32. package/dist/tools/email.js.map +1 -0
  33. package/dist/tools/identity.d.ts +3 -0
  34. package/dist/tools/identity.d.ts.map +1 -0
  35. package/dist/tools/identity.js +18 -0
  36. package/dist/tools/identity.js.map +1 -0
  37. package/dist/tools/types.d.ts +10 -0
  38. package/dist/tools/types.d.ts.map +1 -0
  39. package/dist/tools/types.js +2 -0
  40. package/dist/tools/types.js.map +1 -0
  41. package/package.json +48 -0
package/dist/server.js ADDED
@@ -0,0 +1,323 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { emailTools } from './tools/email.js';
3
+ import { calendarTools } from './tools/calendar.js';
4
+ import { contactsTools } from './tools/contacts.js';
5
+ import { identityTools } from './tools/identity.js';
6
+ import { shapeToolResponse } from './shape-response.js';
7
+ const DETAIL_DEFAULTS = {
8
+ minimal: { jsonIndent: 0, includeAttribution: false, defaultBodyLimit: 500 },
9
+ standard: { jsonIndent: 2, includeAttribution: true, defaultBodyLimit: 2000 },
10
+ full: { jsonIndent: 2, includeAttribution: true, defaultBodyLimit: 0 },
11
+ };
12
+ /**
13
+ * Create an MCP server with AI identity tools registered.
14
+ * The server is stateless — context is provided per-request via the API client.
15
+ * Tools are filtered by enabledTools and responses shaped by responseDetail.
16
+ */
17
+ export function createMcpServer(getContext) {
18
+ const server = new McpServer({
19
+ name: 'nylas-ai-identity',
20
+ version: '0.0.1',
21
+ });
22
+ const allTools = [
23
+ ...emailTools,
24
+ ...calendarTools,
25
+ ...contactsTools,
26
+ ...identityTools,
27
+ ];
28
+ // Register each tool with the MCP server
29
+ for (const tool of allTools) {
30
+ server.registerTool(tool.name, {
31
+ description: tool.description,
32
+ inputSchema: tool.inputSchema,
33
+ }, async (args) => {
34
+ const ctx = await getContext();
35
+ // Filter by enabled tool categories
36
+ const enabledTools = ctx.tokenOptimization?.enabledTools;
37
+ if (enabledTools && !enabledTools.includes(tool.category)) {
38
+ return {
39
+ content: [{
40
+ type: 'text',
41
+ text: JSON.stringify({
42
+ error: 'tool_disabled',
43
+ message: `The '${tool.category}' tool category is disabled. Enable it at helix.nylas.com/identity.`,
44
+ }),
45
+ }],
46
+ };
47
+ }
48
+ // Check scopes
49
+ for (const scope of tool.requiredScopes) {
50
+ if (!ctx.scopes.includes(scope)) {
51
+ return {
52
+ content: [{
53
+ type: 'text',
54
+ text: JSON.stringify({
55
+ error: 'insufficient_scope',
56
+ message: `This action requires the '${scope}' scope.`,
57
+ hint: 'Re-authorize with the required scope at https://helix.nylas.com/identity',
58
+ }),
59
+ }],
60
+ };
61
+ }
62
+ }
63
+ // Execute tool and audit
64
+ const toolStart = Date.now();
65
+ const result = await executeTool(tool.name, args, ctx);
66
+ const toolDuration = Date.now() - toolStart;
67
+ if (ctx.logToolCall) {
68
+ ctx.logToolCall(tool.name, args, toolDuration).catch(() => { });
69
+ }
70
+ // Apply response shaping based on token optimization settings
71
+ const detail = ctx.tokenOptimization?.responseDetail ?? 'standard';
72
+ const detailConfig = DETAIL_DEFAULTS[detail];
73
+ const bodyLimit = ctx.tokenOptimization?.maxBodyLength ?? detailConfig.defaultBodyLimit;
74
+ const bodyFormat = ctx.tokenOptimization?.bodyFormat ?? 'text';
75
+ let response = shapeToolResponse(tool.name, result, { detail, bodyLimit, bodyFormat });
76
+ if (detailConfig.includeAttribution && typeof response === 'object' && response !== null) {
77
+ response = {
78
+ ...response,
79
+ _attribution: {
80
+ label: 'Powered by Helix',
81
+ source: 'helix.nylas.com',
82
+ version: '0.1.0',
83
+ },
84
+ };
85
+ }
86
+ return {
87
+ content: [{ type: 'text', text: JSON.stringify(response, null, detailConfig.jsonIndent) }],
88
+ };
89
+ });
90
+ }
91
+ // Register resources
92
+ server.resource('identity-profile', 'identity://profile', async () => {
93
+ const ctx = await getContext();
94
+ return {
95
+ contents: [{
96
+ uri: 'identity://profile',
97
+ mimeType: 'application/json',
98
+ text: JSON.stringify({
99
+ userId: ctx.userId,
100
+ grantId: ctx.grantId,
101
+ scopes: ctx.scopes,
102
+ }),
103
+ }],
104
+ };
105
+ });
106
+ return server;
107
+ }
108
+ /**
109
+ * Resolve the best grantId for a capability, falling back to primary.
110
+ */
111
+ async function resolveGrant(ctx, capability) {
112
+ if (ctx.resolveGrantId)
113
+ return ctx.resolveGrantId(capability);
114
+ return ctx.grantId;
115
+ }
116
+ /**
117
+ * Execute a tool against the Nylas API.
118
+ * Routes tool calls to the appropriate Nylas endpoint.
119
+ * Each tool resolves the best grant for its required capability.
120
+ */
121
+ async function executeTool(toolName, args, ctx) {
122
+ const nylasUrl = ctx.nylasApiUrl;
123
+ const headers = {
124
+ Authorization: `Bearer ${ctx.nylasApiKey}`,
125
+ 'Content-Type': 'application/json',
126
+ };
127
+ switch (toolName) {
128
+ case 'email_search': {
129
+ const grantId = await resolveGrant(ctx, 'email.read');
130
+ const params = new URLSearchParams();
131
+ if (args.query)
132
+ params.set('search_query_native', String(args.query));
133
+ if (args.from)
134
+ params.set('from', String(args.from));
135
+ if (args.to)
136
+ params.set('to', String(args.to));
137
+ if (args.subject)
138
+ params.set('subject', String(args.subject));
139
+ if (args.unread !== undefined)
140
+ params.set('unread', String(args.unread));
141
+ params.set('limit', String(args.limit ?? 10));
142
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/messages?${params}`, { headers });
143
+ return res.json();
144
+ }
145
+ case 'email_read': {
146
+ const grantId = await resolveGrant(ctx, 'email.read');
147
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/messages/${args.message_id}`, { headers });
148
+ return res.json();
149
+ }
150
+ case 'email_send': {
151
+ const grantId = await resolveGrant(ctx, 'email.send');
152
+ const sendPayload = {
153
+ to: args.to,
154
+ subject: args.subject,
155
+ body: args.body,
156
+ reply_to_message_id: args.reply_to_message_id,
157
+ };
158
+ const sendSummary = `Send email to ${Array.isArray(args.to) ? args.to.map((r) => r.email).join(', ') : args.to}: ${args.subject ?? '(no subject)'}`;
159
+ if (ctx.checkApproval) {
160
+ const approval = await ctx.checkApproval('send_email', sendPayload, sendSummary);
161
+ if (!approval.approved) {
162
+ return {
163
+ status: 'pending_approval',
164
+ pendingActionId: approval.pendingActionId,
165
+ summary: sendSummary,
166
+ hint: 'Approve at helix.nylas.com/now',
167
+ };
168
+ }
169
+ }
170
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/messages/send`, {
171
+ method: 'POST',
172
+ headers,
173
+ body: JSON.stringify(sendPayload),
174
+ });
175
+ const sendResult = await res.json();
176
+ if (ctx.logAction) {
177
+ await ctx.logAction('send_email', 'mcp_tool', sendSummary, 'success');
178
+ }
179
+ return sendResult;
180
+ }
181
+ case 'email_reply': {
182
+ const grantId = await resolveGrant(ctx, 'email.send');
183
+ // Get the thread to find the latest message
184
+ const threadRes = await fetch(`${nylasUrl}/v3/grants/${grantId}/threads/${args.thread_id}`, { headers });
185
+ const thread = (await threadRes.json());
186
+ const lastMessageId = thread.data.message_ids[thread.data.message_ids.length - 1];
187
+ const replyPayload = {
188
+ body: args.body,
189
+ reply_to_message_id: lastMessageId,
190
+ };
191
+ const replySummary = `Reply to thread ${args.thread_id}`;
192
+ if (ctx.checkApproval) {
193
+ const approval = await ctx.checkApproval('send_email', replyPayload, replySummary);
194
+ if (!approval.approved) {
195
+ return {
196
+ status: 'pending_approval',
197
+ pendingActionId: approval.pendingActionId,
198
+ summary: replySummary,
199
+ hint: 'Approve at helix.nylas.com/now',
200
+ };
201
+ }
202
+ }
203
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/messages/send`, {
204
+ method: 'POST',
205
+ headers,
206
+ body: JSON.stringify(replyPayload),
207
+ });
208
+ const replyResult = await res.json();
209
+ if (ctx.logAction) {
210
+ await ctx.logAction('send_email', 'mcp_tool', replySummary, 'success');
211
+ }
212
+ return replyResult;
213
+ }
214
+ case 'calendar_events': {
215
+ const grantId = await resolveGrant(ctx, 'calendar.read');
216
+ const params = new URLSearchParams();
217
+ params.set('calendar_id', String(args.calendar_id ?? 'primary'));
218
+ params.set('limit', String(args.limit ?? 25));
219
+ if (args.start)
220
+ params.set('start', String(Math.floor(new Date(String(args.start)).getTime() / 1000)));
221
+ if (args.end)
222
+ params.set('end', String(Math.floor(new Date(String(args.end)).getTime() / 1000)));
223
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/events?${params}`, { headers });
224
+ return res.json();
225
+ }
226
+ case 'calendar_event_create': {
227
+ const grantId = await resolveGrant(ctx, 'calendar.write');
228
+ const eventPayload = {
229
+ title: args.title,
230
+ when: {
231
+ start_time: Math.floor(new Date(String(args.start_time)).getTime() / 1000),
232
+ end_time: Math.floor(new Date(String(args.end_time)).getTime() / 1000),
233
+ },
234
+ description: args.description,
235
+ location: args.location,
236
+ participants: args.participants,
237
+ calendar_id: args.calendar_id ?? 'primary',
238
+ };
239
+ const eventSummary = `Create event: ${args.title ?? '(untitled)'}`;
240
+ if (ctx.checkApproval) {
241
+ const approval = await ctx.checkApproval('create_event', eventPayload, eventSummary);
242
+ if (!approval.approved) {
243
+ return {
244
+ status: 'pending_approval',
245
+ pendingActionId: approval.pendingActionId,
246
+ summary: eventSummary,
247
+ hint: 'Approve at helix.nylas.com/now',
248
+ };
249
+ }
250
+ }
251
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/events`, {
252
+ method: 'POST',
253
+ headers,
254
+ body: JSON.stringify(eventPayload),
255
+ });
256
+ const eventResult = await res.json();
257
+ if (ctx.logAction) {
258
+ await ctx.logAction('create_event', 'mcp_tool', eventSummary, 'success');
259
+ }
260
+ return eventResult;
261
+ }
262
+ case 'calendar_availability': {
263
+ const grantId = await resolveGrant(ctx, 'calendar.read');
264
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/calendars/free-busy`, {
265
+ method: 'POST',
266
+ headers,
267
+ body: JSON.stringify({
268
+ emails: args.emails,
269
+ start_time: Math.floor(new Date(String(args.start)).getTime() / 1000),
270
+ end_time: Math.floor(new Date(String(args.end)).getTime() / 1000),
271
+ }),
272
+ });
273
+ return res.json();
274
+ }
275
+ case 'contact_search': {
276
+ const grantId = await resolveGrant(ctx, 'contacts.read');
277
+ const params = new URLSearchParams();
278
+ params.set('limit', String(args.limit ?? 10));
279
+ if (args.query)
280
+ params.set('email', String(args.query));
281
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/contacts?${params}`, { headers });
282
+ return res.json();
283
+ }
284
+ case 'contact_get': {
285
+ const grantId = await resolveGrant(ctx, 'contacts.read');
286
+ const res = await fetch(`${nylasUrl}/v3/grants/${grantId}/contacts/${args.contact_id}`, { headers });
287
+ return res.json();
288
+ }
289
+ case 'identity_get_context': {
290
+ return {
291
+ userId: ctx.userId,
292
+ scopes: ctx.scopes,
293
+ displayName: ctx.identity?.displayName ?? null,
294
+ tone: ctx.identity?.tone ?? 'professional',
295
+ verbosity: ctx.identity?.verbosity ?? 'balanced',
296
+ customInstructions: ctx.identity?.customInstructions ?? null,
297
+ approvalPolicy: ctx.identity?.approvalPolicy ?? 'always',
298
+ capabilities: ctx.identity?.capabilities ?? ctx.scopes,
299
+ templateId: ctx.identity?.templateId ?? null,
300
+ hint: 'Use email_search or calendar_events to get specific data. Respect the approval policy and tone settings above when taking actions.',
301
+ };
302
+ }
303
+ case 'meta_whoami': {
304
+ return {
305
+ userId: ctx.userId,
306
+ grantId: ctx.grantId,
307
+ scopes: ctx.scopes,
308
+ server: 'nylas-ai-identity',
309
+ version: '0.1.0',
310
+ attribution: {
311
+ label: 'Powered by Helix',
312
+ poweredBy: 'Nylas',
313
+ product: 'Helix',
314
+ url: 'https://helix.nylas.com',
315
+ },
316
+ templateId: ctx.identity?.templateId ?? null,
317
+ };
318
+ }
319
+ default:
320
+ return { error: 'unknown_tool', message: `Tool '${toolName}' not found` };
321
+ }
322
+ }
323
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Response shaping for MCP token optimization.
3
+ *
4
+ * Reduces token cost by stripping unnecessary fields and truncating
5
+ * large text content based on the user's configured response detail level.
6
+ */
7
+ export type ResponseDetail = 'minimal' | 'standard' | 'full';
8
+ export type BodyFormat = 'html' | 'text' | 'markdown';
9
+ export interface ShapeConfig {
10
+ detail: ResponseDetail;
11
+ bodyLimit: number;
12
+ bodyFormat: BodyFormat;
13
+ }
14
+ /**
15
+ * Shape a tool response to reduce token usage.
16
+ * `full` detail passes through unchanged.
17
+ */
18
+ export declare function shapeToolResponse(toolName: string, response: unknown, config: ShapeConfig): unknown;
19
+ //# sourceMappingURL=shape-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-response.d.ts","sourceRoot":"","sources":["../src/shape-response.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAA;AAC5D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAA;AAErD,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,WAAW,GACjB,OAAO,CAkBT"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Response shaping for MCP token optimization.
3
+ *
4
+ * Reduces token cost by stripping unnecessary fields and truncating
5
+ * large text content based on the user's configured response detail level.
6
+ */
7
+ import { htmlToMarkdown } from './html-to-markdown.js';
8
+ /**
9
+ * Shape a tool response to reduce token usage.
10
+ * `full` detail passes through unchanged.
11
+ */
12
+ export function shapeToolResponse(toolName, response, config) {
13
+ if (config.detail === 'full')
14
+ return response;
15
+ if (!response || typeof response !== 'object')
16
+ return response;
17
+ const obj = response;
18
+ // Nylas API responses wrap data in { request_id, data }
19
+ // For minimal, strip request_id to save tokens
20
+ const hasData = 'data' in obj;
21
+ if (!hasData)
22
+ return response;
23
+ const shaped = shapeByTool(toolName, obj.data, config);
24
+ if (config.detail === 'minimal') {
25
+ return { data: shaped };
26
+ }
27
+ // standard: keep request_id
28
+ return { ...obj, data: shaped };
29
+ }
30
+ function shapeByTool(toolName, data, config) {
31
+ switch (toolName) {
32
+ case 'email_search':
33
+ return shapeArray(data, (m) => shapeMessage(m, config, true));
34
+ case 'email_read':
35
+ return shapeMessage(data, config, false);
36
+ case 'calendar_events':
37
+ return shapeArray(data, (e) => shapeEvent(e, config));
38
+ case 'calendar_event_create':
39
+ return shapeEvent(data, config);
40
+ case 'contact_search':
41
+ return shapeArray(data, (c) => shapeContact(c, config));
42
+ case 'contact_get':
43
+ return shapeContact(data, config);
44
+ default:
45
+ return data;
46
+ }
47
+ }
48
+ function shapeArray(data, fn) {
49
+ if (!Array.isArray(data))
50
+ return data;
51
+ return data.map((item) => item && typeof item === 'object' ? fn(item) : item);
52
+ }
53
+ function shapeMessage(data, config, isList) {
54
+ if (!data || typeof data !== 'object')
55
+ return data;
56
+ const msg = data;
57
+ if (config.detail === 'minimal') {
58
+ const slim = {
59
+ id: msg.id,
60
+ subject: msg.subject,
61
+ from: shapeParticipants(msg.from),
62
+ date: msg.date,
63
+ unread: msg.unread,
64
+ };
65
+ if (isList) {
66
+ slim.snippet = truncate(String(msg.snippet ?? ''), 120);
67
+ }
68
+ else {
69
+ slim.to = shapeParticipants(msg.to);
70
+ slim.body = truncate(formatBody(String(msg.body ?? ''), config.bodyFormat), config.bodyLimit);
71
+ slim.thread_id = msg.thread_id;
72
+ }
73
+ return stripNulls(slim);
74
+ }
75
+ // standard / full: keep most fields, apply body format and truncation
76
+ const result = { ...msg };
77
+ if (result.body && typeof result.body === 'string') {
78
+ let formatted = formatBody(result.body, config.bodyFormat);
79
+ if (config.bodyLimit > 0) {
80
+ formatted = truncate(formatted, config.bodyLimit);
81
+ }
82
+ result.body = formatted;
83
+ }
84
+ // Strip heavyweight fields that LLMs rarely need
85
+ delete result.headers;
86
+ delete result.raw_mime;
87
+ return stripNulls(result);
88
+ }
89
+ function shapeEvent(data, config) {
90
+ if (!data || typeof data !== 'object')
91
+ return data;
92
+ const evt = data;
93
+ if (config.detail === 'minimal') {
94
+ const slim = {
95
+ id: evt.id,
96
+ title: evt.title,
97
+ when: evt.when,
98
+ status: evt.status,
99
+ busy: evt.busy,
100
+ };
101
+ if (evt.participants) {
102
+ slim.participants = shapeParticipants(evt.participants);
103
+ }
104
+ if (evt.location)
105
+ slim.location = evt.location;
106
+ return stripNulls(slim);
107
+ }
108
+ // standard: keep fields, truncate description
109
+ const result = { ...evt };
110
+ if (result.description && typeof result.description === 'string' && config.bodyLimit > 0) {
111
+ result.description = truncate(result.description, config.bodyLimit);
112
+ }
113
+ return stripNulls(result);
114
+ }
115
+ function shapeContact(data, config) {
116
+ if (!data || typeof data !== 'object')
117
+ return data;
118
+ const contact = data;
119
+ if (config.detail === 'minimal') {
120
+ return stripNulls({
121
+ id: contact.id,
122
+ given_name: contact.given_name,
123
+ surname: contact.surname,
124
+ emails: contact.emails,
125
+ company_name: contact.company_name,
126
+ });
127
+ }
128
+ return stripNulls(contact);
129
+ }
130
+ /**
131
+ * Reduce participant arrays to just email+name (strip status, comment, etc.)
132
+ */
133
+ function shapeParticipants(data) {
134
+ if (!Array.isArray(data))
135
+ return data;
136
+ return data.map((p) => {
137
+ if (!p || typeof p !== 'object')
138
+ return p;
139
+ const { email, name } = p;
140
+ return name ? { email, name } : { email };
141
+ });
142
+ }
143
+ /** Convert email body to the requested output format. */
144
+ function formatBody(body, format) {
145
+ switch (format) {
146
+ case 'markdown':
147
+ return htmlToMarkdown(body);
148
+ case 'text':
149
+ return stripHtml(body);
150
+ case 'html':
151
+ default:
152
+ return body;
153
+ }
154
+ }
155
+ function truncate(str, limit) {
156
+ if (limit <= 0 || str.length <= limit)
157
+ return str;
158
+ return `${str.slice(0, limit)}…`;
159
+ }
160
+ function stripHtml(html) {
161
+ return html.replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/\s+/g, ' ').trim();
162
+ }
163
+ function stripNulls(obj) {
164
+ const result = {};
165
+ for (const [key, value] of Object.entries(obj)) {
166
+ if (value != null && value !== '') {
167
+ result[key] = value;
168
+ }
169
+ }
170
+ return result;
171
+ }
172
+ //# sourceMappingURL=shape-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shape-response.js","sourceRoot":"","sources":["../src/shape-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './types.js';
2
+ export declare const calendarTools: ToolDefinition[];
3
+ //# sourceMappingURL=calendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,aAAa,EAAE,cAAc,EA8CzC,CAAA"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ export const calendarTools = [
3
+ {
4
+ name: 'calendar_events',
5
+ description: "List the user's calendar events within a date range. Defaults to today if no range specified.",
6
+ inputSchema: z.object({
7
+ start: z.string().optional().describe('Start of range in ISO-8601 format (defaults to now)'),
8
+ end: z.string().optional().describe('End of range in ISO-8601 format (defaults to end of today)'),
9
+ calendar_id: z.string().optional().describe('Specific calendar ID (defaults to primary)'),
10
+ limit: z.number().min(1).max(50).default(25).describe('Maximum events to return'),
11
+ }),
12
+ requiredScopes: ['calendar.read'],
13
+ category: 'calendar',
14
+ },
15
+ {
16
+ name: 'calendar_event_create',
17
+ description: "Create a new calendar event. Subject to the user's approval policy.",
18
+ inputSchema: z.object({
19
+ title: z.string().describe('Event title'),
20
+ start_time: z.string().describe('Start time in ISO-8601 format'),
21
+ end_time: z.string().describe('End time in ISO-8601 format'),
22
+ description: z.string().optional().describe('Event description'),
23
+ location: z.string().optional().describe('Event location'),
24
+ participants: z.array(z.object({
25
+ email: z.string().email(),
26
+ name: z.string().optional(),
27
+ })).optional().describe('Event participants to invite'),
28
+ calendar_id: z.string().optional().describe('Calendar ID (defaults to primary)'),
29
+ }),
30
+ requiredScopes: ['calendar.write'],
31
+ category: 'calendar',
32
+ },
33
+ {
34
+ name: 'calendar_availability',
35
+ description: 'Check availability / free-busy times across one or more people for scheduling.',
36
+ inputSchema: z.object({
37
+ emails: z.array(z.string().email()).min(1).describe('Email addresses to check availability for'),
38
+ start: z.string().describe('Start of search window in ISO-8601'),
39
+ end: z.string().describe('End of search window in ISO-8601'),
40
+ duration_minutes: z.number().min(5).max(480).optional().describe('Desired meeting duration in minutes'),
41
+ }),
42
+ requiredScopes: ['calendar.read'],
43
+ category: 'calendar',
44
+ },
45
+ ];
46
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/tools/calendar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC9C;QACC,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACV,+FAA+F;QAChG,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YAC5F,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;YACjG,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACzF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;SACjF,CAAC;QACF,cAAc,EAAE,CAAC,eAAe,CAAC;QACjC,QAAQ,EAAE,UAAU;KACpB;IACD;QACC,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACV,qEAAqE;QACtE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAChE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC5D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAChE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC1D,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;gBACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;SAChF,CAAC;QACF,cAAc,EAAE,CAAC,gBAAgB,CAAC;QAClC,QAAQ,EAAE,UAAU;KACpB;IACD;QACC,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACV,gFAAgF;QACjF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YAChG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAChE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YAC5D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SACvG,CAAC;QACF,cAAc,EAAE,CAAC,eAAe,CAAC;QACjC,QAAQ,EAAE,UAAU;KACpB;CACD,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './types.js';
2
+ export declare const contactsTools: ToolDefinition[];
3
+ //# sourceMappingURL=contacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD,eAAO,MAAM,aAAa,EAAE,cAAc,EAqBzC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { z } from 'zod';
2
+ export const contactsTools = [
3
+ {
4
+ name: 'contact_search',
5
+ description: "Search the user's contacts by name, email, company, or job title.",
6
+ inputSchema: z.object({
7
+ query: z.string().describe('Search query (name, email, or company)'),
8
+ limit: z.number().min(1).max(50).default(10).describe('Maximum results'),
9
+ }),
10
+ requiredScopes: ['contacts.read'],
11
+ category: 'contacts',
12
+ },
13
+ {
14
+ name: 'contact_get',
15
+ description: 'Get full details for a specific contact by ID.',
16
+ inputSchema: z.object({
17
+ contact_id: z.string().describe('The contact ID'),
18
+ }),
19
+ requiredScopes: ['contacts.read'],
20
+ category: 'contacts',
21
+ },
22
+ ];
23
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/tools/contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC9C;QACC,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACV,mEAAmE;QACpE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YACpE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACxE,CAAC;QACF,cAAc,EAAE,CAAC,eAAe,CAAC;QACjC,QAAQ,EAAE,UAAU;KACpB;IACD;QACC,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,gDAAgD;QAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;SACjD,CAAC;QACF,cAAc,EAAE,CAAC,eAAe,CAAC;QACjC,QAAQ,EAAE,UAAU;KACpB;CACD,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './types.js';
2
+ export declare const emailTools: ToolDefinition[];
3
+ //# sourceMappingURL=email.d.ts.map