Developer Documentation

MCP Integration Guide

VM Advanced WooCommerce Sales includes native support for the Model Context Protocol (MCP), allowing MCP clients to interact with the plugin programmatically.

What is MCP?

The Model Context Protocol (MCP) is a protocol for connecting AI assistants and other tools to external data sources and capabilities. Our plugin exposes its functionality through MCP-compatible REST API endpoints.

Enabling MCP

MCP integration is automatically enabled when the plugin is activated. The MCP server registers REST API endpoints at:

/wp-json/vm-woo-advanced-sales/v1/

Authentication

All MCP endpoints require:

  • WordPress authentication (logged-in user)
  • manage_woocommerce capability

Available Endpoints

List All Sales

GET /wp-json/vm-woo-advanced-sales/v1/sales

Returns an array of all storewide sales.

Response:

[

  {

    “id”: 1,

    “title”: “Summer Sale”,

    “enabled”: true,

    “amount”: 15,

    “type”: “percentage”,

    “priority”: 1,

    …

  }

]

Get Single Sale

GET /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Returns details for a specific sale.

Create Sale

POST /wp-json/vm-woo-advanced-sales/v1/sales

Content-Type: application/json

{

  “title”: “New Sale”,

  “enabled”: true,

  “amount”: 20,

  “type”: “percentage”,

  “start_date”: “2024-06-01 00:00:00”,

  “end_date”: “2024-06-30 23:59:59”,

  “include_categories”: [5, 10],

  …

}

Update Sale

PUT /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Content-Type: application/json

{

  “amount”: 25,

  “enabled”: false,

  …

}

Delete Sale

DELETE /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Update Priority

POST /wp-json/vm-woo-advanced-sales/v1/sales/priority

Content-Type: application/json

{

  “sale_ids”: [3, 1, 2]

}

Reorders sales – first ID gets priority 1, second gets priority 2, etc.

Get License Status

GET /wp-json/vm-woo-advanced-sales/v1/license/status

Returns current license information.

Response Format

All endpoints return standard WordPress REST API responses:

Success:

{

  “id”: 1,

  “title”: “Sale Name”,

  …

}

Error:

{

    “code”: “not_found”,

    “message”: “Sale not found.”,

    “data”: {

        “status”: 404

    }

}

Field Reference

See API Reference for complete field documentation.

Usage Examples

Create a Sale via cURL

curl -X POST \

  https://yoursite.com/wp-json/vm-woo-advanced-sales/v1/sales \

  -H ‘Content-Type: application/json’ \

  -H ‘Authorization: Bearer YOUR_AUTH_TOKEN’ \

  -d ‘{

    “title”: “Black Friday”,

    “enabled”: true,

    “amount”: 30,

    “type”: “percentage”

  }’

List Sales via JavaScript

fetch(‘/wp-json/vm-woo-advanced-sales/v1/sales’, {

    headers: {

        ‘X-WP-Nonce’: wpApiSettings.nonce,

    },

})

    .then(response => response.json())

    .then(sales => console.log(sales));

MCP Tools Reference

For detailed information about available MCP tools, see MCP Tools Reference.

Developer Guide

For developers extending MCP functionality, see Developer MCP Guide.

MCP Tools Reference

Complete reference for all MCP tools available in VM Advanced WooCommerce Sales.

Overview

MCP tools allow MCP clients to interact with storewide sales programmatically. All tools require authentication and the manage_woocommerce capability.

Tools

list_sales

List all storewide sales.

Endpoint: GET /wp-json/vm-woo-advanced-sales/v1/sales

Description: Returns an array of all storewide sales ordered by priority.

Parameters: None

Response: Array of sale objects

Example:

const sales = await mcp.call(‘list_sales’);

get_sale

Get details of a specific sale.

Endpoint: GET /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Description: Returns detailed information about a single sale.

Parameters:

  • id (integer, required): Sale post ID

Response: Sale object

Example:

const sale = await mcp.call(‘get_sale’, { id: 1 });

create_sale

Create a new storewide sale.

Endpoint: POST /wp-json/vm-woo-advanced-sales/v1/sales

Description: Creates a new storewide sale with the provided data.

