mcp-mautic-server
Version:
MCP server for Mautic marketing automation platform integration
208 lines (207 loc) • 8.16 kB
JavaScript
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',
});
}
}