mcp-wordpress 2.6.3 → 2.7.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 (333) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/CacheInvalidation.d.ts +25 -6
  3. package/dist/cache/CacheInvalidation.d.ts.map +1 -1
  4. package/dist/cache/CacheInvalidation.js +168 -16
  5. package/dist/cache/CacheInvalidation.js.map +1 -1
  6. package/dist/cache/HttpCacheWrapper.d.ts.map +1 -1
  7. package/dist/cache/HttpCacheWrapper.js +3 -4
  8. package/dist/cache/HttpCacheWrapper.js.map +1 -1
  9. package/dist/cache/SEOCacheManager.d.ts +150 -0
  10. package/dist/cache/SEOCacheManager.d.ts.map +1 -0
  11. package/dist/cache/SEOCacheManager.js +275 -0
  12. package/dist/cache/SEOCacheManager.js.map +1 -0
  13. package/dist/client/SEOWordPressClient.d.ts +164 -0
  14. package/dist/client/SEOWordPressClient.d.ts.map +1 -0
  15. package/dist/client/SEOWordPressClient.js +674 -0
  16. package/dist/client/SEOWordPressClient.js.map +1 -0
  17. package/dist/client/api.d.ts.map +1 -1
  18. package/dist/client/api.js +50 -20
  19. package/dist/client/api.js.map +1 -1
  20. package/dist/client/auth.js +19 -19
  21. package/dist/client/auth.js.map +1 -1
  22. package/dist/client/index.d.ts +11 -0
  23. package/dist/client/index.d.ts.map +1 -0
  24. package/dist/client/index.js +14 -0
  25. package/dist/client/index.js.map +1 -0
  26. package/dist/client/managers/AuthManager.d.ts +39 -0
  27. package/dist/client/managers/AuthManager.d.ts.map +1 -0
  28. package/dist/client/managers/AuthManager.js +142 -0
  29. package/dist/client/managers/AuthManager.js.map +1 -0
  30. package/dist/client/managers/AuthenticationManager.d.ts.map +1 -1
  31. package/dist/client/managers/AuthenticationManager.js +10 -9
  32. package/dist/client/managers/AuthenticationManager.js.map +1 -1
  33. package/dist/client/managers/BaseManager.d.ts.map +1 -1
  34. package/dist/client/managers/BaseManager.js +12 -0
  35. package/dist/client/managers/BaseManager.js.map +1 -1
  36. package/dist/client/managers/ComposedAuthenticationManager.d.ts +94 -0
  37. package/dist/client/managers/ComposedAuthenticationManager.d.ts.map +1 -0
  38. package/dist/client/managers/ComposedAuthenticationManager.js +340 -0
  39. package/dist/client/managers/ComposedAuthenticationManager.js.map +1 -0
  40. package/dist/client/managers/ComposedManagerFactory.d.ts +104 -0
  41. package/dist/client/managers/ComposedManagerFactory.d.ts.map +1 -0
  42. package/dist/client/managers/ComposedManagerFactory.js +180 -0
  43. package/dist/client/managers/ComposedManagerFactory.js.map +1 -0
  44. package/dist/client/managers/ComposedRequestManager.d.ts +82 -0
  45. package/dist/client/managers/ComposedRequestManager.d.ts.map +1 -0
  46. package/dist/client/managers/ComposedRequestManager.js +260 -0
  47. package/dist/client/managers/ComposedRequestManager.js.map +1 -0
  48. package/dist/client/managers/JWTAuthImplementation.d.ts +86 -0
  49. package/dist/client/managers/JWTAuthImplementation.d.ts.map +1 -0
  50. package/dist/client/managers/JWTAuthImplementation.js +240 -0
  51. package/dist/client/managers/JWTAuthImplementation.js.map +1 -0
  52. package/dist/client/managers/ManagersIndex.d.ts +6 -0
  53. package/dist/client/managers/ManagersIndex.d.ts.map +1 -0
  54. package/dist/client/managers/ManagersIndex.js +6 -0
  55. package/dist/client/managers/ManagersIndex.js.map +1 -0
  56. package/dist/client/managers/RequestManager.d.ts.map +1 -1
  57. package/dist/client/managers/RequestManager.js +5 -3
  58. package/dist/client/managers/RequestManager.js.map +1 -1
  59. package/dist/client/managers/composed/MigrationAdapter.d.ts +80 -0
  60. package/dist/client/managers/composed/MigrationAdapter.d.ts.map +1 -0
  61. package/dist/client/managers/composed/MigrationAdapter.js +214 -0
  62. package/dist/client/managers/composed/MigrationAdapter.js.map +1 -0
  63. package/dist/client/managers/composed/index.d.ts +23 -0
  64. package/dist/client/managers/composed/index.d.ts.map +1 -0
  65. package/dist/client/managers/composed/index.js +26 -0
  66. package/dist/client/managers/composed/index.js.map +1 -0
  67. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts +27 -0
  68. package/dist/client/managers/implementations/ConfigurationProviderImpl.d.ts.map +1 -0
  69. package/dist/client/managers/implementations/ConfigurationProviderImpl.js +41 -0
  70. package/dist/client/managers/implementations/ConfigurationProviderImpl.js.map +1 -0
  71. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts +31 -0
  72. package/dist/client/managers/implementations/ErrorHandlerImpl.d.ts.map +1 -0
  73. package/dist/client/managers/implementations/ErrorHandlerImpl.js +73 -0
  74. package/dist/client/managers/implementations/ErrorHandlerImpl.js.map +1 -0
  75. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts +47 -0
  76. package/dist/client/managers/implementations/ParameterValidatorImpl.d.ts.map +1 -0
  77. package/dist/client/managers/implementations/ParameterValidatorImpl.js +141 -0
  78. package/dist/client/managers/implementations/ParameterValidatorImpl.js.map +1 -0
  79. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts +147 -0
  80. package/dist/client/managers/interfaces/ManagerInterfaces.d.ts.map +1 -0
  81. package/dist/client/managers/interfaces/ManagerInterfaces.js +6 -0
  82. package/dist/client/managers/interfaces/ManagerInterfaces.js.map +1 -0
  83. package/dist/config/Config.d.ts +30 -0
  84. package/dist/config/Config.d.ts.map +1 -1
  85. package/dist/config/Config.js +30 -0
  86. package/dist/config/Config.js.map +1 -1
  87. package/dist/config/ConfigurationSchema.d.ts +75 -198
  88. package/dist/config/ConfigurationSchema.d.ts.map +1 -1
  89. package/dist/config/ConfigurationSchema.js +17 -17
  90. package/dist/config/ConfigurationSchema.js.map +1 -1
  91. package/dist/config/ServerConfiguration.d.ts +2 -2
  92. package/dist/config/ServerConfiguration.d.ts.map +1 -1
  93. package/dist/config/ServerConfiguration.js +15 -13
  94. package/dist/config/ServerConfiguration.js.map +1 -1
  95. package/dist/config/index.d.ts +8 -0
  96. package/dist/config/index.d.ts.map +1 -0
  97. package/dist/config/index.js +11 -0
  98. package/dist/config/index.js.map +1 -0
  99. package/dist/docs/DocumentationGenerator.js +2 -2
  100. package/dist/docs/DocumentationGenerator.js.map +1 -1
  101. package/dist/dxt-entry.js +3 -3
  102. package/dist/dxt-entry.js.map +1 -1
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +38 -37
  106. package/dist/index.js.map +1 -1
  107. package/dist/performance/MetricsCollector.d.ts.map +1 -1
  108. package/dist/performance/MetricsCollector.js +5 -4
  109. package/dist/performance/MetricsCollector.js.map +1 -1
  110. package/dist/security/AISecurityScanner.js +7 -7
  111. package/dist/security/AISecurityScanner.js.map +1 -1
  112. package/dist/security/AutomatedRemediation.d.ts.map +1 -1
  113. package/dist/security/AutomatedRemediation.js +11 -11
  114. package/dist/security/AutomatedRemediation.js.map +1 -1
  115. package/dist/security/InputValidator.d.ts +50 -126
  116. package/dist/security/InputValidator.d.ts.map +1 -1
  117. package/dist/security/InputValidator.js +9 -9
  118. package/dist/security/InputValidator.js.map +1 -1
  119. package/dist/security/SecurityCIPipeline.d.ts +47 -5
  120. package/dist/security/SecurityCIPipeline.d.ts.map +1 -1
  121. package/dist/security/SecurityCIPipeline.js +390 -49
  122. package/dist/security/SecurityCIPipeline.js.map +1 -1
  123. package/dist/security/SecurityConfigManager.js +10 -10
  124. package/dist/security/SecurityConfigManager.js.map +1 -1
  125. package/dist/security/SecurityMonitoring.js +4 -4
  126. package/dist/security/SecurityMonitoring.js.map +1 -1
  127. package/dist/security/SecurityReviewer.d.ts.map +1 -1
  128. package/dist/security/SecurityReviewer.js +13 -6
  129. package/dist/security/SecurityReviewer.js.map +1 -1
  130. package/dist/security/index.js +3 -3
  131. package/dist/security/index.js.map +1 -1
  132. package/dist/server/ConnectionTester.js +5 -5
  133. package/dist/server/ConnectionTester.js.map +1 -1
  134. package/dist/server/ToolRegistry.d.ts +2 -2
  135. package/dist/server/ToolRegistry.d.ts.map +1 -1
  136. package/dist/server/ToolRegistry.js +7 -6
  137. package/dist/server/ToolRegistry.js.map +1 -1
  138. package/dist/server/index.d.ts +7 -0
  139. package/dist/server/index.d.ts.map +1 -0
  140. package/dist/server/index.js +9 -0
  141. package/dist/server/index.js.map +1 -0
  142. package/dist/tools/BaseToolManager.d.ts.map +1 -1
  143. package/dist/tools/BaseToolManager.js +11 -11
  144. package/dist/tools/BaseToolManager.js.map +1 -1
  145. package/dist/tools/auth.d.ts.map +1 -1
  146. package/dist/tools/auth.js +7 -7
  147. package/dist/tools/auth.js.map +1 -1
  148. package/dist/tools/comments.d.ts.map +1 -1
  149. package/dist/tools/comments.js +14 -14
  150. package/dist/tools/comments.js.map +1 -1
  151. package/dist/tools/index.d.ts +1 -0
  152. package/dist/tools/index.d.ts.map +1 -1
  153. package/dist/tools/index.js +1 -0
  154. package/dist/tools/index.js.map +1 -1
  155. package/dist/tools/media.d.ts.map +1 -1
  156. package/dist/tools/media.js +14 -11
  157. package/dist/tools/media.js.map +1 -1
  158. package/dist/tools/pages.d.ts.map +1 -1
  159. package/dist/tools/pages.js +12 -12
  160. package/dist/tools/pages.js.map +1 -1
  161. package/dist/tools/performance.d.ts.map +1 -1
  162. package/dist/tools/performance.js +13 -11
  163. package/dist/tools/performance.js.map +1 -1
  164. package/dist/tools/posts/PostHandlers.d.ts.map +1 -1
  165. package/dist/tools/posts/PostHandlers.js +16 -16
  166. package/dist/tools/posts/PostHandlers.js.map +1 -1
  167. package/dist/tools/posts/PostToolDefinitions.d.ts.map +1 -1
  168. package/dist/tools/posts/index.d.ts.map +1 -1
  169. package/dist/tools/seo/BulkOperations.d.ts +113 -0
  170. package/dist/tools/seo/BulkOperations.d.ts.map +1 -0
  171. package/dist/tools/seo/BulkOperations.js +398 -0
  172. package/dist/tools/seo/BulkOperations.js.map +1 -0
  173. package/dist/tools/seo/SEOHandlers.d.ts +55 -0
  174. package/dist/tools/seo/SEOHandlers.d.ts.map +1 -0
  175. package/dist/tools/seo/SEOHandlers.js +255 -0
  176. package/dist/tools/seo/SEOHandlers.js.map +1 -0
  177. package/dist/tools/seo/SEOToolDefinitions.d.ts +59 -0
  178. package/dist/tools/seo/SEOToolDefinitions.d.ts.map +1 -0
  179. package/dist/tools/seo/SEOToolDefinitions.js +385 -0
  180. package/dist/tools/seo/SEOToolDefinitions.js.map +1 -0
  181. package/dist/tools/seo/SEOTools.d.ts +203 -0
  182. package/dist/tools/seo/SEOTools.d.ts.map +1 -0
  183. package/dist/tools/seo/SEOTools.js +708 -0
  184. package/dist/tools/seo/SEOTools.js.map +1 -0
  185. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts +94 -0
  186. package/dist/tools/seo/analyzers/ContentAnalyzer.d.ts.map +1 -0
  187. package/dist/tools/seo/analyzers/ContentAnalyzer.js +402 -0
  188. package/dist/tools/seo/analyzers/ContentAnalyzer.js.map +1 -0
  189. package/dist/tools/seo/auditors/SiteAuditor.d.ts +121 -0
  190. package/dist/tools/seo/auditors/SiteAuditor.d.ts.map +1 -0
  191. package/dist/tools/seo/auditors/SiteAuditor.js +600 -0
  192. package/dist/tools/seo/auditors/SiteAuditor.js.map +1 -0
  193. package/dist/tools/seo/generators/MetaGenerator.d.ts +128 -0
  194. package/dist/tools/seo/generators/MetaGenerator.d.ts.map +1 -0
  195. package/dist/tools/seo/generators/MetaGenerator.js +547 -0
  196. package/dist/tools/seo/generators/MetaGenerator.js.map +1 -0
  197. package/dist/tools/seo/generators/SchemaGenerator.d.ts +204 -0
  198. package/dist/tools/seo/generators/SchemaGenerator.d.ts.map +1 -0
  199. package/dist/tools/seo/generators/SchemaGenerator.js +670 -0
  200. package/dist/tools/seo/generators/SchemaGenerator.js.map +1 -0
  201. package/dist/tools/seo/index.d.ts +17 -0
  202. package/dist/tools/seo/index.d.ts.map +1 -0
  203. package/dist/tools/seo/index.js +18 -0
  204. package/dist/tools/seo/index.js.map +1 -0
  205. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts +186 -0
  206. package/dist/tools/seo/optimizers/InternalLinkingSuggester.d.ts.map +1 -0
  207. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js +683 -0
  208. package/dist/tools/seo/optimizers/InternalLinkingSuggester.js.map +1 -0
  209. package/dist/tools/site.d.ts.map +1 -1
  210. package/dist/tools/site.js +12 -12
  211. package/dist/tools/site.js.map +1 -1
  212. package/dist/tools/taxonomies.d.ts.map +1 -1
  213. package/dist/tools/taxonomies.js +20 -20
  214. package/dist/tools/taxonomies.js.map +1 -1
  215. package/dist/tools/users.d.ts.map +1 -1
  216. package/dist/tools/users.js +12 -12
  217. package/dist/tools/users.js.map +1 -1
  218. package/dist/types/client.d.ts +8 -6
  219. package/dist/types/client.d.ts.map +1 -1
  220. package/dist/types/client.js.map +1 -1
  221. package/dist/types/seo.d.ts +473 -0
  222. package/dist/types/seo.d.ts.map +1 -0
  223. package/dist/types/seo.js +94 -0
  224. package/dist/types/seo.js.map +1 -0
  225. package/dist/utils/enhancedError.js +1 -1
  226. package/dist/utils/enhancedError.js.map +1 -1
  227. package/dist/utils/error.d.ts.map +1 -1
  228. package/dist/utils/error.js +0 -1
  229. package/dist/utils/error.js.map +1 -1
  230. package/dist/utils/index.d.ts +12 -0
  231. package/dist/utils/index.d.ts.map +1 -0
  232. package/dist/utils/index.js +18 -0
  233. package/dist/utils/index.js.map +1 -0
  234. package/dist/utils/logger.js +3 -3
  235. package/dist/utils/logger.js.map +1 -1
  236. package/dist/utils/toolWrapper.d.ts +2 -2
  237. package/dist/utils/toolWrapper.js +8 -8
  238. package/dist/utils/toolWrapper.js.map +1 -1
  239. package/dist/utils/validation/core.d.ts.map +1 -1
  240. package/dist/utils/validation/core.js.map +1 -1
  241. package/dist/utils/validation/index.d.ts.map +1 -1
  242. package/dist/utils/validation/index.js.map +1 -1
  243. package/dist/utils/validation/network.js +3 -3
  244. package/dist/utils/validation/network.js.map +1 -1
  245. package/dist/utils/validation/rateLimit.js.map +1 -1
  246. package/dist/utils/validation/security.js.map +1 -1
  247. package/dist/utils/validation/wordpress.js.map +1 -1
  248. package/dist/utils/version.d.ts +144 -0
  249. package/dist/utils/version.d.ts.map +1 -0
  250. package/dist/utils/version.js +318 -0
  251. package/dist/utils/version.js.map +1 -0
  252. package/package.json +24 -58
  253. package/src/cache/CacheInvalidation.ts +183 -20
  254. package/src/cache/HttpCacheWrapper.ts +8 -5
  255. package/src/cache/SEOCacheManager.ts +330 -0
  256. package/src/cache/__tests__/CacheInvalidation.test.ts +6 -11
  257. package/src/cache/__tests__/CachedWordPressClient.test.ts +37 -62
  258. package/src/client/SEOWordPressClient.ts +876 -0
  259. package/src/client/api.ts +50 -21
  260. package/src/client/auth.ts +19 -19
  261. package/src/client/index.ts +16 -0
  262. package/src/client/managers/AuthManager.ts +175 -0
  263. package/src/client/managers/AuthenticationManager.ts +16 -14
  264. package/src/client/managers/BaseManager.ts +24 -5
  265. package/src/client/managers/ComposedAuthenticationManager.ts +409 -0
  266. package/src/client/managers/ComposedManagerFactory.ts +231 -0
  267. package/src/client/managers/ComposedRequestManager.ts +336 -0
  268. package/src/client/managers/JWTAuthImplementation.ts +326 -0
  269. package/src/client/managers/ManagersIndex.ts +6 -0
  270. package/src/client/managers/RequestManager.ts +9 -7
  271. package/src/client/managers/composed/MigrationAdapter.ts +263 -0
  272. package/src/client/managers/composed/index.ts +47 -0
  273. package/src/client/managers/implementations/ConfigurationProviderImpl.ts +52 -0
  274. package/src/client/managers/implementations/ErrorHandlerImpl.ts +102 -0
  275. package/src/client/managers/implementations/ParameterValidatorImpl.ts +221 -0
  276. package/src/client/managers/interfaces/ManagerInterfaces.ts +171 -0
  277. package/src/config/Config.ts +63 -0
  278. package/src/config/ConfigurationSchema.ts +17 -17
  279. package/src/config/ServerConfiguration.ts +18 -16
  280. package/src/config/index.ts +13 -0
  281. package/src/docs/DocumentationGenerator.ts +2 -2
  282. package/src/dxt-entry.ts +3 -3
  283. package/src/index.ts +43 -43
  284. package/src/performance/MetricsCollector.ts +15 -11
  285. package/src/security/AISecurityScanner.ts +7 -7
  286. package/src/security/AutomatedRemediation.ts +13 -11
  287. package/src/security/InputValidator.ts +10 -9
  288. package/src/security/SecurityCIPipeline.ts +494 -56
  289. package/src/security/SecurityConfigManager.ts +10 -10
  290. package/src/security/SecurityMonitoring.ts +5 -5
  291. package/src/security/SecurityReviewer.ts +13 -6
  292. package/src/security/index.ts +3 -3
  293. package/src/server/ConnectionTester.ts +5 -5
  294. package/src/server/ToolRegistry.ts +9 -8
  295. package/src/server/index.ts +10 -0
  296. package/src/tools/BaseToolManager.ts +55 -83
  297. package/src/tools/auth.ts +21 -12
  298. package/src/tools/comments.ts +23 -19
  299. package/src/tools/index.ts +1 -0
  300. package/src/tools/media.ts +23 -20
  301. package/src/tools/pages.ts +20 -13
  302. package/src/tools/performance.ts +101 -32
  303. package/src/tools/posts/PostHandlers.ts +23 -23
  304. package/src/tools/posts/PostToolDefinitions.ts +1 -1
  305. package/src/tools/posts/index.ts +2 -2
  306. package/src/tools/seo/BulkOperations.ts +557 -0
  307. package/src/tools/seo/SEOHandlers.ts +296 -0
  308. package/src/tools/seo/SEOToolDefinitions.ts +402 -0
  309. package/src/tools/seo/SEOTools.ts +871 -0
  310. package/src/tools/seo/analyzers/ContentAnalyzer.ts +493 -0
  311. package/src/tools/seo/auditors/SiteAuditor.ts +787 -0
  312. package/src/tools/seo/generators/MetaGenerator.ts +694 -0
  313. package/src/tools/seo/generators/SchemaGenerator.ts +955 -0
  314. package/src/tools/seo/index.ts +47 -0
  315. package/src/tools/seo/optimizers/InternalLinkingSuggester.ts +934 -0
  316. package/src/tools/site.ts +27 -26
  317. package/src/tools/taxonomies.ts +29 -25
  318. package/src/tools/users.ts +20 -13
  319. package/src/types/client.ts +8 -6
  320. package/src/types/seo.ts +546 -0
  321. package/src/utils/enhancedError.ts +1 -1
  322. package/src/utils/error.ts +1 -2
  323. package/src/utils/index.ts +23 -0
  324. package/src/utils/logger.ts +3 -3
  325. package/src/utils/toolWrapper.ts +10 -10
  326. package/src/utils/validation/core.ts +2 -2
  327. package/src/utils/validation/index.ts +2 -2
  328. package/src/utils/validation/network.ts +5 -5
  329. package/src/utils/validation/rateLimit.ts +1 -1
  330. package/src/utils/validation/security.ts +1 -1
  331. package/src/utils/validation/wordpress.ts +1 -1
  332. package/src/utils/version.ts +402 -0
  333. package/src/dxt-entry.cjs +0 -68