Parameters:

  • title (string, required): Sale name
  • enabled (boolean): Whether sale is enabled
  • override_mode (string): Override mode
  • amount (float): Discount amount
  • type (string): “percentage” or “fixed”
  • start_date (string): Start date (YYYY-MM-DD HH:MM:SS)
  • end_date (string): End date
  • priority (integer): Priority number
  • include_products (array): Array of product IDs
  • exclude_products (array): Array of product IDs
  • include_categories (array): Array of category IDs
  • exclude_categories (array): Array of category IDs
  • include_tags (array): Array of tag IDs
  • exclude_tags (array): Array of tag IDs
  • role_restrictions (array): Array of role slugs

Response: Created sale object

Example:

const sale = await mcp.call(‘create_sale’, {

  title: ‘Summer Sale’,

  enabled: true,

  amount: 20,

  type: ‘percentage’,

  include_categories: [5, 10]

});

update_sale

Update an existing sale.

Endpoint: PUT /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Description: Updates sale with provided data. Only include fields to update.

Parameters: Same as create_sale, plus:

  • id (integer, required): Sale post ID

Response: Updated sale object

Example:

const sale = await mcp.call(‘update_sale’, {

  id: 1,

  amount: 25,

  enabled: false

});

delete_sale

Delete a sale.

Endpoint: DELETE /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Description: Permanently deletes a sale.

Parameters:

  • id (integer, required): Sale post ID

Response: Success confirmation

Example:

await mcp.call(‘delete_sale’, { id: 1 });

update_priority

Update sale priorities.

Endpoint: POST /wp-json/vm-woo-advanced-sales/v1/sales/priority

Description: Reorders sales by priority. First ID gets priority 1, second gets 2, etc.

Parameters:

  • sale_ids (array, required): Array of sale IDs in desired order

Response: Object mapping sale IDs to new priorities

Example:

const result = await mcp.call(‘update_priority’, {

  sale_ids: [3, 1, 2]

});

// Result: { “3”: 1, “1”: 2, “2”: 3 }

get_license_status

Get license information.

Endpoint: GET /wp-json/vm-woo-advanced-sales/v1/license/status

Description: Returns current license status and data.

Parameters: None

Response: License status object

Example:

const license = await mcp.call(‘get_license_status’);

// Returns: { status: ‘valid’, valid: true, data: {…} }

Data Structures

Sale Object

interface Sale {

  id: number;

  title: string;

  enabled: boolean;

  override_mode: ‘do_not_override’ | ‘apply_both’ | ‘override’;

  amount: number;

  type: ‘percentage’ | ‘fixed’;

  start_date: string | null;

  end_date: string | null;

  priority: number;

  include_products: number[];

  exclude_products: number[];

  include_categories: number[];

  exclude_categories: number[];

  include_tags: number[];

  exclude_tags: number[];

  role_restrictions: string[];

  date_created: string;

  date_modified: string;

}

License Status Object

interface LicenseStatus {

  status: ‘valid’ | ‘invalid’ | ‘expired’ | ‘revoked’ | ‘error’;

  valid: boolean;

  data: {

    expires?: string;

    activations_left?: number;

    [key: string]: any;

  };

}

Error Handling

All tools return standard WordPress REST API error responses on failure:

interface ErrorResponse {

  code: string;

  message: string;

  data: {

    status: number;

  };

}

Usage Examples

Create a Sale for Specific Products

const sale = await mcp.call(‘create_sale’, {

  title: ‘Product Bundle Sale’,

  enabled: true,

  amount: 15,

  type: ‘percentage’,

  include_products: [10, 20, 30],

  override_mode: ‘override’

});

Temporarily Disable All Sales

const sales = await mcp.call(‘list_sales’);

for (const sale of sales) {

  await mcp.call(‘update_sale’, {

    id: sale.id,

    enabled: false

  });

}

Reorder Sales by Date

const sales = await mcp.call(‘list_sales’);

// Sort by start date

sales.sort((a, b) => new Date(a.start_date) – new Date(b.start_date));

// Update priorities

await mcp.call(‘update_priority’, {

  sale_ids: sales.map(s => s.id)

});

Authentication

MCP tools require:

  1. WordPress user authentication
  2. manage_woocommerce capability
  3. Valid nonce (for AJAX requests)

See MCP Integration Guide for authentication details.

API Reference

Complete reference for the VM Advanced WooCommerce Sales REST API and internal APIs.

REST API Endpoints

Base URL: /wp-json/vm-woo-advanced-sales/v1/

Authentication

All endpoints require:

  • WordPress user authentication
  • manage_woocommerce capability

Sales Endpoints

List Sales

GET /wp-json/vm-woo-advanced-sales/v1/sales

Returns all storewide sales.

Response:

