@adsim/wordpress-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/constants.d.ts +13 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +10 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +33 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/index.d.ts +308 -0
  12. package/dist/schemas/index.d.ts.map +1 -0
  13. package/dist/schemas/index.js +191 -0
  14. package/dist/schemas/index.js.map +1 -0
  15. package/dist/services/formatters.d.ts +22 -0
  16. package/dist/services/formatters.d.ts.map +1 -0
  17. package/dist/services/formatters.js +52 -0
  18. package/dist/services/formatters.js.map +1 -0
  19. package/dist/services/wp-client.d.ts +38 -0
  20. package/dist/services/wp-client.d.ts.map +1 -0
  21. package/dist/services/wp-client.js +102 -0
  22. package/dist/services/wp-client.js.map +1 -0
  23. package/dist/tools/content.d.ts +4 -0
  24. package/dist/tools/content.d.ts.map +1 -0
  25. package/dist/tools/content.js +196 -0
  26. package/dist/tools/content.js.map +1 -0
  27. package/dist/tools/posts.d.ts +4 -0
  28. package/dist/tools/posts.d.ts.map +1 -0
  29. package/dist/tools/posts.js +179 -0
  30. package/dist/tools/posts.js.map +1 -0
  31. package/dist/tools/seo.d.ts +4 -0
  32. package/dist/tools/seo.d.ts.map +1 -0
  33. package/dist/tools/seo.js +241 -0
  34. package/dist/tools/seo.js.map +1 -0
  35. package/dist/tools/taxonomy.d.ts +4 -0
  36. package/dist/tools/taxonomy.d.ts.map +1 -0
  37. package/dist/tools/taxonomy.js +82 -0
  38. package/dist/tools/taxonomy.js.map +1 -0
  39. package/dist/types.d.ts +160 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +3 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/tools/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WordPressClient } from "../services/wp-client.js";
