mcp-wordpress 1.1.7 → 1.2.2

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 (255) hide show
  1. package/README.md +388 -66
  2. package/dist/cache/CacheInvalidation.d.ts +118 -0
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -0
  4. package/dist/cache/CacheInvalidation.js +349 -0
  5. package/dist/cache/CacheInvalidation.js.map +1 -0
  6. package/dist/cache/CacheManager.d.ts +143 -0
  7. package/dist/cache/CacheManager.d.ts.map +1 -0
  8. package/dist/cache/CacheManager.js +308 -0
  9. package/dist/cache/CacheManager.js.map +1 -0
  10. package/dist/cache/HttpCacheWrapper.d.ts +121 -0
  11. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -0
  12. package/dist/cache/HttpCacheWrapper.js +280 -0
  13. package/dist/cache/HttpCacheWrapper.js.map +1 -0
  14. package/dist/cache/__tests__/CacheInvalidation.test.d.ts +5 -0
  15. package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +1 -0
  16. package/dist/cache/__tests__/CacheInvalidation.test.js +236 -0
  17. package/dist/cache/__tests__/CacheInvalidation.test.js.map +1 -0
  18. package/dist/cache/__tests__/CacheManager.test.d.ts +5 -0
  19. package/dist/cache/__tests__/CacheManager.test.d.ts.map +1 -0
  20. package/dist/cache/__tests__/CacheManager.test.js +233 -0
  21. package/dist/cache/__tests__/CacheManager.test.js.map +1 -0
  22. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +5 -0
  23. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +1 -0
  24. package/dist/cache/__tests__/CachedWordPressClient.test.js +228 -0
  25. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +1 -0
  26. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +5 -0
  27. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +1 -0
  28. package/dist/cache/__tests__/HttpCacheWrapper.test.js +296 -0
  29. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +1 -0
  30. package/dist/cache/index.d.ts +12 -0
  31. package/dist/cache/index.d.ts.map +1 -0
  32. package/dist/cache/index.js +9 -0
  33. package/dist/cache/index.js.map +1 -0
  34. package/dist/client/CachedWordPressClient.d.ts +160 -0
  35. package/dist/client/CachedWordPressClient.d.ts.map +1 -0
  36. package/dist/client/CachedWordPressClient.js +338 -0
  37. package/dist/client/CachedWordPressClient.js.map +1 -0
  38. package/dist/client/WordPressClient.d.ts +81 -0
  39. package/dist/client/WordPressClient.d.ts.map +1 -0
  40. package/dist/client/WordPressClient.js +354 -0
  41. package/dist/client/WordPressClient.js.map +1 -0
  42. package/dist/config/ConfigurationSchema.d.ts +281 -0
  43. package/dist/config/ConfigurationSchema.d.ts.map +1 -0
  44. package/dist/config/ConfigurationSchema.js +205 -0
  45. package/dist/config/ConfigurationSchema.js.map +1 -0
  46. package/dist/config/ServerConfiguration.d.ts +38 -0
  47. package/dist/config/ServerConfiguration.d.ts.map +1 -0
  48. package/dist/config/ServerConfiguration.js +158 -0
  49. package/dist/config/ServerConfiguration.js.map +1 -0
  50. package/dist/docs/DocumentationGenerator.d.ts +184 -0
  51. package/dist/docs/DocumentationGenerator.d.ts.map +1 -0
  52. package/dist/docs/DocumentationGenerator.js +735 -0
  53. package/dist/docs/DocumentationGenerator.js.map +1 -0
  54. package/dist/docs/MarkdownFormatter.d.ts +84 -0
  55. package/dist/docs/MarkdownFormatter.d.ts.map +1 -0
  56. package/dist/docs/MarkdownFormatter.js +448 -0
  57. package/dist/docs/MarkdownFormatter.js.map +1 -0
  58. package/dist/docs/index.d.ts +8 -0
  59. package/dist/docs/index.d.ts.map +1 -0
  60. package/dist/docs/index.js +7 -0
  61. package/dist/docs/index.js.map +1 -0
  62. package/dist/index.d.ts +1 -4
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +12 -212
  65. package/dist/index.js.map +1 -1
  66. package/dist/performance/AnomalyDetector.d.ts +63 -0
  67. package/dist/performance/AnomalyDetector.d.ts.map +1 -0
  68. package/dist/performance/AnomalyDetector.js +222 -0
  69. package/dist/performance/AnomalyDetector.js.map +1 -0
  70. package/dist/performance/BenchmarkAnalyzer.d.ts +67 -0
  71. package/dist/performance/BenchmarkAnalyzer.d.ts.map +1 -0
  72. package/dist/performance/BenchmarkAnalyzer.js +301 -0
  73. package/dist/performance/BenchmarkAnalyzer.js.map +1 -0
  74. package/dist/performance/MetricsCollector.d.ts +139 -0
  75. package/dist/performance/MetricsCollector.d.ts.map +1 -0
  76. package/dist/performance/MetricsCollector.js +320 -0
  77. package/dist/performance/MetricsCollector.js.map +1 -0
  78. package/dist/performance/PerformanceAnalytics.d.ts +162 -0
  79. package/dist/performance/PerformanceAnalytics.d.ts.map +1 -0
  80. package/dist/performance/PerformanceAnalytics.js +554 -0
  81. package/dist/performance/PerformanceAnalytics.js.map +1 -0
  82. package/dist/performance/PerformanceMonitor.d.ts +202 -0
  83. package/dist/performance/PerformanceMonitor.d.ts.map +1 -0
  84. package/dist/performance/PerformanceMonitor.js +478 -0
  85. package/dist/performance/PerformanceMonitor.js.map +1 -0
  86. package/dist/performance/TrendAnalyzer.d.ts +69 -0
  87. package/dist/performance/TrendAnalyzer.d.ts.map +1 -0
  88. package/dist/performance/TrendAnalyzer.js +203 -0
  89. package/dist/performance/TrendAnalyzer.js.map +1 -0
  90. package/dist/performance/index.d.ts +11 -0
  91. package/dist/performance/index.d.ts.map +1 -0
  92. package/dist/performance/index.js +8 -0
  93. package/dist/performance/index.js.map +1 -0
  94. package/dist/security/InputValidator.d.ts +215 -0
  95. package/dist/security/InputValidator.d.ts.map +1 -0
  96. package/dist/security/InputValidator.js +278 -0
  97. package/dist/security/InputValidator.js.map +1 -0
  98. package/dist/security/SecurityConfig.d.ts +129 -0
  99. package/dist/security/SecurityConfig.d.ts.map +1 -0
  100. package/dist/security/SecurityConfig.js +262 -0
  101. package/dist/security/SecurityConfig.js.map +1 -0
  102. package/dist/server/ConnectionTester.d.ts +24 -0
  103. package/dist/server/ConnectionTester.d.ts.map +1 -0
  104. package/dist/server/ConnectionTester.js +61 -0
  105. package/dist/server/ConnectionTester.js.map +1 -0
  106. package/dist/server/ToolRegistry.d.ts +46 -0
  107. package/dist/server/ToolRegistry.d.ts.map +1 -0
  108. package/dist/server/ToolRegistry.js +148 -0
  109. package/dist/server/ToolRegistry.js.map +1 -0
  110. package/dist/tools/BaseToolClass.d.ts +76 -0
  111. package/dist/tools/BaseToolClass.d.ts.map +1 -0
  112. package/dist/tools/BaseToolClass.js +104 -0
  113. package/dist/tools/BaseToolClass.js.map +1 -0
  114. package/dist/tools/BaseToolManager.d.ts +26 -0
  115. package/dist/tools/BaseToolManager.d.ts.map +1 -0
  116. package/dist/tools/BaseToolManager.js +56 -0
  117. package/dist/tools/BaseToolManager.js.map +1 -0
  118. package/dist/tools/base.d.ts +37 -0
  119. package/dist/tools/base.d.ts.map +1 -0
  120. package/dist/tools/base.js +60 -0
  121. package/dist/tools/base.js.map +1 -0
  122. package/dist/tools/cache.d.ts +260 -0
  123. package/dist/tools/cache.d.ts.map +1 -0
  124. package/dist/tools/cache.js +237 -0
  125. package/dist/tools/cache.js.map +1 -0
  126. package/dist/tools/index.d.ts +2 -0
  127. package/dist/tools/index.d.ts.map +1 -1
  128. package/dist/tools/index.js +2 -0
  129. package/dist/tools/index.js.map +1 -1
  130. package/dist/tools/performance.d.ts +63 -0
  131. package/dist/tools/performance.d.ts.map +1 -0
  132. package/dist/tools/performance.js +865 -0
  133. package/dist/tools/performance.js.map +1 -0
  134. package/dist/types/client.d.ts +1 -0
  135. package/dist/types/client.d.ts.map +1 -1
  136. package/dist/types/client.js.map +1 -1
  137. package/dist/utils/toolWrapper.d.ts +4 -0
  138. package/dist/utils/toolWrapper.d.ts.map +1 -1
  139. package/dist/utils/toolWrapper.js +11 -0
  140. package/dist/utils/toolWrapper.js.map +1 -1
  141. package/dist/utils/validation.d.ts +68 -0
  142. package/dist/utils/validation.d.ts.map +1 -0
  143. package/dist/utils/validation.js +185 -0
  144. package/dist/utils/validation.js.map +1 -0
  145. package/docs/CACHING.md +340 -0
  146. package/docs/DOCKER.md +451 -0
  147. package/docs/PERFORMANCE_MONITORING.md +471 -0
  148. package/docs/SECURITY_TESTING.md +393 -0
  149. package/docs/api/README.md +200 -0
  150. package/docs/api/categories/auth.md +40 -0
  151. package/docs/api/categories/cache.md +41 -0
  152. package/docs/api/categories/comment.md +44 -0
  153. package/docs/api/categories/media.md +43 -0
  154. package/docs/api/categories/page.md +43 -0
  155. package/docs/api/categories/performance.md +44 -0
  156. package/docs/api/categories/post.md +43 -0
  157. package/docs/api/categories/site.md +43 -0
  158. package/docs/api/categories/taxonomy.md +47 -0
  159. package/docs/api/categories/user.md +43 -0
  160. package/docs/api/openapi.json +3305 -0
  161. package/docs/api/summary.json +12 -0
  162. package/docs/api/tools/wp_approve_comment.md +98 -0
  163. package/docs/api/tools/wp_cache_clear.md +120 -0
  164. package/docs/api/tools/wp_cache_info.md +119 -0
  165. package/docs/api/tools/wp_cache_stats.md +119 -0
  166. package/docs/api/tools/wp_cache_warm.md +119 -0
  167. package/docs/api/tools/wp_create_application_password.md +102 -0
  168. package/docs/api/tools/wp_create_category.md +102 -0
  169. package/docs/api/tools/wp_create_comment.md +128 -0
  170. package/docs/api/tools/wp_create_page.md +135 -0
  171. package/docs/api/tools/wp_create_post.md +147 -0
  172. package/docs/api/tools/wp_create_tag.md +101 -0
  173. package/docs/api/tools/wp_create_user.md +135 -0
  174. package/docs/api/tools/wp_delete_application_password.md +101 -0
  175. package/docs/api/tools/wp_delete_category.md +100 -0
  176. package/docs/api/tools/wp_delete_comment.md +101 -0
  177. package/docs/api/tools/wp_delete_media.md +108 -0
  178. package/docs/api/tools/wp_delete_page.md +108 -0
  179. package/docs/api/tools/wp_delete_post.md +117 -0
  180. package/docs/api/tools/wp_delete_tag.md +100 -0
  181. package/docs/api/tools/wp_delete_user.md +108 -0
  182. package/docs/api/tools/wp_get_application_passwords.md +103 -0
  183. package/docs/api/tools/wp_get_auth_status.md +101 -0
  184. package/docs/api/tools/wp_get_category.md +103 -0
  185. package/docs/api/tools/wp_get_comment.md +103 -0
  186. package/docs/api/tools/wp_get_current_user.md +101 -0
  187. package/docs/api/tools/wp_get_media.md +103 -0
  188. package/docs/api/tools/wp_get_page.md +103 -0
  189. package/docs/api/tools/wp_get_page_revisions.md +103 -0
  190. package/docs/api/tools/wp_get_post.md +112 -0
  191. package/docs/api/tools/wp_get_post_revisions.md +103 -0
  192. package/docs/api/tools/wp_get_site_settings.md +108 -0
  193. package/docs/api/tools/wp_get_tag.md +103 -0
  194. package/docs/api/tools/wp_get_user.md +103 -0
  195. package/docs/api/tools/wp_list_categories.md +111 -0
  196. package/docs/api/tools/wp_list_comments.md +111 -0
  197. package/docs/api/tools/wp_list_media.md +145 -0
  198. package/docs/api/tools/wp_list_pages.md +145 -0
  199. package/docs/api/tools/wp_list_posts.md +156 -0
  200. package/docs/api/tools/wp_list_tags.md +110 -0
  201. package/docs/api/tools/wp_list_users.md +111 -0
  202. package/docs/api/tools/wp_performance_alerts.md +162 -0
  203. package/docs/api/tools/wp_performance_benchmark.md +160 -0
  204. package/docs/api/tools/wp_performance_export.md +162 -0
  205. package/docs/api/tools/wp_performance_history.md +161 -0
  206. package/docs/api/tools/wp_performance_optimize.md +162 -0
  207. package/docs/api/tools/wp_performance_stats.md +160 -0
  208. package/docs/api/tools/wp_search_site.md +99 -0
  209. package/docs/api/tools/wp_spam_comment.md +98 -0
  210. package/docs/api/tools/wp_switch_auth_method.md +122 -0
  211. package/docs/api/tools/wp_test_auth.md +96 -0
  212. package/docs/api/tools/wp_update_category.md +102 -0
  213. package/docs/api/tools/wp_update_comment.md +127 -0
  214. package/docs/api/tools/wp_update_media.md +129 -0
  215. package/docs/api/tools/wp_update_page.md +135 -0
  216. package/docs/api/tools/wp_update_post.md +144 -0
  217. package/docs/api/tools/wp_update_site_settings.md +127 -0
  218. package/docs/api/tools/wp_update_tag.md +102 -0
  219. package/docs/api/tools/wp_update_user.md +134 -0
  220. package/docs/api/tools/wp_upload_media.md +131 -0
  221. package/docs/api/types/WordPressPost.md +39 -0
  222. package/docs/contract-testing.md +183 -0
  223. package/docs/developer/NPM_AUTH_SETUP.md +3 -3
  224. package/docs/wordpress-rest-api-authentication-troubleshooting.md +218 -0
  225. package/package.json +84 -64
  226. package/src/cache/CacheInvalidation.ts +421 -0
  227. package/src/cache/CacheManager.ts +391 -0
  228. package/src/cache/HttpCacheWrapper.ts +372 -0
  229. package/src/cache/__tests__/CacheInvalidation.test.ts +299 -0
  230. package/src/cache/__tests__/CacheManager.test.ts +300 -0
  231. package/src/cache/__tests__/CachedWordPressClient.test.ts +304 -0
  232. package/src/cache/__tests__/HttpCacheWrapper.test.ts +359 -0
  233. package/src/cache/index.ts +26 -0
  234. package/src/client/CachedWordPressClient.ts +442 -0
  235. package/src/config/ConfigurationSchema.ts +246 -0
  236. package/src/config/ServerConfiguration.ts +215 -0
  237. package/src/docs/DocumentationGenerator.ts +952 -0
  238. package/src/docs/MarkdownFormatter.ts +494 -0
  239. package/src/docs/index.ts +21 -0
  240. package/src/index.ts +14 -274
  241. package/src/performance/MetricsCollector.ts +447 -0
  242. package/src/performance/PerformanceAnalytics.ts +762 -0
  243. package/src/performance/PerformanceMonitor.ts +649 -0
  244. package/src/performance/index.ts +28 -0
  245. package/src/security/InputValidator.ts +319 -0
  246. package/src/security/SecurityConfig.ts +301 -0
  247. package/src/server/ConnectionTester.ts +74 -0
  248. package/src/server/ToolRegistry.ts +194 -0
  249. package/src/tools/BaseToolManager.ts +66 -0
  250. package/src/tools/cache.ts +259 -0
  251. package/src/tools/index.ts +2 -0
  252. package/src/tools/performance.ts +948 -0
  253. package/src/types/client.ts +1 -0
  254. package/src/utils/toolWrapper.ts +11 -0
  255. package/src/utils/validation.ts +259 -0