[

  {

    “id”: 1,

    “title”: “Summer Sale”,

    “enabled”: true,

    “override_mode”: “override”,

    “amount”: “15.00”,

    “type”: “percentage”,

    “start_date”: “2024-06-01 00:00:00”,

    “end_date”: “2024-06-30 23:59:59”,

    “priority”: 1,

    “include_products”: [],

    “exclude_products”: [],

    “include_categories”: [5],

    “exclude_categories”: [],

    “include_tags”: [],

    “exclude_tags”: [],

    “role_restrictions”: [],

    “date_created”: “2024-05-15 10:30:00”,

    “date_modified”: “2024-05-20 14:20:00”

  }

]

Get Sale

GET /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Returns a single sale by ID.

Parameters:

  • id (required): Sale post ID

Response: Single sale object (same format as list)

Error Response (404):

{

  “code”: “not_found”,

  “message”: “Sale not found.”,

  “data”: {

    “status”: 404

  }

}

Create Sale

POST /wp-json/vm-woo-advanced-sales/v1/sales

Content-Type: application/json

Creates a new storewide sale.

Request Body:

{

  “title”: “New Sale”,

  “enabled”: true,

  “override_mode”: “override”,

  “amount”: 20,

  “type”: “percentage”,

  “start_date”: “2024-06-01 00:00:00”,

  “end_date”: “2024-06-30 23:59:59”,

  “priority”: 1,

  “include_products”: [10, 20],

  “exclude_products”: [5],

  “include_categories”: [3, 7],

  “exclude_categories”: [],

  “include_tags”: [2],

  “exclude_tags”: [],

  “role_restrictions”: [“customer”]

}

Fields:

  • title (string, required): Sale name
  • enabled (boolean): Whether sale is enabled (default: true)
  • override_mode (string): “do_not_override”, “apply_both”, or “override” (default: “do_not_override”)
  • amount (float): Discount amount
  • type (string): “percentage” or “fixed”
  • start_date (string): Start date in MySQL format (YYYY-MM-DD HH:MM:SS)
  • end_date (string): End date in MySQL format
  • priority (integer): Priority number (lower = higher priority)
  • include_products (array): Array of product IDs
  • exclude_products (array): Array of product IDs
  • include_categories (array): Array of category term IDs
  • exclude_categories (array): Array of category term IDs
  • include_tags (array): Array of tag term IDs
  • exclude_tags (array): Array of tag term IDs
  • role_restrictions (array): Array of WordPress role slugs

Response: Created sale object (201 status)

Update Sale

PUT /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Content-Type: application/json

Updates an existing sale. Same request body format as Create Sale.

Response: Updated sale object (200 status)

Delete Sale

DELETE /wp-json/vm-woo-advanced-sales/v1/sales/{id}

Deletes a sale.

Response (200):

{

  “deleted”: true

}

Update Priority

POST /wp-json/vm-woo-advanced-sales/v1/sales/priority

Content-Type: application/json

Updates sale priorities based on order.

Request Body:

{

  “sale_ids”: [3, 1, 2]

}

First ID gets priority 1, second gets priority 2, etc.

Response (200):

{

  “updated”: {

    “3”: 1,

    “1”: 2,

    “2”: 3

  }

}

License Endpoints

Get License Status

GET /wp-json/vm-woo-advanced-sales/v1/license/status

Returns current license information.

Response:

{

  “status”: “valid”,

  “valid”: true,

  “data”: {

    “expires”: “2025-12-31”,

    “activations_left”: 2

  }

}

Internal PHP API

Classes

VM_Woo_Advanced_Sales_License

License management class.

Methods:

  • get_license_key(): Get stored license key
  • get_license_status(): Get license status
  • is_license_valid(): Check if license is valid
  • activate_license( $key ): Activate license
  • deactivate_license(): Deactivate license
  • validate_license( $force = false ): Validate license

Example:

if ( VM_Woo_Advanced_Sales_License::is_license_valid() ) {

    // License is valid

}

VM_Woo_Advanced_Sales_Price_Handler

Price handling class.

Methods:

  • clear_cache(): Clear sale cache

Example:

// Clear cache after manual changes

VM_Woo_Advanced_Sales_Price_Handler::clear_cache();

VM_Woo_Advanced_Sales_Restrictions

Restriction checking class.

Methods:

  • sale_matches_restrictions( $sale_id, $product_id, $user_id = 0, $sale_meta = null ): Check if sale matches restrictions

Example:

