@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.
Files changed (58) hide show
  1. package/README.md +119 -0
  2. package/dist/client.d.ts +465 -0
  3. package/dist/client.js +456 -0
  4. package/dist/constants.d.ts +30 -0
  5. package/dist/constants.js +87 -0
  6. package/dist/handlers/analytics.d.ts +5 -0
  7. package/dist/handlers/analytics.js +11 -0
  8. package/dist/handlers/brand-kit.d.ts +5 -0
  9. package/dist/handlers/brand-kit.js +32 -0
  10. package/dist/handlers/content-pipeline.d.ts +5 -0
  11. package/dist/handlers/content-pipeline.js +127 -0
  12. package/dist/handlers/email-sequences.d.ts +5 -0
  13. package/dist/handlers/email-sequences.js +30 -0
  14. package/dist/handlers/funnels.d.ts +5 -0
  15. package/dist/handlers/funnels.js +65 -0
  16. package/dist/handlers/ideation.d.ts +5 -0
  17. package/dist/handlers/ideation.js +44 -0
  18. package/dist/handlers/index.d.ts +24 -0
  19. package/dist/handlers/index.js +104 -0
  20. package/dist/handlers/lead-magnets.d.ts +5 -0
  21. package/dist/handlers/lead-magnets.js +31 -0
  22. package/dist/handlers/leads.d.ts +5 -0
  23. package/dist/handlers/leads.js +24 -0
  24. package/dist/handlers/libraries.d.ts +5 -0
  25. package/dist/handlers/libraries.js +31 -0
  26. package/dist/handlers/qualification-forms.d.ts +5 -0
  27. package/dist/handlers/qualification-forms.js +21 -0
  28. package/dist/handlers/swipe-file.d.ts +5 -0
  29. package/dist/handlers/swipe-file.js +31 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +58 -0
  32. package/dist/tools/analytics.d.ts +2 -0
  33. package/dist/tools/analytics.js +10 -0
  34. package/dist/tools/brand-kit.d.ts +2 -0
  35. package/dist/tools/brand-kit.js +89 -0
  36. package/dist/tools/content-pipeline.d.ts +2 -0
  37. package/dist/tools/content-pipeline.js +476 -0
  38. package/dist/tools/email-sequences.d.ts +2 -0
  39. package/dist/tools/email-sequences.js +70 -0
  40. package/dist/tools/funnels.d.ts +2 -0
  41. package/dist/tools/funnels.js +153 -0
  42. package/dist/tools/ideation.d.ts +2 -0
  43. package/dist/tools/ideation.js +161 -0
  44. package/dist/tools/index.d.ts +66 -0
  45. package/dist/tools/index.js +52 -0
  46. package/dist/tools/lead-magnets.d.ts +2 -0
  47. package/dist/tools/lead-magnets.js +101 -0
  48. package/dist/tools/leads.d.ts +2 -0
  49. package/dist/tools/leads.js +32 -0
  50. package/dist/tools/libraries.d.ts +2 -0
  51. package/dist/tools/libraries.js +83 -0
  52. package/dist/tools/qualification-forms.d.ts +2 -0
  53. package/dist/tools/qualification-forms.js +71 -0
  54. package/dist/tools/swipe-file.d.ts +2 -0
  55. package/dist/tools/swipe-file.js +46 -0
  56. package/dist/validation.d.ts +476 -0
  57. package/dist/validation.js +236 -0
  58. 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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle email sequence tool calls.
4
+ */
5
+ export declare function handleEmailSequenceTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle funnel related tool calls.
4
+ */
5
+ export declare function handleFunnelTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle ideation and content generation tool calls.
4
+ */
5
+ export declare function handleIdeationTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle lead magnet related tool calls.
4
+ */
5
+ export declare function handleLeadMagnetTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle lead management tool calls.
4
+ */
5
+ export declare function handleLeadTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle library tool calls.
4
+ */
5
+ export declare function handleLibraryTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle qualification form tool calls.
4
+ */
5
+ export declare function handleQualificationFormTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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,5 @@
1
+ import { MagnetLabClient } from '../client.js';
2
+ /**
3
+ * Handle swipe file tool calls.
4
+ */
5
+ export declare function handleSwipeFileTools(name: string, args: Record<string, unknown>, client: MagnetLabClient): Promise<unknown>;
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export * from './constants.js';
3
+ export { MagnetLabClient } from './client.js';
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();
@@ -0,0 +1,2 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ export declare const analyticsTools: Tool[];