@iflow-mcp/claudeus-wp-mcp
Version:
The most comprehensive WordPress MCP server - 145 production-ready tools for complete WordPress management with AI
100 lines • 3.22 kB
JavaScript
import axios from 'axios';
import { createPaginationMeta } from '../types/index.js';
export class BaseApiClient {
client;
_site;
constructor(site) {
this._site = site;
this.client = axios.create({
baseURL: `${site.url}/wp-json/wp/v2`,
auth: site.authType === 'basic' ? {
username: site.username,
password: site.auth
} : undefined,
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
...(site.authType === 'jwt' ? { 'Authorization': `Bearer ${site.auth}` } : {})
}
});
// Add response interceptor for better error handling
this.client.interceptors.response.use(response => response, error => {
if (axios.isAxiosError(error)) {
const axiosError = error;
const errorMessage = axiosError.response?.data?.message || axiosError.message;
const errorCode = axiosError.response?.status;
throw new Error(`API Error (${errorCode}): ${errorMessage}`);
}
throw error;
});
}
get site() {
return this._site;
}
handleError(error) {
if (error.response?.data?.message) {
throw new Error(`API Error: ${error.response.data.message}`);
}
else if (error.response?.status) {
throw new Error(`HTTP Error ${error.response.status}: ${error.message}`);
}
else {
throw new Error(`Network Error: ${error.message}`);
}
}
async get(endpoint, params) {
try {
const response = await this.client.get(endpoint, { params });
return response.data;
}
catch (error) {
this.handleError(error);
}
}
/**
* GET request with pagination metadata
* Extracts X-WP-Total and X-WP-TotalPages headers
*/
async getPaginated(endpoint, params) {
try {
const response = await this.client.get(endpoint, { params });
// Extract pagination metadata from headers
const pagination = createPaginationMeta(response.headers, params?.page || 1, params?.per_page || 10);
return {
data: response.data,
pagination
};
}
catch (error) {
this.handleError(error);
}
}
async post(endpoint, data) {
try {
const response = await this.client.post(endpoint, data);
return response.data;
}
catch (error) {
this.handleError(error);
}
}
async put(endpoint, data) {
try {
const response = await this.client.put(endpoint, data);
return response.data;
}
catch (error) {
this.handleError(error);
}
}
async delete(endpoint) {
try {
const response = await this.client.delete(endpoint);
return response.data;
}
catch (error) {
this.handleError(error);
}
}
}
//# sourceMappingURL=base-client.js.map