if ( VM_Woo_Advanced_Sales_Restrictions::sale_matches_restrictions( $sale_id, $product_id, $user_id ) ) {

    // Sale applies to this product/user combination

}

Error Codes

  • not_found: Resource not found (404)
  • invalid_data: Invalid request data (400)
  • create_failed: Creation failed (500)
  • delete_failed: Deletion failed (500)
  • permission_denied: Insufficient permissions (403)

Rate Limiting

No rate limiting is currently enforced. Implement appropriate limits in production.

Versioning

Current API version: v1

Future versions will maintain backward compatibility when possible.

Hooks and Filters Reference

VM Advanced WooCommerce Sales provides several hooks and filters for developers to extend functionality.

Filters

vm_woo_advanced_sales_applicable_sale

Filter the applicable sale for a product before price calculation.

add_filter( ‘vm_woo_advanced_sales_applicable_sale’, function( $sale, $product, $user_id ) {

    // Modify $sale or return null to skip storewide sale

    return $sale;

}, 10, 3 );

Parameters:

  • $sale (WP_Post|null): The sale post object or null
  • $product (WC_Product): The product object
  • $user_id (int): Current user ID (0 for guests)

Return: WP_Post object or null

vm_woo_advanced_sales_calculated_price

Filter the calculated sale price.

add_filter( ‘vm_woo_advanced_sales_calculated_price’, function( $price, $regular_price, $sale, $product ) {

    // Modify the calculated price

    return $price;

}, 10, 4 );

Parameters:

  • $price (float): Calculated sale price
  • $regular_price (float): Original regular price
  • $sale (WP_Post): Sale post object
  • $product (WC_Product): Product object

Return: float (modified price)

vm_woo_advanced_sales_active_sales

Filter the list of active sales before processing.

add_filter( ‘vm_woo_advanced_sales_active_sales’, function( $sales, $args ) {

    // Modify $sales array

   return $sales;

}, 10, 2 );

Parameters:

  • $sales (array): Array of WP_Post objects
  • $args (array): Query arguments

Return: array of WP_Post objects

vm_woo_advanced_sales_restriction_check

Filter restriction check results.

add_filter( ‘vm_woo_advanced_sales_restriction_check’, function( $matches, $sale_id, $product_id, $user_id ) {

    // Override restriction check

    return $matches; // true or false

}, 10, 4 );

Parameters:

  • $matches (bool): Whether restrictions match
  • $sale_id (int): Sale post ID
  • $product_id (int): Product ID
  • $user_id (int): User ID

Return: bool

Actions

vm_woo_advanced_sales_before_price_calculation

Fires before calculating sale price.

add_action( ‘vm_woo_advanced_sales_before_price_calculation’, function( $product, $sale ) {

    // Do something before price calculation

}, 10, 2 );

Parameters:

  • $product (WC_Product): Product object
  • $sale (WP_Post): Sale post object

vm_woo_advanced_sales_after_price_calculation

Fires after calculating sale price.

add_action( ‘vm_woo_advanced_sales_after_price_calculation’, function( $product, $sale, $final_price ) {

    // Do something after price calculation

}, 10, 3 );

Parameters:

  • $product (WC_Product): Product object
  • $sale (WP_Post): Sale post object
  • $final_price (float): Final calculated price

vm_woo_advanced_sales_sale_created

Fires when a sale is created.

add_action( ‘vm_woo_advanced_sales_sale_created’, function( $sale_id, $sale_data ) {

    // Do something when sale is created

}, 10, 2 );

Parameters:

  • $sale_id (int): New sale post ID
  • $sale_data (array): Sale data array

vm_woo_advanced_sales_sale_updated

Fires when a sale is updated.

add_action( ‘vm_woo_advanced_sales_sale_updated’, function( $sale_id, $sale_data ) {

    // Do something when sale is updated

}, 10, 2 );

Parameters:

  • $sale_id (int): Updated sale post ID
  • $sale_data (array): Updated sale data array

vm_woo_advanced_sales_sale_deleted

Fires when a sale is deleted.

add_action( ‘vm_woo_advanced_sales_sale_deleted’, function( $sale_id ) {

    // Do something when sale is deleted

}, 10, 1 );

Parameters:

  • $sale_id (int): Deleted sale post ID

vm_woo_advanced_sales_priority_updated

Fires when sale priorities are updated.

add_action( ‘vm_woo_advanced_sales_priority_updated’, function( $sale_ids, $priorities ) {

    // Do something when priorities change

}, 10, 2 );