@@ -0,0 +1,296 @@
1
+ /**
2
+ * SEO Tool Handlers
3
+ *
4
+ * Implements the handler functions for all SEO-related MCP tools.
5
+ * These handlers bridge the gap between MCP protocol requests and
6
+ * the SEO toolkit implementation.
7
+ *
8
+ * @since 2.7.0
9
+ */
10
+
11
+ import { WordPressClient } from "@/client/api.js";
12
+ import { SEOTools } from "./SEOTools.js";
13
+ import { LoggerFactory } from "@/utils/logger.js";
14
+ import type { SEOToolParams, SEOAnalysisType, SEOMetadata, SchemaType } from "@/types/seo.js";
15
+
16
+ // Single instance of SEOTools to be reused
17
+ let seoToolsInstance: SEOTools | null = null;
18
+
19
+ /**
20
+ * Get or create SEOTools instance
21
+ */
22
+ function getSEOToolsInstance(): SEOTools {
23
+ if (!seoToolsInstance) {
24
+ seoToolsInstance = new SEOTools();
25
+ }
26
+ return seoToolsInstance;
27
+ }
28
+
29
+ /**
30
+ * Handle content analysis request
31
+ */
32
+ export async function handleAnalyzeContent(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
33
+ const logger = LoggerFactory.tool("wp_seo_analyze_content");
34
+
35
+ try {
36
+ const seoTools = getSEOToolsInstance();
37
+ const params: SEOToolParams = {
38
+ postId: args.postId as number,
39
+ analysisType: args.analysisType as SEOAnalysisType,
40
+ focusKeywords: args.focusKeywords as string[],
41
+ site: args.site as string,
42
+ };
43
+
44
+ return await seoTools.analyzeContent(params);
45
+ } catch (error) {
46
+ logger.error("Failed to analyze content", { error, args });
47
+ throw error;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Handle metadata generation request
53
+ */
54
+ export async function handleGenerateMetadata(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
55
+ const logger = LoggerFactory.tool("wp_seo_generate_metadata");
56
+
57
+ try {
58
+ const seoTools = getSEOToolsInstance();
59
+ const params: SEOToolParams = {
60
+ postId: args.postId as number,
61
+ site: args.site as string,
62
+ };
63
+
64
+ // Add custom title/description if provided
65
+ if (args.title) {
66
+ params.title = args.title as string;
67
+ }
68
+ if (args.description) {
69
+ params.description = args.description as string;
70
+ }
71
+ if (args.focusKeyword) {
72
+ params.focusKeywords = [args.focusKeyword as string];
73
+ }
74
+
75
+ return await seoTools.generateMetadata(params);
76
+ } catch (error) {
77
+ logger.error("Failed to generate metadata", { error, args });
78
+ throw error;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Handle bulk metadata update request
84
+ */
85
+ export async function handleBulkUpdateMetadata(
86
+ client: WordPressClient,
87
+ args: Record<string, unknown>,
88
+ ): Promise<unknown> {
89
+ const logger = LoggerFactory.tool("wp_seo_bulk_update_metadata");
90
+
91
+ try {
92
+ const seoTools = getSEOToolsInstance();
93
+ const params: SEOToolParams = {
94
+ postIds: args.postIds as number[],
95
+ updates: args.updates as Partial<SEOMetadata>,
96
+ dryRun: args.dryRun as boolean,
97
+ site: args.site as string,
98
+ };
99
+
100
+ return await seoTools.bulkUpdateMetadata(params);
101
+ } catch (error) {
102
+ logger.error("Failed to bulk update metadata", { error, args });
103
+ throw error;
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Handle schema generation request
109
+ */
110
+ export async function handleGenerateSchema(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
111
+ const logger = LoggerFactory.tool("wp_seo_generate_schema");
112
+
113
+ try {
114
+ const seoTools = getSEOToolsInstance();
115
+ const params: SEOToolParams = {
116
+ postId: args.postId as number,
117
+ schemaType: args.schemaType as SchemaType,
118
+ site: args.site as string,
119
+ };
120
+
121
+ // Add custom data if provided
122
+ if (args.customData) {
123
+ params.customData = args.customData;
124
+ }
125
+
126
+ return await seoTools.generateSchema(params);
127
+ } catch (error) {
128
+ logger.error("Failed to generate schema", { error, args });
129
+ throw error;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Handle schema validation request
135
+ */
136
+ export async function handleValidateSchema(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
137
+ const logger = LoggerFactory.tool("wp_seo_validate_schema");
138
+
139
+ try {
140
+ const seoTools = getSEOToolsInstance();
141
+ const params: SEOToolParams = {
142
+ schema: args.schema,
143
+ schemaType: args.schemaType as SchemaType,
144
+ site: args.site as string,
145
+ };
146
+
147
+ // Add Google validator flag if provided
148
+ if (args.useGoogleValidator) {
149
+ params.useGoogleValidator = args.useGoogleValidator as boolean;
150
+ }
151
+
152
+ return await seoTools.validateSchema(params);
153
+ } catch (error) {
154
+ logger.error("Failed to validate schema", { error, args });
155
+ throw error;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Handle internal linking suggestions request
161
+ */
162
+ export async function handleSuggestInternalLinks(
163
+ client: WordPressClient,
164
+ args: Record<string, unknown>,
165
+ ): Promise<unknown> {
166
+ const logger = LoggerFactory.tool("wp_seo_suggest_internal_links");
167
+
168
+ try {
169
+ const seoTools = getSEOToolsInstance();
170
+ const params: SEOToolParams = {
171
+ postId: args.postId as number,
172
+ site: args.site as string,
173
+ };
174
+
175
+ // Add optional parameters
176
+ if (args.maxSuggestions) {
177
+ params.maxSuggestions = args.maxSuggestions as number;
178
+ }
179
+ if (args.minimumRelevance) {
180
+ params.minimumRelevance = args.minimumRelevance as number;
181
+ }
182
+
183
+ return await seoTools.suggestInternalLinks(params);
184
+ } catch (error) {
185
+ logger.error("Failed to suggest internal links", { error, args });
186
+ throw error;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Handle site audit request
192
+ */
193
+ export async function handlePerformSiteAudit(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
194
+ const logger = LoggerFactory.tool("wp_seo_site_audit");
195
+
196
+ try {
197
+ const seoTools = getSEOToolsInstance();
198
+ const params: SEOToolParams = {
199
+ auditType: args.auditType as "content" | "performance" | "full" | "technical",
200
+ force: args.force as boolean,
201
+ site: args.site as string,
202
+ };
203
+
204
+ // Add optional parameters
205
+ if (args.maxPages) {
206
+ params.maxPages = args.maxPages as number;
207
+ }
208
+ if (args.includeExternalLinks) {
209
+ params.includeExternalLinks = args.includeExternalLinks as boolean;
210
+ }
211
+
212
+ return await seoTools.performSiteAudit(params);
213
+ } catch (error) {
214
+ logger.error("Failed to perform site audit", { error, args });
215
+ throw error;
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Handle SERP tracking request
221
+ */
222
+ export async function handleTrackSERPPositions(
223
+ client: WordPressClient,
224
+ args: Record<string, unknown>,
225
+ ): Promise<unknown> {
226
+ const logger = LoggerFactory.tool("wp_seo_track_serp");
227
+
228
+ try {
229
+ // This would need implementation in SEOTools
230
+ throw new Error("SERP tracking not yet implemented");
231
+ } catch (error) {
232
+ logger.error("Failed to track SERP positions", { error, args });
233
+ throw error;
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Handle keyword research request
239
+ */
240
+ export async function handleKeywordResearch(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
241
+ const logger = LoggerFactory.tool("wp_seo_keyword_research");
242
+
243
+ try {
244
+ // This would need implementation in SEOTools
245
+ throw new Error("Keyword research not yet implemented");
246
+ } catch (error) {
247
+ logger.error("Failed to perform keyword research", { error, args });
248
+ throw error;
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Handle SEO integration test request
254
+ */
255
+ export async function handleTestSEOIntegration(
256
+ client: WordPressClient,
257
+ args: Record<string, unknown>,
258
+ ): Promise<unknown> {
259
+ const logger = LoggerFactory.tool("wp_seo_test_integration");
260
+
261
+ try {
262
+ const seoTools = getSEOToolsInstance();
263
+ const params: SEOToolParams = {
264
+ checkPlugins: args.checkPlugins as boolean,
265
+ testMetadataAccess: args.testMetadataAccess as boolean,
266
+ site: args.site as string,
267
+ };
268
+
269
+ return await seoTools.testSEOIntegration(params);
270
+ } catch (error) {
271
+ logger.error("Failed to test SEO integration", { error, args });
272
+ throw error;
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Handle get live SEO data request
278
+ */
279
+ export async function handleGetLiveSEOData(client: WordPressClient, args: Record<string, unknown>): Promise<unknown> {
280
+ const logger = LoggerFactory.tool("wp_seo_get_live_data");
281
+
282
+ try {
283
+ const seoTools = getSEOToolsInstance();
284
+ const params: SEOToolParams = {
285
+ postId: args.postId as number,
286
+ includeAnalysis: args.includeAnalysis as boolean,
287
+ includeRecommendations: args.includeRecommendations as boolean,
288
+ site: args.site as string,
289
+ };
290
+
291
+ return await seoTools.getLiveSEOData(params);
292
+ } catch (error) {
293
+ logger.error("Failed to get live SEO data", { error, args });
294
+ throw error;
295
+ }
296
+ }
@@ -0,0 +1,402 @@
1
+ /**
2
+ * SEO Tool Definitions for MCP Registration
3
+ *
4
+ * Defines all SEO-related tools with their schemas, descriptions,
5
+ * and handler functions for the Model Context Protocol.
6
+ *
7
+ * @since 2.7.0
8
+ */
9
+
10
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
11
+
12
+ /**
13
+ * Analyze content for SEO optimization opportunities
14
+ */
15
+ export const analyzeContentTool: Tool = {
16
+ name: "wp_seo_analyze_content",
17
+ description:
18
+ "Analyze WordPress post content for SEO optimization opportunities including readability, keyword density, structure, and technical factors",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ postId: {
23
+ type: "number",
24
+ description: "WordPress post ID to analyze",
25
+ },
26
+ analysisType: {
27
+ type: "string",
28
+ enum: ["readability", "keywords", "structure", "full"],
29
+ description: "Type of SEO analysis to perform (default: full)",
30
+ },
31
+ focusKeywords: {
32
+ type: "array",
33
+ items: { type: "string" },
34
+ description: "Primary keywords to analyze for optimization",
35
+ },
36
+ site: {
37
+ type: "string",
38
+ description: "Site identifier for multi-site setups",
39
+ },
40
+ },
41
+ required: ["postId"],
42
+ },
43
+ };
44
+
45
+ /**
46
+ * Generate optimized metadata for posts
47
+ */
48
+ export const generateMetadataTool: Tool = {
49
+ name: "wp_seo_generate_metadata",
50
+ description:
51
+ "Generate SEO-optimized metadata including title tags, meta descriptions, OpenGraph, and Twitter Card data",
52
+ inputSchema: {
53
+ type: "object",
54
+ properties: {
55
+ postId: {
56
+ type: "number",
57
+ description: "WordPress post ID",
58
+ },
59
+ title: {
60
+ type: "string",
61
+ description: "Custom title to optimize (optional, uses post title if not provided)",
62
+ },
63
+ description: {
64
+ type: "string",
65
+ description: "Custom description to optimize (optional, uses excerpt if not provided)",
66
+ },
67
+ focusKeyword: {
68
+ type: "string",
69
+ description: "Primary keyword to include in metadata",
70
+ },
71
+ site: {
72
+ type: "string",
73
+ description: "Site identifier for multi-site setups",
74
+ },
75
+ },
76
+ required: ["postId"],
77
+ },
78
+ };
79
+
80
+ /**
81
+ * Bulk update metadata for multiple posts
82
+ */
83
+ export const bulkUpdateMetadataTool: Tool = {
84
+ name: "wp_seo_bulk_update_metadata",
85
+ description: "Update SEO metadata for multiple posts with progress tracking and error handling",
86
+ inputSchema: {
87
+ type: "object",
88
+ properties: {
89
+ postIds: {
90
+ type: "array",
91
+ items: { type: "number" },
92
+ description: "Array of WordPress post IDs to update",
93
+ },
94
+ updates: {
95
+ type: "object",
96
+ properties: {
97
+ title: { type: "string" },
98
+ description: { type: "string" },
99
+ focusKeyword: { type: "string" },
100
+ canonical: { type: "string" },
101
+ },
102
+ description: "Metadata fields to update for all posts",
103
+ },
104
+ dryRun: {
105
+ type: "boolean",
106
+ description: "Perform a dry run without making actual changes",
107
+ },
108
+ site: {
109
+ type: "string",
110
+ description: "Site identifier for multi-site setups",
111
+ },
112
+ },
113
+ required: ["postIds", "updates"],
114
+ },
115
+ };
116
+
117
+ /**
118
+ * Generate structured data schema markup
119
+ */
120
+ export const generateSchemaTool: Tool = {
121
+ name: "wp_seo_generate_schema",
122
+ description: "Generate JSON-LD structured data schema for enhanced search results",
123
+ inputSchema: {
124
+ type: "object",
125
+ properties: {
126
+ postId: {
127
+ type: "number",
128
+ description: "WordPress post ID",
129
+ },
130
+ schemaType: {
131
+ type: "string",
132
+ enum: [
133
+ "Article",
134
+ "Product",
135
+ "FAQ",
136
+ "HowTo",
137
+ "Organization",
138
+ "Website",
139
+ "BreadcrumbList",
140
+ "Event",
141
+ "Recipe",
142
+ "Course",
143
+ "LocalBusiness",
144
+ "Person",
145
+ "Review",
146
+ "VideoObject",
147
+ ],
148
+ description: "Type of schema.org structured data to generate",
149
+ },
150
+ customData: {
151
+ type: "object",
152
+ description: "Additional custom data for the schema",
153
+ },
154
+ site: {
155
+ type: "string",
156
+ description: "Site identifier for multi-site setups",
157
+ },
158
+ },
159
+ required: ["postId", "schemaType"],
160
+ },
161
+ };
162
+
163
+ /**
164
+ * Validate schema markup
165
+ */
166
+ export const validateSchemaTool: Tool = {
167
+ name: "wp_seo_validate_schema",
168
+ description: "Validate JSON-LD schema markup for correctness and compliance",
169
+ inputSchema: {
170
+ type: "object",
171
+ properties: {
172
+ schema: {
173
+ type: "object",
174
+ description: "JSON-LD schema object to validate",
175
+ },
176
+ schemaType: {
177
+ type: "string",
178
+ description: "Expected schema type for validation",
179
+ },
180
+ useGoogleValidator: {
181
+ type: "boolean",
182
+ description: "Use Google's Rich Results Test API for validation",
183
+ },
184
+ site: {
185
+ type: "string",
186
+ description: "Site identifier for multi-site setups",
187
+ },
188
+ },
189
+ required: ["schema"],
190
+ },
191
+ };
192
+
193
+ /**
194
+ * Suggest internal linking opportunities
195
+ */
196
+ export const suggestInternalLinksTool: Tool = {
197
+ name: "wp_seo_suggest_internal_links",
198
+ description: "Analyze content and suggest relevant internal linking opportunities for better SEO",
199
+ inputSchema: {
200
+ type: "object",
201
+ properties: {
202
+ postId: {
203
+ type: "number",
204
+ description: "WordPress post ID to analyze for linking opportunities",
205
+ },
206
+ maxSuggestions: {
207
+ type: "number",
208
+ description: "Maximum number of link suggestions (default: 5)",
209
+ },
210
+ minimumRelevance: {
211
+ type: "number",
212
+ description: "Minimum relevance score (0-100) for suggestions",
213
+ },
214
+ site: {
215
+ type: "string",
216
+ description: "Site identifier for multi-site setups",
217
+ },
218
+ },
219
+ required: ["postId"],
220
+ },
221
+ };
222
+
223
+ /**
224
+ * Perform comprehensive site audit
225
+ */
226
+ export const performSiteAuditTool: Tool = {
227
+ name: "wp_seo_site_audit",
228
+ description:
229
+ "Perform comprehensive SEO audit of the WordPress site including technical, content, and performance analysis",
230
+ inputSchema: {
231
+ type: "object",
232
+ properties: {
233
+ auditType: {
234
+ type: "string",
235
+ enum: ["technical", "content", "performance", "full"],
236
+ description: "Type of audit to perform (default: full)",
237
+ },
238
+ maxPages: {
239
+ type: "number",
240
+ description: "Maximum number of pages to audit (default: 100)",
241
+ },
242
+ includeExternalLinks: {
243
+ type: "boolean",
244
+ description: "Include external link validation in audit",
245
+ },
246
+ force: {
247
+ type: "boolean",
248
+ description: "Force refresh, bypassing cached audit results",
249
+ },
250
+ site: {
251
+ type: "string",
252
+ description: "Site identifier for multi-site setups",
253
+ },
254
+ },
255
+ required: [],
256
+ },
257
+ };
258
+
259
+ /**
260
+ * Track SERP positions
261
+ */
262
+ export const trackSERPPositionsTool: Tool = {
263
+ name: "wp_seo_track_serp",
264
+ description: "Track search engine result page positions for target keywords",
265
+ inputSchema: {
266
+ type: "object",
267
+ properties: {
268
+ keywords: {
269
+ type: "array",
270
+ items: { type: "string" },
271
+ description: "Keywords to track positions for",
272
+ },
273
+ url: {
274
+ type: "string",
275
+ description: "Specific URL to track (optional, uses site home if not provided)",
276
+ },
277
+ searchEngine: {
278
+ type: "string",
279
+ enum: ["google", "bing", "yahoo"],
280
+ description: "Search engine to track positions on",
281
+ },
282
+ location: {
283
+ type: "string",
284
+ description: "Geographic location for localized results",
285
+ },
286
+ site: {
287
+ type: "string",
288
+ description: "Site identifier for multi-site setups",
289
+ },
290
+ },
291
+ required: ["keywords"],
292
+ },
293
+ };
294
+
295
+ /**
296
+ * Keyword research and suggestions
297
+ */
298
+ export const keywordResearchTool: Tool = {
299
+ name: "wp_seo_keyword_research",
300
+ description: "Research keywords and get suggestions based on topic and competition analysis",
301
+ inputSchema: {
302
+ type: "object",
303
+ properties: {
304
+ seedKeyword: {
305
+ type: "string",
306
+ description: "Seed keyword or topic to research",
307
+ },
308
+ includeVariations: {
309
+ type: "boolean",
310
+ description: "Include keyword variations and long-tail keywords",
311
+ },
312
+ includeQuestions: {
313
+ type: "boolean",
314
+ description: "Include question-based keywords",
315
+ },
316
+ maxResults: {
317
+ type: "number",
318
+ description: "Maximum number of keyword suggestions",
319
+ },
320
+ site: {
321
+ type: "string",
322
+ description: "Site identifier for multi-site setups",
323
+ },
324
+ },
325
+ required: ["seedKeyword"],
326
+ },
327
+ };
328
+
329
+ /**
330
+ * Test SEO integration with WordPress
331
+ */
332
+ export const testSEOIntegrationTool: Tool = {
333
+ name: "wp_seo_test_integration",
334
+ description: "Test SEO plugin integration and detect available SEO plugins on the WordPress site",
335
+ inputSchema: {
336
+ type: "object",
337
+ properties: {
338
+ checkPlugins: {
339
+ type: "boolean",
340
+ description: "Check which SEO plugins are installed and active",
341
+ },
342
+ testMetadataAccess: {
343
+ type: "boolean",
344
+ description: "Test ability to read/write SEO metadata",
345
+ },
346
+ site: {
347
+ type: "string",
348
+ description: "Site identifier for multi-site setups",
349
+ },
350
+ },
351
+ required: [],
352
+ },
353
+ };
354
+
355
+ /**
356
+ * Get live SEO data from WordPress
357
+ */
358
+ export const getLiveSEODataTool: Tool = {
359
+ name: "wp_seo_get_live_data",
360
+ description: "Retrieve live SEO data from WordPress including plugin-specific metadata and configurations",
361
+ inputSchema: {
362
+ type: "object",
363
+ properties: {
364
+ postId: {
365
+ type: "number",
366
+ description: "WordPress post ID to get SEO data for",
367
+ },
368
+ includeAnalysis: {
369
+ type: "boolean",
370
+ description: "Include SEO analysis of the live data",
371
+ },
372
+ includeRecommendations: {
373
+ type: "boolean",
374
+ description: "Include optimization recommendations",
375
+ },
376
+ site: {
377
+ type: "string",
378
+ description: "Site identifier for multi-site setups",
379
+ },
380
+ },
381
+ required: ["postId"],
382
+ },
383
+ };
384
+
385
+ /**
386
+ * Export all SEO tool definitions
387
+ */
388
+ export const seoToolDefinitions: Tool[] = [
389
+ analyzeContentTool,
390
+ generateMetadataTool,
391
+ bulkUpdateMetadataTool,
392
+ generateSchemaTool,
393
+ validateSchemaTool,
394
+ suggestInternalLinksTool,
395
+ performSiteAuditTool,
396
+ trackSERPPositionsTool,
397
+ keywordResearchTool,
398
+ testSEOIntegrationTool,
399
+ getLiveSEODataTool,
400
+ ];
401
+
402
+ export default seoToolDefinitions;