@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.
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/constants.d.ts +13 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/index.d.ts +308 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +191 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/services/formatters.d.ts +22 -0
- package/dist/services/formatters.d.ts.map +1 -0
- package/dist/services/formatters.js +52 -0
- package/dist/services/formatters.js.map +1 -0
- package/dist/services/wp-client.d.ts +38 -0
- package/dist/services/wp-client.d.ts.map +1 -0
- package/dist/services/wp-client.js +102 -0
- package/dist/services/wp-client.js.map +1 -0
- package/dist/tools/content.d.ts +4 -0
- package/dist/tools/content.d.ts.map +1 -0
- package/dist/tools/content.js +196 -0
- package/dist/tools/content.js.map +1 -0
- package/dist/tools/posts.d.ts +4 -0
- package/dist/tools/posts.d.ts.map +1 -0
- package/dist/tools/posts.js +179 -0
- package/dist/tools/posts.js.map +1 -0
- package/dist/tools/seo.d.ts +4 -0
- package/dist/tools/seo.d.ts.map +1 -0
- package/dist/tools/seo.js +241 -0
- package/dist/tools/seo.js.map +1 -0
- package/dist/tools/taxonomy.d.ts +4 -0
- package/dist/tools/taxonomy.d.ts.map +1 -0
- package/dist/tools/taxonomy.js +82 -0
- package/dist/tools/taxonomy.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;EAc3B,CAAC;AAEH,eAAO,MAAM,gBAAgB,wFAGI,CAAC;AAElC,eAAO,MAAM,aAAa,6FAGc,CAAC;AAEzC,eAAO,MAAM,WAAW,0CAGK,CAAC;AAI9B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgB1B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;EAExB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB3B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB3B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;EAS/B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;EAQzB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;EAM3B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;EAS9B,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;EAazB,CAAC;AAEH,eAAO,MAAM,cAAc,iDAAwB,CAAC;AAEpD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;EAM1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;EAM7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;EAG1B,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// ---- Shared schemas ----
|
|
3
|
+
export const PaginationSchema = z.object({
|
|
4
|
+
per_page: z
|
|
5
|
+
.number()
|
|
6
|
+
.int()
|
|
7
|
+
.min(1)
|
|
8
|
+
.max(100)
|
|
9
|
+
.default(10)
|
|
10
|
+
.describe("Number of items per page (1-100, default: 10)"),
|
|
11
|
+
page: z
|
|
12
|
+
.number()
|
|
13
|
+
.int()
|
|
14
|
+
.min(1)
|
|
15
|
+
.default(1)
|
|
16
|
+
.describe("Page number (default: 1)"),
|
|
17
|
+
});
|
|
18
|
+
export const PostStatusSchema = z
|
|
19
|
+
.enum(["publish", "draft", "pending", "private", "future", "trash"])
|
|
20
|
+
.default("publish")
|
|
21
|
+
.describe("Post status filter");
|
|
22
|
+
export const OrderBySchema = z
|
|
23
|
+
.enum(["date", "id", "title", "slug", "modified", "author", "relevance"])
|
|
24
|
+
.default("date")
|
|
25
|
+
.describe("Field to order results by");
|
|
26
|
+
export const OrderSchema = z
|
|
27
|
+
.enum(["asc", "desc"])
|
|
28
|
+
.default("desc")
|
|
29
|
+
.describe("Sort direction");
|
|
30
|
+
// ---- Tool-specific schemas ----
|
|
31
|
+
export const ListPostsSchema = PaginationSchema.extend({
|
|
32
|
+
status: PostStatusSchema.optional(),
|
|
33
|
+
orderby: OrderBySchema.optional(),
|
|
34
|
+
order: OrderSchema.optional(),
|
|
35
|
+
categories: z
|
|
36
|
+
.string()
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Comma-separated category IDs to filter by"),
|
|
39
|
+
tags: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Comma-separated tag IDs to filter by"),
|
|
43
|
+
search: z
|
|
44
|
+
.string()
|
|
45
|
+
.optional()
|
|
46
|
+
.describe("Search keyword to filter posts"),
|
|
47
|
+
});
|
|
48
|
+
export const GetPostSchema = z.object({
|
|
49
|
+
id: z.number().int().positive().describe("WordPress post ID"),
|
|
50
|
+
});
|
|
51
|
+
export const CreatePostSchema = z.object({
|
|
52
|
+
title: z.string().min(1).describe("Post title"),
|
|
53
|
+
content: z.string().describe("Post content (HTML supported)"),
|
|
54
|
+
status: z
|
|
55
|
+
.enum(["publish", "draft", "pending", "private", "future"])
|
|
56
|
+
.default("draft")
|
|
57
|
+
.describe("Post status (default: draft for safety)"),
|
|
58
|
+
excerpt: z.string().optional().describe("Post excerpt/summary"),
|
|
59
|
+
categories: z
|
|
60
|
+
.array(z.number().int().positive())
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Array of category IDs"),
|
|
63
|
+
tags: z
|
|
64
|
+
.array(z.number().int().positive())
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Array of tag IDs"),
|
|
67
|
+
featured_media: z
|
|
68
|
+
.number()
|
|
69
|
+
.int()
|
|
70
|
+
.positive()
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("Featured image media ID"),
|
|
73
|
+
slug: z.string().optional().describe("URL slug for the post"),
|
|
74
|
+
});
|
|
75
|
+
export const UpdatePostSchema = z.object({
|
|
76
|
+
id: z.number().int().positive().describe("Post ID to update"),
|
|
77
|
+
title: z.string().optional().describe("New title"),
|
|
78
|
+
content: z.string().optional().describe("New content (HTML supported)"),
|
|
79
|
+
status: z
|
|
80
|
+
.enum(["publish", "draft", "pending", "private", "future", "trash"])
|
|
81
|
+
.optional()
|
|
82
|
+
.describe("New status"),
|
|
83
|
+
excerpt: z.string().optional().describe("New excerpt"),
|
|
84
|
+
categories: z
|
|
85
|
+
.array(z.number().int().positive())
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("New category IDs"),
|
|
88
|
+
tags: z
|
|
89
|
+
.array(z.number().int().positive())
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("New tag IDs"),
|
|
92
|
+
featured_media: z.number().int().optional().describe("New featured image ID"),
|
|
93
|
+
slug: z.string().optional().describe("New URL slug"),
|
|
94
|
+
meta: z
|
|
95
|
+
.record(z.unknown())
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Post meta fields to update (e.g., rank_math_title, rank_math_description)"),
|
|
98
|
+
});
|
|
99
|
+
export const DeletePostSchema = z.object({
|
|
100
|
+
id: z.number().int().positive().describe("Post ID to delete"),
|
|
101
|
+
force: z
|
|
102
|
+
.boolean()
|
|
103
|
+
.default(false)
|
|
104
|
+
.describe("If true, permanently deletes. If false, moves to trash."),
|
|
105
|
+
});
|
|
106
|
+
export const ListPagesSchema = PaginationSchema.extend({
|
|
107
|
+
status: PostStatusSchema.optional(),
|
|
108
|
+
parent: z.number().int().optional().describe("Filter by parent page ID"),
|
|
109
|
+
orderby: OrderBySchema.optional(),
|
|
110
|
+
order: OrderSchema.optional(),
|
|
111
|
+
search: z.string().optional().describe("Search keyword"),
|
|
112
|
+
});
|
|
113
|
+
export const ListCategoriesSchema = PaginationSchema.extend({
|
|
114
|
+
search: z.string().optional().describe("Search keyword"),
|
|
115
|
+
parent: z.number().int().optional().describe("Filter by parent category ID"),
|
|
116
|
+
orderby: z
|
|
117
|
+
.enum(["id", "name", "slug", "count"])
|
|
118
|
+
.default("name")
|
|
119
|
+
.describe("Order by field"),
|
|
120
|
+
order: OrderSchema.optional(),
|
|
121
|
+
hide_empty: z.boolean().default(false).describe("Hide categories with no posts"),
|
|
122
|
+
});
|
|
123
|
+
export const ListTagsSchema = PaginationSchema.extend({
|
|
124
|
+
search: z.string().optional().describe("Search keyword"),
|
|
125
|
+
orderby: z
|
|
126
|
+
.enum(["id", "name", "slug", "count"])
|
|
127
|
+
.default("name")
|
|
128
|
+
.describe("Order by field"),
|
|
129
|
+
order: OrderSchema.optional(),
|
|
130
|
+
hide_empty: z.boolean().default(false).describe("Hide tags with no posts"),
|
|
131
|
+
});
|
|
132
|
+
export const SearchSchema = z.object({
|
|
133
|
+
search: z.string().min(1).describe("Search term"),
|
|
134
|
+
per_page: z.number().int().min(1).max(100).default(10).describe("Results per page"),
|
|
135
|
+
type: z
|
|
136
|
+
.enum(["post", "page", "category", "tag"])
|
|
137
|
+
.optional()
|
|
138
|
+
.describe("Filter by content type"),
|
|
139
|
+
subtype: z.string().optional().describe("Filter by post subtype"),
|
|
140
|
+
});
|
|
141
|
+
export const GetSEOMetaSchema = z.object({
|
|
142
|
+
id: z.number().int().positive().describe("Post or page ID"),
|
|
143
|
+
post_type: z
|
|
144
|
+
.enum(["post", "page"])
|
|
145
|
+
.default("post")
|
|
146
|
+
.describe("Content type: 'post' or 'page'"),
|
|
147
|
+
});
|
|
148
|
+
export const UpdateSEOMetaSchema = z.object({
|
|
149
|
+
id: z.number().int().positive().describe("Post or page ID"),
|
|
150
|
+
post_type: z
|
|
151
|
+
.enum(["post", "page"])
|
|
152
|
+
.default("post")
|
|
153
|
+
.describe("Content type"),
|
|
154
|
+
rank_math_title: z.string().optional().describe("SEO title (RankMath)"),
|
|
155
|
+
rank_math_description: z.string().optional().describe("Meta description (RankMath)"),
|
|
156
|
+
rank_math_focus_keyword: z.string().optional().describe("Focus keyword (RankMath)"),
|
|
157
|
+
});
|
|
158
|
+
export const AuditSEOSchema = z.object({
|
|
159
|
+
post_type: z
|
|
160
|
+
.enum(["post", "page"])
|
|
161
|
+
.default("post")
|
|
162
|
+
.describe("Content type to audit"),
|
|
163
|
+
per_page: z
|
|
164
|
+
.number()
|
|
165
|
+
.int()
|
|
166
|
+
.min(1)
|
|
167
|
+
.max(50)
|
|
168
|
+
.default(10)
|
|
169
|
+
.describe("Number of items to audit"),
|
|
170
|
+
status: PostStatusSchema.optional(),
|
|
171
|
+
});
|
|
172
|
+
export const SiteInfoSchema = z.object({}).strict();
|
|
173
|
+
export const ListMediaSchema = PaginationSchema.extend({
|
|
174
|
+
media_type: z
|
|
175
|
+
.enum(["image", "video", "audio", "application"])
|
|
176
|
+
.optional()
|
|
177
|
+
.describe("Filter by media type"),
|
|
178
|
+
search: z.string().optional().describe("Search keyword"),
|
|
179
|
+
});
|
|
180
|
+
export const ListCommentsSchema = PaginationSchema.extend({
|
|
181
|
+
post: z.number().int().optional().describe("Filter by post ID"),
|
|
182
|
+
status: z
|
|
183
|
+
.enum(["approve", "hold", "spam", "trash"])
|
|
184
|
+
.optional()
|
|
185
|
+
.describe("Comment status filter"),
|
|
186
|
+
});
|
|
187
|
+
export const ListUsersSchema = PaginationSchema.extend({
|
|
188
|
+
roles: z.string().optional().describe("Comma-separated roles to filter by"),
|
|
189
|
+
search: z.string().optional().describe("Search keyword"),
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Strip HTML tags from a string */
|
|
2
|
+
export declare function stripHtml(html: string): string;
|
|
3
|
+
/** Truncate text if it exceeds the character limit */
|
|
4
|
+
export declare function truncateIfNeeded(text: string, limit?: number): string;
|
|
5
|
+
/** Format a pagination message */
|
|
6
|
+
export declare function paginationInfo(page: number, perPage: number, total?: number, totalPages?: number): string;
|
|
7
|
+
/** Format a post summary for listing */
|
|
8
|
+
export declare function formatPostSummary(post: {
|
|
9
|
+
id: number;
|
|
10
|
+
title: {
|
|
11
|
+
rendered: string;
|
|
12
|
+
};
|
|
13
|
+
date: string;
|
|
14
|
+
status: string;
|
|
15
|
+
link: string;
|
|
16
|
+
excerpt?: {
|
|
17
|
+
rendered: string;
|
|
18
|
+
};
|
|
19
|
+
}): Record<string, unknown>;
|
|
20
|
+
/** Format SEO score as emoji */
|
|
21
|
+
export declare function seoScoreEmoji(score: number): string;
|
|
22
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/services/formatters.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAW9C;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM,CAGtF;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAQR;AAED,wCAAwC;AACxC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS1B;AAED,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAInD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CHARACTER_LIMIT } from "../constants.js";
|
|
2
|
+
/** Strip HTML tags from a string */
|
|
3
|
+
export function stripHtml(html) {
|
|
4
|
+
return html
|
|
5
|
+
.replace(/<[^>]*>/g, "")
|
|
6
|
+
.replace(/ /g, " ")
|
|
7
|
+
.replace(/&/g, "&")
|
|
8
|
+
.replace(/</g, "<")
|
|
9
|
+
.replace(/>/g, ">")
|
|
10
|
+
.replace(/"/g, '"')
|
|
11
|
+
.replace(/'/g, "'")
|
|
12
|
+
.replace(/\s+/g, " ")
|
|
13
|
+
.trim();
|
|
14
|
+
}
|
|
15
|
+
/** Truncate text if it exceeds the character limit */
|
|
16
|
+
export function truncateIfNeeded(text, limit = CHARACTER_LIMIT) {
|
|
17
|
+
if (text.length <= limit)
|
|
18
|
+
return text;
|
|
19
|
+
return text.substring(0, limit) + `\n\n[Truncated — response exceeded ${limit} characters]`;
|
|
20
|
+
}
|
|
21
|
+
/** Format a pagination message */
|
|
22
|
+
export function paginationInfo(page, perPage, total, totalPages) {
|
|
23
|
+
let info = `Page ${page}`;
|
|
24
|
+
if (totalPages)
|
|
25
|
+
info += ` of ${totalPages}`;
|
|
26
|
+
if (total)
|
|
27
|
+
info += ` (${total} total results)`;
|
|
28
|
+
if (totalPages && page < totalPages) {
|
|
29
|
+
info += ` — Use page=${page + 1} to see more`;
|
|
30
|
+
}
|
|
31
|
+
return info;
|
|
32
|
+
}
|
|
33
|
+
/** Format a post summary for listing */
|
|
34
|
+
export function formatPostSummary(post) {
|
|
35
|
+
return {
|
|
36
|
+
id: post.id,
|
|
37
|
+
title: stripHtml(post.title.rendered),
|
|
38
|
+
date: post.date,
|
|
39
|
+
status: post.status,
|
|
40
|
+
link: post.link,
|
|
41
|
+
...(post.excerpt ? { excerpt: stripHtml(post.excerpt.rendered).substring(0, 200) } : {}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Format SEO score as emoji */
|
|
45
|
+
export function seoScoreEmoji(score) {
|
|
46
|
+
if (score >= 80)
|
|
47
|
+
return "🟢";
|
|
48
|
+
if (score >= 50)
|
|
49
|
+
return "🟡";
|
|
50
|
+
return "🔴";
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/services/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,oCAAoC;AACpC,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI;SACR,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB,eAAe;IAC5E,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,sCAAsC,KAAK,cAAc,CAAC;AAC9F,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAAe,EACf,KAAc,EACd,UAAmB;IAEnB,IAAI,IAAI,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC1B,IAAI,UAAU;QAAE,IAAI,IAAI,OAAO,UAAU,EAAE,CAAC;IAC5C,IAAI,KAAK;QAAE,IAAI,IAAI,KAAK,KAAK,iBAAiB,CAAC;IAC/C,IAAI,UAAU,IAAI,IAAI,GAAG,UAAU,EAAE,CAAC;QACpC,IAAI,IAAI,eAAe,IAAI,GAAG,CAAC,cAAc,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,IAOjC;IACC,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QACrC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { WPApiConfig } from "../types.js";
|
|
2
|
+
export declare class WordPressClient {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private authHeader;
|
|
5
|
+
constructor(config: WPApiConfig);
|
|
6
|
+
request<T>(endpoint: string, options?: {
|
|
7
|
+
method?: string;
|
|
8
|
+
body?: Record<string, unknown>;
|
|
9
|
+
params?: Record<string, string | number | boolean | undefined>;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
data: T;
|
|
12
|
+
totalPages?: number;
|
|
13
|
+
total?: number;
|
|
14
|
+
}>;
|
|
15
|
+
/** GET shorthand */
|
|
16
|
+
get<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined>): Promise<{
|
|
17
|
+
data: T;
|
|
18
|
+
totalPages?: number;
|
|
19
|
+
total?: number;
|
|
20
|
+
}>;
|
|
21
|
+
/** POST shorthand */
|
|
22
|
+
post<T>(endpoint: string, body: Record<string, unknown>, params?: Record<string, string | number | boolean | undefined>): Promise<{
|
|
23
|
+
data: T;
|
|
24
|
+
}>;
|
|
25
|
+
/** PUT shorthand */
|
|
26
|
+
put<T>(endpoint: string, body: Record<string, unknown>): Promise<{
|
|
27
|
+
data: T;
|
|
28
|
+
}>;
|
|
29
|
+
/** DELETE shorthand */
|
|
30
|
+
delete<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined>): Promise<{
|
|
31
|
+
data: T;
|
|
32
|
+
}>;
|
|
33
|
+
/** Test connection by fetching site info */
|
|
34
|
+
testConnection(): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
/** Create a client from environment variables */
|
|
37
|
+
export declare function createClientFromEnv(): WordPressClient;
|
|
38
|
+
//# sourceMappingURL=wp-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wp-client.d.ts","sourceRoot":"","sources":["../../src/services/wp-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,WAAW;IAMzB,OAAO,CAAC,CAAC,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;KAC3D,GACL,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAmD5D,oBAAoB;IACd,GAAG,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAI5D,qBAAqB;IACf,IAAI,CAAC,CAAC,EACV,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;IAIvB,oBAAoB;IACd,GAAG,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;IAIvB,uBAAuB;IACjB,MAAM,CAAC,CAAC,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC7D,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;IAIvB,4CAA4C;IACtC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAWzC;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,IAAI,eAAe,CA0BrD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { WP_REST_BASE } from "../constants.js";
|
|
2
|
+
export class WordPressClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
authHeader;
|
|
5
|
+
constructor(config) {
|
|
6
|
+
// Remove trailing slash
|
|
7
|
+
this.baseUrl = config.baseUrl.replace(/\/+$/, "");
|
|
8
|
+
this.authHeader = `Basic ${Buffer.from(`${config.username}:${config.password}`).toString("base64")}`;
|
|
9
|
+
}
|
|
10
|
+
async request(endpoint, options = {}) {
|
|
11
|
+
const { method = "GET", body, params } = options;
|
|
12
|
+
// Build URL with query parameters
|
|
13
|
+
const url = new URL(`${this.baseUrl}${WP_REST_BASE}${endpoint}`);
|
|
14
|
+
if (params) {
|
|
15
|
+
for (const [key, value] of Object.entries(params)) {
|
|
16
|
+
if (value !== undefined && value !== null) {
|
|
17
|
+
url.searchParams.set(key, String(value));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const headers = {
|
|
22
|
+
Authorization: this.authHeader,
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
Accept: "application/json",
|
|
25
|
+
};
|
|
26
|
+
const fetchOptions = { method, headers };
|
|
27
|
+
if (body && method !== "GET") {
|
|
28
|
+
fetchOptions.body = JSON.stringify(body);
|
|
29
|
+
}
|
|
30
|
+
const response = await fetch(url.toString(), fetchOptions);
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const errorText = await response.text();
|
|
33
|
+
let errorMessage;
|
|
34
|
+
try {
|
|
35
|
+
const errorJson = JSON.parse(errorText);
|
|
36
|
+
errorMessage = errorJson.message || errorJson.code || errorText;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
errorMessage = errorText;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`WordPress API Error (${response.status}): ${errorMessage}. ` +
|
|
42
|
+
`Endpoint: ${method} ${endpoint}. ` +
|
|
43
|
+
`Check your WP_API_URL, credentials, and ensure the REST API is enabled.`);
|
|
44
|
+
}
|
|
45
|
+
const data = (await response.json());
|
|
46
|
+
return {
|
|
47
|
+
data,
|
|
48
|
+
totalPages: parseInt(response.headers.get("X-WP-TotalPages") || "0", 10) || undefined,
|
|
49
|
+
total: parseInt(response.headers.get("X-WP-Total") || "0", 10) || undefined,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** GET shorthand */
|
|
53
|
+
async get(endpoint, params) {
|
|
54
|
+
return this.request(endpoint, { params });
|
|
55
|
+
}
|
|
56
|
+
/** POST shorthand */
|
|
57
|
+
async post(endpoint, body, params) {
|
|
58
|
+
return this.request(endpoint, { method: "POST", body, params });
|
|
59
|
+
}
|
|
60
|
+
/** PUT shorthand */
|
|
61
|
+
async put(endpoint, body) {
|
|
62
|
+
return this.request(endpoint, { method: "PUT", body });
|
|
63
|
+
}
|
|
64
|
+
/** DELETE shorthand */
|
|
65
|
+
async delete(endpoint, params) {
|
|
66
|
+
return this.request(endpoint, { method: "DELETE", params });
|
|
67
|
+
}
|
|
68
|
+
/** Test connection by fetching site info */
|
|
69
|
+
async testConnection() {
|
|
70
|
+
try {
|
|
71
|
+
const url = `${this.baseUrl}/wp-json`;
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
headers: { Authorization: this.authHeader },
|
|
74
|
+
});
|
|
75
|
+
return response.ok;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Create a client from environment variables */
|
|
83
|
+
export function createClientFromEnv() {
|
|
84
|
+
const baseUrl = process.env.WP_API_URL;
|
|
85
|
+
const username = process.env.WP_API_USERNAME;
|
|
86
|
+
const password = process.env.WP_API_PASSWORD;
|
|
87
|
+
if (!baseUrl) {
|
|
88
|
+
throw new Error("Missing WP_API_URL environment variable. " +
|
|
89
|
+
'Set it to your WordPress site URL (e.g., "https://example.com").');
|
|
90
|
+
}
|
|
91
|
+
if (!username) {
|
|
92
|
+
throw new Error("Missing WP_API_USERNAME environment variable. " +
|
|
93
|
+
"Set it to your WordPress username.");
|
|
94
|
+
}
|
|
95
|
+
if (!password) {
|
|
96
|
+
throw new Error("Missing WP_API_PASSWORD environment variable. " +
|
|
97
|
+
"Set it to a WordPress Application Password " +
|
|
98
|
+
"(Users → Your Profile → Application Passwords).");
|
|
99
|
+
}
|
|
100
|
+
return new WordPressClient({ baseUrl, username, password });
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=wp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wp-client.js","sourceRoot":"","sources":["../../src/services/wp-client.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 registerContentTools(server: McpServer, client: WordPressClient): void;
|
|
4
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/tools/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAYhE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CA8OrF"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ListPagesSchema, ListMediaSchema, SearchSchema, ListCommentsSchema, ListUsersSchema, SiteInfoSchema, } from "../schemas/index.js";
|
|
2
|
+
import { paginationInfo, stripHtml, truncateIfNeeded } from "../services/formatters.js";
|
|
3
|
+
export function registerContentTools(server, client) {
|
|
4
|
+
// ---- wp_list_pages ----
|
|
5
|
+
server.registerTool("wp_list_pages", {
|
|
6
|
+
title: "List WordPress Pages",
|
|
7
|
+
description: `List WordPress pages with filtering and pagination.
|
|
8
|
+
|
|
9
|
+
Args:
|
|
10
|
+
- per_page, page, status, parent, orderby, order, search
|
|
11
|
+
|
|
12
|
+
Returns: Array of page summaries.`,
|
|
13
|
+
inputSchema: ListPagesSchema,
|
|
14
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
15
|
+
}, async (params) => {
|
|
16
|
+
const { data: pages, total, totalPages } = await client.get("/pages", {
|
|
17
|
+
per_page: params.per_page,
|
|
18
|
+
page: params.page,
|
|
19
|
+
status: params.status,
|
|
20
|
+
parent: params.parent,
|
|
21
|
+
orderby: params.orderby,
|
|
22
|
+
order: params.order,
|
|
23
|
+
search: params.search,
|
|
24
|
+
});
|
|
25
|
+
const results = pages.map((p) => ({
|
|
26
|
+
id: p.id,
|
|
27
|
+
title: stripHtml(p.title.rendered),
|
|
28
|
+
date: p.date,
|
|
29
|
+
slug: p.slug,
|
|
30
|
+
status: p.status,
|
|
31
|
+
link: p.link,
|
|
32
|
+
parent: p.parent,
|
|
33
|
+
menu_order: p.menu_order,
|
|
34
|
+
}));
|
|
35
|
+
const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
|
|
36
|
+
const text = truncateIfNeeded(JSON.stringify({ pages: results, pagination }, null, 2));
|
|
37
|
+
return { content: [{ type: "text", text }] };
|
|
38
|
+
});
|
|
39
|
+
// ---- wp_list_media ----
|
|
40
|
+
server.registerTool("wp_list_media", {
|
|
41
|
+
title: "List WordPress Media",
|
|
42
|
+
description: `List media files in the WordPress library.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
- per_page, page, media_type (image/video/audio/application), search
|
|
46
|
+
|
|
47
|
+
Returns: Array of media items with URLs and metadata.`,
|
|
48
|
+
inputSchema: ListMediaSchema,
|
|
49
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
50
|
+
}, async (params) => {
|
|
51
|
+
const { data: media, total, totalPages } = await client.get("/media", {
|
|
52
|
+
per_page: params.per_page,
|
|
53
|
+
page: params.page,
|
|
54
|
+
media_type: params.media_type,
|
|
55
|
+
search: params.search,
|
|
56
|
+
});
|
|
57
|
+
const results = media.map((m) => ({
|
|
58
|
+
id: m.id,
|
|
59
|
+
title: stripHtml(m.title.rendered),
|
|
60
|
+
date: m.date,
|
|
61
|
+
media_type: m.media_type,
|
|
62
|
+
mime_type: m.mime_type,
|
|
63
|
+
source_url: m.source_url,
|
|
64
|
+
alt_text: m.alt_text,
|
|
65
|
+
width: m.media_details?.width,
|
|
66
|
+
height: m.media_details?.height,
|
|
67
|
+
}));
|
|
68
|
+
const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
|
|
69
|
+
const text = truncateIfNeeded(JSON.stringify({ media: results, pagination }, null, 2));
|
|
70
|
+
return { content: [{ type: "text", text }] };
|
|
71
|
+
});
|
|
72
|
+
// ---- wp_search ----
|
|
73
|
+
server.registerTool("wp_search", {
|
|
74
|
+
title: "Search WordPress Content",
|
|
75
|
+
description: `Search across WordPress content (posts, pages, categories, tags).
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
- search (string): Search term (required)
|
|
79
|
+
- per_page (number): Results per page (default: 10)
|
|
80
|
+
- type (string): Filter by content type — post, page, category, tag
|
|
81
|
+
- subtype (string): Filter by subtype
|
|
82
|
+
|
|
83
|
+
Returns: Array of search results with id, title, url, type.`,
|
|
84
|
+
inputSchema: SearchSchema,
|
|
85
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
86
|
+
}, async (params) => {
|
|
87
|
+
const { data: results } = await client.get("/search", {
|
|
88
|
+
search: params.search,
|
|
89
|
+
per_page: params.per_page,
|
|
90
|
+
type: params.type,
|
|
91
|
+
subtype: params.subtype,
|
|
92
|
+
});
|
|
93
|
+
const formatted = results.map((r) => ({
|
|
94
|
+
id: r.id,
|
|
95
|
+
title: r.title,
|
|
96
|
+
url: r.url,
|
|
97
|
+
type: r.type,
|
|
98
|
+
subtype: r.subtype,
|
|
99
|
+
}));
|
|
100
|
+
const text = JSON.stringify({ results: formatted, count: formatted.length }, null, 2);
|
|
101
|
+
return { content: [{ type: "text", text }] };
|
|
102
|
+
});
|
|
103
|
+
// ---- wp_list_comments ----
|
|
104
|
+
server.registerTool("wp_list_comments", {
|
|
105
|
+
title: "List WordPress Comments",
|
|
106
|
+
description: `List comments with filtering by post and status.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
- per_page, page, post (post ID), status (approve/hold/spam/trash)
|
|
110
|
+
|
|
111
|
+
Returns: Array of comments.`,
|
|
112
|
+
inputSchema: ListCommentsSchema,
|
|
113
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
114
|
+
}, async (params) => {
|
|
115
|
+
const { data: comments, total, totalPages } = await client.get("/comments", {
|
|
116
|
+
per_page: params.per_page,
|
|
117
|
+
page: params.page,
|
|
118
|
+
post: params.post,
|
|
119
|
+
status: params.status,
|
|
120
|
+
});
|
|
121
|
+
const results = comments.map((c) => ({
|
|
122
|
+
id: c.id,
|
|
123
|
+
post: c.post,
|
|
124
|
+
author_name: c.author_name,
|
|
125
|
+
date: c.date,
|
|
126
|
+
content: stripHtml(c.content.rendered).substring(0, 300),
|
|
127
|
+
status: c.status,
|
|
128
|
+
parent: c.parent,
|
|
129
|
+
}));
|
|
130
|
+
const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
|
|
131
|
+
const text = truncateIfNeeded(JSON.stringify({ comments: results, pagination }, null, 2));
|
|
132
|
+
return { content: [{ type: "text", text }] };
|
|
133
|
+
});
|
|
134
|
+
// ---- wp_list_users ----
|
|
135
|
+
server.registerTool("wp_list_users", {
|
|
136
|
+
title: "List WordPress Users",
|
|
137
|
+
description: `List WordPress users with filtering.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
- per_page, page, roles (comma-separated), search
|
|
141
|
+
|
|
142
|
+
Returns: Array of users with id, name, slug, description.`,
|
|
143
|
+
inputSchema: ListUsersSchema,
|
|
144
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
145
|
+
}, async (params) => {
|
|
146
|
+
const { data: users, total, totalPages } = await client.get("/users", {
|
|
147
|
+
per_page: params.per_page,
|
|
148
|
+
page: params.page,
|
|
149
|
+
roles: params.roles,
|
|
150
|
+
search: params.search,
|
|
151
|
+
});
|
|
152
|
+
const results = users.map((u) => ({
|
|
153
|
+
id: u.id,
|
|
154
|
+
name: u.name,
|
|
155
|
+
slug: u.slug,
|
|
156
|
+
description: u.description || null,
|
|
157
|
+
link: u.link,
|
|
158
|
+
}));
|
|
159
|
+
const pagination = paginationInfo(params.page, params.per_page, total, totalPages);
|
|
160
|
+
const text = JSON.stringify({ users: results, pagination }, null, 2);
|
|
161
|
+
return { content: [{ type: "text", text }] };
|
|
162
|
+
});
|
|
163
|
+
// ---- wp_site_info ----
|
|
164
|
+
server.registerTool("wp_site_info", {
|
|
165
|
+
title: "Get WordPress Site Info",
|
|
166
|
+
description: `Get WordPress site information including name, description, URL, and timezone.
|
|
167
|
+
|
|
168
|
+
Returns: Site name, description, URL, GMT offset, timezone.`,
|
|
169
|
+
inputSchema: SiteInfoSchema,
|
|
170
|
+
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
171
|
+
}, async () => {
|
|
172
|
+
// Fetch from /wp-json root (not /wp/v2)
|
|
173
|
+
const url = `${process.env.WP_API_URL}/wp-json`;
|
|
174
|
+
const auth = `Basic ${Buffer.from(`${process.env.WP_API_USERNAME}:${process.env.WP_API_PASSWORD}`).toString("base64")}`;
|
|
175
|
+
const response = await fetch(url, { headers: { Authorization: auth } });
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new Error(`Failed to fetch site info: ${response.status}`);
|
|
178
|
+
}
|
|
179
|
+
const data = (await response.json());
|
|
180
|
+
return {
|
|
181
|
+
content: [
|
|
182
|
+
{
|
|
183
|
+
type: "text",
|
|
184
|
+
text: JSON.stringify({
|
|
185
|
+
name: data.name,
|
|
186
|
+
description: data.description,
|
|
187
|
+
url: data.url,
|
|
188
|
+
home: data.home,
|
|
189
|
+
timezone: data.timezone_string || `GMT${data.gmt_offset >= 0 ? "+" : ""}${data.gmt_offset}`,
|
|
190
|
+
}, null, 2),
|
|
191
|
+
},
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=content.js.map
|