Parameters:

  • $sale_ids (array): Array of sale IDs
  • $priorities (array): Array of new priorities (sale_id => priority)

vm_woo_advanced_sales_cache_cleared

Fires when the sale cache is cleared.

add_action( ‘vm_woo_advanced_sales_cache_cleared’, function() {

    // Do something when cache is cleared

}, 10, 0 );

Example Usage

Add Custom Discount Logic

add_filter( ‘vm_woo_advanced_sales_calculated_price’, function( $price, $regular_price, $sale, $product ) {

    // Add $5 discount on top of existing sale for VIP customers

    if ( user_has_role( ‘vip_customer’ ) ) {

        $price = max( 0, $price – 5 );

    }

    return $price;

}, 10, 4 );

Log Sale Applications

add_action( ‘vm_woo_advanced_sales_after_price_calculation’, function( $product, $sale, $final_price ) {

    error_log( sprintf( 

        ‘Sale %d applied to product %d: %s -> %s’,

        $sale->ID,

        $product->get_id(),

        $product->get_regular_price(),

        $final_price

    ) );

}, 10, 3 );

Prevent Sale for Specific Products

add_filter( ‘vm_woo_advanced_sales_applicable_sale’, function( $sale, $product, $user_id ) {

    // Never apply sales to products with specific meta

    if ( $product->get_meta( ‘no_storewide_sales’ ) === ‘yes’ ) {

        return null;

    }

    return $sale;

}, 10, 3 );

Best Practices

  1. Always return expected types: Filters must return the correct data type
  2. Check for null: Sale may be null if no sale applies
  3. Performance: Keep hook callbacks efficient
  4. Documentation: Document custom hooks in your code
  5. Testing: Test hooks thoroughly before production use

Deprecated Hooks

None currently. Future deprecations will be announced in changelog.

Developer Guide: Extending MCP Support

This guide is for developers who want to extend or customize the MCP integration in VM Advanced WooCommerce Sales.

Architecture

The MCP integration consists of two main classes:

  1. VM_Woo_Advanced_Sales_MCP: Registers REST API routes and handles authentication
  2. VM_Woo_Advanced_Sales_MCP_Tools: Implements the actual tool handlers

Adding Custom MCP Tools

Step 1: Register the Route

In VM_Woo_Advanced_Sales_MCP::register_mcp_routes():

register_rest_route(

    ‘vm-woo-advanced-sales/v1’,

    ‘/custom-endpoint’,

    array(

        ‘methods’             => ‘GET’,

        ‘callback’            => array( ‘VM_Woo_Advanced_Sales_MCP_Tools’, ‘custom_tool’ ),

        ‘permission_callback’ => array( ‘VM_Woo_Advanced_Sales_MCP’, ‘check_permissions’ ),

    )

);

Step 2: Implement the Tool Handler

In VM_Woo_Advanced_Sales_MCP_Tools:

public static function custom_tool( $request ) {

    // Get parameters

    $param = $request->get_param( ‘param_name’ );

    // Perform action

    $result = do_something( $param );

    // Return response

    return new WP_REST_Response( $result, 200 );

}

Step 3: Handle Errors

Return WP_Error for failures:

if ( ! $result ) {

    return new WP_Error(

        ‘error_code’,

        __( ‘Error message.’, ‘vm-woo-advanced-sales’ ),

        array( ‘status’ => 400 )

    );

}

Extending Existing Tools

Filter Tool Responses

Use filters to modify tool responses:

add_filter( ‘rest_prepare_vm_storewide_sale’, function( $response, $post, $request ) {

    $data = $response->get_data();

    $data[‘custom_field’] = get_post_meta( $post->ID, ‘_custom_field’, true );

    $response->set_data( $data );

    return $response;

}, 10, 3 );

Override Tool Behavior

Replace tool handlers using filters or by extending the class:

class Custom_MCP_Tools extends VM_Woo_Advanced_Sales_MCP_Tools {

    public static function create_sale( $request ) {

        // Custom implementation

        // Call parent for default behavior

        $response = parent::create_sale( $request );

        // Modify response

        return $response;

    }

}

Custom Authentication

Override permission checking:

add_filter( ‘vm_woo_advanced_sales_mcp_permissions’, function( $has_permission, $request ) {

    // Custom permission logic

    return $has_permission && custom_check();

}, 10, 2 );

