Skip to main content
Glama

get-post-stats

Retrieve view statistics for a specific WordPress post by entering site URL, credentials, site ID, and post ID. Integrates with WordPress MCP Server for secure, programmatic access to post analytics.

Instructions

View a specific post's views

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
passwordYesWordPress application password
postIdYesPost ID to get stats for
siteIdYesWordPress site ID
siteUrlYesWordPress site URL
usernameYesWordPress username

Implementation Reference

  • The main handler function for the 'get-post-stats' tool. It makes an authenticated API request to the WordPress/Jetpack stats endpoint `/sites/{siteId}/stats/post/{postId}`, processes the response (handling total views, timeframe data, or raw JSON), formats it into a markdown text response, and handles errors.
    async ({ siteUrl, username, password, siteId, postId }) => { try { const postStats = await makeWPRequest<any>({ siteUrl, endpoint: `sites/${siteId}/stats/post/${postId}`, auth: { username, password } }); // Format will depend on the actual API response let statsText; if (postStats && typeof postStats.views !== 'undefined') { statsText = ` Post #${postId} Stats: Total Views: ${postStats.views || 0} First View: ${postStats.first_view || "Unknown"} Most Recent View: ${postStats.most_recent_view || "Unknown"} `.trim(); } else if (postStats && Array.isArray(postStats.data)) { // Handle timeframe data if present statsText = ` Post #${postId} Views Over Time: ${postStats.data.map((item: WPPostStatsData) => `${item.period || "Unknown"}: ${item.views || 0} views`).join('\n')} `.trim(); } else { statsText = `Post #${postId} Stats:\n${JSON.stringify(postStats, null, 2)}`; } return { content: [ { type: "text", text: statsText, }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error retrieving post stats: ${error instanceof Error ? error.message : String(error)}`, }, ], }; } }
  • Zod input schema defining the required parameters for the get-post-stats tool: siteUrl (URL), username (string), password (string), siteId (number), postId (number). Used for validation by the MCP server.
    { siteUrl: z.string().url().describe("WordPress site URL"), username: z.string().describe("WordPress username"), password: z.string().describe("WordPress application password"), siteId: z.number().describe("WordPress site ID"), postId: z.number().describe("Post ID to get stats for"), },
  • src/index.ts:1383-1440 (registration)
    The server.tool() registration call that defines and registers the 'get-post-stats' tool with the MCP server, including its name, description, input schema, and handler function.
    server.tool( "get-post-stats", "View a specific post's views", { siteUrl: z.string().url().describe("WordPress site URL"), username: z.string().describe("WordPress username"), password: z.string().describe("WordPress application password"), siteId: z.number().describe("WordPress site ID"), postId: z.number().describe("Post ID to get stats for"), }, async ({ siteUrl, username, password, siteId, postId }) => { try { const postStats = await makeWPRequest<any>({ siteUrl, endpoint: `sites/${siteId}/stats/post/${postId}`, auth: { username, password } }); // Format will depend on the actual API response let statsText; if (postStats && typeof postStats.views !== 'undefined') { statsText = ` Post #${postId} Stats: Total Views: ${postStats.views || 0} First View: ${postStats.first_view || "Unknown"} Most Recent View: ${postStats.most_recent_view || "Unknown"} `.trim(); } else if (postStats && Array.isArray(postStats.data)) { // Handle timeframe data if present statsText = ` Post #${postId} Views Over Time: ${postStats.data.map((item: WPPostStatsData) => `${item.period || "Unknown"}: ${item.views || 0} views`).join('\n')} `.trim(); } else { statsText = `Post #${postId} Stats:\n${JSON.stringify(postStats, null, 2)}`; } return { content: [ { type: "text", text: statsText, }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error retrieving post stats: ${error instanceof Error ? error.message : String(error)}`, }, ], }; } } );
  • The makeWPRequest helper function used by the get-post-stats handler (and other tools) to make authenticated HTTP requests to WordPress REST API endpoints using axios, with Basic Auth and error handling.
    async function makeWPRequest<T>({ siteUrl, endpoint, method = 'GET', auth, data = null, params = null }: { siteUrl: string; endpoint: string; method?: 'GET' | 'POST' | 'PUT' | 'DELETE'; auth: { username: string; password: string }; data?: any; params?: any; }): Promise<T> { const authString = Buffer.from(`${auth.username}:${auth.password}`).toString('base64'); try { const response = await axios({ method, url: `${siteUrl}/wp-json/wp/v2/${endpoint}`, headers: { 'Authorization': `Basic ${authString}`, 'Content-Type': 'application/json', }, data: data, params: params }); return response.data as T; } catch (error) { if (axios.isAxiosError(error) && error.response) { throw new Error(`WordPress API error: ${error.response.data?.message || error.message}`); } throw error; } }
  • TypeScript interface defining the structure of post stats data points (period and views), referenced in the handler for processing timeframe data.
    interface WPPostStatsData { period: string; views: number; }

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/prathammanocha/wordpress-mcp-server'

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