3
+ export declare function registerPostsTools(server: McpServer, client: WordPressClient): void;
4
+ //# sourceMappingURL=posts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAiOnF"}
@@ -0,0 +1,179 @@
1
+ import { ListPostsSchema, GetPostSchema, CreatePostSchema, UpdatePostSchema, DeletePostSchema } from "../schemas/index.js";
2
+ import { formatPostSummary, paginationInfo, stripHtml, truncateIfNeeded } from "../services/formatters.js";
3
+ export function registerPostsTools(server, client) {
4
+ // ---- wp_list_posts ----
5
+ server.registerTool("wp_list_posts", {
6
+ title: "List WordPress Posts",
7
+ description: `List WordPress posts with filtering, sorting, and pagination.
8
+
9
+ Args:
10
+ - per_page (number): Items per page, 1-100 (default: 10)
11
+ - page (number): Page number (default: 1)
12
+ - status (string): Filter by status — publish, draft, pending, private, future, trash
13
+ - orderby (string): Sort by — date, id, title, slug, modified, author, relevance
14
+ - order (string): Sort direction — asc or desc (default: desc)
15
+ - categories (string): Comma-separated category IDs
16
+ - tags (string): Comma-separated tag IDs
17
+ - search (string): Search keyword
18
+
19
+ Returns: Array of post summaries with id, title, date, status, link, excerpt.`,
20
+ inputSchema: ListPostsSchema,
21
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
22
+ }, async (params) => {
23
+ const queryParams = {
24
+ per_page: params.per_page,
25
+ page: params.page,
26
+ status: params.status,
27
+ orderby: params.orderby,
28
+ order: params.order,
29
+ categories: params.categories,
30
+ tags: params.tags,
31
+ search: params.search,
32
+ };
33
+ const { data: posts, total, totalPages } = await client.get("/posts", queryParams);
34
+ const results = posts.map(formatPostSummary);
35
+ const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
36
+ const text = truncateIfNeeded(JSON.stringify({ posts: results, pagination }, null, 2));
37
+ return { content: [{ type: "text", text }] };
38
+ });
39
+ // ---- wp_get_post ----
40
+ server.registerTool("wp_get_post", {
41
+ title: "Get WordPress Post",
42
+ description: `Get a single WordPress post by ID with full content, metadata, and SEO fields.
43
+
44
+ Args:
45
+ - id (number): WordPress post ID
46
+
47
+ Returns: Complete post data including title, content, excerpt, SEO metadata, categories, tags.`,
48
+ inputSchema: GetPostSchema,
49
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
50
+ }, async (params) => {
51
+ const { data: post } = await client.get(`/posts/${params.id}`);
52
+ const result = {
53
+ id: post.id,
54
+ title: stripHtml(post.title.rendered),
55
+ content: stripHtml(post.content.rendered),
56
+ excerpt: stripHtml(post.excerpt.rendered),
57
+ date: post.date,
58
+ modified: post.modified,
59
+ slug: post.slug,
60
+ status: post.status,
61
+ link: post.link,
62
+ author: post.author,
63
+ categories: post.categories,
64
+ tags: post.tags,
65
+ featured_media: post.featured_media,
66
+ seo: {
67
+ rank_math_title: post.rank_math_title || null,
68
+ rank_math_description: post.rank_math_description || null,
69
+ rank_math_focus_keyword: post.rank_math_focus_keyword || null,
70
+ yoast: post.yoast_head_json || null,
71
+ },
72
+ meta: post.meta,
73
+ };
74
+ const text = truncateIfNeeded(JSON.stringify(result, null, 2));
75
+ return { content: [{ type: "text", text }] };
76
+ });
77
+ // ---- wp_create_post ----
78
+ server.registerTool("wp_create_post", {
79
+ title: "Create WordPress Post",
80
+ description: `Create a new WordPress post. Defaults to 'draft' status for safety.
81
+
82
+ Args:
83
+ - title (string): Post title (required)
84
+ - content (string): Post content, HTML supported (required)
85
+ - status (string): publish, draft, pending, private, future (default: draft)
86
+ - excerpt (string): Post excerpt/summary
87
+ - categories (number[]): Category IDs
88
+ - tags (number[]): Tag IDs
89
+ - featured_media (number): Featured image media ID
90
+ - slug (string): URL slug
91
+
92
+ Returns: Created post ID, title, and link.`,
93
+ inputSchema: CreatePostSchema,
94
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
95
+ }, async (params) => {
96
+ const { data: post } = await client.post("/posts", params);
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: JSON.stringify({
102
+ success: true,
103
+ id: post.id,
104
+ title: stripHtml(post.title.rendered),
105
+ status: post.status,
106
+ link: post.link,
107
+ }, null, 2),
108
+ },
109
+ ],
110
+ };
111
+ });
112
+ // ---- wp_update_post ----
113
+ server.registerTool("wp_update_post", {
114
+ title: "Update WordPress Post",
115
+ description: `Update an existing WordPress post. Only specified fields are changed.
116
+
117
+ Args:
118
+ - id (number): Post ID to update (required)
119
+ - title (string): New title
120
+ - content (string): New content (HTML)
121
+ - status (string): New status
122
+ - excerpt (string): New excerpt
123
+ - categories (number[]): New category IDs
124
+ - tags (number[]): New tag IDs
125
+ - featured_media (number): New featured image ID
126
+ - slug (string): New URL slug
127
+ - meta (object): Meta fields to update (e.g., rank_math_title, rank_math_description)
128
+
129
+ Returns: Updated post ID, title, and link.`,
130
+ inputSchema: UpdatePostSchema,
131
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
132
+ }, async (params) => {
133
+ const { id, ...updates } = params;
134
+ const { data: post } = await client.post(`/posts/${id}`, updates);
135
+ return {
136
+ content: [
137
+ {
138
+ type: "text",
139
+ text: JSON.stringify({
140
+ success: true,
141
+ id: post.id,
142
+ title: stripHtml(post.title.rendered),
143
+ status: post.status,
144
+ link: post.link,
145
+ }, null, 2),
146
+ },
147
+ ],
148
+ };
149
+ });
150
+ // ---- wp_delete_post ----
151
+ server.registerTool("wp_delete_post", {
152
+ title: "Delete WordPress Post",
153
+ description: `Delete a WordPress post. By default moves to trash; use force=true to permanently delete.
154
+
155
+ Args:
156
+ - id (number): Post ID to delete (required)
157
+ - force (boolean): Permanently delete if true, trash if false (default: false)
158
+
159
+ Returns: Confirmation with deleted post ID and status.`,
160
+ inputSchema: DeletePostSchema,
161
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
162
+ }, async (params) => {
163
+ const { data } = await client.delete(`/posts/${params.id}`, { force: params.force });
164
+ return {
165
+ content: [
166
+ {
167
+ type: "text",
168
+ text: JSON.stringify({
169
+ success: true,
170
+ id: params.id,
171
+ action: params.force ? "permanently deleted" : "moved to trash",
172
+ status: data.status,
173
+ }, null, 2),
174
+ },
175
+ ],
176
+ };
177
+ });
178
+ }
179
+ //# sourceMappingURL=posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WordPressClient } from "../services/wp-client.js";
3
+ export declare function registerSEOTools(server: McpServer, client: WordPressClient): void;
4
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/tools/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAyHhE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAyJjF"}
@@ -0,0 +1,241 @@
1
+ import { GetSEOMetaSchema, UpdateSEOMetaSchema, AuditSEOSchema } from "../schemas/index.js";
2
+ import { stripHtml, seoScoreEmoji, truncateIfNeeded } from "../services/formatters.js";
3
+ /** Extract SEO metadata from a post */
4
+ function extractSEO(post) {
5
+ // RankMath
6
+ if (post.rank_math_title || post.rank_math_description || post.rank_math_focus_keyword) {
7
+ return {
8
+ plugin: "rankmath",
9
+ title: post.rank_math_title || null,
10
+ description: post.rank_math_description || null,
11
+ focus_keyword: post.rank_math_focus_keyword || null,
12
+ robots: post.rank_math_robots || null,
13
+ };
14
+ }
15
+ // Yoast
16
+ if (post.yoast_head_json) {
17
+ return {
18
+ plugin: "yoast",
19
+ title: post.yoast_head_json.title || null,
20
+ description: post.yoast_head_json.description || null,
21
+ focus_keyword: null,
22
+ robots: null,
23
+ };
24
+ }
25
+ return {
26
+ plugin: "unknown",
27
+ title: null,
28
+ description: null,
29
+ focus_keyword: null,
30
+ robots: null,
31
+ };
32
+ }
33
+ /** Calculate SEO score (0-100) */
34
+ function calculateSEOScore(post) {
35
+ const issues = [];
36
+ const recommendations = [];
37
+ let score = 100;
38
+ const seo = extractSEO(post);
39
+ const title = stripHtml(post.title.rendered);
40
+ const content = stripHtml(post.content.rendered);
41
+ const excerpt = stripHtml(post.excerpt.rendered);
42
+ // SEO Title check
43
+ if (!seo.title) {
44
+ score -= 20;
45
+ issues.push("Missing SEO title");
46
+ recommendations.push("Add a custom SEO title (50-60 characters ideal)");
47
+ }
48
+ else if (seo.title.length > 60) {
49
+ score -= 5;
50
+ issues.push(`SEO title too long (${seo.title.length} chars, max 60)`);
51
+ recommendations.push("Shorten SEO title to 60 characters or less");
52
+ }
53
+ // Meta description check
54
+ if (!seo.description) {
55
+ score -= 20;
56
+ issues.push("Missing meta description");
57
+ recommendations.push("Add a meta description (150-160 characters ideal)");
58
+ }
59
+ else if (seo.description.length > 160) {
60
+ score -= 5;
61
+ issues.push(`Meta description too long (${seo.description.length} chars, max 160)`);
62
+ recommendations.push("Shorten meta description to 160 characters or less");
63
+ }
64
+ else if (seo.description.length < 120) {
65
+ score -= 5;
66
+ issues.push(`Meta description short (${seo.description.length} chars, aim for 120-160)`);
67
+ recommendations.push("Expand meta description to 120-160 characters");
68
+ }
69
+ // Focus keyword check
70
+ if (!seo.focus_keyword) {
71
+ score -= 15;
72
+ issues.push("No focus keyword defined");
73
+ recommendations.push("Set a focus keyword for this content");
74
+ }
75
+ else {
76
+ const keyword = seo.focus_keyword.toLowerCase();
77
+ if (!title.toLowerCase().includes(keyword)) {
78
+ score -= 5;
79
+ issues.push("Focus keyword not found in title");
80
+ recommendations.push("Include focus keyword in the post title");
81
+ }
82
+ if (!content.toLowerCase().includes(keyword)) {
83
+ score -= 5;
84
+ issues.push("Focus keyword not found in content");
85
+ recommendations.push("Include focus keyword in the post content");
86
+ }
87
+ }
88
+ // Content length check
89
+ const wordCount = content.split(/\s+/).length;
90
+ if (wordCount < 300) {
91
+ score -= 15;
92
+ issues.push(`Content too short (${wordCount} words, aim for 300+)`);
93
+ recommendations.push("Expand content to at least 300 words");
94
+ }
95
+ else if (wordCount < 600) {
96
+ score -= 5;
97
+ issues.push(`Content could be longer (${wordCount} words, aim for 600+)`);
98
+ recommendations.push("Consider expanding content to 600+ words for better ranking");
99
+ }
100
+ // Excerpt check
101
+ if (!excerpt || excerpt.length < 10) {
102
+ score -= 5;
103
+ issues.push("Missing or very short excerpt");
104
+ recommendations.push("Write a custom excerpt (150-200 characters)");
105
+ }
106
+ // Slug check
107
+ if (post.slug && post.slug.length > 75) {
108
+ score -= 5;
109
+ issues.push("URL slug too long");
110
+ recommendations.push("Shorten URL slug to be more concise");
111
+ }
112
+ return { score: Math.max(0, score), issues, recommendations };
113
+ }
114
+ export function registerSEOTools(server, client) {
115
+ // ---- wp_get_seo_meta ----
116
+ server.registerTool("wp_get_seo_meta", {
117
+ title: "Get SEO Metadata",
118
+ description: `Get SEO metadata for a WordPress post or page. Supports RankMath and Yoast SEO.
119
+
120
+ IMPORTANT: SEO meta fields must be exposed via REST API in your WordPress theme's functions.php.
121
+ See the README for the required register_post_meta() code.
122
+
123
+ Args:
124
+ - id (number): Post or page ID (required)
125
+ - post_type (string): 'post' or 'page' (default: 'post')
126
+
127
+ Returns: SEO plugin detected, title, description, focus keyword, robots directives.`,
128
+ inputSchema: GetSEOMetaSchema,
129
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
130
+ }, async (params) => {
131
+ const endpoint = params.post_type === "page" ? "/pages" : "/posts";
132
+ const { data: post } = await client.get(`${endpoint}/${params.id}`);
133
+ const seo = extractSEO(post);
134
+ return {
135
+ content: [
136
+ {
137
+ type: "text",
138
+ text: JSON.stringify({
139
+ post_id: post.id,
140
+ post_title: stripHtml(post.title.rendered),
141
+ seo,
142
+ note: seo.plugin === "unknown"
143
+ ? "No SEO plugin data found. Ensure RankMath or Yoast fields are exposed via REST API. See README."
144
+ : undefined,
145
+ }, null, 2),
146
+ },
147
+ ],
148
+ };
149
+ });
150
+ // ---- wp_update_seo_meta ----
151
+ server.registerTool("wp_update_seo_meta", {
152
+ title: "Update SEO Metadata",
153
+ description: `Update SEO metadata for a WordPress post or page (RankMath fields).
154
+
155
+ IMPORTANT: SEO meta fields must be exposed via REST API. See README.
156
+
157
+ Args:
158
+ - id (number): Post/page ID (required)
159
+ - post_type (string): 'post' or 'page' (default: 'post')
160
+ - rank_math_title (string): New SEO title
161
+ - rank_math_description (string): New meta description
162
+ - rank_math_focus_keyword (string): New focus keyword
163
+
164
+ Returns: Confirmation with updated values.`,
165
+ inputSchema: UpdateSEOMetaSchema,
166
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
167
+ }, async (params) => {
168
+ const endpoint = params.post_type === "page" ? "/pages" : "/posts";
169
+ const meta = {};
170
+ if (params.rank_math_title !== undefined)
171
+ meta.rank_math_title = params.rank_math_title;
172
+ if (params.rank_math_description !== undefined)
173
+ meta.rank_math_description = params.rank_math_description;
174
+ if (params.rank_math_focus_keyword !== undefined)
175
+ meta.rank_math_focus_keyword = params.rank_math_focus_keyword;
176
+ const { data: post } = await client.post(`${endpoint}/${params.id}`, { meta });
177
+ const seo = extractSEO(post);
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: JSON.stringify({
183
+ success: true,
184
+ post_id: post.id,
185
+ post_title: stripHtml(post.title.rendered),
186
+ updated_seo: seo,
187
+ }, null, 2),
188
+ },
189
+ ],
190
+ };
191
+ });
192
+ // ---- wp_audit_seo ----
193
+ server.registerTool("wp_audit_seo", {
194
+ title: "Audit SEO",
195
+ description: `Audit SEO for multiple WordPress posts or pages. Returns a score (0-100) with issues and recommendations for each item.
196
+
197
+ Args:
198
+ - post_type (string): 'post' or 'page' (default: 'post')
199
+ - per_page (number): Items to audit, 1-50 (default: 10)
200
+ - status (string): Filter by status (default: publish)
201
+
202
+ Returns: Array of audit results with score, issues, and recommendations for each item.`,
203
+ inputSchema: AuditSEOSchema,
204
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
205
+ }, async (params) => {
206
+ const endpoint = params.post_type === "page" ? "/pages" : "/posts";
207
+ const { data: posts } = await client.get(endpoint, {
208
+ per_page: params.per_page,
209
+ status: params.status,
210
+ orderby: "date",
211
+ order: "desc",
212
+ });
213
+ const audits = posts.map((post) => {
214
+ const { score, issues, recommendations } = calculateSEOScore(post);
215
+ const seo = extractSEO(post);
216
+ return {
217
+ post_id: post.id,
218
+ post_title: stripHtml(post.title.rendered),
219
+ post_url: post.link,
220
+ post_status: post.status,
221
+ seo: { ...seo, robots: seo.robots },
222
+ score,
223
+ issues,
224
+ recommendations,
225
+ };
226
+ });
227
+ // Summary
228
+ const avgScore = Math.round(audits.reduce((sum, a) => sum + a.score, 0) / audits.length);
229
+ const summary = {
230
+ total_audited: audits.length,
231
+ average_score: avgScore,
232
+ score_label: `${seoScoreEmoji(avgScore)} ${avgScore}/100`,
233
+ critical: audits.filter((a) => a.score < 50).length,
234
+ warning: audits.filter((a) => a.score >= 50 && a.score < 80).length,
235
+ good: audits.filter((a) => a.score >= 80).length,
236
+ };
237
+ const text = truncateIfNeeded(JSON.stringify({ summary, audits }, null, 2));
238
+ return { content: [{ type: "text", text }] };
239
+ });
240
+ }
241
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/tools/seo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { WordPressClient } from "../services/wp-client.js";
3
+ export declare function registerTaxonomyTools(server: McpServer, client: WordPressClient): void;
4
+ //# sourceMappingURL=taxonomy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../../src/tools/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA2FtF"}
@@ -0,0 +1,82 @@
1
+ import { ListCategoriesSchema, ListTagsSchema } from "../schemas/index.js";
2
+ import { paginationInfo, truncateIfNeeded } from "../services/formatters.js";
3
+ export function registerTaxonomyTools(server, client) {
4
+ // ---- wp_list_categories ----
5
+ server.registerTool("wp_list_categories", {
6
+ title: "List WordPress Categories",
7
+ description: `List WordPress categories with filtering and pagination.
8
+
9
+ Args:
10
+ - per_page (number): Items per page, 1-100 (default: 10)
11
+ - page (number): Page number (default: 1)
12
+ - search (string): Search keyword
13
+ - parent (number): Filter by parent category ID
14
+ - orderby (string): id, name, slug, count (default: name)
15
+ - order (string): asc or desc (default: desc)
16
+ - hide_empty (boolean): Hide categories with no posts (default: false)
17
+
18
+ Returns: Array of categories with id, name, slug, count, parent, link.`,
19
+ inputSchema: ListCategoriesSchema,
20
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
21
+ }, async (params) => {
22
+ const { data: categories, total, totalPages } = await client.get("/categories", {
23
+ per_page: params.per_page,
24
+ page: params.page,
25
+ search: params.search,
26
+ parent: params.parent,
27
+ orderby: params.orderby,
28
+ order: params.order,
29
+ hide_empty: params.hide_empty,
30
+ });
31
+ const results = categories.map((cat) => ({
32
+ id: cat.id,
33
+ name: cat.name,
34
+ slug: cat.slug,
35
+ count: cat.count,
36
+ parent: cat.parent,
37
+ link: cat.link,
38
+ description: cat.description || null,
39
+ }));
40
+ const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
41
+ const text = truncateIfNeeded(JSON.stringify({ categories: results, pagination }, null, 2));
42
+ return { content: [{ type: "text", text }] };
43
+ });
44
+ // ---- wp_list_tags ----
45
+ server.registerTool("wp_list_tags", {
46
+ title: "List WordPress Tags",
47
+ description: `List WordPress tags with filtering and pagination.
48
+
49
+ Args:
50
+ - per_page (number): Items per page, 1-100 (default: 10)
51
+ - page (number): Page number (default: 1)
52
+ - search (string): Search keyword
53
+ - orderby (string): id, name, slug, count (default: name)
54
+ - order (string): asc or desc (default: desc)
55
+ - hide_empty (boolean): Hide tags with no posts (default: false)
56
+
57
+ Returns: Array of tags with id, name, slug, count, link.`,
58
+ inputSchema: ListTagsSchema,
59
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
60
+ }, async (params) => {
61
+ const { data: tags, total, totalPages } = await client.get("/tags", {
62
+ per_page: params.per_page,
63
+ page: params.page,
64
+ search: params.search,
65
+ orderby: params.orderby,
66
+ order: params.order,
67
+ hide_empty: params.hide_empty,
68
+ });
69
+ const results = tags.map((tag) => ({
70
+ id: tag.id,
71
+ name: tag.name,
72
+ slug: tag.slug,
73
+ count: tag.count,
74
+ link: tag.link,
75
+ description: tag.description || null,
76
+ }));
77
+ const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
78
+ const text = truncateIfNeeded(JSON.stringify({ tags: results, pagination }, null, 2));
79
+ return { content: [{ type: "text", text }] };
80
+ });
81
+ }
82
+ //# sourceMappingURL=taxonomy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../../src/tools/taxonomy.ts"],"names":[],"mappings":"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"}