@@ -0,0 +1,735 @@
1
+ /**
2
+ * Comprehensive API Documentation Auto-Generation System
3
+ * Extracts documentation from tool classes, types, and WordPress mappings
4
+ */
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as Tools from '../tools/index.js';
8
+ /**
9
+ * Main Documentation Generator
10
+ */
11
+ export class DocumentationGenerator {
12
+ config;
13
+ toolCategories = new Map();
14
+ wordpressEndpoints = new Map();
15
+ constructor(config = {}) {
16
+ this.config = {
17
+ outputDir: 'docs/api',
18
+ includeExamples: true,
19
+ includeWordPressMapping: true,
20
+ generateOpenAPI: true,
21
+ generateInteractiveHtml: true,
22
+ validateExamples: false,
23
+ ...config
24
+ };
25
+ this.initializeWordPressMapping();
26
+ this.initializeToolCategories();
27
+ }
28
+ /**
29
+ * Generate complete documentation for all tools and types
30
+ */
31
+ async generateFullDocumentation() {
32
+ console.log('🚀 Starting API documentation generation...');
33
+ const tools = await this.extractAllToolDocumentation();
34
+ const categories = this.generateCategoryDocumentation(tools);
35
+ const types = await this.extractTypeDocumentation();
36
+ let openApiSpec = undefined;
37
+ if (this.config.generateOpenAPI) {
38
+ openApiSpec = this.generateOpenAPISpecification(tools, types);
39
+ }
40
+ const summary = this.generateDocumentationSummary(tools, categories, types);
41
+ const output = {
42
+ tools,
43
+ categories,
44
+ types,
45
+ openApiSpec,
46
+ summary
47
+ };
48
+ // Write documentation to files
49
+ await this.writeDocumentationFiles(output);
50
+ console.log(`✅ Documentation generation complete! ${tools.length} tools documented.`);
51
+ return output;
52
+ }
53
+ /**
54
+ * Extract documentation from all tool classes
55
+ */
56
+ async extractAllToolDocumentation() {
57
+ const toolDocs = [];
58
+ // Iterate through all tool classes
59
+ for (const [className, ToolClass] of Object.entries(Tools)) {
60
+ try {
61
+ // Create tool instance
62
+ let toolInstance;
63
+ if (className === 'CacheTools' || className === 'PerformanceTools') {
64
+ // These tools need client map - use empty map for doc generation
65
+ toolInstance = new ToolClass(new Map());
66
+ }
67
+ else {
68
+ toolInstance = new ToolClass();
69
+ }
70
+ const toolDefinitions = toolInstance.getTools();
71
+ const category = this.extractCategoryFromClassName(className);
72
+ for (const toolDef of toolDefinitions) {
73
+ const doc = await this.extractToolDocumentation(toolDef, category, className);
74
+ toolDocs.push(doc);
75
+ }
76
+ }
77
+ catch (error) {
78
+ console.warn(`⚠️ Failed to extract documentation for ${className}:`, error);
79
+ }
80
+ }
81
+ return toolDocs.sort((a, b) => a.name.localeCompare(b.name));
82
+ }
83
+ /**
84
+ * Extract documentation for a single tool
85
+ */
86
+ async extractToolDocumentation(toolDef, category, className) {
87
+ const parameters = this.extractParameterDocumentation(toolDef.parameters || []);
88
+ const examples = this.generateToolExamples(toolDef, category);
89
+ const wordpressEndpoint = this.wordpressEndpoints.get(toolDef.name);
90
+ const returnType = this.inferReturnType(toolDef.name, category);
91
+ const errorCodes = this.generateErrorDocumentation(toolDef.name);
92
+ const relatedTools = this.findRelatedTools(toolDef.name, category);
93
+ return {
94
+ name: toolDef.name,
95
+ category,
96
+ description: toolDef.description || `${category} tool: ${toolDef.name}`,
97
+ parameters,
98
+ examples,
99
+ wordpressEndpoint,
100
+ requiredPermissions: this.getRequiredPermissions(toolDef.name),
101
+ returnType,
102
+ errorCodes,
103
+ relatedTools
104
+ };
105
+ }
106
+ /**
107
+ * Extract parameter documentation
108
+ */
109
+ extractParameterDocumentation(parameters) {
110
+ return parameters.map(param => ({
111
+ name: param.name,
112
+ type: param.type || 'string',
113
+ required: param.required || false,
114
+ description: param.description || `${param.name} parameter`,
115
+ defaultValue: this.getDefaultValue(param),
116
+ allowedValues: this.getAllowedValues(param) || undefined,
117
+ examples: this.generateParameterExamples(param)
118
+ }));
119
+ }
120
+ /**
121
+ * Generate usage examples for tools
122
+ */
123
+ generateToolExamples(toolDef, category) {
124
+ const examples = [];
125
+ // Basic usage example
126
+ const basicExample = this.generateBasicExample(toolDef, category);
127
+ if (basicExample) {
128
+ examples.push(basicExample);
129
+ }
130
+ // Multi-site example (if applicable)
131
+ if (this.supportsMultiSite(toolDef)) {
132
+ const multiSiteExample = this.generateMultiSiteExample(toolDef, category);
133
+ if (multiSiteExample) {
134
+ examples.push(multiSiteExample);
135
+ }
136
+ }
137
+ // Advanced example with all parameters
138
+ const advancedExample = this.generateAdvancedExample(toolDef, category);
139
+ if (advancedExample) {
140
+ examples.push(advancedExample);
141
+ }
142
+ return examples;
143
+ }
144
+ /**
145
+ * Generate basic usage example
146
+ */
147
+ generateBasicExample(toolDef, category) {
148
+ const toolName = toolDef.name;
149
+ const basicParams = {};
150
+ // Add essential parameters
151
+ const requiredParams = (toolDef.parameters || []).filter(p => p.required);
152
+ for (const param of requiredParams.slice(0, 2)) { // Limit to 2 for basic example
153
+ basicParams[param.name] = this.generateExampleValue(param);
154
+ }
155
+ return {
156
+ title: `Basic ${category} Usage`,
157
+ description: `Simple example of using ${toolName}`,
158
+ command: toolName,
159
+ parameters: basicParams,
160
+ expectedResponse: this.generateExpectedResponse(toolName, category, 'basic'),
161
+ errorExample: {
162
+ scenario: 'Authentication failure',
163
+ error: {
164
+ error: 'Authentication failed',
165
+ message: 'Invalid credentials or insufficient permissions'
166
+ }
167
+ }
168
+ };
169
+ }
170
+ /**
171
+ * Generate multi-site example
172
+ */
173
+ generateMultiSiteExample(toolDef, category) {
174
+ const params = { site: 'site1', ...this.getExampleParameters(toolDef, 1) };
175
+ return {
176
+ title: `Multi-Site ${category} Usage`,
177
+ description: `Using ${toolDef.name} with specific site targeting`,
178
+ command: toolDef.name,
179
+ parameters: params,
180
+ expectedResponse: this.generateExpectedResponse(toolDef.name, category, 'multisite')
181
+ };
182
+ }
183
+ /**
184
+ * Generate advanced example with all parameters
185
+ */
186
+ generateAdvancedExample(toolDef, category) {
187
+ const allParams = this.getExampleParameters(toolDef, 'all');
188
+ if (Object.keys(allParams).length <= 2) {
189
+ return null; // Skip if not enough parameters for advanced example
190
+ }
191
+ return {
192
+ title: `Advanced ${category} Configuration`,
193
+ description: 'Comprehensive example using all available parameters',
194
+ command: toolDef.name,
195
+ parameters: allParams,
196
+ expectedResponse: this.generateExpectedResponse(toolDef.name, category, 'advanced')
197
+ };
198
+ }
199
+ /**
200
+ * Generate category documentation
201
+ */
202
+ generateCategoryDocumentation(tools) {
203
+ const categories = new Map();
204
+ // Group tools by category
205
+ for (const tool of tools) {
206
+ if (!categories.has(tool.category)) {
207
+ categories.set(tool.category, []);
208
+ }
209
+ categories.get(tool.category).push(tool);
210
+ }
211
+ return Array.from(categories.entries()).map(([categoryName, categoryTools]) => ({
212
+ name: categoryName,
213
+ description: this.getCategoryDescription(categoryName),
214
+ toolCount: categoryTools.length,
215
+ tools: categoryTools.map(t => t.name).sort(),
216
+ usagePatterns: this.generateUsagePatterns(categoryName, categoryTools)
217
+ }));
218
+ }
219
+ /**
220
+ * Extract type documentation from TypeScript definitions
221
+ */
222
+ async extractTypeDocumentation() {
223
+ // This would analyze TypeScript files to extract type information
224
+ // For now, we'll provide key WordPress and MCP types
225
+ return [
226
+ {
227
+ name: 'WordPressPost',
228
+ description: 'WordPress blog post object',
229
+ properties: [
230
+ { name: 'id', type: 'number', required: true, description: 'Unique identifier' },
231
+ { name: 'title', type: 'string', required: true, description: 'Post title' },
232
+ { name: 'content', type: 'string', required: true, description: 'Post content' },
233
+ { name: 'status', type: 'string', required: true, description: 'Publication status' }
234
+ ],
235
+ examples: [this.generateWordPressPostExample()],
236
+ wordpressSource: '/wp-json/wp/v2/posts'
237
+ }
238
+ // Add more types as needed
239
+ ];
240
+ }
241
+ /**
242
+ * Generate OpenAPI specification
243
+ */
244
+ generateOpenAPISpecification(tools, types) {
245
+ const paths = {};
246
+ const components = {
247
+ schemas: {},
248
+ parameters: {},
249
+ responses: {}
250
+ };
251
+ // Convert tools to OpenAPI paths
252
+ for (const tool of tools) {
253
+ const path = `/tools/${tool.name}`;
254
+ paths[path] = {
255
+ post: {
256
+ summary: tool.description,
257
+ description: `Execute ${tool.name} MCP tool`,
258
+ tags: [tool.category],
259
+ requestBody: {
260
+ required: true,
261
+ content: {
262
+ 'application/json': {
263
+ schema: this.generateParameterSchema(tool.parameters)
264
+ }
265
+ }
266
+ },
267
+ responses: {
268
+ '200': {
269
+ description: 'Successful response',
270
+ content: {
271
+ 'application/json': {
272
+ schema: { type: 'object' }
273
+ }
274
+ }
275
+ },
276
+ '400': {
277
+ description: 'Bad request - invalid parameters'
278
+ },
279
+ '401': {
280
+ description: 'Authentication failed'
281
+ },
282
+ '500': {
283
+ description: 'Internal server error'
284
+ }
285
+ }
286
+ }
287
+ };
288
+ }
289
+ // Add type schemas to components
290
+ for (const type of types) {
291
+ components.schemas[type.name] = this.convertTypeToJsonSchema(type);
292
+ }
293
+ return {
294
+ openapi: '3.0.3',
295
+ info: {
296
+ title: 'WordPress MCP Server API',
297
+ description: 'Model Context Protocol server for WordPress management',
298
+ version: '1.2.0',
299
+ contact: {
300
+ name: 'MCP WordPress',
301
+ url: 'https://github.com/docdyhr/mcp-wordpress'
302
+ },
303
+ license: {
304
+ name: 'MIT',
305
+ url: 'https://opensource.org/licenses/MIT'
306
+ }
307
+ },
308
+ paths,
309
+ components
310
+ };
311
+ }
312
+ /**
313
+ * Write all documentation files
314
+ */
315
+ async writeDocumentationFiles(output) {
316
+ const outputDir = this.config.outputDir;
317
+ // Ensure output directory exists
318
+ await fs.promises.mkdir(outputDir, { recursive: true });
319
+ await fs.promises.mkdir(path.join(outputDir, 'tools'), { recursive: true });
320
+ await fs.promises.mkdir(path.join(outputDir, 'types'), { recursive: true });
321
+ await fs.promises.mkdir(path.join(outputDir, 'examples'), { recursive: true });
322
+ await fs.promises.mkdir(path.join(outputDir, 'categories'), { recursive: true });
323
+ // Write main API documentation
324
+ await this.writeApiOverview(output);
325
+ // Write individual tool documentation
326
+ for (const tool of output.tools) {
327
+ await this.writeToolDocumentation(tool);
328
+ }
329
+ // Write category documentation
330
+ for (const category of output.categories) {
331
+ await this.writeCategoryDocumentation(category);
332
+ }
333
+ // Write type documentation
334
+ for (const type of output.types) {
335
+ await this.writeTypeDocumentation(type);
336
+ }
337
+ // Write OpenAPI specification
338
+ if (output.openApiSpec) {
339
+ await fs.promises.writeFile(path.join(outputDir, 'openapi.json'), JSON.stringify(output.openApiSpec, null, 2));
340
+ }
341
+ // Write summary
342
+ await fs.promises.writeFile(path.join(outputDir, 'summary.json'), JSON.stringify(output.summary, null, 2));
343
+ console.log(`📁 Documentation written to ${outputDir}/`);
344
+ }
345
+ // Helper methods for specific documentation tasks...
346
+ extractCategoryFromClassName(className) {
347
+ return className.replace('Tools', '').toLowerCase();
348
+ }
349
+ initializeWordPressMapping() {
350
+ // Map MCP tools to WordPress REST API endpoints
351
+ this.wordpressEndpoints.set('wp_list_posts', '/wp-json/wp/v2/posts');
352
+ this.wordpressEndpoints.set('wp_get_post', '/wp-json/wp/v2/posts/{id}');
353
+ this.wordpressEndpoints.set('wp_create_post', '/wp-json/wp/v2/posts');
354
+ this.wordpressEndpoints.set('wp_update_post', '/wp-json/wp/v2/posts/{id}');
355
+ this.wordpressEndpoints.set('wp_delete_post', '/wp-json/wp/v2/posts/{id}');
356
+ // Add more mappings...
357
+ }
358
+ initializeToolCategories() {
359
+ this.toolCategories.set('Posts', ['wp_list_posts', 'wp_get_post', 'wp_create_post', 'wp_update_post', 'wp_delete_post', 'wp_search_posts']);
360
+ this.toolCategories.set('Pages', ['wp_list_pages', 'wp_get_page', 'wp_create_page', 'wp_update_page', 'wp_delete_page', 'wp_search_pages']);
361
+ // Add more categories...
362
+ }
363
+ generateDocumentationSummary(tools, categories, types) {
364
+ return {
365
+ totalTools: tools.length,
366
+ totalCategories: categories.length,
367
+ totalTypes: types.length,
368
+ lastUpdated: new Date().toISOString(),
369
+ version: '1.2.0',
370
+ coverage: {
371
+ toolsWithExamples: tools.filter(t => t.examples.length > 0).length,
372
+ toolsWithWordPressMapping: tools.filter(t => t.wordpressEndpoint).length,
373
+ typesDocumented: types.length
374
+ }
375
+ };
376
+ }
377
+ /**
378
+ * Helper methods for documentation generation
379
+ */
380
+ getDefaultValue(param) {
381
+ const defaults = {
382
+ 'per_page': 10,
383
+ 'page': 1,
384
+ 'order': 'desc',
385
+ 'orderby': 'date',
386
+ 'status': 'publish',
387
+ 'format': 'summary',
388
+ 'category': 'all',
389
+ 'includeExamples': true,
390
+ 'includeTrends': true
391
+ };
392
+ return defaults[param.name];
393
+ }
394
+ getAllowedValues(param) {
395
+ const allowedValues = {
396
+ 'status': ['publish', 'draft', 'private', 'pending', 'future'],
397
+ 'order': ['asc', 'desc'],
398
+ 'orderby': ['date', 'title', 'author', 'modified'],
399
+ 'format': ['summary', 'detailed', 'raw'],
400
+ 'category': ['overview', 'requests', 'cache', 'system', 'tools', 'all'],
401
+ 'timeframe': ['1h', '6h', '12h', '24h', '7d', '30d'],
402
+ 'priority': ['quick_wins', 'medium_term', 'long_term', 'all'],
403
+ 'focus': ['speed', 'reliability', 'efficiency', 'scaling']
404
+ };
405
+ return allowedValues[param.name];
406
+ }
407
+ generateParameterExamples(param) {
408
+ const examples = {
409
+ 'id': ['123', '456'],
410
+ 'title': ['My Blog Post', 'Hello World'],
411
+ 'content': ['<p>Post content here</p>', 'This is my post content'],
412
+ 'site': ['site1', 'production', 'staging'],
413
+ 'per_page': ['10', '20', '50'],
414
+ 'search': ['wordpress', 'tutorial'],
415
+ 'author': ['1', '2'],
416
+ 'email': ['user@example.com', 'admin@site.com'],
417
+ 'username': ['john_doe', 'admin'],
418
+ 'limit': ['10', '20', '50'],
419
+ 'timeframe': ['24h', '7d', '1h']
420
+ };
421
+ return examples[param.name] || ['example'];
422
+ }
423
+ supportsMultiSite(toolDef) {
424
+ // All tools support multi-site via the site parameter
425
+ return toolDef.parameters?.some(p => p.name === 'site') ?? true;
426
+ }
427
+ generateExampleValue(param) {
428
+ const exampleValues = {
429
+ 'id': 123,
430
+ 'title': 'Example Post Title',
431
+ 'content': 'This is example content for the post.',
432
+ 'site': 'site1',
433
+ 'per_page': 10,
434
+ 'page': 1,
435
+ 'search': 'wordpress',
436
+ 'author': 1,
437
+ 'email': 'user@example.com',
438
+ 'username': 'john_doe',
439
+ 'status': 'publish',
440
+ 'order': 'desc',
441
+ 'orderby': 'date',
442
+ 'limit': 20,
443
+ 'timeframe': '24h',
444
+ 'format': 'summary',
445
+ 'category': 'overview'
446
+ };
447
+ return exampleValues[param.name] || 'example_value';
448
+ }
449
+ generateExpectedResponse(toolName, category, type) {
450
+ if (toolName.includes('list')) {
451
+ return {
452
+ success: true,
453
+ data: [
454
+ { id: 1, title: `Example ${category} 1`, status: 'publish' },
455
+ { id: 2, title: `Example ${category} 2`, status: 'draft' }
456
+ ],
457
+ total: 2,
458
+ pages: 1
459
+ };
460
+ }
461
+ if (toolName.includes('get')) {
462
+ return {
463
+ success: true,
464
+ data: {
465
+ id: 123,
466
+ title: `Example ${category}`,
467
+ content: 'Example content',
468
+ status: 'publish',
469
+ date: '2024-01-01T00:00:00Z'
470
+ }
471
+ };
472
+ }
473
+ if (toolName.includes('create') || toolName.includes('update')) {
474
+ return {
475
+ success: true,
476
+ data: {
477
+ id: 123,
478
+ title: 'Created/Updated successfully',
479
+ status: 'publish'
480
+ }
481
+ };
482
+ }
483
+ if (toolName.includes('delete')) {
484
+ return {
485
+ success: true,
486
+ data: {
487
+ deleted: true,
488
+ id: 123
489
+ }
490
+ };
491
+ }
492
+ if (toolName.includes('performance')) {
493
+ return {
494
+ success: true,
495
+ data: {
496
+ overview: {
497
+ overallHealth: 'Good',
498
+ performanceScore: 85,
499
+ averageResponseTime: '245ms',
500
+ cacheHitRate: '87.5%'
501
+ }
502
+ }
503
+ };
504
+ }
505
+ return {
506
+ success: true,
507
+ data: {},
508
+ message: `${toolName} executed successfully`
509
+ };
510
+ }
511
+ getExampleParameters(toolDef, type) {
512
+ const params = {};
513
+ const parameters = toolDef.parameters || [];
514
+ if (type === 'all') {
515
+ // Include all parameters
516
+ for (const param of parameters) {
517
+ params[param.name] = this.generateExampleValue(param);
518
+ }
519
+ }
520
+ else if (typeof type === 'number') {
521
+ // Include limited number of parameters
522
+ for (const param of parameters.slice(0, type)) {
523
+ params[param.name] = this.generateExampleValue(param);
524
+ }
525
+ }
526
+ return params;
527
+ }
528
+ getCategoryDescription(categoryName) {
529
+ const descriptions = {
530
+ 'posts': 'Blog post creation, editing, and management tools',
531
+ 'pages': 'Static page creation and management tools',
532
+ 'media': 'File upload, management, and media library tools',
533
+ 'users': 'User account management and authentication tools',
534
+ 'comments': 'Comment moderation and management tools',
535
+ 'taxonomies': 'Category and tag management tools',
536
+ 'site': 'Site settings and configuration tools',
537
+ 'auth': 'Authentication testing and management tools',
538
+ 'cache': 'Performance caching and optimization tools',
539
+ 'performance': 'Performance monitoring and analytics tools'
540
+ };
541
+ return descriptions[categoryName.toLowerCase()] || `${categoryName} management tools`;
542
+ }
543
+ generateUsagePatterns(categoryName, tools) {
544
+ const patterns = {
545
+ 'posts': [
546
+ 'Create and publish blog posts',
547
+ 'Bulk edit multiple posts',
548
+ 'Search and filter posts by criteria',
549
+ 'Schedule posts for future publication'
550
+ ],
551
+ 'media': [
552
+ 'Upload images and files',
553
+ 'Organize media library',
554
+ 'Generate thumbnails and variants',
555
+ 'Bulk media operations'
556
+ ],
557
+ 'users': [
558
+ 'Manage user accounts and roles',
559
+ 'User authentication and permissions',
560
+ 'Bulk user operations',
561
+ 'User profile management'
562
+ ],
563
+ 'performance': [
564
+ 'Monitor real-time performance metrics',
565
+ 'Analyze historical performance trends',
566
+ 'Generate optimization recommendations',
567
+ 'Export performance reports'
568
+ ]
569
+ };
570
+ return patterns[categoryName.toLowerCase()] || [
571
+ `Manage ${categoryName.toLowerCase()} efficiently`,
572
+ `Bulk ${categoryName.toLowerCase()} operations`,
573
+ `Search and filter ${categoryName.toLowerCase()}`
574
+ ];
575
+ }
576
+ generateWordPressPostExample() {
577
+ return {
578
+ id: 123,
579
+ title: 'Welcome to WordPress',
580
+ content: '<p>This is your first post. Edit or delete it to get started!</p>',
581
+ status: 'publish',
582
+ date: '2024-01-01T00:00:00Z',
583
+ author: 1,
584
+ categories: [1],
585
+ tags: [1, 2],
586
+ featured_media: 0,
587
+ excerpt: 'A sample WordPress post',
588
+ slug: 'welcome-to-wordpress'
589
+ };
590
+ }
591
+ generateParameterSchema(parameters) {
592
+ const properties = {};
593
+ const required = [];
594
+ for (const param of parameters) {
595
+ properties[param.name] = {
596
+ type: param.type,
597
+ description: param.description
598
+ };
599
+ if (param.allowedValues) {
600
+ properties[param.name].enum = param.allowedValues;
601
+ }
602
+ if (param.defaultValue !== undefined) {
603
+ properties[param.name].default = param.defaultValue;
604
+ }
605
+ if (param.required) {
606
+ required.push(param.name);
607
+ }
608
+ }
609
+ return {
610
+ type: 'object',
611
+ properties,
612
+ required: required.length > 0 ? required : undefined
613
+ };
614
+ }
615
+ convertTypeToJsonSchema(type) {
616
+ const properties = {};
617
+ const required = [];
618
+ for (const prop of type.properties) {
619
+ properties[prop.name] = {
620
+ type: prop.type,
621
+ description: prop.description
622
+ };
623
+ if (prop.format) {
624
+ properties[prop.name].format = prop.format;
625
+ }
626
+ if (prop.required) {
627
+ required.push(prop.name);
628
+ }
629
+ }
630
+ return {
631
+ type: 'object',
632
+ description: type.description,
633
+ properties,
634
+ required: required.length > 0 ? required : undefined
635
+ };
636
+ }
637
+ inferReturnType(toolName, category) {
638
+ if (toolName.includes('list'))
639
+ return `${category}[]`;
640
+ if (toolName.includes('get'))
641
+ return category;
642
+ if (toolName.includes('create'))
643
+ return category;
644
+ if (toolName.includes('update'))
645
+ return category;
646
+ if (toolName.includes('delete'))
647
+ return 'DeleteResult';
648
+ if (toolName.includes('search'))
649
+ return `${category}[]`;
650
+ if (toolName.includes('performance'))
651
+ return 'PerformanceMetrics';
652
+ if (toolName.includes('cache'))
653
+ return 'CacheStats';
654
+ return 'object';
655
+ }
656
+ generateErrorDocumentation(toolName) {
657
+ return [
658
+ {
659
+ code: 'AUTHENTICATION_FAILED',
660
+ message: 'Authentication failed',
661
+ description: 'Invalid credentials or insufficient permissions',
662
+ resolution: 'Check your authentication credentials and user permissions'
663
+ },
664
+ {
665
+ code: 'VALIDATION_ERROR',
666
+ message: 'Parameter validation failed',
667
+ description: 'One or more required parameters are missing or invalid',
668
+ resolution: 'Review the required parameters and their formats'
669
+ },
670
+ {
671
+ code: 'NOT_FOUND',
672
+ message: 'Resource not found',
673
+ description: 'The requested resource does not exist',
674
+ resolution: 'Verify the resource ID and ensure it exists'
675
+ },
676
+ {
677
+ code: 'PERMISSION_DENIED',
678
+ message: 'Insufficient permissions',
679
+ description: 'The user does not have permission to perform this action',
680
+ resolution: 'Contact an administrator to grant the necessary permissions'
681
+ }
682
+ ];
683
+ }
684
+ findRelatedTools(toolName, category) {
685
+ // Find tools in the same category
686
+ const categoryTools = this.toolCategories.get(category) || [];
687
+ return categoryTools.filter(tool => tool !== toolName).slice(0, 3);
688
+ }
689
+ getRequiredPermissions(toolName) {
690
+ const permissions = {
691
+ 'wp_create_post': ['publish_posts', 'edit_posts'],
692
+ 'wp_update_post': ['edit_posts'],
693
+ 'wp_delete_post': ['delete_posts'],
694
+ 'wp_create_page': ['publish_pages', 'edit_pages'],
695
+ 'wp_update_page': ['edit_pages'],
696
+ 'wp_delete_page': ['delete_pages'],
697
+ 'wp_upload_media': ['upload_files'],
698
+ 'wp_delete_media': ['delete_files'],
699
+ 'wp_create_user': ['create_users'],
700
+ 'wp_update_user': ['edit_users'],
701
+ 'wp_delete_user': ['delete_users'],
702
+ 'wp_moderate_comment': ['moderate_comments'],
703
+ 'wp_get_site_settings': ['manage_options']
704
+ };
705
+ return permissions[toolName];
706
+ }
707
+ /**
708
+ * File writing implementations
709
+ */
710
+ async writeApiOverview(output) {
711
+ const { MarkdownFormatter } = await import('./MarkdownFormatter.js');
712
+ const formatter = new MarkdownFormatter();
713
+ const content = formatter.generateApiOverview(output);
714
+ await fs.promises.writeFile(path.join(this.config.outputDir, 'README.md'), content);
715
+ }
716
+ async writeToolDocumentation(tool) {
717
+ const { MarkdownFormatter } = await import('./MarkdownFormatter.js');
718
+ const formatter = new MarkdownFormatter();
719
+ const content = formatter.generateToolDocumentation(tool);
720
+ await fs.promises.writeFile(path.join(this.config.outputDir, 'tools', `${tool.name}.md`), content);
721
+ }
722
+ async writeCategoryDocumentation(category) {
723
+ const { MarkdownFormatter } = await import('./MarkdownFormatter.js');
724
+ const formatter = new MarkdownFormatter();
725
+ const content = formatter.generateCategoryDocumentation(category);
726
+ await fs.promises.writeFile(path.join(this.config.outputDir, 'categories', `${category.name.toLowerCase()}.md`), content);
727
+ }
728
+ async writeTypeDocumentation(type) {
729
+ const { MarkdownFormatter } = await import('./MarkdownFormatter.js');
730
+ const formatter = new MarkdownFormatter();
731
+ const content = formatter.generateTypeDocumentation(type);
732
+ await fs.promises.writeFile(path.join(this.config.outputDir, 'types', `${type.name}.md`), content);
733
+ }
734
+ }
735
+ //# sourceMappingURL=DocumentationGenerator.js.map