Без рубрики

Створюємо MCP-сервер для WordPress із підтримкою WPML на Python

Вступ

Якщо ви хочете керувати своїм WordPress-сайтом через зовнішні інструменти, наприклад Claude, зручним способом буде використання MCP-сервера. У цій статті ми розберемо, як створити такий сервер на Python із підтримкою WPML для багатомовності.

1. Архітектура сервера

Ми використовуємо бібліотеку FastMCP для реалізації MCP-сервера. Сервер уміє:

  • Отримувати список записів.
  • Отримувати один запис за ID.
  • Створювати записи.
  • Оновлювати записи.
  • Працювати з мовою запису через WPML (параметр lang).

Конфігурація підключення до WordPress зберігається в окремому файлі .ini, що дозволяє легко змінювати облікові дані та URL сайту.

2. Конфігураційний файл

Створіть файл wordpress.ini у тій самій папці, що й скрипт MCP:

[wordpress]
url = https://example.com
user = your_username
app_password = your_application_password

Де взяти пароль: цей пароль потрібно створити на сайті, зайшовши до профілю користувача й вибравши опцію створення пароля застосунку.

3. Основний код MCP-сервера

import os
import configparser
import requests
from typing import Optional, Dict
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("WordPress-MCP-Server")

# --- завантаження конфігурації ---
config = configparser.ConfigParser()
config_path = os.path.join(os.path.dirname(__file__), 'wordpress.ini')
config.read(config_path)

WP_URL = config['wordpress']['url']
WP_USER = config['wordpress']['user']
WP_APP_PASSWORD = config['wordpress']['app_password']
auth = (WP_USER, WP_APP_PASSWORD)

# --- допоміжна функція ---
def wp_request(method: str, endpoint: str, data: Optional[Dict] = None, lang: Optional[str] = None):
    url = f"{WP_URL.rstrip('/')}/wp-json/wp/v2/{endpoint.lstrip('/')}"
    params = {}
    if lang:
        params['lang'] = lang  # параметр мови WPML
    resp = requests.request(method, url, auth=auth, json=data, params=params)
    resp.raise_for_status()
    return resp.json()

# --- інструменти MCP ---
@mcp.tool()
def list_posts(status: str = "publish", per_page: int = 10, lang: Optional[str] = None):
    """Повернути список записів указаною мовою"""
    return wp_request('GET', f'posts?status={status}&per_page={per_page}', lang=lang)

@mcp.tool()
def get_post(post_id: int, lang: Optional[str] = None):
    """Повернути один запис за ID указаною мовою"""
    return wp_request('GET', f'posts/{post_id}', lang=lang)

@mcp.tool()
def create_post(title: str, content: str, status: str = "draft", lang: Optional[str] = None):
    """Створити новий запис указаною мовою"""
    endpoint = 'posts'
    if lang:
        endpoint += f"?lang={lang}"
    data = {"title": title, "content": content, "status": status}
    return wp_request('POST', endpoint, data)

@mcp.tool()
def update_post(post_id: int, title: Optional[str] = None, content: Optional[str] = None,
                status: Optional[str] = None, lang: Optional[str] = None):
    """Оновити наявний запис указаною мовою"""
    data = {}
    if title is not None:
        data['title'] = title
    if content is not None:
        data['content'] = content
    if status is not None:
        data['status'] = status
    if not data:
        return {"error": "No data to update"}
    endpoint = f'posts/{post_id}'
    if lang:
        endpoint += f"?lang={lang}"
    return wp_request('POST', endpoint, data)

if __name__ == "__main__":
    print("WordPress MCP server running with WPML language support...")
    mcp.run()

4. Використання MCP-сервера

Приклади викликів функцій через MCP:

Отримати записи французькою:

list_posts(lang="fr")

Отримати конкретний запис німецькою:

get_post(123, lang="de")

Створити запис іспанською:

create_post("Hola mundo", "Contenido de prueba", status="publish", lang="es")

Оновити запис англійською:

update_post(456, title="Updated title", lang="en")

WPML створює окремі записи для кожної мови. Цей MCP уміє працювати з мовою через параметр lang, але автоматичне зв’язування перекладів між мовами тут неможливе без додаткових розширень.

5. Висновок

За допомогою такого MCP-сервера ви можете інтегрувати WordPress із зовнішніми інструментами й керувати контентом різними мовами. Структура сервера проста, безпечна та розширювана: можна додавати додаткові функції, наприклад роботу з категоріями, тегами або медіафайлами.

Якщо хочеш, можна додатково зробити конфіг із мовою за замовчуванням, щоб не передавати lang у кожному виклику, і це ще більше спростить роботу з багатомовним контентом.

Залишити коментар

Вашу електронну адресу не буде оприлюднено. Обов’язкові поля позначено *