@jclvsh/iris 0.2.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 +78 -0
- package/dist/cli-utils.d.ts +4 -0
- package/dist/cli-utils.js +31 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +43 -0
- package/dist/client.d.ts +11 -0
- package/dist/client.js +100 -0
- package/dist/commands/ai.d.ts +3 -0
- package/dist/commands/ai.js +97 -0
- package/dist/commands/analytics.d.ts +3 -0
- package/dist/commands/analytics.js +75 -0
- package/dist/commands/billing.d.ts +3 -0
- package/dist/commands/billing.js +16 -0
- package/dist/commands/campaigns.d.ts +3 -0
- package/dist/commands/campaigns.js +123 -0
- package/dist/commands/channels.d.ts +3 -0
- package/dist/commands/channels.js +53 -0
- package/dist/commands/contacts.d.ts +3 -0
- package/dist/commands/contacts.js +120 -0
- package/dist/commands/conversations.d.ts +3 -0
- package/dist/commands/conversations.js +71 -0
- package/dist/commands/credits.d.ts +10 -0
- package/dist/commands/credits.js +38 -0
- package/dist/commands/discovery.d.ts +3 -0
- package/dist/commands/discovery.js +76 -0
- package/dist/commands/keys.d.ts +3 -0
- package/dist/commands/keys.js +70 -0
- package/dist/commands/messages.d.ts +3 -0
- package/dist/commands/messages.js +110 -0
- package/dist/commands/notifications.d.ts +3 -0
- package/dist/commands/notifications.js +66 -0
- package/dist/commands/webhooks.d.ts +3 -0
- package/dist/commands/webhooks.js +122 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +37 -0
- package/dist/tools/agent-credits.d.ts +10 -0
- package/dist/tools/agent-credits.js +43 -0
- package/dist/tools/ai.d.ts +3 -0
- package/dist/tools/ai.js +81 -0
- package/dist/tools/analytics.d.ts +3 -0
- package/dist/tools/analytics.js +84 -0
- package/dist/tools/billing.d.ts +3 -0
- package/dist/tools/billing.js +14 -0
- package/dist/tools/campaigns.d.ts +3 -0
- package/dist/tools/campaigns.js +211 -0
- package/dist/tools/channels.d.ts +3 -0
- package/dist/tools/channels.js +49 -0
- package/dist/tools/contacts.d.ts +3 -0
- package/dist/tools/contacts.js +149 -0
- package/dist/tools/conversations.d.ts +3 -0
- package/dist/tools/conversations.js +84 -0
- package/dist/tools/discovery.d.ts +3 -0
- package/dist/tools/discovery.js +62 -0
- package/dist/tools/keys.d.ts +3 -0
- package/dist/tools/keys.js +92 -0
- package/dist/tools/messages.d.ts +3 -0
- package/dist/tools/messages.js +99 -0
- package/dist/tools/notifications.d.ts +3 -0
- package/dist/tools/notifications.js +64 -0
- package/dist/tools/webhooks.d.ts +3 -0
- package/dist/tools/webhooks.js +161 -0
- package/dist/types.d.ts +256 -0
- package/dist/types.js +2 -0
- package/package.json +33 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const WEBHOOK_EVENTS = [
|
|
3
|
+
"campaign.created",
|
|
4
|
+
"campaign.updated",
|
|
5
|
+
"campaign.deleted",
|
|
6
|
+
"campaign.activated",
|
|
7
|
+
"campaign.completed",
|
|
8
|
+
"contact.created",
|
|
9
|
+
"contact.updated",
|
|
10
|
+
"contact.deleted",
|
|
11
|
+
"conversation.created",
|
|
12
|
+
"conversation.updated",
|
|
13
|
+
"message.sent",
|
|
14
|
+
"message.delivered",
|
|
15
|
+
"message.opened",
|
|
16
|
+
"message.clicked",
|
|
17
|
+
"message.replied",
|
|
18
|
+
"message.bounced",
|
|
19
|
+
"message.failed",
|
|
20
|
+
];
|
|
21
|
+
export function registerWebhookTools(server, client) {
|
|
22
|
+
server.tool("list_webhooks", "list all configured webhooks. requires webhooks:read scope.", {
|
|
23
|
+
page: z.number().int().positive().optional().describe("page number (default 1)"),
|
|
24
|
+
page_size: z.number().int().min(1).max(100).optional().describe("items per page (default 50, max 100)"),
|
|
25
|
+
}, async ({ page, page_size }) => {
|
|
26
|
+
try {
|
|
27
|
+
const params = {};
|
|
28
|
+
if (page !== undefined)
|
|
29
|
+
params.page = String(page);
|
|
30
|
+
if (page_size !== undefined)
|
|
31
|
+
params.page_size = String(page_size);
|
|
32
|
+
const result = await client.get("/webhooks", params);
|
|
33
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
38
|
+
isError: true,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
server.tool("create_webhook", "create a new webhook endpoint. requires webhooks:write scope.", {
|
|
43
|
+
url: z
|
|
44
|
+
.string()
|
|
45
|
+
.url()
|
|
46
|
+
.refine((u) => u.startsWith("https://"), { message: "webhook URL must use HTTPS" })
|
|
47
|
+
.describe("webhook endpoint URL (must be HTTPS)"),
|
|
48
|
+
events: z.array(z.enum(WEBHOOK_EVENTS)).min(1).describe("events to subscribe to"),
|
|
49
|
+
description: z.string().max(500).optional().describe("webhook description"),
|
|
50
|
+
}, async (args) => {
|
|
51
|
+
try {
|
|
52
|
+
const result = await client.post("/webhooks", args);
|
|
53
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
server.tool("get_webhook", "get a webhook by ID. requires webhooks:read scope.", {
|
|
63
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
64
|
+
}, async ({ id }) => {
|
|
65
|
+
try {
|
|
66
|
+
const result = await client.get(`/webhooks/${id}`);
|
|
67
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
72
|
+
isError: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
server.tool("update_webhook", "update a webhook's configuration. requires webhooks:write scope.", {
|
|
77
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
78
|
+
url: z
|
|
79
|
+
.string()
|
|
80
|
+
.url()
|
|
81
|
+
.refine((u) => u.startsWith("https://"), { message: "webhook URL must use HTTPS" })
|
|
82
|
+
.optional()
|
|
83
|
+
.describe("new endpoint URL (must be HTTPS)"),
|
|
84
|
+
events: z.array(z.enum(WEBHOOK_EVENTS)).min(1).optional().describe("new events to subscribe to"),
|
|
85
|
+
active: z.boolean().optional().describe("enable or disable the webhook"),
|
|
86
|
+
}, async ({ id, ...body }) => {
|
|
87
|
+
try {
|
|
88
|
+
const result = await client.patch(`/webhooks/${id}`, body);
|
|
89
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
94
|
+
isError: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
server.tool("delete_webhook", "delete a webhook. requires webhooks:write scope.", {
|
|
99
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
100
|
+
}, async ({ id }) => {
|
|
101
|
+
try {
|
|
102
|
+
await client.delete(`/webhooks/${id}`);
|
|
103
|
+
return { content: [{ type: "text", text: `webhook ${id} deleted` }] };
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
server.tool("test_webhook", "send a test event to a webhook endpoint to verify it's working. requires webhooks:write scope.", {
|
|
113
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
114
|
+
}, async ({ id }) => {
|
|
115
|
+
try {
|
|
116
|
+
const result = await client.post(`/webhooks/${id}/test`);
|
|
117
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
server.tool("rotate_webhook_secret", "rotate the signing secret for a webhook. the new secret is returned in the response. requires webhooks:write scope.", {
|
|
127
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
128
|
+
}, async ({ id }) => {
|
|
129
|
+
try {
|
|
130
|
+
const result = await client.post(`/webhooks/${id}/rotate-secret`);
|
|
131
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
return {
|
|
135
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
136
|
+
isError: true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
server.tool("list_webhook_deliveries", "list delivery history for a webhook. requires webhooks:read scope.", {
|
|
141
|
+
id: z.string().uuid().describe("webhook ID"),
|
|
142
|
+
page: z.number().int().positive().optional().describe("page number (default 1)"),
|
|
143
|
+
page_size: z.number().int().min(1).max(100).optional().describe("items per page (default 50, max 100)"),
|
|
144
|
+
}, async ({ id, page, page_size }) => {
|
|
145
|
+
try {
|
|
146
|
+
const params = {};
|
|
147
|
+
if (page !== undefined)
|
|
148
|
+
params.page = String(page);
|
|
149
|
+
if (page_size !== undefined)
|
|
150
|
+
params.page_size = String(page_size);
|
|
151
|
+
const result = await client.get(`/webhooks/${id}/deliveries`, params);
|
|
152
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
content: [{ type: "text", text: `error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
157
|
+
isError: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
export interface PaginatedResponse<T> {
|
|
2
|
+
success: true;
|
|
3
|
+
data: T[];
|
|
4
|
+
meta: {
|
|
5
|
+
pagination: {
|
|
6
|
+
page: number;
|
|
7
|
+
page_size: number;
|
|
8
|
+
total: number;
|
|
9
|
+
total_pages: number;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface DataResponse<T> {
|
|
14
|
+
success: true;
|
|
15
|
+
data: T;
|
|
16
|
+
}
|
|
17
|
+
export interface ApiErrorResponse {
|
|
18
|
+
success: false;
|
|
19
|
+
error: {
|
|
20
|
+
code: string;
|
|
21
|
+
message: string;
|
|
22
|
+
field?: string;
|
|
23
|
+
requestId?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface Campaign {
|
|
27
|
+
id: string;
|
|
28
|
+
user_id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
status: string;
|
|
31
|
+
objective_type: string;
|
|
32
|
+
product_name: string | null;
|
|
33
|
+
product_url: string | null;
|
|
34
|
+
product_description: string | null;
|
|
35
|
+
follow_up_enabled: boolean;
|
|
36
|
+
follow_up_max_count: number;
|
|
37
|
+
follow_up_delay_days: number;
|
|
38
|
+
created_at: string;
|
|
39
|
+
updated_at: string;
|
|
40
|
+
}
|
|
41
|
+
export interface CampaignWithStats extends Campaign {
|
|
42
|
+
contacts_count?: number;
|
|
43
|
+
conversations_count?: number;
|
|
44
|
+
emails_sent?: number;
|
|
45
|
+
emails_opened?: number;
|
|
46
|
+
emails_replied?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface CampaignUsage {
|
|
49
|
+
campaign_id: string;
|
|
50
|
+
contacts_count: number;
|
|
51
|
+
contacts_limit: number;
|
|
52
|
+
emails_sent: number;
|
|
53
|
+
emails_limit: number;
|
|
54
|
+
discovery_runs: number;
|
|
55
|
+
discovery_limit: number;
|
|
56
|
+
}
|
|
57
|
+
export interface TargetProfile {
|
|
58
|
+
id: string;
|
|
59
|
+
campaign_id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
profile_type: string;
|
|
62
|
+
fit_score: number | null;
|
|
63
|
+
job_titles: string[];
|
|
64
|
+
industries: string[];
|
|
65
|
+
pain_points: string[];
|
|
66
|
+
buying_signals: string[];
|
|
67
|
+
discovery_keywords: string[];
|
|
68
|
+
recommended_channels: string[];
|
|
69
|
+
created_at: string;
|
|
70
|
+
updated_at: string;
|
|
71
|
+
}
|
|
72
|
+
export interface Contact {
|
|
73
|
+
id: string;
|
|
74
|
+
user_id: string;
|
|
75
|
+
email: string | null;
|
|
76
|
+
first_name: string | null;
|
|
77
|
+
last_name: string | null;
|
|
78
|
+
company_name: string | null;
|
|
79
|
+
job_title: string | null;
|
|
80
|
+
phone: string | null;
|
|
81
|
+
website: string | null;
|
|
82
|
+
tags: string[];
|
|
83
|
+
enrichment_data: Record<string, unknown> | null;
|
|
84
|
+
created_at: string;
|
|
85
|
+
updated_at: string;
|
|
86
|
+
deleted_at: string | null;
|
|
87
|
+
}
|
|
88
|
+
export interface ContactUsage {
|
|
89
|
+
contacts_count: number;
|
|
90
|
+
contacts_limit: number;
|
|
91
|
+
period_start: string;
|
|
92
|
+
period_end: string;
|
|
93
|
+
}
|
|
94
|
+
export interface Conversation {
|
|
95
|
+
id: string;
|
|
96
|
+
campaign_id: string | null;
|
|
97
|
+
contact_id: string;
|
|
98
|
+
user_id: string;
|
|
99
|
+
channel: string;
|
|
100
|
+
status: string;
|
|
101
|
+
metadata: Record<string, unknown> | null;
|
|
102
|
+
created_at: string;
|
|
103
|
+
updated_at: string;
|
|
104
|
+
}
|
|
105
|
+
export interface ConversationWithDetails extends Conversation {
|
|
106
|
+
contact?: Contact;
|
|
107
|
+
campaign?: Campaign;
|
|
108
|
+
last_message?: Message;
|
|
109
|
+
unread_count?: number;
|
|
110
|
+
}
|
|
111
|
+
export interface Message {
|
|
112
|
+
id: string;
|
|
113
|
+
conversation_id: string;
|
|
114
|
+
direction: string;
|
|
115
|
+
channel: string;
|
|
116
|
+
content: string;
|
|
117
|
+
status: string;
|
|
118
|
+
metadata: Record<string, unknown> | null;
|
|
119
|
+
created_at: string;
|
|
120
|
+
updated_at: string;
|
|
121
|
+
}
|
|
122
|
+
export interface EngagementMetrics {
|
|
123
|
+
total_conversations: number;
|
|
124
|
+
active_conversations: number;
|
|
125
|
+
response_rate: number;
|
|
126
|
+
avg_response_time_hours: number;
|
|
127
|
+
}
|
|
128
|
+
export interface AiUsage {
|
|
129
|
+
generations_count: number;
|
|
130
|
+
generations_limit: number;
|
|
131
|
+
period_start: string;
|
|
132
|
+
period_end: string;
|
|
133
|
+
}
|
|
134
|
+
export interface AiSuggestion {
|
|
135
|
+
type: string;
|
|
136
|
+
content: string;
|
|
137
|
+
confidence: number;
|
|
138
|
+
}
|
|
139
|
+
export interface DiscoveryJob {
|
|
140
|
+
id: string;
|
|
141
|
+
campaign_id: string | null;
|
|
142
|
+
status: string;
|
|
143
|
+
source: string;
|
|
144
|
+
query: string;
|
|
145
|
+
results_count: number;
|
|
146
|
+
created_at: string;
|
|
147
|
+
updated_at: string;
|
|
148
|
+
}
|
|
149
|
+
export interface DiscoverySource {
|
|
150
|
+
id: string;
|
|
151
|
+
name: string;
|
|
152
|
+
type: string;
|
|
153
|
+
description: string;
|
|
154
|
+
is_available: boolean;
|
|
155
|
+
}
|
|
156
|
+
export interface AnalyticsOverview {
|
|
157
|
+
total_campaigns: number;
|
|
158
|
+
active_campaigns: number;
|
|
159
|
+
total_contacts: number;
|
|
160
|
+
total_conversations: number;
|
|
161
|
+
emails_sent: number;
|
|
162
|
+
emails_opened: number;
|
|
163
|
+
emails_replied: number;
|
|
164
|
+
response_rate: number;
|
|
165
|
+
}
|
|
166
|
+
export interface CampaignAnalytics {
|
|
167
|
+
campaign_id: string;
|
|
168
|
+
contacts_count: number;
|
|
169
|
+
emails_sent: number;
|
|
170
|
+
emails_delivered: number;
|
|
171
|
+
emails_opened: number;
|
|
172
|
+
emails_clicked: number;
|
|
173
|
+
emails_replied: number;
|
|
174
|
+
emails_bounced: number;
|
|
175
|
+
open_rate: number;
|
|
176
|
+
click_rate: number;
|
|
177
|
+
reply_rate: number;
|
|
178
|
+
bounce_rate: number;
|
|
179
|
+
}
|
|
180
|
+
export interface PerformanceMetrics {
|
|
181
|
+
period: string;
|
|
182
|
+
emails_sent: number;
|
|
183
|
+
emails_opened: number;
|
|
184
|
+
emails_replied: number;
|
|
185
|
+
open_rate: number;
|
|
186
|
+
reply_rate: number;
|
|
187
|
+
}
|
|
188
|
+
export interface BillingPlan {
|
|
189
|
+
id: string;
|
|
190
|
+
name: string;
|
|
191
|
+
tier: string;
|
|
192
|
+
price_monthly: number;
|
|
193
|
+
price_yearly: number;
|
|
194
|
+
features: Record<string, unknown>;
|
|
195
|
+
limits: Record<string, number>;
|
|
196
|
+
}
|
|
197
|
+
export interface ConnectedAccount {
|
|
198
|
+
id: string;
|
|
199
|
+
user_id: string;
|
|
200
|
+
platform: string;
|
|
201
|
+
platform_user_id: string;
|
|
202
|
+
platform_username: string | null;
|
|
203
|
+
status: string;
|
|
204
|
+
created_at: string;
|
|
205
|
+
updated_at: string;
|
|
206
|
+
}
|
|
207
|
+
export interface ChannelAvailability {
|
|
208
|
+
channel: string;
|
|
209
|
+
available: boolean;
|
|
210
|
+
account_id: string | null;
|
|
211
|
+
reason: string | null;
|
|
212
|
+
}
|
|
213
|
+
export interface Notification {
|
|
214
|
+
id: string;
|
|
215
|
+
user_id: string;
|
|
216
|
+
type: string;
|
|
217
|
+
title: string;
|
|
218
|
+
message: string;
|
|
219
|
+
read: boolean;
|
|
220
|
+
metadata: Record<string, unknown> | null;
|
|
221
|
+
created_at: string;
|
|
222
|
+
}
|
|
223
|
+
export interface ApiKey {
|
|
224
|
+
id: string;
|
|
225
|
+
user_id: string;
|
|
226
|
+
name: string;
|
|
227
|
+
key_prefix: string;
|
|
228
|
+
scopes: string[];
|
|
229
|
+
expires_at: string | null;
|
|
230
|
+
last_used_at: string | null;
|
|
231
|
+
created_at: string;
|
|
232
|
+
}
|
|
233
|
+
export interface Webhook {
|
|
234
|
+
id: string;
|
|
235
|
+
user_id: string;
|
|
236
|
+
url: string;
|
|
237
|
+
events: string[];
|
|
238
|
+
description: string | null;
|
|
239
|
+
active: boolean;
|
|
240
|
+
secret: string;
|
|
241
|
+
created_at: string;
|
|
242
|
+
updated_at: string;
|
|
243
|
+
}
|
|
244
|
+
export interface CreateApiKeyResponse extends ApiKey {
|
|
245
|
+
key: string;
|
|
246
|
+
}
|
|
247
|
+
export interface WebhookDelivery {
|
|
248
|
+
id: string;
|
|
249
|
+
webhook_id: string;
|
|
250
|
+
event: string;
|
|
251
|
+
status: string;
|
|
252
|
+
status_code: number | null;
|
|
253
|
+
request_body: Record<string, unknown>;
|
|
254
|
+
response_body: string | null;
|
|
255
|
+
created_at: string;
|
|
256
|
+
}
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jclvsh/iris",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "MCP server for the Iris API",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"iris-mcp": "dist/index.js",
|
|
10
|
+
"iris": "dist/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@modelcontextprotocol/sdk": "^1.11.0",
|
|
22
|
+
"commander": "^14.0.3",
|
|
23
|
+
"zod": "^3.24.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.7.0",
|
|
27
|
+
"@types/node": "^22.0.0"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"license": "MIT"
|
|
33
|
+
}
|