// WordPress MCP Tools
import { z } from 'zod';
import { WordPressService } from '../services/wordpress/wordpress-service.js';
import { logger } from '../utils/logger.js';
export function createWordPressTools(wpService: WordPressService) {
const tools: any[] = [];
// ========== POSTS TOOLS ==========
tools.push({
name: 'get_posts',
description: 'Retrieve WordPress posts with optional filtering',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of posts to retrieve (default: 10)',
default: 10
},
status: {
type: 'string',
description: 'Post status (publish, draft, private, etc.)',
default: 'publish'
},
search: {
type: 'string',
description: 'Search term to filter posts'
},
author: {
type: 'number',
description: 'Filter by author ID'
}
}
},
handler: async (args: any) => {
const result = await wpService.posts.listPosts(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'get_post',
description: 'Get a specific WordPress post by ID',
inputSchema: {
type: 'object',
properties: {
id: {
type: 'number',
description: 'Post ID to retrieve'
}
},
required: ['id']
},
handler: async (args: any) => {
const result = await wpService.posts.getPost(args.id);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'create_post',
description: 'Create a new WordPress post',
inputSchema: {
type: 'object',
properties: {
title: {
type: 'string',
description: 'Post title'
},
content: {
type: 'string',
description: 'Post content (HTML)'
},
status: {
type: 'string',
description: 'Post status (draft, publish, private)',
default: 'draft'
},
excerpt: {
type: 'string',
description: 'Post excerpt'
},
categories: {
type: 'array',
items: { type: 'number' },
description: 'Array of category IDs'
},
tags: {
type: 'array',
items: { type: 'number' },
description: 'Array of tag IDs'
}
},
required: ['title', 'content']
},
handler: async (args: any) => {
const result = await wpService.posts.createPost(args);
return {
content: [{
type: 'text',
text: `Post created successfully with ID: ${result.id}`
}]
};
}
});
tools.push({
name: 'update_post',
description: 'Update an existing WordPress post',
inputSchema: {
type: 'object',
properties: {
id: {
type: 'number',
description: 'Post ID to update'
},
title: {
type: 'string',
description: 'Post title'
},
content: {
type: 'string',
description: 'Post content (HTML)'
},
status: {
type: 'string',
description: 'Post status'
},
excerpt: {
type: 'string',
description: 'Post excerpt'
}
},
required: ['id']
},
handler: async (args: any) => {
const result = await wpService.posts.updatePost(args);
return {
content: [{
type: 'text',
text: `Post ${args.id} updated successfully`
}]
};
}
});
// ========== PAGES TOOLS ==========
tools.push({
name: 'get_pages',
description: 'Retrieve WordPress pages',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of pages to retrieve (default: 10)',
default: 10
},
status: {
type: 'string',
description: 'Page status (publish, draft, private, etc.)',
default: 'publish'
}
}
},
handler: async (args: any) => {
const result = await wpService.pages.listPages(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'create_page',
description: 'Create a new WordPress page',
inputSchema: {
type: 'object',
properties: {
title: {
type: 'string',
description: 'Page title'
},
content: {
type: 'string',
description: 'Page content (HTML)',
default: ''
},
status: {
type: 'string',
description: 'Page status (draft, publish, private)',
default: 'draft'
},
parent: {
type: 'number',
description: 'Parent page ID'
}
},
required: ['title']
},
handler: async (args: any) => {
const result = await wpService.pages.createPage(args);
return {
content: [{
type: 'text',
text: `Page created successfully with ID: ${result.id}`
}]
};
}
});
tools.push({
name: 'update_page',
description: 'Update an existing WordPress page',
inputSchema: {
type: 'object',
properties: {
id: {
type: 'number',
description: 'Page ID to update'
},
title: {
type: 'string',
description: 'Page title'
},
content: {
type: 'string',
description: 'Page content (HTML)'
},
status: {
type: 'string',
description: 'Page status'
}
},
required: ['id']
},
handler: async (args: any) => {
const result = await wpService.pages.updatePage(args);
return {
content: [{
type: 'text',
text: `Page ${args.id} updated successfully`
}]
};
}
});
// ========== MEDIA TOOLS ==========
tools.push({
name: 'get_media',
description: 'Get WordPress media library items',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of media items to retrieve (default: 10)',
default: 10
},
media_type: {
type: 'string',
description: 'Filter by media type (image, video, audio)'
}
}
},
handler: async (args: any) => {
const result = await wpService.media.getMedia(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'upload_media',
description: 'Upload media file to WordPress',
inputSchema: {
type: 'object',
properties: {
file_path: {
type: 'string',
description: 'Path to the file to upload'
},
title: {
type: 'string',
description: 'Media title'
},
alt_text: {
type: 'string',
description: 'Alternative text for images'
}
},
required: ['file_path']
},
handler: async (args: any) => {
const result = await wpService.media.uploadMedia(args.file_path, {
title: args.title,
alt_text: args.alt_text
});
return {
content: [{
type: 'text',
text: `Media uploaded successfully. ID: ${result.id}, URL: ${result.source_url}`
}]
};
}
});
tools.push({
name: 'list_all_content',
description: 'List all posts and pages with their IDs and Elementor status',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of items per type (default: 50)',
default: 50
},
include_all_statuses: {
type: 'boolean',
description: 'Include draft, private content (default: false)',
default: false
}
}
},
handler: async (args: any) => {
const result = await wpService.pages.listAllContent(
args.per_page || 50,
args.include_all_statuses || false
);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
// ========== USER MANAGEMENT ==========
tools.push({
name: 'get_users',
description: 'Get WordPress users',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of users (default: 10)',
default: 10
},
roles: {
type: 'array',
items: { type: 'string' },
description: 'Filter by user roles'
}
}
},
handler: async (args: any) => {
const result = await wpService.users.listUsers(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'create_user',
description: 'Create a new WordPress user',
inputSchema: {
type: 'object',
properties: {
username: {
type: 'string',
description: 'Username'
},
email: {
type: 'string',
description: 'Email address'
},
password: {
type: 'string',
description: 'Password'
},
roles: {
type: 'array',
items: { type: 'string' },
description: 'User roles'
}
},
required: ['username', 'email', 'password']
},
handler: async (args: any) => {
const result = await wpService.users.createUser(args);
return {
content: [{
type: 'text',
text: `User created successfully with ID: ${result.id}`
}]
};
}
});
// ========== TAXONOMY TOOLS ==========
tools.push({
name: 'get_categories',
description: 'Get WordPress categories',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of categories (default: 10)',
default: 10
}
}
},
handler: async (args: any) => {
const result = await wpService.taxonomy.listCategories(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'create_category',
description: 'Create a new category',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Category name'
},
description: {
type: 'string',
description: 'Category description'
},
parent: {
type: 'number',
description: 'Parent category ID'
}
},
required: ['name']
},
handler: async (args: any) => {
const result = await wpService.taxonomy.createCategory(args);
return {
content: [{
type: 'text',
text: `Category created successfully with ID: ${result.id}`
}]
};
}
});
tools.push({
name: 'get_tags',
description: 'Get WordPress tags',
inputSchema: {
type: 'object',
properties: {
per_page: {
type: 'number',
description: 'Number of tags (default: 10)',
default: 10
}
}
},
handler: async (args: any) => {
const result = await wpService.taxonomy.listTags(args);
return {
content: [{
type: 'text',
text: JSON.stringify(result, null, 2)
}]
};
}
});
tools.push({
name: 'create_tag',
description: 'Create a new tag',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Tag name'
},
description: {
type: 'string',
description: 'Tag description'
}
},
required: ['name']
},
handler: async (args: any) => {
const result = await wpService.taxonomy.createTag(args);
return {
content: [{
type: 'text',
text: `Tag created successfully with ID: ${result.id}`
}]
};
}
});
return tools;
}