Error Handling Best Practices

  1. Use Appropriate HTTP Status Codes:
    • 200: Success
    • 201: Created
    • 400: Bad Request
    • 403: Forbidden
    • 404: Not Found
    • 500: Server Error
  2. Provide Helpful Error Messages:


return new WP_Error(

 ‘invalid_data’,

 __( ‘Please provide a valid sale amount between 0 and 100.’, ‘vm-woo-advanced-sales’ ),

 array( ‘status’ => 400 )

);


  1. Include Error Data:


return new WP_Error(

 ‘validation_failed’,

 __( ‘Validation failed.’, ‘vm-woo-advanced-sales’ ),

 array(

     ‘status’ => 400,

     ‘errors’ => $validation_errors

 )

);

Testing MCP Tools

Manual Testing with cURL

# List sales

curl -X GET \

  ‘https://yoursite.com/wp-json/vm-woo-advanced-sales/v1/sales’ \

  -H ‘Authorization: Bearer YOUR_TOKEN’

# Create sale

curl -X POST \

  ‘https://yoursite.com/wp-json/vm-woo-advanced-sales/v1/sales’ \

  -H ‘Content-Type: application/json’ \

  -H ‘Authorization: Bearer YOUR_TOKEN’ \

  -d ‘{“title”:”Test Sale”,”amount”:10,”type”:”percentage”}’

Unit Testing

class Test_MCP_Tools extends WP_UnitTestCase {

    public function test_list_sales() {

        $request = new WP_REST_Request( ‘GET’, ‘/vm-woo-advanced-sales/v1/sales’ );

        $response = VM_Woo_Advanced_Sales_MCP_Tools::list_sales( $request );

        $this->assertInstanceOf( ‘WP_REST_Response’, $response );

        $this->assertEquals( 200, $response->get_status() );

    }

}

Performance Considerations

  1. Cache Responses When Appropriate: Use WordPress object cache for expensive operations
  2. Limit Response Size: Use pagination for large datasets
  3. Optimize Queries: Use efficient database queries
  4. Batch Operations: Support bulk operations when possible

Security Considerations

  1. Always Validate Input: Sanitize and validate all input data
  2. Check Permissions: Verify user capabilities
  3. Use Nonces: Implement nonce verification for state-changing operations
  4. Rate Limiting: Consider implementing rate limiting for production
  5. Data Sanitization: Escape all output

Hooks for MCP Integration

vm_woo_advanced_sales_mcp_tool_response

Filter MCP tool responses before sending:

add_filter( ‘vm_woo_advanced_sales_mcp_tool_response’, function( $response, $tool_name, $request ) {

    // Modify response

    return $response;

}, 10, 3 );

vm_woo_advanced_sales_mcp_tool_error

Filter error responses:

add_filter( ‘vm_woo_advanced_sales_mcp_tool_error’, function( $error, $tool_name, $request ) {

    // Log or modify error

    return $error;

}, 10, 3 );

Best Practices

  1. Follow REST API Standards: Use proper HTTP methods and status codes
  2. Document Your Tools: Add PHPDoc comments explaining parameters and responses
  3. Version Your API: Consider versioning for breaking changes
  4. Test Thoroughly: Test all edge cases and error conditions
  5. Keep It Simple: Don’t overcomplicate tool implementations

Example: Custom Reporting Tool

class Custom_MCP_Tools extends VM_Woo_Advanced_Sales_MCP_Tools {

    public static function get_sale_stats( $request ) {

        $sale_id = absint( $request[‘id’] );

        // Get stats

        $stats = array(

            ‘applications’ => get_sale_application_count( $sale_id ),

            ‘total_discount’ => get_total_discount_applied( $sale_id ),

            ‘affected_products’ => get_affected_product_count( $sale_id ),

        );

        return new WP_REST_Response( $stats, 200 );

    }

}

Register in MCP class:

register_rest_route(

    ‘vm-woo-advanced-sales/v1’,

    ‘/sales/(?P<id>\d+)/stats’,

    array(

        ‘methods’             => ‘GET’,

        ‘callback’            => array( ‘Custom_MCP_Tools’, ‘get_sale_stats’ ),

        ‘permission_callback’ => array( ‘VM_Woo_Advanced_Sales_MCP’, ‘check_permissions’ ),

    )

);

Resources

Previous Article
User Documentation
Still haven’t found what you’re looking for?

Let us know and we’ll do our best to help out!

sit back and relax

We have monthly site maintenance options to ensure that your website is running smoothly.

Website development post-launch support and resources
Secret Link
SHARE YOUR CART