@magnetlab/mcp 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.
- package/README.md +119 -0
- package/dist/client.d.ts +465 -0
- package/dist/client.js +456 -0
- package/dist/constants.d.ts +30 -0
- package/dist/constants.js +87 -0
- package/dist/handlers/analytics.d.ts +5 -0
- package/dist/handlers/analytics.js +11 -0
- package/dist/handlers/brand-kit.d.ts +5 -0
- package/dist/handlers/brand-kit.js +32 -0
- package/dist/handlers/content-pipeline.d.ts +5 -0
- package/dist/handlers/content-pipeline.js +127 -0
- package/dist/handlers/email-sequences.d.ts +5 -0
- package/dist/handlers/email-sequences.js +30 -0
- package/dist/handlers/funnels.d.ts +5 -0
- package/dist/handlers/funnels.js +65 -0
- package/dist/handlers/ideation.d.ts +5 -0
- package/dist/handlers/ideation.js +44 -0
- package/dist/handlers/index.d.ts +24 -0
- package/dist/handlers/index.js +104 -0
- package/dist/handlers/lead-magnets.d.ts +5 -0
- package/dist/handlers/lead-magnets.js +31 -0
- package/dist/handlers/leads.d.ts +5 -0
- package/dist/handlers/leads.js +24 -0
- package/dist/handlers/libraries.d.ts +5 -0
- package/dist/handlers/libraries.js +31 -0
- package/dist/handlers/qualification-forms.d.ts +5 -0
- package/dist/handlers/qualification-forms.js +21 -0
- package/dist/handlers/swipe-file.d.ts +5 -0
- package/dist/handlers/swipe-file.js +31 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +58 -0
- package/dist/tools/analytics.d.ts +2 -0
- package/dist/tools/analytics.js +10 -0
- package/dist/tools/brand-kit.d.ts +2 -0
- package/dist/tools/brand-kit.js +89 -0
- package/dist/tools/content-pipeline.d.ts +2 -0
- package/dist/tools/content-pipeline.js +476 -0
- package/dist/tools/email-sequences.d.ts +2 -0
- package/dist/tools/email-sequences.js +70 -0
- package/dist/tools/funnels.d.ts +2 -0
- package/dist/tools/funnels.js +153 -0
- package/dist/tools/ideation.d.ts +2 -0
- package/dist/tools/ideation.js +161 -0
- package/dist/tools/index.d.ts +66 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/lead-magnets.d.ts +2 -0
- package/dist/tools/lead-magnets.js +101 -0
- package/dist/tools/leads.d.ts +2 -0
- package/dist/tools/leads.js +32 -0
- package/dist/tools/libraries.d.ts +2 -0
- package/dist/tools/libraries.js +83 -0
- package/dist/tools/qualification-forms.d.ts +2 -0
- package/dist/tools/qualification-forms.js +71 -0
- package/dist/tools/swipe-file.d.ts +2 -0
- package/dist/tools/swipe-file.js +46 -0
- package/dist/validation.d.ts +476 -0
- package/dist/validation.js +236 -0
- package/package.json +52 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle content pipeline tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleContentPipelineTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
// Transcripts
|
|
7
|
+
case 'magnetlab_list_transcripts':
|
|
8
|
+
return client.listTranscripts();
|
|
9
|
+
case 'magnetlab_submit_transcript':
|
|
10
|
+
return client.submitTranscript({
|
|
11
|
+
transcript: args.transcript,
|
|
12
|
+
title: args.title,
|
|
13
|
+
});
|
|
14
|
+
case 'magnetlab_delete_transcript':
|
|
15
|
+
return client.deleteTranscript(args.id);
|
|
16
|
+
// Knowledge base
|
|
17
|
+
case 'magnetlab_search_knowledge':
|
|
18
|
+
return client.searchKnowledge({
|
|
19
|
+
query: args.query,
|
|
20
|
+
category: args.category,
|
|
21
|
+
});
|
|
22
|
+
case 'magnetlab_browse_knowledge':
|
|
23
|
+
return client.searchKnowledge({
|
|
24
|
+
category: args.category,
|
|
25
|
+
});
|
|
26
|
+
case 'magnetlab_get_knowledge_tags':
|
|
27
|
+
return client.searchKnowledge({ view: 'tags' });
|
|
28
|
+
case 'magnetlab_get_knowledge_clusters':
|
|
29
|
+
return client.getKnowledgeClusters();
|
|
30
|
+
// Ideas
|
|
31
|
+
case 'magnetlab_list_ideas':
|
|
32
|
+
return client.listIdeas({
|
|
33
|
+
status: args.status,
|
|
34
|
+
pillar: args.pillar,
|
|
35
|
+
contentType: args.content_type,
|
|
36
|
+
limit: args.limit,
|
|
37
|
+
});
|
|
38
|
+
case 'magnetlab_get_idea':
|
|
39
|
+
return client.getIdea(args.id);
|
|
40
|
+
case 'magnetlab_update_idea_status':
|
|
41
|
+
return client.updateIdeaStatus(args.idea_id, args.status);
|
|
42
|
+
case 'magnetlab_delete_idea':
|
|
43
|
+
return client.deleteIdea(args.id);
|
|
44
|
+
case 'magnetlab_write_post_from_idea':
|
|
45
|
+
return client.writePostFromIdea(args.idea_id);
|
|
46
|
+
// Posts
|
|
47
|
+
case 'magnetlab_list_posts':
|
|
48
|
+
return client.listPosts({
|
|
49
|
+
status: args.status,
|
|
50
|
+
isBuffer: args.is_buffer,
|
|
51
|
+
limit: args.limit,
|
|
52
|
+
});
|
|
53
|
+
case 'magnetlab_get_post':
|
|
54
|
+
return client.getPost(args.id);
|
|
55
|
+
case 'magnetlab_update_post': {
|
|
56
|
+
const { id, ...rest } = args;
|
|
57
|
+
return client.updatePost(id, rest);
|
|
58
|
+
}
|
|
59
|
+
case 'magnetlab_delete_post':
|
|
60
|
+
return client.deletePost(args.id);
|
|
61
|
+
case 'magnetlab_polish_post':
|
|
62
|
+
return client.polishPost(args.id);
|
|
63
|
+
case 'magnetlab_publish_post':
|
|
64
|
+
return client.publishPost(args.id);
|
|
65
|
+
case 'magnetlab_schedule_post':
|
|
66
|
+
return client.schedulePost({
|
|
67
|
+
postId: args.post_id,
|
|
68
|
+
scheduledTime: args.scheduled_time,
|
|
69
|
+
});
|
|
70
|
+
case 'magnetlab_get_posts_by_date_range':
|
|
71
|
+
return client.getPostsByDateRange({
|
|
72
|
+
startDate: args.start_date,
|
|
73
|
+
endDate: args.end_date,
|
|
74
|
+
});
|
|
75
|
+
case 'magnetlab_quick_write':
|
|
76
|
+
return client.quickWritePost({
|
|
77
|
+
topic: args.topic,
|
|
78
|
+
style: args.style,
|
|
79
|
+
template: args.template,
|
|
80
|
+
});
|
|
81
|
+
// Schedule & Autopilot
|
|
82
|
+
case 'magnetlab_list_posting_slots':
|
|
83
|
+
return client.listPostingSlots();
|
|
84
|
+
case 'magnetlab_create_posting_slot':
|
|
85
|
+
return client.createPostingSlot({
|
|
86
|
+
dayOfWeek: args.day_of_week,
|
|
87
|
+
time: args.time,
|
|
88
|
+
});
|
|
89
|
+
case 'magnetlab_delete_posting_slot':
|
|
90
|
+
return client.deletePostingSlot(args.id);
|
|
91
|
+
case 'magnetlab_get_autopilot_status':
|
|
92
|
+
return client.getAutopilotStatus();
|
|
93
|
+
case 'magnetlab_trigger_autopilot':
|
|
94
|
+
return client.triggerAutopilot({
|
|
95
|
+
postsPerBatch: args.posts_per_batch,
|
|
96
|
+
bufferTarget: args.buffer_target,
|
|
97
|
+
autoPublish: args.auto_publish,
|
|
98
|
+
});
|
|
99
|
+
case 'magnetlab_get_buffer':
|
|
100
|
+
return client.getBuffer();
|
|
101
|
+
// Writing Styles & Templates
|
|
102
|
+
case 'magnetlab_list_writing_styles':
|
|
103
|
+
return client.listWritingStyles();
|
|
104
|
+
case 'magnetlab_extract_writing_style':
|
|
105
|
+
return client.extractWritingStyle({ linkedinUrl: args.linkedin_url });
|
|
106
|
+
case 'magnetlab_get_writing_style':
|
|
107
|
+
return client.getWritingStyle(args.id);
|
|
108
|
+
case 'magnetlab_list_templates':
|
|
109
|
+
return client.listTemplates({ limit: args.limit });
|
|
110
|
+
case 'magnetlab_match_template':
|
|
111
|
+
return client.matchTemplate({ ideaId: args.idea_id });
|
|
112
|
+
// Content Planner
|
|
113
|
+
case 'magnetlab_get_plan':
|
|
114
|
+
return client.getPlan();
|
|
115
|
+
case 'magnetlab_generate_plan':
|
|
116
|
+
return client.generatePlan({ weekCount: args.week_count });
|
|
117
|
+
case 'magnetlab_approve_plan':
|
|
118
|
+
return client.approvePlan({ planId: args.plan_id });
|
|
119
|
+
// Business Context
|
|
120
|
+
case 'magnetlab_get_business_context':
|
|
121
|
+
return client.getBusinessContext();
|
|
122
|
+
case 'magnetlab_update_business_context':
|
|
123
|
+
return client.updateBusinessContext(args.context);
|
|
124
|
+
default:
|
|
125
|
+
throw new Error(`Unknown content pipeline tool: ${name}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle email sequence tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleEmailSequenceTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_get_email_sequence':
|
|
7
|
+
return client.getEmailSequence(args.lead_magnet_id);
|
|
8
|
+
case 'magnetlab_generate_email_sequence':
|
|
9
|
+
return client.generateEmailSequence({
|
|
10
|
+
leadMagnetId: args.lead_magnet_id,
|
|
11
|
+
useAI: args.use_ai,
|
|
12
|
+
});
|
|
13
|
+
case 'magnetlab_update_email_sequence': {
|
|
14
|
+
const emails = args.emails;
|
|
15
|
+
return client.updateEmailSequence(args.lead_magnet_id, {
|
|
16
|
+
emails: emails?.map((e) => ({
|
|
17
|
+
day: e.day,
|
|
18
|
+
subject: e.subject,
|
|
19
|
+
body: e.body,
|
|
20
|
+
replyTrigger: e.reply_trigger,
|
|
21
|
+
})),
|
|
22
|
+
status: args.status,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
case 'magnetlab_activate_email_sequence':
|
|
26
|
+
return client.activateEmailSequence(args.lead_magnet_id);
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`Unknown email sequence tool: ${name}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle funnel related tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleFunnelTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_list_funnels':
|
|
7
|
+
return client.listFunnels();
|
|
8
|
+
case 'magnetlab_get_funnel':
|
|
9
|
+
return client.getFunnel(args.id);
|
|
10
|
+
case 'magnetlab_get_funnel_by_target':
|
|
11
|
+
return client.getFunnelByTarget({
|
|
12
|
+
leadMagnetId: args.lead_magnet_id,
|
|
13
|
+
libraryId: args.library_id,
|
|
14
|
+
externalResourceId: args.external_resource_id,
|
|
15
|
+
});
|
|
16
|
+
case 'magnetlab_create_funnel':
|
|
17
|
+
return client.createFunnel({
|
|
18
|
+
leadMagnetId: args.lead_magnet_id,
|
|
19
|
+
libraryId: args.library_id,
|
|
20
|
+
externalResourceId: args.external_resource_id,
|
|
21
|
+
targetType: args.target_type,
|
|
22
|
+
slug: args.slug,
|
|
23
|
+
optinHeadline: args.optin_headline,
|
|
24
|
+
optinSubline: args.optin_subline,
|
|
25
|
+
optinButtonText: args.optin_button_text,
|
|
26
|
+
optinSocialProof: args.optin_social_proof,
|
|
27
|
+
thankyouHeadline: args.thankyou_headline,
|
|
28
|
+
thankyouSubline: args.thankyou_subline,
|
|
29
|
+
vslUrl: args.vsl_url,
|
|
30
|
+
calendlyUrl: args.calendly_url,
|
|
31
|
+
theme: args.theme,
|
|
32
|
+
primaryColor: args.primary_color,
|
|
33
|
+
backgroundStyle: args.background_style,
|
|
34
|
+
logoUrl: args.logo_url,
|
|
35
|
+
qualificationFormId: args.qualification_form_id,
|
|
36
|
+
});
|
|
37
|
+
case 'magnetlab_update_funnel':
|
|
38
|
+
return client.updateFunnel(args.id, {
|
|
39
|
+
slug: args.slug,
|
|
40
|
+
optinHeadline: args.optin_headline,
|
|
41
|
+
optinSubline: args.optin_subline,
|
|
42
|
+
optinButtonText: args.optin_button_text,
|
|
43
|
+
optinSocialProof: args.optin_social_proof,
|
|
44
|
+
thankyouHeadline: args.thankyou_headline,
|
|
45
|
+
thankyouSubline: args.thankyou_subline,
|
|
46
|
+
vslUrl: args.vsl_url,
|
|
47
|
+
calendlyUrl: args.calendly_url,
|
|
48
|
+
theme: args.theme,
|
|
49
|
+
primaryColor: args.primary_color,
|
|
50
|
+
backgroundStyle: args.background_style,
|
|
51
|
+
logoUrl: args.logo_url,
|
|
52
|
+
qualificationFormId: args.qualification_form_id,
|
|
53
|
+
});
|
|
54
|
+
case 'magnetlab_delete_funnel':
|
|
55
|
+
return client.deleteFunnel(args.id);
|
|
56
|
+
case 'magnetlab_publish_funnel':
|
|
57
|
+
return client.publishFunnel(args.id);
|
|
58
|
+
case 'magnetlab_unpublish_funnel':
|
|
59
|
+
return client.unpublishFunnel(args.id);
|
|
60
|
+
case 'magnetlab_generate_funnel_content':
|
|
61
|
+
return client.generateFunnelContent({ leadMagnetId: args.lead_magnet_id });
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Unknown funnel tool: ${name}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle ideation and content generation tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleIdeationTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_ideate_lead_magnets':
|
|
7
|
+
return client.ideateLeadMagnets({
|
|
8
|
+
businessDescription: args.business_description,
|
|
9
|
+
businessType: args.business_type,
|
|
10
|
+
credibilityMarkers: args.credibility_markers,
|
|
11
|
+
urgentPains: args.urgent_pains,
|
|
12
|
+
templates: args.templates,
|
|
13
|
+
processes: args.processes,
|
|
14
|
+
tools: args.tools,
|
|
15
|
+
frequentQuestions: args.frequent_questions,
|
|
16
|
+
results: args.results,
|
|
17
|
+
successExample: args.success_example,
|
|
18
|
+
});
|
|
19
|
+
case 'magnetlab_extract_content':
|
|
20
|
+
return client.extractContent(args.lead_magnet_id, {
|
|
21
|
+
archetype: args.archetype,
|
|
22
|
+
concept: args.concept,
|
|
23
|
+
answers: args.answers,
|
|
24
|
+
});
|
|
25
|
+
case 'magnetlab_generate_content':
|
|
26
|
+
return client.generateContent(args.lead_magnet_id, {
|
|
27
|
+
archetype: args.archetype,
|
|
28
|
+
concept: args.concept,
|
|
29
|
+
answers: args.answers,
|
|
30
|
+
});
|
|
31
|
+
case 'magnetlab_write_linkedin_posts':
|
|
32
|
+
return client.writeLinkedInPosts(args.lead_magnet_id, {
|
|
33
|
+
leadMagnetTitle: args.lead_magnet_title,
|
|
34
|
+
contents: args.contents,
|
|
35
|
+
problemSolved: args.problem_solved,
|
|
36
|
+
});
|
|
37
|
+
case 'magnetlab_polish_lead_magnet':
|
|
38
|
+
return client.polishLeadMagnetContent(args.lead_magnet_id);
|
|
39
|
+
case 'magnetlab_get_job_status':
|
|
40
|
+
return client.getJobStatus(args.job_id);
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`Unknown ideation tool: ${name}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MagnetLabClient } from '../client.js';
|
|
2
|
+
export type ToolResult = {
|
|
3
|
+
content: Array<{
|
|
4
|
+
type: 'text';
|
|
5
|
+
text: string;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Main dispatcher for MCP tool calls.
|
|
10
|
+
* Routes tool calls to the appropriate category handler based on tool name.
|
|
11
|
+
* Validates required arguments before dispatching to handlers.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleToolCall(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<ToolResult>;
|
|
14
|
+
export { handleLeadMagnetTools } from './lead-magnets.js';
|
|
15
|
+
export { handleIdeationTools } from './ideation.js';
|
|
16
|
+
export { handleFunnelTools } from './funnels.js';
|
|
17
|
+
export { handleLeadTools } from './leads.js';
|
|
18
|
+
export { handleAnalyticsTools } from './analytics.js';
|
|
19
|
+
export { handleBrandKitTools } from './brand-kit.js';
|
|
20
|
+
export { handleEmailSequenceTools } from './email-sequences.js';
|
|
21
|
+
export { handleContentPipelineTools } from './content-pipeline.js';
|
|
22
|
+
export { handleSwipeFileTools } from './swipe-file.js';
|
|
23
|
+
export { handleLibraryTools } from './libraries.js';
|
|
24
|
+
export { handleQualificationFormTools } from './qualification-forms.js';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { handleLeadMagnetTools } from './lead-magnets.js';
|
|
2
|
+
import { handleIdeationTools } from './ideation.js';
|
|
3
|
+
import { handleFunnelTools } from './funnels.js';
|
|
4
|
+
import { handleLeadTools } from './leads.js';
|
|
5
|
+
import { handleAnalyticsTools } from './analytics.js';
|
|
6
|
+
import { handleBrandKitTools } from './brand-kit.js';
|
|
7
|
+
import { handleEmailSequenceTools } from './email-sequences.js';
|
|
8
|
+
import { handleContentPipelineTools } from './content-pipeline.js';
|
|
9
|
+
import { handleSwipeFileTools } from './swipe-file.js';
|
|
10
|
+
import { handleLibraryTools } from './libraries.js';
|
|
11
|
+
import { handleQualificationFormTools } from './qualification-forms.js';
|
|
12
|
+
import { toolCategories } from '../tools/index.js';
|
|
13
|
+
import { validateToolArgs } from '../validation.js';
|
|
14
|
+
/**
|
|
15
|
+
* Main dispatcher for MCP tool calls.
|
|
16
|
+
* Routes tool calls to the appropriate category handler based on tool name.
|
|
17
|
+
* Validates required arguments before dispatching to handlers.
|
|
18
|
+
*/
|
|
19
|
+
export async function handleToolCall(name, args, client) {
|
|
20
|
+
try {
|
|
21
|
+
// Validate args before calling handler
|
|
22
|
+
const validation = validateToolArgs(name, args);
|
|
23
|
+
if (!validation.success) {
|
|
24
|
+
return {
|
|
25
|
+
content: [
|
|
26
|
+
{
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: JSON.stringify({ error: validation.error }),
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
let result;
|
|
34
|
+
// Route to appropriate handler based on tool category
|
|
35
|
+
if (toolCategories.leadMagnets.includes(name)) {
|
|
36
|
+
result = await handleLeadMagnetTools(name, args, client);
|
|
37
|
+
}
|
|
38
|
+
else if (toolCategories.ideation.includes(name)) {
|
|
39
|
+
result = await handleIdeationTools(name, args, client);
|
|
40
|
+
}
|
|
41
|
+
else if (toolCategories.funnels.includes(name)) {
|
|
42
|
+
result = await handleFunnelTools(name, args, client);
|
|
43
|
+
}
|
|
44
|
+
else if (toolCategories.leads.includes(name)) {
|
|
45
|
+
result = await handleLeadTools(name, args, client);
|
|
46
|
+
}
|
|
47
|
+
else if (toolCategories.analytics.includes(name)) {
|
|
48
|
+
result = await handleAnalyticsTools(name, args, client);
|
|
49
|
+
}
|
|
50
|
+
else if (toolCategories.brandKit.includes(name)) {
|
|
51
|
+
result = await handleBrandKitTools(name, args, client);
|
|
52
|
+
}
|
|
53
|
+
else if (toolCategories.emailSequences.includes(name)) {
|
|
54
|
+
result = await handleEmailSequenceTools(name, args, client);
|
|
55
|
+
}
|
|
56
|
+
else if (toolCategories.contentPipeline.includes(name)) {
|
|
57
|
+
result = await handleContentPipelineTools(name, args, client);
|
|
58
|
+
}
|
|
59
|
+
else if (toolCategories.swipeFile.includes(name)) {
|
|
60
|
+
result = await handleSwipeFileTools(name, args, client);
|
|
61
|
+
}
|
|
62
|
+
else if (toolCategories.libraries.includes(name)) {
|
|
63
|
+
result = await handleLibraryTools(name, args, client);
|
|
64
|
+
}
|
|
65
|
+
else if (toolCategories.qualificationForms.includes(name)) {
|
|
66
|
+
result = await handleQualificationFormTools(name, args, client);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
content: [
|
|
73
|
+
{
|
|
74
|
+
type: 'text',
|
|
75
|
+
text: JSON.stringify(result, null, 2),
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: JSON.stringify({
|
|
86
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
87
|
+
}),
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Re-export individual handlers for testing
|
|
94
|
+
export { handleLeadMagnetTools } from './lead-magnets.js';
|
|
95
|
+
export { handleIdeationTools } from './ideation.js';
|
|
96
|
+
export { handleFunnelTools } from './funnels.js';
|
|
97
|
+
export { handleLeadTools } from './leads.js';
|
|
98
|
+
export { handleAnalyticsTools } from './analytics.js';
|
|
99
|
+
export { handleBrandKitTools } from './brand-kit.js';
|
|
100
|
+
export { handleEmailSequenceTools } from './email-sequences.js';
|
|
101
|
+
export { handleContentPipelineTools } from './content-pipeline.js';
|
|
102
|
+
export { handleSwipeFileTools } from './swipe-file.js';
|
|
103
|
+
export { handleLibraryTools } from './libraries.js';
|
|
104
|
+
export { handleQualificationFormTools } from './qualification-forms.js';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle lead magnet related tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleLeadMagnetTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_list_lead_magnets':
|
|
7
|
+
return client.listLeadMagnets({
|
|
8
|
+
status: args.status,
|
|
9
|
+
limit: args.limit,
|
|
10
|
+
offset: args.offset,
|
|
11
|
+
});
|
|
12
|
+
case 'magnetlab_get_lead_magnet':
|
|
13
|
+
return client.getLeadMagnet(args.id);
|
|
14
|
+
case 'magnetlab_create_lead_magnet':
|
|
15
|
+
return client.createLeadMagnet({
|
|
16
|
+
title: args.title,
|
|
17
|
+
archetype: args.archetype,
|
|
18
|
+
concept: args.concept,
|
|
19
|
+
});
|
|
20
|
+
case 'magnetlab_delete_lead_magnet':
|
|
21
|
+
return client.deleteLeadMagnet(args.id);
|
|
22
|
+
case 'magnetlab_get_lead_magnet_stats':
|
|
23
|
+
return client.getLeadMagnetStats(args.lead_magnet_id);
|
|
24
|
+
case 'magnetlab_analyze_competitor':
|
|
25
|
+
return client.analyzeCompetitor({ url: args.url });
|
|
26
|
+
case 'magnetlab_analyze_transcript':
|
|
27
|
+
return client.analyzeTranscript({ transcript: args.transcript });
|
|
28
|
+
default:
|
|
29
|
+
throw new Error(`Unknown lead magnet tool: ${name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle lead management tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleLeadTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_list_leads':
|
|
7
|
+
return client.listLeads({
|
|
8
|
+
funnelId: args.funnel_id,
|
|
9
|
+
leadMagnetId: args.lead_magnet_id,
|
|
10
|
+
qualified: args.qualified,
|
|
11
|
+
search: args.search,
|
|
12
|
+
limit: args.limit,
|
|
13
|
+
offset: args.offset,
|
|
14
|
+
});
|
|
15
|
+
case 'magnetlab_export_leads':
|
|
16
|
+
return client.exportLeads({
|
|
17
|
+
funnelId: args.funnel_id,
|
|
18
|
+
leadMagnetId: args.lead_magnet_id,
|
|
19
|
+
qualified: args.qualified,
|
|
20
|
+
});
|
|
21
|
+
default:
|
|
22
|
+
throw new Error(`Unknown lead tool: ${name}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle library tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleLibraryTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_list_libraries':
|
|
7
|
+
return client.listLibraries();
|
|
8
|
+
case 'magnetlab_get_library':
|
|
9
|
+
return client.getLibrary(args.id);
|
|
10
|
+
case 'magnetlab_create_library':
|
|
11
|
+
return client.createLibrary({
|
|
12
|
+
name: args.name,
|
|
13
|
+
description: args.description,
|
|
14
|
+
});
|
|
15
|
+
case 'magnetlab_update_library':
|
|
16
|
+
return client.updateLibrary(args.id, {
|
|
17
|
+
name: args.name,
|
|
18
|
+
description: args.description,
|
|
19
|
+
});
|
|
20
|
+
case 'magnetlab_delete_library':
|
|
21
|
+
return client.deleteLibrary(args.id);
|
|
22
|
+
case 'magnetlab_list_library_items':
|
|
23
|
+
return client.listLibraryItems(args.library_id);
|
|
24
|
+
case 'magnetlab_create_library_item': {
|
|
25
|
+
const { library_id, ...rest } = args;
|
|
26
|
+
return client.createLibraryItem(library_id, rest);
|
|
27
|
+
}
|
|
28
|
+
default:
|
|
29
|
+
throw new Error(`Unknown library tool: ${name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle qualification form tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleQualificationFormTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_list_qualification_forms':
|
|
7
|
+
return client.listQualificationForms();
|
|
8
|
+
case 'magnetlab_get_qualification_form':
|
|
9
|
+
return client.getQualificationForm(args.id);
|
|
10
|
+
case 'magnetlab_create_qualification_form':
|
|
11
|
+
return client.createQualificationForm({ name: args.name });
|
|
12
|
+
case 'magnetlab_list_questions':
|
|
13
|
+
return client.listQuestions(args.form_id);
|
|
14
|
+
case 'magnetlab_create_question': {
|
|
15
|
+
const { form_id, ...rest } = args;
|
|
16
|
+
return client.createQuestion(form_id, rest);
|
|
17
|
+
}
|
|
18
|
+
default:
|
|
19
|
+
throw new Error(`Unknown qualification form tool: ${name}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle swipe file tool calls.
|
|
3
|
+
*/
|
|
4
|
+
export async function handleSwipeFileTools(name, args, client) {
|
|
5
|
+
switch (name) {
|
|
6
|
+
case 'magnetlab_browse_swipe_posts':
|
|
7
|
+
return client.browseSwipeFilePosts({
|
|
8
|
+
niche: args.niche,
|
|
9
|
+
type: args.type,
|
|
10
|
+
featured: args.featured,
|
|
11
|
+
limit: args.limit,
|
|
12
|
+
offset: args.offset,
|
|
13
|
+
});
|
|
14
|
+
case 'magnetlab_browse_swipe_lead_magnets':
|
|
15
|
+
return client.browseSwipeFileLeadMagnets({
|
|
16
|
+
niche: args.niche,
|
|
17
|
+
format: args.format,
|
|
18
|
+
featured: args.featured,
|
|
19
|
+
limit: args.limit,
|
|
20
|
+
offset: args.offset,
|
|
21
|
+
});
|
|
22
|
+
case 'magnetlab_submit_to_swipe_file':
|
|
23
|
+
return client.submitToSwipeFile({
|
|
24
|
+
content: args.content,
|
|
25
|
+
type: args.type,
|
|
26
|
+
niche: args.niche,
|
|
27
|
+
});
|
|
28
|
+
default:
|
|
29
|
+
throw new Error(`Unknown swipe file tool: ${name}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { MagnetLabClient } from './client.js';
|
|
7
|
+
import { tools } from './tools/index.js';
|
|
8
|
+
import { handleToolCall } from './handlers/index.js';
|
|
9
|
+
// Re-export constants and types for consumers
|
|
10
|
+
export * from './constants.js';
|
|
11
|
+
export { MagnetLabClient } from './client.js';
|
|
12
|
+
async function startServer(apiKey, baseUrl) {
|
|
13
|
+
// Create the MagnetLab client
|
|
14
|
+
const client = new MagnetLabClient(apiKey, { baseUrl });
|
|
15
|
+
// Create the MCP server
|
|
16
|
+
const server = new Server({ name: 'magnetlab', version: '0.1.0' }, { capabilities: { tools: {} } });
|
|
17
|
+
// Register the tools list handler
|
|
18
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
19
|
+
tools,
|
|
20
|
+
}));
|
|
21
|
+
// Register the tool call handler
|
|
22
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
23
|
+
const { name, arguments: args } = request.params;
|
|
24
|
+
return handleToolCall(name, args || {}, client);
|
|
25
|
+
});
|
|
26
|
+
// Connect via stdio transport
|
|
27
|
+
const transport = new StdioServerTransport();
|
|
28
|
+
await server.connect(transport);
|
|
29
|
+
}
|
|
30
|
+
function resolveOptions(options) {
|
|
31
|
+
const apiKey = options.apiKey || process.env.MAGNETLAB_API_KEY;
|
|
32
|
+
if (!apiKey) {
|
|
33
|
+
console.error('Error: API key required. Set MAGNETLAB_API_KEY or use --api-key');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const baseUrl = options.baseUrl || process.env.MAGNETLAB_BASE_URL;
|
|
37
|
+
return { apiKey, baseUrl };
|
|
38
|
+
}
|
|
39
|
+
const program = new Command();
|
|
40
|
+
program.name('magnetlab-mcp').description('MCP server for MagnetLab').version('0.1.0');
|
|
41
|
+
program
|
|
42
|
+
.command('serve')
|
|
43
|
+
.description('Start the MCP server')
|
|
44
|
+
.option('--api-key <key>', 'MagnetLab API key')
|
|
45
|
+
.option('--base-url <url>', 'MagnetLab API base URL')
|
|
46
|
+
.action(async (options) => {
|
|
47
|
+
const { apiKey, baseUrl } = resolveOptions(options);
|
|
48
|
+
await startServer(apiKey, baseUrl);
|
|
49
|
+
});
|
|
50
|
+
// Default command (no subcommand) also starts the server for simplicity
|
|
51
|
+
program
|
|
52
|
+
.option('--api-key <key>', 'MagnetLab API key')
|
|
53
|
+
.option('--base-url <url>', 'MagnetLab API base URL')
|
|
54
|
+
.action(async (options) => {
|
|
55
|
+
const { apiKey, baseUrl } = resolveOptions(options);
|
|
56
|
+
await startServer(apiKey, baseUrl);
|
|
57
|
+
});
|
|
58
|
+
program.parse();
|