UNPKG

mcp-mautic-server

Version:

MCP server for Mautic marketing automation platform integration

208 lines (207 loc) 8.16 kB
import { MauticAuth } from './auth.js'; export class MauticClient { auth; config; constructor(config) { this.config = config; this.auth = new MauticAuth(config); } async makeRequest(endpoint, options = {}) { const token = await this.auth.getAccessToken(); const url = `${this.config.url}/api${endpoint}`; const response = await fetch(url, { ...options, headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', ...options.headers, }, }); const data = await response.json(); if (!response.ok) { const error = data; throw new Error(`API Error ${response.status}: ${error.error?.message || 'Unknown error'}`); } return data; } async listContacts(params = {}) { const searchParams = new URLSearchParams(); if (params.limit) searchParams.set('limit', params.limit.toString()); if (params.search) searchParams.set('search', params.search); if (params.orderBy) searchParams.set('orderBy', params.orderBy); if (params.orderByDir) searchParams.set('orderByDir', params.orderByDir); if (params.start) searchParams.set('start', params.start.toString()); if (params.minimal !== undefined) searchParams.set('minimal', params.minimal.toString()); const endpoint = `/contacts${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } async createContact(contact) { return this.makeRequest('/contacts/new', { method: 'POST', body: JSON.stringify(contact), }); } async getContact(id) { return this.makeRequest(`/contacts/${id}`); } async updateContact(id, contact) { return this.makeRequest(`/contacts/${id}/edit`, { method: 'PATCH', body: JSON.stringify(contact), }); } async deleteContact(id) { return this.makeRequest(`/contacts/${id}/delete`, { method: 'DELETE', }); } // Statistics endpoints async getStats(params = {}) { const searchParams = new URLSearchParams(); if (params.start) searchParams.set('start', params.start.toString()); if (params.limit) searchParams.set('limit', params.limit.toString()); if (params.order) { params.order.forEach((order, index) => { searchParams.set(`order[${index}][col]`, order.col); searchParams.set(`order[${index}][dir]`, order.dir); }); } if (params.where) { params.where.forEach((where, index) => { searchParams.set(`where[${index}][col]`, where.col); searchParams.set(`where[${index}][expr]`, where.expr); searchParams.set(`where[${index}][val]`, where.val.toString()); }); } const table = params.table || ''; const endpoint = `/stats${table ? '/' + table : ''}${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } async getData(params = {}) { const searchParams = new URLSearchParams(); if (params.dateFrom) searchParams.set('dateFrom', params.dateFrom); if (params.dateTo) searchParams.set('dateTo', params.dateTo); if (params.timeUnit) searchParams.set('timeUnit', params.timeUnit); if (params.filter?.companyId) searchParams.set('filter[companyId]', params.filter.companyId.toString()); if (params.filter?.campaignId) searchParams.set('filter[campaignId]', params.filter.campaignId.toString()); if (params.filter?.segmentId) searchParams.set('filter[segmentId]', params.filter.segmentId.toString()); const type = params.type || ''; const endpoint = `/data${type ? '/' + type : ''}${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } async getContactActivity(contactId, params = {}) { const searchParams = new URLSearchParams(); if (params.search) searchParams.set('search', params.search); if (params.includeEvents) searchParams.set('includeEvents', params.includeEvents.join(',')); if (params.excludeEvents) searchParams.set('excludeEvents', params.excludeEvents.join(',')); const endpoint = `/contacts/${contactId}/activity${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } // Asset methods async listAssets(params = {}) { const searchParams = new URLSearchParams(); if (params.limit) searchParams.set('limit', params.limit.toString()); if (params.search) searchParams.set('search', params.search); if (params.orderBy) searchParams.set('orderBy', params.orderBy); if (params.orderByDir) searchParams.set('orderByDir', params.orderByDir); if (params.start) searchParams.set('start', params.start.toString()); if (params.publishedOnly) searchParams.set('publishedOnly', 'true'); if (params.minimal !== undefined) searchParams.set('minimal', params.minimal.toString()); const endpoint = `/assets${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } async getAsset(id) { return this.makeRequest(`/assets/${id}`); } async createAsset(asset) { return this.makeRequest('/assets/new', { method: 'POST', body: JSON.stringify(asset), }); } async updateAsset(id, asset) { return this.makeRequest(`/assets/${id}/edit`, { method: 'PATCH', body: JSON.stringify(asset), }); } async deleteAsset(id) { return this.makeRequest(`/assets/${id}/delete`, { method: 'DELETE', }); } // Segment methods async listSegments(params = {}) { const searchParams = new URLSearchParams(); if (params.limit) searchParams.set('limit', params.limit.toString()); if (params.search) searchParams.set('search', params.search); if (params.orderBy) searchParams.set('orderBy', params.orderBy); if (params.orderByDir) searchParams.set('orderByDir', params.orderByDir); if (params.start) searchParams.set('start', params.start.toString()); if (params.publishedOnly) searchParams.set('publishedOnly', 'true'); if (params.minimal !== undefined) searchParams.set('minimal', params.minimal.toString()); const endpoint = `/segments${searchParams.toString() ? '?' + searchParams.toString() : ''}`; return this.makeRequest(endpoint); } async getSegment(id) { return this.makeRequest(`/segments/${id}`); } async createSegment(segment) { return this.makeRequest('/segments/new', { method: 'POST', body: JSON.stringify(segment), }); } async updateSegment(id, segment) { return this.makeRequest(`/segments/${id}/edit`, { method: 'PATCH', body: JSON.stringify(segment), }); } async deleteSegment(id) { return this.makeRequest(`/segments/${id}/delete`, { method: 'DELETE', }); } async addContactToSegment(segmentId, contactId) { return this.makeRequest(`/segments/${segmentId}/contact/${contactId}/add`, { method: 'POST', }); } async removeContactFromSegment(segmentId, contactId) { return this.makeRequest(`/segments/${segmentId}/contact/${contactId}/remove`, { method: 'POST', }); } }