@sequenzy/mcp 0.0.1 → 0.0.2
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/dist/index.js +16 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -100,5 +100,19 @@ IMPORTANT GUIDELINES:
|
|
|
100
100
|
- Auto-stops when: user logs in again
|
|
101
101
|
- Goal: Bring back inactive users
|
|
102
102
|
|
|
103
|
-
Built-in events
|
|
104
|
-
Built-in tags you can use: lead, customer, trial, cancelled, churned, active, inactive, past-due`,inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID to create the sequence in. If not provided, uses the currently selected company."},name:{type:"string",description:"Sequence name (e.g., 'User Onboarding', 'Welcome Series')"},trigger:{type:"string",enum:["contact_added","tag_added","event_received","inactivity","frequency"],description:"Trigger type: 'contact_added' (when added to a list), 'tag_added' (when tag is applied), 'event_received' (when custom event fires), 'inactivity' (when subscriber hasn't performed an event for X days), 'frequency' (when subscriber performs event X times in Y days)"},listId:{type:"string",description:"List ID to trigger on (for contact_added trigger). If not provided, triggers on any list."},tagName:{type:"string",description:"Tag name to trigger on (required for tag_added trigger)"},eventName:{type:"string",description:"Event name to trigger on (required for event_received, inactivity, and frequency triggers)"},inactiveDays:{type:"number",description:"Number of days of inactivity (required for inactivity trigger, must be >= 1)"},minCount:{type:"number",description:"Minimum event count (required for frequency trigger, must be >= 1)"},timeWindowDays:{type:"number",description:"Time window in days for frequency trigger (required for frequency trigger, must be >= 1)"},emailCount:{type:"number",description:"Number of emails in the sequence (default: 5)"},goal:{type:"string",description:"What this sequence should accomplish. Be specific to the app's actual features and user journey. Avoid generic goals that don't match the app's business model."}},required:["name","trigger","goal"]}},{name:"update_sequence",description:"Update an existing sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"},name:{type:"string",description:"Sequence name"},emails:{type:"array",description:"Updated email steps"}},required:["sequenceId"]}},{name:"enable_sequence",description:"Enable/activate a sequence. IMPORTANT: Only call this when the user EXPLICITLY asks to enable or activate a sequence. Never enable sequences automatically after creation - the user must review the content first.",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"disable_sequence",description:"Disable/pause a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"delete_sequence",description:"Delete a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"send_email",description:"Send a transactional email to a single recipient",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},to:{type:"string",description:"Recipient email address"},subject:{type:"string",description:"Email subject (required if not using templateId)"},html:{type:"string",description:"Email HTML content (required if not using templateId)"},templateId:{type:"string",description:"Template ID to use (alternative to html)"},variables:{type:"object",description:"Variables for template personalization"}},required:["to"]}},{name:"get_stats",description:"Get overview statistics for a time period",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},period:{type:"string",description:"Time period: 7d, 30d, or 90d (default: 7d)"}}}},{name:"get_campaign_stats",description:"Get detailed statistics for a campaign",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},campaignId:{type:"string",description:"Campaign ID"}},required:["campaignId"]}},{name:"get_sequence_stats",description:"Get statistics for a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"get_subscriber_activity",description:"Get activity timeline for a subscriber",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},email:{type:"string",description:"Subscriber email address"}},required:["email"]}},{name:"generate_email",description:"Generate email HTML content from a prompt",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},prompt:{type:"string",description:"Description of the email to generate"},style:{type:"string",description:"Style: minimal, branded, promotional"},tone:{type:"string",description:"Tone: professional, casual, friendly"}},required:["prompt"]}},{name:"generate_sequence",description:"[DEPRECATED - Use create_sequence instead] Generate a multi-email sequence from a goal. Note: create_sequence now handles AI generation automatically.",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},goal:{type:"string",description:"Goal of the sequence (e.g., 'onboard new SaaS trial users')"},emailCount:{type:"number",description:"Number of emails in the sequence (default: 5)"},durationDays:{type:"number",description:"Total duration in days (default: 14)"}},required:["goal"]}},{name:"generate_subject_lines",description:"Generate A/B test subject line variants",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},topic:{type:"string",description:"Topic or context for the subject lines"},count:{type:"number",description:"Number of variants to generate (default: 5)"}},required:["topic"]}}];async function i$(Q,X){try{let Y;switch(Q){case"get_account":{let W=await w("GET","/api/v1/account"),G=d$();Y={...W,selectedCompanyId:G??W.currentCompanyId};break}case"select_company":{let W=X.companyId,G=await w("GET","/api/v1/account"),J=G.companies?.find(($)=>$.id===W);if(!J)throw Error(`Company not found. Available companies: ${G.companies?.map(($)=>`${$.name} (${$.id})`).join(", ")??"none"}`);AX(W),Y={success:!0,message:`Switched to company: ${J.name}`,companyId:J.id,companyName:J.name};break}case"create_company":{let W=await w("POST","/api/v1/companies",{name:X.name,domain:X.domain});if(!W.success)throw Error("Failed to create company");let G=W.company.id,J=6,$=0,z=W.company.status;while(z==="processing"&&$<J){await new Promise((B)=>setTimeout(B,20000)),$++;let H=await w("GET",`/api/v1/companies/${G}`);if(H.success)z=H.company.status}AX(G);let K=await w("GET",`/api/v1/companies/${G}`);Y={success:!0,company:K.company,message:z==="processing"?"Company created but still processing. You can continue using it while processing completes.":`Company '${K.company.name}' created and ready to use.`,autoSelected:!0};break}case"get_company":{let W=X.companyId;Y=await w("GET",`/api/v1/companies/${W}`);break}case"create_api_key":{let W=X.companyId;Y=await w("POST","/api/v1/api-keys",{name:X.name},W);break}case"list_websites":{let W=X.companyId;Y=await w("GET","/api/v1/websites",void 0,W);break}case"add_website":{let W=X.companyId;Y=await w("POST","/api/v1/websites",{domain:X.domain},W);break}case"check_website":{let W=X.companyId;Y=await w("GET",`/api/v1/websites/${X.domain}`,void 0,W);break}case"get_integration_guide":Y=await w("POST","/api/v1/integration-guide",X);break;case"add_subscriber":{let W=X.companyId;Y=await w("POST","/api/v1/subscribers",X,W);break}case"update_subscriber":{let W=X.companyId;Y=await w("PUT",`/api/v1/subscribers/${X.email}`,X,W);break}case"remove_subscriber":{let W=X.companyId;Y=await w("DELETE",`/api/v1/subscribers/${X.email}`,X,W);break}case"get_subscriber":{let W=X.companyId;Y=await w("GET",`/api/v1/subscribers/${X.email}`,void 0,W);break}case"search_subscribers":{let W=X.companyId,G=new URLSearchParams;if(X.query)G.set("query",String(X.query));if(X.tags)G.set("tags",X.tags.join(","));if(X.segmentId)G.set("segmentId",String(X.segmentId));if(X.limit)G.set("limit",String(X.limit));Y=await w("GET",`/api/v1/subscribers?${G}`,void 0,W);break}case"list_tags":{let W=X.companyId;Y=await w("GET","/api/v1/tags",void 0,W);break}case"list_lists":{let W=X.companyId;Y=await w("GET","/api/v1/lists",void 0,W);break}case"create_list":{let W=X.companyId;Y=await w("POST","/api/v1/lists",X,W);break}case"list_segments":{let W=X.companyId;Y=await w("GET","/api/v1/segments",void 0,W);break}case"create_segment":{let W=X.companyId;Y=await w("POST","/api/v1/segments",X,W);break}case"get_segment_count":{let W=X.companyId;Y=await w("GET",`/api/v1/segments/${X.segmentId}/count`,void 0,W);break}case"list_templates":{let W=X.companyId;Y=await w("GET","/api/v1/templates",void 0,W);break}case"get_template":{let W=X.companyId;Y=await w("GET",`/api/v1/templates/${X.templateId}`,void 0,W);break}case"create_template":{let W=X.companyId;Y=await w("POST","/api/v1/templates",X,W);break}case"update_template":{let W=X.companyId;Y=await w("PUT",`/api/v1/templates/${X.templateId}`,X,W);break}case"delete_template":{let W=X.companyId;Y=await w("DELETE",`/api/v1/templates/${X.templateId}`,void 0,W);break}case"list_campaigns":{let W=X.companyId,G=new URLSearchParams;if(X.status)G.set("status",String(X.status));Y=await w("GET",`/api/v1/campaigns?${G}`,void 0,W);break}case"get_campaign":{let W=X.companyId;Y=await w("GET",`/api/v1/campaigns/${X.campaignId}`,void 0,W);break}case"create_campaign":{let W=X.companyId;Y=await w("POST","/api/v1/campaigns",X,W);break}case"update_campaign":{let W=X.companyId;Y=await w("PUT",`/api/v1/campaigns/${X.campaignId}`,X,W);break}case"send_test_email":{let W=X.companyId;Y=await w("POST",`/api/v1/campaigns/${X.campaignId}/test`,{to:X.to},W);break}case"list_sequences":{let W=X.companyId;Y=await w("GET","/api/v1/sequences",void 0,W);break}case"get_sequence":{let W=X.companyId;Y=await w("GET",`/api/v1/sequences/${X.sequenceId}`,void 0,W);break}case"create_sequence":{let W=X.companyId,G=await w("POST","/api/v1/sequences",X,W);if(!G.success){Y=G;break}let J=G.sequence.id,$=6,z=0,K="pending";while(K!=="complete"&&z<$){await new Promise((A)=>setTimeout(A,20000)),z++;let B=await w("GET",`/api/v1/sequences/${J}`,void 0,W);if(B.success)K=B.sequence.enrichmentStatus}let H=await w("GET",`/api/v1/sequences/${J}`,void 0,W);if(H.success)Y={success:!0,sequence:H.sequence,message:H.sequence.enrichmentStatus==="complete"?`Sequence "${H.sequence.name}" created with ${H.sequence.emailCount} AI-generated emails. The sequence is ready to review and enable.`:`Sequence "${H.sequence.name}" created. Email enrichment is still in progress (${H.sequence.enrichedCount}/${H.sequence.emailCount} emails generated). You can check status with get_sequence.`};else Y=H;break}case"update_sequence":{let W=X.companyId;Y=await w("PUT",`/api/v1/sequences/${X.sequenceId}`,X,W);break}case"enable_sequence":{let W=X.companyId;Y=await w("POST",`/api/v1/sequences/${X.sequenceId}/enable`,void 0,W);break}case"disable_sequence":{let W=X.companyId;Y=await w("POST",`/api/v1/sequences/${X.sequenceId}/disable`,void 0,W);break}case"delete_sequence":{let W=X.companyId;Y=await w("DELETE",`/api/v1/sequences/${X.sequenceId}`,void 0,W);break}case"send_email":{let W=X.companyId;Y=await w("POST","/api/v1/transactional/send",X,W);break}case"get_stats":{let W=X.companyId,G=X.period??"7d";Y=await w("GET",`/api/v1/stats?period=${G}`,void 0,W);break}case"get_campaign_stats":{let W=X.companyId;Y=await w("GET",`/api/v1/campaigns/${X.campaignId}/stats`,void 0,W);break}case"get_sequence_stats":{let W=X.companyId;Y=await w("GET",`/api/v1/sequences/${X.sequenceId}/stats`,void 0,W);break}case"get_subscriber_activity":{let W=X.companyId;Y=await w("GET",`/api/v1/subscribers/${X.email}/activity`,void 0,W);break}case"generate_email":{let W=X.companyId;Y=await w("POST","/api/v1/generate/email",X,W);break}case"generate_sequence":{let W=X.companyId;Y=await w("POST","/api/v1/generate/sequence",X,W);break}case"generate_subject_lines":{let W=X.companyId;Y=await w("POST","/api/v1/generate/subjects",X,W);break}default:throw Error(`Unknown tool: ${Q}`)}return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y instanceof Error?Y.message:"Unknown error"}`}]}}}var PV=process.env.SEQUENZY_API_URL??"https://api.sequenzy.com",r$=process.env.SEQUENZY_API_KEY,FX=null;if(!r$)console.error("Error: SEQUENZY_API_KEY environment variable is required"),console.error("Run `npx @sequenzy/setup` to configure your API key."),process.exit(1);function d$(){return FX}function AX(Q){FX=Q}var E6=new HX({name:"sequenzy",version:"0.0.1"},{capabilities:{tools:{},resources:{}}});async function w(Q,X,Y,W){let G={"Content-Type":"application/json",Authorization:`Bearer ${r$}`},J=W??FX;if(J)G["x-company-id"]=J;let $=await fetch(`${PV}${X}`,{method:Q,headers:G,body:Y?JSON.stringify(Y):void 0});if(!$.ok){let z=await $.text();throw Error(`API error: ${$.status} - ${z}`)}return $.json()}E6.setRequestHandler(o9,async()=>{return{tools:p$}});E6.setRequestHandler(Q6,async(Q)=>{let{name:X,arguments:Y}=Q.params;return i$(X,Y??{})});E6.setRequestHandler(l9,async()=>{return{resources:l$}});E6.setRequestHandler(p9,async(Q)=>{let{uri:X}=Q.params;return c$(X)});async function bV(){let Q=new BX;await E6.connect(Q),console.error("Sequenzy MCP server running on stdio")}bV().catch((Q)=>{console.error("Fatal error:",Q),process.exit(1)});export{AX as setSelectedCompanyId,d$ as getSelectedCompanyId,w as apiRequest};
|
|
103
|
+
Built-in events (from Stripe/payment webhooks):
|
|
104
|
+
- saas.purchase, saas.purchase.monthly, saas.purchase.yearly
|
|
105
|
+
- saas.payment_failed, saas.cancelled, saas.churn, saas.refund
|
|
106
|
+
- saas.upgrade, saas.downgrade
|
|
107
|
+
- saas.trial_started, saas.trial_will_end, saas.trial_ended
|
|
108
|
+
|
|
109
|
+
Built-in events (email engagement):
|
|
110
|
+
- email.opened, email.clicked, email.replied, email.bounced, email.unsubscribed
|
|
111
|
+
|
|
112
|
+
Built-in events (contact lifecycle):
|
|
113
|
+
- contact.subscribed, contact.unsubscribed
|
|
114
|
+
|
|
115
|
+
Built-in tags:
|
|
116
|
+
- Status: lead, customer, cancelled, churned, refunded, past-due, trial
|
|
117
|
+
- Subscription: saas.monthly, saas.yearly
|
|
118
|
+
- Engagement: active, inactive`,inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID to create the sequence in. If not provided, uses the currently selected company."},name:{type:"string",description:"Sequence name (e.g., 'User Onboarding', 'Welcome Series')"},trigger:{type:"string",enum:["contact_added","tag_added","event_received","inactivity","frequency"],description:"Trigger type: 'contact_added' (when added to a list), 'tag_added' (when tag is applied), 'event_received' (when custom event fires), 'inactivity' (when subscriber hasn't performed an event for X days), 'frequency' (when subscriber performs event X times in Y days)"},listId:{type:"string",description:"List ID to trigger on (for contact_added trigger). If not provided, triggers on any list."},tagName:{type:"string",description:"Tag name to trigger on (required for tag_added trigger)"},eventName:{type:"string",description:"Event name to trigger on (required for event_received, inactivity, and frequency triggers)"},inactiveDays:{type:"number",description:"Number of days of inactivity (required for inactivity trigger, must be >= 1)"},minCount:{type:"number",description:"Minimum event count (required for frequency trigger, must be >= 1)"},timeWindowDays:{type:"number",description:"Time window in days for frequency trigger (required for frequency trigger, must be >= 1)"},emailCount:{type:"number",description:"Number of emails in the sequence (default: 5)"},goal:{type:"string",description:"What this sequence should accomplish. Be specific to the app's actual features and user journey. Avoid generic goals that don't match the app's business model."}},required:["name","trigger","goal"]}},{name:"update_sequence",description:"Update an existing sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"},name:{type:"string",description:"Sequence name"},emails:{type:"array",description:"Updated email steps"}},required:["sequenceId"]}},{name:"enable_sequence",description:"Enable/activate a sequence. IMPORTANT: Only call this when the user EXPLICITLY asks to enable or activate a sequence. Never enable sequences automatically after creation - the user must review the content first.",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"disable_sequence",description:"Disable/pause a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"delete_sequence",description:"Delete a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"send_email",description:"Send a transactional email to a single recipient",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},to:{type:"string",description:"Recipient email address"},subject:{type:"string",description:"Email subject (required if not using templateId)"},html:{type:"string",description:"Email HTML content (required if not using templateId)"},templateId:{type:"string",description:"Template ID to use (alternative to html)"},variables:{type:"object",description:"Variables for template personalization"}},required:["to"]}},{name:"get_stats",description:"Get overview statistics for a time period",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},period:{type:"string",description:"Time period: 7d, 30d, or 90d (default: 7d)"}}}},{name:"get_campaign_stats",description:"Get detailed statistics for a campaign",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},campaignId:{type:"string",description:"Campaign ID"}},required:["campaignId"]}},{name:"get_sequence_stats",description:"Get statistics for a sequence",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},sequenceId:{type:"string",description:"Sequence ID"}},required:["sequenceId"]}},{name:"get_subscriber_activity",description:"Get activity timeline for a subscriber",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},email:{type:"string",description:"Subscriber email address"}},required:["email"]}},{name:"generate_email",description:"Generate email HTML content from a prompt",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},prompt:{type:"string",description:"Description of the email to generate"},style:{type:"string",description:"Style: minimal, branded, promotional"},tone:{type:"string",description:"Tone: professional, casual, friendly"}},required:["prompt"]}},{name:"generate_sequence",description:"[DEPRECATED - Use create_sequence instead] Generate a multi-email sequence from a goal. Note: create_sequence now handles AI generation automatically.",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},goal:{type:"string",description:"Goal of the sequence (e.g., 'onboard new SaaS trial users')"},emailCount:{type:"number",description:"Number of emails in the sequence (default: 5)"},durationDays:{type:"number",description:"Total duration in days (default: 14)"}},required:["goal"]}},{name:"generate_subject_lines",description:"Generate A/B test subject line variants",inputSchema:{type:"object",properties:{companyId:{type:"string",description:"Company ID. If not provided, uses the currently selected company."},topic:{type:"string",description:"Topic or context for the subject lines"},count:{type:"number",description:"Number of variants to generate (default: 5)"}},required:["topic"]}}];async function i$(Q,X){try{let Y;switch(Q){case"get_account":{let W=await w("GET","/api/v1/account"),G=d$();Y={...W,selectedCompanyId:G??W.currentCompanyId};break}case"select_company":{let W=X.companyId,G=await w("GET","/api/v1/account"),J=G.companies?.find(($)=>$.id===W);if(!J)throw Error(`Company not found. Available companies: ${G.companies?.map(($)=>`${$.name} (${$.id})`).join(", ")??"none"}`);AX(W),Y={success:!0,message:`Switched to company: ${J.name}`,companyId:J.id,companyName:J.name};break}case"create_company":{let W=await w("POST","/api/v1/companies",{name:X.name,domain:X.domain});if(!W.success)throw Error("Failed to create company");let G=W.company.id,J=6,$=0,z=W.company.status;while(z==="processing"&&$<J){await new Promise((B)=>setTimeout(B,20000)),$++;let H=await w("GET",`/api/v1/companies/${G}`);if(H.success)z=H.company.status}AX(G);let K=await w("GET",`/api/v1/companies/${G}`);Y={success:!0,company:K.company,message:z==="processing"?"Company created but still processing. You can continue using it while processing completes.":`Company '${K.company.name}' created and ready to use.`,autoSelected:!0};break}case"get_company":{let W=X.companyId;Y=await w("GET",`/api/v1/companies/${W}`);break}case"create_api_key":{let W=X.companyId;Y=await w("POST","/api/v1/api-keys",{name:X.name},W);break}case"list_websites":{let W=X.companyId;Y=await w("GET","/api/v1/websites",void 0,W);break}case"add_website":{let W=X.companyId;Y=await w("POST","/api/v1/websites",{domain:X.domain},W);break}case"check_website":{let W=X.companyId;Y=await w("GET",`/api/v1/websites/${X.domain}`,void 0,W);break}case"get_integration_guide":Y=await w("POST","/api/v1/integration-guide",X);break;case"add_subscriber":{let W=X.companyId;Y=await w("POST","/api/v1/subscribers",X,W);break}case"update_subscriber":{let W=X.companyId;Y=await w("PUT",`/api/v1/subscribers/${X.email}`,X,W);break}case"remove_subscriber":{let W=X.companyId;Y=await w("DELETE",`/api/v1/subscribers/${X.email}`,X,W);break}case"get_subscriber":{let W=X.companyId;Y=await w("GET",`/api/v1/subscribers/${X.email}`,void 0,W);break}case"search_subscribers":{let W=X.companyId,G=new URLSearchParams;if(X.query)G.set("query",String(X.query));if(X.tags)G.set("tags",X.tags.join(","));if(X.segmentId)G.set("segmentId",String(X.segmentId));if(X.limit)G.set("limit",String(X.limit));Y=await w("GET",`/api/v1/subscribers?${G}`,void 0,W);break}case"list_tags":{let W=X.companyId;Y=await w("GET","/api/v1/tags",void 0,W);break}case"list_lists":{let W=X.companyId;Y=await w("GET","/api/v1/lists",void 0,W);break}case"create_list":{let W=X.companyId;Y=await w("POST","/api/v1/lists",X,W);break}case"list_segments":{let W=X.companyId;Y=await w("GET","/api/v1/segments",void 0,W);break}case"create_segment":{let W=X.companyId;Y=await w("POST","/api/v1/segments",X,W);break}case"get_segment_count":{let W=X.companyId;Y=await w("GET",`/api/v1/segments/${X.segmentId}/count`,void 0,W);break}case"list_templates":{let W=X.companyId;Y=await w("GET","/api/v1/templates",void 0,W);break}case"get_template":{let W=X.companyId;Y=await w("GET",`/api/v1/templates/${X.templateId}`,void 0,W);break}case"create_template":{let W=X.companyId;Y=await w("POST","/api/v1/templates",X,W);break}case"update_template":{let W=X.companyId;Y=await w("PUT",`/api/v1/templates/${X.templateId}`,X,W);break}case"delete_template":{let W=X.companyId;Y=await w("DELETE",`/api/v1/templates/${X.templateId}`,void 0,W);break}case"list_campaigns":{let W=X.companyId,G=new URLSearchParams;if(X.status)G.set("status",String(X.status));Y=await w("GET",`/api/v1/campaigns?${G}`,void 0,W);break}case"get_campaign":{let W=X.companyId;Y=await w("GET",`/api/v1/campaigns/${X.campaignId}`,void 0,W);break}case"create_campaign":{let W=X.companyId;Y=await w("POST","/api/v1/campaigns",X,W);break}case"update_campaign":{let W=X.companyId;Y=await w("PUT",`/api/v1/campaigns/${X.campaignId}`,X,W);break}case"send_test_email":{let W=X.companyId;Y=await w("POST",`/api/v1/campaigns/${X.campaignId}/test`,{to:X.to},W);break}case"list_sequences":{let W=X.companyId;Y=await w("GET","/api/v1/sequences",void 0,W);break}case"get_sequence":{let W=X.companyId;Y=await w("GET",`/api/v1/sequences/${X.sequenceId}`,void 0,W);break}case"create_sequence":{let W=X.companyId,G=await w("POST","/api/v1/sequences",X,W);if(!G.success){Y=G;break}let J=G.sequence.id,$=6,z=0,K="pending";while(K!=="complete"&&z<$){await new Promise((A)=>setTimeout(A,20000)),z++;let B=await w("GET",`/api/v1/sequences/${J}`,void 0,W);if(B.success)K=B.sequence.enrichmentStatus}let H=await w("GET",`/api/v1/sequences/${J}`,void 0,W);if(H.success)Y={success:!0,sequence:H.sequence,message:H.sequence.enrichmentStatus==="complete"?`Sequence "${H.sequence.name}" created with ${H.sequence.emailCount} AI-generated emails. The sequence is ready to review and enable.`:`Sequence "${H.sequence.name}" created. Email enrichment is still in progress (${H.sequence.enrichedCount}/${H.sequence.emailCount} emails generated). You can check status with get_sequence.`};else Y=H;break}case"update_sequence":{let W=X.companyId;Y=await w("PUT",`/api/v1/sequences/${X.sequenceId}`,X,W);break}case"enable_sequence":{let W=X.companyId;Y=await w("POST",`/api/v1/sequences/${X.sequenceId}/enable`,void 0,W);break}case"disable_sequence":{let W=X.companyId;Y=await w("POST",`/api/v1/sequences/${X.sequenceId}/disable`,void 0,W);break}case"delete_sequence":{let W=X.companyId;Y=await w("DELETE",`/api/v1/sequences/${X.sequenceId}`,void 0,W);break}case"send_email":{let W=X.companyId;Y=await w("POST","/api/v1/transactional/send",X,W);break}case"get_stats":{let W=X.companyId,G=X.period??"7d";Y=await w("GET",`/api/v1/stats?period=${G}`,void 0,W);break}case"get_campaign_stats":{let W=X.companyId;Y=await w("GET",`/api/v1/campaigns/${X.campaignId}/stats`,void 0,W);break}case"get_sequence_stats":{let W=X.companyId;Y=await w("GET",`/api/v1/sequences/${X.sequenceId}/stats`,void 0,W);break}case"get_subscriber_activity":{let W=X.companyId;Y=await w("GET",`/api/v1/subscribers/${X.email}/activity`,void 0,W);break}case"generate_email":{let W=X.companyId;Y=await w("POST","/api/v1/generate/email",X,W);break}case"generate_sequence":{let W=X.companyId;Y=await w("POST","/api/v1/generate/sequence",X,W);break}case"generate_subject_lines":{let W=X.companyId;Y=await w("POST","/api/v1/generate/subjects",X,W);break}default:throw Error(`Unknown tool: ${Q}`)}return{content:[{type:"text",text:JSON.stringify(Y,null,2)}]}}catch(Y){return{content:[{type:"text",text:`Error: ${Y instanceof Error?Y.message:"Unknown error"}`}]}}}var PV=process.env.SEQUENZY_API_URL??"https://api.sequenzy.com",r$=process.env.SEQUENZY_API_KEY,FX=null;if(!r$)console.error("Error: SEQUENZY_API_KEY environment variable is required"),console.error("Run `npx @sequenzy/setup` to configure your API key."),process.exit(1);function d$(){return FX}function AX(Q){FX=Q}var E6=new HX({name:"sequenzy",version:"0.0.1"},{capabilities:{tools:{},resources:{}}});async function w(Q,X,Y,W){let G={"Content-Type":"application/json",Authorization:`Bearer ${r$}`},J=W??FX;if(J)G["x-company-id"]=J;let $=await fetch(`${PV}${X}`,{method:Q,headers:G,body:Y?JSON.stringify(Y):void 0});if(!$.ok){let z=await $.text();throw Error(`API error: ${$.status} - ${z}`)}return $.json()}E6.setRequestHandler(o9,async()=>{return{tools:p$}});E6.setRequestHandler(Q6,async(Q)=>{let{name:X,arguments:Y}=Q.params;return i$(X,Y??{})});E6.setRequestHandler(l9,async()=>{return{resources:l$}});E6.setRequestHandler(p9,async(Q)=>{let{uri:X}=Q.params;return c$(X)});async function bV(){let Q=new BX;await E6.connect(Q),console.error("Sequenzy MCP server running on stdio")}bV().catch((Q)=>{console.error("Fatal error:",Q),process.exit(1)});export{AX as setSelectedCompanyId,d$ as getSelectedCompanyId,w as apiRequest};
|