Skip to main content
Glama
pages.mjs4.1 kB
import { z } from "zod"; import { stringOrNumber, stringOrRaw, yoastMeta } from "../schemas.mjs"; import { toolResult } from "../toolResult.mjs"; import { isWpError, wpErrorToolResult } from "../wpErrors.mjs"; import { buildQuery, buildYoastMeta } from "../wpUtils.mjs"; // Registers page-specific tools. export function registerPageTools( server, { wpFetch, writePostLike, updatePostLike, resolvePostType } ) { server.tool( "list_pages", "List WordPress pages", { per_page: stringOrNumber.optional(), page: stringOrNumber.optional(), search: z.string().optional(), status: z.string().optional(), }, async ({ per_page = 10, page, search, status } = {}) => { const postType = await resolvePostType("page"); const query = buildQuery({ per_page, page, search, status }); const pages = await wpFetch(`/wp-json/wp/v2/${postType}${query}`); if (isWpError(pages)) { return wpErrorToolResult(pages); } return toolResult({ pages }); } ); server.tool( "get_page", "Get a WordPress page by ID", { id: stringOrNumber, }, async ({ id } = {}) => { const postType = await resolvePostType("page"); const page = await wpFetch(`/wp-json/wp/v2/${postType}/${id}`); if (isWpError(page)) { return wpErrorToolResult(page); } return toolResult({ page }); } ); server.tool( "create_page", "Create a WordPress page (draft by default)", { title: stringOrRaw.optional(), content: stringOrRaw.optional(), status: z.string().optional(), excerpt: stringOrRaw.optional(), slug: z.string().optional(), parent: stringOrNumber.optional(), yoast: yoastMeta.optional(), }, async ({ title, content, status = "draft", excerpt, slug, parent, yoast, } = {}) => { console.error("MCP: create_page called with:", { title, content, status, excerpt, slug, parent, yoast, }); const postType = await resolvePostType("page"); const page = await writePostLike(`/wp-json/wp/v2/${postType}`, { title, content, status, excerpt, slug, parent, meta: buildYoastMeta(yoast), }); if (isWpError(page)) { return wpErrorToolResult(page); } return toolResult({ page }); } ); server.tool( "update_page", "Update a WordPress page", { id: stringOrNumber, title: stringOrRaw.optional(), content: stringOrRaw.optional(), status: z.string().optional(), excerpt: stringOrRaw.optional(), slug: z.string().optional(), parent: stringOrNumber.optional(), yoast: yoastMeta.optional(), }, async ({ id, title, content, status, excerpt, slug, parent, yoast, } = {}) => { console.error("MCP: update_page called with:", { id, title, content, status, excerpt, slug, parent, yoast, }); const postType = await resolvePostType("page"); const page = await updatePostLike(`/wp-json/wp/v2/${postType}/${id}`, { title, content, status, excerpt, slug, parent, meta: buildYoastMeta(yoast), }); if (isWpError(page)) { return wpErrorToolResult(page); } return toolResult({ page }); } ); server.tool( "delete_page", "Delete a WordPress page", { id: stringOrNumber, force: z.boolean().optional(), }, async ({ id, force = false } = {}) => { const postType = await resolvePostType("page"); const query = buildQuery({ force }); const result = await wpFetch(`/wp-json/wp/v2/${postType}/${id}${query}`, { method: "DELETE", }); if (isWpError(result)) { return wpErrorToolResult(result); } return toolResult({ result }); } ); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/jahzlariosa/wordpress-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server