@jskit-ai/connectors-catalog 0.1.1

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 (399) hide show
  1. package/README.md +192 -0
  2. package/docs/ai-upstream-notices.md +51 -0
  3. package/docs/ai.md +191 -0
  4. package/docs/airtable.md +130 -0
  5. package/docs/algolia.md +190 -0
  6. package/docs/amazon-redshift.md +229 -0
  7. package/docs/amplitude.md +210 -0
  8. package/docs/apify.md +162 -0
  9. package/docs/apollo-io.md +200 -0
  10. package/docs/asana.md +126 -0
  11. package/docs/ashby.md +188 -0
  12. package/docs/atlassian.md +224 -0
  13. package/docs/attention.md +162 -0
  14. package/docs/aws-athena.md +150 -0
  15. package/docs/aws-credentials.md +75 -0
  16. package/docs/aws-s3.md +193 -0
  17. package/docs/bigquery.md +146 -0
  18. package/docs/brevo.md +122 -0
  19. package/docs/calendly.md +158 -0
  20. package/docs/canva.md +191 -0
  21. package/docs/chargebee.md +192 -0
  22. package/docs/clay.md +194 -0
  23. package/docs/clickhouse.md +242 -0
  24. package/docs/confidence-exp.md +74 -0
  25. package/docs/confidence-flags.md +75 -0
  26. package/docs/confidence-oauth.md +137 -0
  27. package/docs/contentful.md +123 -0
  28. package/docs/databricks.md +180 -0
  29. package/docs/dbt-semantic-layer.md +175 -0
  30. package/docs/elevenlabs.md +102 -0
  31. package/docs/figma.md +132 -0
  32. package/docs/firebase-cloud-messaging.md +262 -0
  33. package/docs/firecrawl.md +137 -0
  34. package/docs/fireflies.md +95 -0
  35. package/docs/fireworks-ai.md +53 -0
  36. package/docs/gatewayapi.md +113 -0
  37. package/docs/gemini-enterprise.md +224 -0
  38. package/docs/github-api.md +133 -0
  39. package/docs/gitlab-api.md +138 -0
  40. package/docs/gmail.md +133 -0
  41. package/docs/gong.md +205 -0
  42. package/docs/google-ads.md +156 -0
  43. package/docs/google-analytics.md +202 -0
  44. package/docs/google-docs.md +105 -0
  45. package/docs/google-drive.md +108 -0
  46. package/docs/google-maps-platform.md +208 -0
  47. package/docs/google-oauth.md +123 -0
  48. package/docs/google-search-console.md +124 -0
  49. package/docs/google-sheets.md +94 -0
  50. package/docs/google-slides.md +95 -0
  51. package/docs/granola.md +178 -0
  52. package/docs/hex.md +161 -0
  53. package/docs/heygen.md +124 -0
  54. package/docs/hubspot.md +142 -0
  55. package/docs/incident-io.md +118 -0
  56. package/docs/inngest.md +178 -0
  57. package/docs/klipy.md +149 -0
  58. package/docs/lexware.md +144 -0
  59. package/docs/lightspeed.md +193 -0
  60. package/docs/linear.md +137 -0
  61. package/docs/linkedin.md +196 -0
  62. package/docs/logo-dev.md +152 -0
  63. package/docs/mailgun.md +153 -0
  64. package/docs/mapbox.md +174 -0
  65. package/docs/microsoft-excel.md +97 -0
  66. package/docs/microsoft-fabric.md +249 -0
  67. package/docs/microsoft-oauth.md +143 -0
  68. package/docs/microsoft-onedrive.md +76 -0
  69. package/docs/microsoft-onenote.md +75 -0
  70. package/docs/microsoft-outlook.md +90 -0
  71. package/docs/microsoft-powerpoint.md +119 -0
  72. package/docs/microsoft-sharepoint.md +75 -0
  73. package/docs/microsoft-teams.md +72 -0
  74. package/docs/microsoft-word.md +119 -0
  75. package/docs/miro.md +117 -0
  76. package/docs/n8n.md +169 -0
  77. package/docs/notion.md +137 -0
  78. package/docs/oura.md +161 -0
  79. package/docs/paddle.md +168 -0
  80. package/docs/perplexity.md +85 -0
  81. package/docs/pipedrive.md +120 -0
  82. package/docs/polar.md +63 -0
  83. package/docs/posthog.md +227 -0
  84. package/docs/prestashop.md +151 -0
  85. package/docs/replicate.md +60 -0
  86. package/docs/resend.md +153 -0
  87. package/docs/salesforce.md +234 -0
  88. package/docs/sanity.md +122 -0
  89. package/docs/semrush.md +276 -0
  90. package/docs/sentry.md +112 -0
  91. package/docs/sevdesk.md +107 -0
  92. package/docs/shopify.md +206 -0
  93. package/docs/slack.md +257 -0
  94. package/docs/snowflake.md +271 -0
  95. package/docs/storyblok.md +130 -0
  96. package/docs/stripe.md +77 -0
  97. package/docs/supabase.md +51 -0
  98. package/docs/tally.md +105 -0
  99. package/docs/telegram.md +165 -0
  100. package/docs/tiktok.md +201 -0
  101. package/docs/twilio.md +284 -0
  102. package/docs/twitch.md +428 -0
  103. package/docs/wave.md +440 -0
  104. package/docs/wix.md +1249 -0
  105. package/docs/wiz.md +177 -0
  106. package/docs/woocommerce.md +400 -0
  107. package/docs/wordpress-com.md +358 -0
  108. package/docs/wordpress-self-hosted.md +252 -0
  109. package/docs/workday.md +292 -0
  110. package/docs/x-twitter.md +188 -0
  111. package/docs/xero.md +429 -0
  112. package/docs/zoho-books.md +214 -0
  113. package/docs/zoho-crm.md +192 -0
  114. package/package.json +153 -0
  115. package/patterns/ai-connections/PATTERN.md +84 -0
  116. package/patterns/ai-connections/example/ai-model.js +11 -0
  117. package/patterns/ai-connections/example/perplexity-answer.js +29 -0
  118. package/patterns/api-key-connection/PATTERN.md +368 -0
  119. package/patterns/api-key-connection/example/connections.js +18 -0
  120. package/patterns/api-key-connection/example/integrations.json +19 -0
  121. package/patterns/assistant-mcp/PATTERN.md +110 -0
  122. package/patterns/assistant-mcp/example/integrations.json +13 -0
  123. package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
  124. package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
  125. package/patterns/aws-storage-queries/PATTERN.md +169 -0
  126. package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
  127. package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
  128. package/patterns/aws-storage-queries/example/formats/package.json +12 -0
  129. package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
  130. package/patterns/aws-storage-queries/example/integrations.json +38 -0
  131. package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
  132. package/patterns/event-delivery/PATTERN.md +151 -0
  133. package/patterns/event-delivery/example/integrations.json +17 -0
  134. package/patterns/firebase-messaging/PATTERN.md +156 -0
  135. package/patterns/firebase-messaging/example/server/notifications.js +23 -0
  136. package/patterns/google-ads-search/PATTERN.md +92 -0
  137. package/patterns/google-ads-search/example/ads-setup.js +25 -0
  138. package/patterns/oauth-connection/PATTERN.md +724 -0
  139. package/patterns/oauth-connection/example/integrations.json +20 -0
  140. package/patterns/paddle-catalogue/PATTERN.md +78 -0
  141. package/patterns/paddle-catalogue/example/create-products.js +38 -0
  142. package/patterns/public-image/PATTERN.md +84 -0
  143. package/patterns/public-image/example/integrations.json +13 -0
  144. package/patterns/public-image/example/logo-url.js +16 -0
  145. package/patterns/redshift-queries/PATTERN.md +150 -0
  146. package/patterns/redshift-queries/example/integrations.json +33 -0
  147. package/patterns/source-scanning/PATTERN.md +83 -0
  148. package/patterns/source-scanning/example/source-scanner.js +13 -0
  149. package/src/client/firebase-cloud-messaging.js +10 -0
  150. package/src/client/google-analytics.js +72 -0
  151. package/src/client/google-maps-platform.js +39 -0
  152. package/src/client/logo-dev.js +36 -0
  153. package/src/server/ai.js +46 -0
  154. package/src/server/airtable.js +67 -0
  155. package/src/server/algolia.js +63 -0
  156. package/src/server/amazon-redshift.js +96 -0
  157. package/src/server/amplitude.js +31 -0
  158. package/src/server/apify.js +68 -0
  159. package/src/server/apollo-io.js +85 -0
  160. package/src/server/asana.js +64 -0
  161. package/src/server/ashby.js +61 -0
  162. package/src/server/atlassian.js +32 -0
  163. package/src/server/attention.js +93 -0
  164. package/src/server/aws-athena.js +82 -0
  165. package/src/server/aws-s3.js +49 -0
  166. package/src/server/awsTransport.js +75 -0
  167. package/src/server/bigquery.js +97 -0
  168. package/src/server/brevo.js +97 -0
  169. package/src/server/calendly.js +77 -0
  170. package/src/server/canva.js +13 -0
  171. package/src/server/chargebee.js +88 -0
  172. package/src/server/clay.js +78 -0
  173. package/src/server/clickhouse.js +66 -0
  174. package/src/server/confidence.js +29 -0
  175. package/src/server/contentful.js +40 -0
  176. package/src/server/databricks.js +55 -0
  177. package/src/server/dbt-semantic-layer.js +95 -0
  178. package/src/server/elevenlabs.js +81 -0
  179. package/src/server/figma.js +24 -0
  180. package/src/server/firebase-cloud-messaging.js +111 -0
  181. package/src/server/firecrawl.js +70 -0
  182. package/src/server/fireflies.js +31 -0
  183. package/src/server/fireworks-ai.js +16 -0
  184. package/src/server/gatewayapi.js +48 -0
  185. package/src/server/gemini-enterprise.js +47 -0
  186. package/src/server/github-api.js +90 -0
  187. package/src/server/gitlab-api.js +67 -0
  188. package/src/server/gmail.js +60 -0
  189. package/src/server/gong.js +52 -0
  190. package/src/server/google-ads-search.js +134 -0
  191. package/src/server/google-ads.js +80 -0
  192. package/src/server/google-docs.js +36 -0
  193. package/src/server/google-drive.js +71 -0
  194. package/src/server/google-maps-platform.js +90 -0
  195. package/src/server/google-search-console.js +31 -0
  196. package/src/server/google-sheets.js +60 -0
  197. package/src/server/google-slides.js +36 -0
  198. package/src/server/google.js +61 -0
  199. package/src/server/granola.js +115 -0
  200. package/src/server/graphqlOperation.js +15 -0
  201. package/src/server/hex.js +29 -0
  202. package/src/server/heygen.js +54 -0
  203. package/src/server/hubspot.js +85 -0
  204. package/src/server/incident-io.js +68 -0
  205. package/src/server/inngest.js +86 -0
  206. package/src/server/jsonOperation.js +34 -0
  207. package/src/server/klipy.js +34 -0
  208. package/src/server/lexware.js +59 -0
  209. package/src/server/lightspeed.js +82 -0
  210. package/src/server/linear.js +52 -0
  211. package/src/server/linkedin.js +74 -0
  212. package/src/server/mailgun.js +76 -0
  213. package/src/server/mapbox.js +46 -0
  214. package/src/server/mcpRegistration.js +41 -0
  215. package/src/server/mcpTransport.js +60 -0
  216. package/src/server/microsoft-excel.js +67 -0
  217. package/src/server/microsoft-fabric.js +81 -0
  218. package/src/server/microsoft-onedrive.js +58 -0
  219. package/src/server/microsoft-onenote.js +52 -0
  220. package/src/server/microsoft-outlook.js +58 -0
  221. package/src/server/microsoft-powerpoint.js +5 -0
  222. package/src/server/microsoft-sharepoint.js +46 -0
  223. package/src/server/microsoft-teams.js +29 -0
  224. package/src/server/microsoft-word.js +5 -0
  225. package/src/server/microsoft.js +88 -0
  226. package/src/server/miro.js +29 -0
  227. package/src/server/n8n.js +78 -0
  228. package/src/server/notion.js +76 -0
  229. package/src/server/oura.js +48 -0
  230. package/src/server/paddle.js +83 -0
  231. package/src/server/perplexity.js +15 -0
  232. package/src/server/pipedrive.js +95 -0
  233. package/src/server/polar.js +20 -0
  234. package/src/server/posthog.js +44 -0
  235. package/src/server/prestashop.js +42 -0
  236. package/src/server/replicate.js +42 -0
  237. package/src/server/resend.js +93 -0
  238. package/src/server/salesforce.js +84 -0
  239. package/src/server/sanity.js +31 -0
  240. package/src/server/semrush.js +359 -0
  241. package/src/server/sentry.js +30 -0
  242. package/src/server/sevdesk.js +20 -0
  243. package/src/server/shopify.js +99 -0
  244. package/src/server/slack.js +143 -0
  245. package/src/server/snowflake.js +139 -0
  246. package/src/server/storyblok.js +49 -0
  247. package/src/server/stripe.js +13 -0
  248. package/src/server/supabase.js +13 -0
  249. package/src/server/tally.js +78 -0
  250. package/src/server/telegram.js +55 -0
  251. package/src/server/tiktok.js +86 -0
  252. package/src/server/twilio.js +90 -0
  253. package/src/server/twitch.js +409 -0
  254. package/src/server/wave.js +520 -0
  255. package/src/server/wix.js +1048 -0
  256. package/src/server/wiz.js +117 -0
  257. package/src/server/woocommerce.js +412 -0
  258. package/src/server/wordpress-com.js +236 -0
  259. package/src/server/wordpress-self-hosted.js +134 -0
  260. package/src/server/workday.js +136 -0
  261. package/src/server/x-twitter.js +110 -0
  262. package/src/server/xero.js +397 -0
  263. package/src/server/zoho-books.js +90 -0
  264. package/src/server/zoho-crm.js +89 -0
  265. package/src/server/zohoOAuth.js +21 -0
  266. package/src/shared/ai-models.json +8049 -0
  267. package/src/shared/ai.js +63 -0
  268. package/src/shared/algolia.js +29 -0
  269. package/src/shared/amazon-redshift.js +51 -0
  270. package/src/shared/amplitude.js +28 -0
  271. package/src/shared/atlassian.js +43 -0
  272. package/src/shared/aws.js +72 -0
  273. package/src/shared/canva.js +66 -0
  274. package/src/shared/chargebee.js +26 -0
  275. package/src/shared/clickhouse.js +38 -0
  276. package/src/shared/confidence.js +28 -0
  277. package/src/shared/databricks.js +33 -0
  278. package/src/shared/dbt-semantic-layer.js +32 -0
  279. package/src/shared/definitions.js +140 -0
  280. package/src/shared/figma.js +21 -0
  281. package/src/shared/firebase-cloud-messaging.js +45 -0
  282. package/src/shared/gemini-enterprise.js +33 -0
  283. package/src/shared/gong.js +33 -0
  284. package/src/shared/google-ads-search.js +31 -0
  285. package/src/shared/google-ads.js +28 -0
  286. package/src/shared/google-maps-platform.js +28 -0
  287. package/src/shared/google.js +133 -0
  288. package/src/shared/granola.js +25 -0
  289. package/src/shared/hex.js +28 -0
  290. package/src/shared/inngest.js +35 -0
  291. package/src/shared/lightspeed.js +75 -0
  292. package/src/shared/linkedin.js +27 -0
  293. package/src/shared/logo-dev.js +21 -0
  294. package/src/shared/mapbox.js +38 -0
  295. package/src/shared/mcp.js +92 -0
  296. package/src/shared/microsoft-fabric.js +47 -0
  297. package/src/shared/microsoft.js +231 -0
  298. package/src/shared/miro.js +27 -0
  299. package/src/shared/oura.js +23 -0
  300. package/src/shared/posthog.js +33 -0
  301. package/src/shared/prestashop.js +23 -0
  302. package/src/shared/salesforce.js +36 -0
  303. package/src/shared/semrush.js +24 -0
  304. package/src/shared/shopify.js +51 -0
  305. package/src/shared/siteUrl.js +12 -0
  306. package/src/shared/slack.js +88 -0
  307. package/src/shared/snowflake.js +55 -0
  308. package/src/shared/tiktok.js +22 -0
  309. package/src/shared/tokens.js +747 -0
  310. package/src/shared/twilio.js +41 -0
  311. package/src/shared/twitch.js +49 -0
  312. package/src/shared/wave.js +52 -0
  313. package/src/shared/wix.js +40 -0
  314. package/src/shared/wiz.js +41 -0
  315. package/src/shared/wordpress-com.js +30 -0
  316. package/src/shared/wordpress.js +69 -0
  317. package/src/shared/workday.js +50 -0
  318. package/src/shared/x-twitter.js +19 -0
  319. package/src/shared/xero.js +46 -0
  320. package/src/shared/zoho-books.js +39 -0
  321. package/src/shared/zoho-crm.js +43 -0
  322. package/src/shared/zoho-regions.js +12 -0
  323. package/test/ai.test.js +136 -0
  324. package/test/airtable.test.js +125 -0
  325. package/test/algolia.test.js +207 -0
  326. package/test/amazon-redshift.test.js +272 -0
  327. package/test/amplitude.test.js +239 -0
  328. package/test/apify.test.js +93 -0
  329. package/test/apollo-io.test.js +125 -0
  330. package/test/asana.test.js +99 -0
  331. package/test/ashby.test.js +97 -0
  332. package/test/atlassian.test.js +249 -0
  333. package/test/attention.test.js +79 -0
  334. package/test/aws.test.js +405 -0
  335. package/test/brevo.test.js +71 -0
  336. package/test/calendly.test.js +136 -0
  337. package/test/canva.test.js +258 -0
  338. package/test/chargebee.test.js +195 -0
  339. package/test/clickhouse.test.js +278 -0
  340. package/test/confidence.test.js +205 -0
  341. package/test/databricks.test.js +253 -0
  342. package/test/dbt-semantic-layer.test.js +221 -0
  343. package/test/designMcp.test.js +336 -0
  344. package/test/elevenlabs.test.js +52 -0
  345. package/test/firebase-cloud-messaging.test.js +242 -0
  346. package/test/firecrawl.test.js +66 -0
  347. package/test/gemini-enterprise.test.js +218 -0
  348. package/test/github-api.test.js +167 -0
  349. package/test/gitlab-api.test.js +160 -0
  350. package/test/gong.test.js +192 -0
  351. package/test/google-ads.test.js +350 -0
  352. package/test/google-maps-platform.test.js +191 -0
  353. package/test/google.test.js +710 -0
  354. package/test/granola.test.js +240 -0
  355. package/test/hex.test.js +253 -0
  356. package/test/heygen.test.js +121 -0
  357. package/test/hubspot.test.js +103 -0
  358. package/test/inngest.test.js +219 -0
  359. package/test/lightspeed.test.js +250 -0
  360. package/test/linear.test.js +146 -0
  361. package/test/linkedin.test.js +243 -0
  362. package/test/logo-dev.test.js +79 -0
  363. package/test/mailgun.test.js +107 -0
  364. package/test/mapbox.test.js +181 -0
  365. package/test/mcp.test.js +227 -0
  366. package/test/microsoft-fabric.test.js +258 -0
  367. package/test/microsoft.test.js +554 -0
  368. package/test/n8nOAuth.test.js +188 -0
  369. package/test/notionOAuth.test.js +183 -0
  370. package/test/oura.test.js +211 -0
  371. package/test/paddleCatalogue.test.js +51 -0
  372. package/test/paddlePermissions.test.js +101 -0
  373. package/test/perplexityComposition.test.js +39 -0
  374. package/test/pipedriveOAuth.test.js +140 -0
  375. package/test/posthog.test.js +200 -0
  376. package/test/prestashop.test.js +207 -0
  377. package/test/resend.test.js +163 -0
  378. package/test/salesforce.test.js +276 -0
  379. package/test/semrush.test.js +479 -0
  380. package/test/sentry.test.js +35 -0
  381. package/test/shopify.test.js +247 -0
  382. package/test/slack.test.js +320 -0
  383. package/test/snowflake.test.js +391 -0
  384. package/test/tally.test.js +75 -0
  385. package/test/telegram.test.js +58 -0
  386. package/test/tiktok.test.js +243 -0
  387. package/test/tokens.test.js +1079 -0
  388. package/test/twilio.test.js +221 -0
  389. package/test/twitch.test.js +573 -0
  390. package/test/wave.test.js +678 -0
  391. package/test/wix.test.js +1099 -0
  392. package/test/wiz.test.js +185 -0
  393. package/test/wordpress-com.test.js +469 -0
  394. package/test/wordpress.test.js +660 -0
  395. package/test/workday.test.js +314 -0
  396. package/test/x-twitter.test.js +256 -0
  397. package/test/xero.test.js +700 -0
  398. package/test/zoho-books.test.js +253 -0
  399. package/test/zoho-crm.test.js +223 -0
@@ -0,0 +1,358 @@
1
+ # WordPress.com
2
+
3
+ Import `wordpressComProvider` from
4
+ `@jskit-ai/connectors-catalog/server/wordpress-com`. This fragment uses an own
5
+ OAuth web registration for profile/site reads, post/page publishing and media management. It is distinct from
6
+ self-hosted WordPress Application Password authentication.
7
+
8
+ ## Register and configure
9
+
10
+ 1. Sign into WordPress.com. Open the [Applications Manager](https://developer.wordpress.com/apps/)
11
+ and choose **Create New Application**.
12
+ 2. Enter its name and description and the exact backend **Redirect URL**, then
13
+ choose **Create**. Retain the Client ID and store the Client Secret privately.
14
+ [Provider's registration walkthrough](https://github.com/Automattic/rest-api-console#configuring-the-console).
15
+ 3. Put the secret in `WORDPRESS_COM_CLIENT_SECRET` and the full callback URL in
16
+ `WORDPRESS_COM_CALLBACK_URL`. Enter the ID and these references in the editor.
17
+ 4. Keep `users` for verification. Select `sites` for site listing and `posts` for
18
+ post reads and publishing. Save configuration, then start consent through the runtime.
19
+
20
+ Server-to-server requests do not require each editor VM to be a JavaScript
21
+ origin. Browser API access instead has its own configured-origin requirements;
22
+ this fragment keeps provider tokens on the backend.
23
+ [Browser access](https://developer.wordpress.com/docs/api/rest-api-javascript/).
24
+
25
+ The OAuth flow uses `public-api.wordpress.com/oauth2/authorize` and
26
+ `/oauth2/token`, with an exact registered redirect URI. It requests granular
27
+ permissions rather than `global`; provider selection limits site access. The
28
+ `posts` permission allows both reads and management; the application must authorize each publishing action.
29
+ [OAuth and scopes](https://developer.wordpress.com/docs/api/oauth2/).
30
+
31
+ ```json
32
+ {
33
+ "schemaVersion": 1,
34
+ "registrations": {
35
+ "wordpress": {
36
+ "source": "own",
37
+ "clientId": "YOUR_ASSIGNED_CLIENT_ID",
38
+ "clientSecretRef": "env:WORDPRESS_COM_CLIENT_SECRET",
39
+ "callbackUrlRef": "env:WORDPRESS_COM_CALLBACK_URL"
40
+ }
41
+ },
42
+ "integrations": {
43
+ "publishing": {
44
+ "provider": "wordpress-com",
45
+ "displayName": "Publishing account",
46
+ "accountMode": "per-user",
47
+ "scopes": ["users", "sites", "posts"],
48
+ "authentication": { "method": "oauth2", "registrationRef": "wordpress" }
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ The editor offers shared, per-user and assistant ownership. Choose per-user
55
+ when each application user connects independently. Select media permission to upload and manage attachments. Comments enables discussion and moderation operations. Stats provides the site summary; taxonomy provides category/tag management.
56
+ Batch enables bounded read batches; each underlying resource remains subject to provider permissions.
57
+ All five optional permission families default off. Configuration
58
+ does not itself grant access or implement login.
59
+
60
+ ## Runtime and AI composition
61
+
62
+ Use the [OAuth file-connection pattern](../patterns/oauth-connection/PATTERN.md).
63
+ The provider adapter and connection lifecycle are imported JSKIT code. CLI and
64
+ editor use the same JSON, with encrypted text runtime files outside source;
65
+ no editor, database or generator is needed.
66
+
67
+ Verification reads `/rest/v1.1/me` with a limited fields selection, including
68
+ `token_scope`, `token_client_id` and `token_site_id`. These fields describe the
69
+ issued token's permissions and ownership.
70
+ [Profile response](https://developer.wordpress.com/docs/api/1.1/get/me/).
71
+ The adapter rejects a mismatched client and retains only permissions present
72
+ in the request, token response when supplied, and verified profile. Missing
73
+ `users` permission fails verification without replacing an existing grant.
74
+ It does not use a successful public post listing to authenticate the account.
75
+
76
+ The runtime sends comma-separated scopes following the provider examples.
77
+ It sends state and PKCE parameters; provider-side PKCE enforcement has not been
78
+ established by these local tests. The documented code-token example has no
79
+ expiry or refresh token. This adapter does not invent either: an explicit
80
+ expiry without refresh or a later 401 requires consent again. An absent expiry
81
+ does not promise permanent access. Local disconnect does not revoke the
82
+ provider grant; manage provider access separately.
83
+
84
+ `sites.list` accepts `site_visibility` (all/visible/hidden) and `site_activity`
85
+ (all/active/inactive), both defaulting to all. It returns the accessible `sites`
86
+ array in its provider envelope; no all-sites `global` grant is requested.
87
+ [Sites](https://developer.wordpress.com/docs/api/1.1/get/me/sites/).
88
+
89
+ ```js
90
+ const sites = await connections.invoke({ context, integrationId: "publishing", operation: "sites.list" });
91
+ const page = await connections.invoke({
92
+ context, integrationId: "publishing", operation: "posts.list",
93
+ input: { siteId: 81, number: 20, status: "publish", context: "display" }
94
+ });
95
+ // If page.meta.next_page is present, pass it as page_handle on an explicit next call.
96
+ ```
97
+
98
+ `posts.list` accepts a numeric site ID, `number` (1–100, default 20), an opaque
99
+ `page_handle`, `search`, `status` and display/edit `context`. The result retains
100
+ `found`, `posts` and `meta.next_page`; no next page is fetched automatically.
101
+ [Post listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/posts/).
102
+ The fragment bounds cursor length to 4096 and search to 500 characters. Site
103
+ domains/URLs are deliberately excluded from operation input. All authenticated
104
+ requests stay on `public-api.wordpress.com`, redirects fail, and returned site
105
+ URLs remain data. Applications own authorization and safe rendering of HTML.
106
+
107
+ ## Application ownership, callbacks and capacity
108
+
109
+ An AI can prepare configuration, callback wiring and library composition.
110
+ The reviewed registration instructions establish a dashboard flow, not a
111
+ supported public API for provisioning OAuth clients. Initial registration and
112
+ provider consent remain owner steps; do not invent a client-creation endpoint.
113
+
114
+ The application owner creates the provider registration and stores its secret
115
+ in the application's private Env. Public Vibe64, Vibe64 Online and CLI users use
116
+ this same ownership model. The configuration file holds the client ID and Env
117
+ references; the editor does not own the application's grants.
118
+
119
+ Register the exact callback implemented by the application. For a hosted project,
120
+ start with its assigned application URL and append the implemented callback path.
121
+ Save that same URL through the application's callback Env reference. On a domain
122
+ or host change, update both the provider registration and callback Env if the URL
123
+ changes. Preserve the application's identity and persistent grant store when
124
+ moving it; neither a new editor URL nor a new hosting address creates a new owner.
125
+ See the [callback guide](../../connectors-core/docs/oauth-callbacks.md) and
126
+ [application setup command](../../connectors-core/docs/setup-command.md).
127
+
128
+ Separate client IDs distinguish registration ownership and revocation. They do
129
+ not prove independent quota pools: provider limits can include shared user/site
130
+ or infrastructure boundaries. Automattic's guidelines prohibit excessive API
131
+ traffic and allow access limits.
132
+ [API usage guidance](https://developer.wordpress.com/docs/api/guidelines-for-responsible-use-of-automattics-apis/).
133
+
134
+ ## Focused evidence
135
+
136
+ Six provider tests use simulated HTTP and real encrypted JSON files. They cover
137
+ client verification, reduced scopes, cancellation, replay, persistence, owner
138
+ isolation, post paging, malformed replies and reconnect/error behavior. The
139
+ shared OAuth test additionally proves that refresh cannot restore permissions
140
+ removed during verification. Editor proof covers registration references,
141
+ permission selections and reload. No live signup, consent, provider calls or
142
+ sample-app generation are included. Login is not supplied. Publishing, media, comments, statistics, taxonomy and bounded batches have additional controlled fixtures; final package/UI acceptance is recorded separately.
143
+
144
+ ## Post and page publishing
145
+
146
+ `posts.get` retrieves one numeric `siteId`/`postId`, defaulting to `context: edit`.
147
+ `posts.create` takes a title plus optional content, excerpt, slug, status, type,
148
+ parent, featured_image and publicize. Creation explicitly defaults to `draft`,
149
+ `type: post` and `publicize: false`; `type: page` creates a page. `posts.list` can
150
+ filter either type. The same update/delete/restore operations apply to both.
151
+
152
+ `posts.update` requires a post ID and at least one changed field. It sends only
153
+ the supplied changes, preserving empty content/excerpts and an empty
154
+ `featured_image` to clear the attachment. Supply the attachment ID as a string
155
+ to set it. Scheduling/custom types and combined upload-and-publish are not yet
156
+ supplied. Publishing is explicit; the application owns who may publish and
157
+ whether publicizing through external services is allowed.
158
+
159
+ ```js
160
+ const draft = await connections.invoke({
161
+ context, integrationId: "publishing", operation: "posts.create",
162
+ input: { siteId: 81, type: "page", title: "Opening hours", content: "<p>9–5</p>" }
163
+ });
164
+ // After the application obtains the author's approval:
165
+ await connections.invoke({
166
+ context, integrationId: "publishing", operation: "posts.update",
167
+ input: { siteId: 81, postId: draft.ID, status: "publish", publicize: false }
168
+ });
169
+ ```
170
+
171
+ A native framework makes authenticated form-encoded POSTs to
172
+ `/rest/v1.1/sites/{siteId}/posts/new` and `/posts/{postId}` using the app-owned
173
+ token. It must explicitly choose draft status at creation: the provider's own
174
+ default is publish. Preserve text/HTML exactly in transport and apply suitable
175
+ HTML handling in the application UI.
176
+ [Create](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/new/),
177
+ [edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/).
178
+
179
+ `posts.delete` requires `confirmDeletion: true`. This is deliberately called
180
+ delete, not trash: with trash enabled it normally trashes a post, but a second
181
+ call can permanently delete it; sites without trash can delete immediately.
182
+ Inspect the returned status and never blindly repeat an uncertain request.
183
+ `posts.restore` returns a trashed post to its previous status, which may be
184
+ published. The runtime performs no automatic write retries or rollback.
185
+ [Delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/delete/),
186
+ [restore](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/restore/).
187
+
188
+ ## Media workflow
189
+
190
+ Select `media` before consent (reconnect if the current grant lacks it).
191
+ `media.list` supports bounded `number`, opaque `page_handle`, `search`, `post_ID`
192
+ and `mime_type`. It retains the provider envelope and `meta.next_page`; pass that
193
+ value as a cursor, never fetch it as a URL. `post_ID: 0` finds unattached items.
194
+ `media.get` takes a numeric mediaId. Returned media URLs are data, not automatically
195
+ downloaded. The app owns access checks and safe image/HTML presentation.
196
+ [Media listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/media/).
197
+
198
+ `media.upload` accepts one filename, MIME type and canonical `contentBase64`
199
+ (up to 5 MiB decoded), plus title, caption, description, alt and parent_id. It
200
+ encodes `media[0]` and `attrs[0][field]` multipart fields. It does not fetch file
201
+ paths or supplied URLs. The provider enforces allowed types, account storage and
202
+ upload permissions; this limit is the helper's memory bound, not a provider limit.
203
+ A native framework can use its multipart HTTP client with these same field names
204
+ and its app-owned Bearer token.
205
+
206
+ ```js
207
+ const result = await connections.invoke({
208
+ context, integrationId: "publishing", operation: "media.upload",
209
+ input: { siteId: 81, filename: "hours.png", mimeType: "image/png",
210
+ contentBase64: imageBytes.toString("base64"), alt: "Opening hours" }
211
+ });
212
+ // Persist returned media IDs before any later operation, and present errors.
213
+ if (Object.keys(result.media_errors ?? {}).length || result.media.length !== 1) {
214
+ // Let the author review partial results; do not automatically upload again.
215
+ return result;
216
+ }
217
+ await connections.invoke({
218
+ context, integrationId: "publishing", operation: "posts.update",
219
+ input: { siteId: 81, postId: draft.ID, featured_image: String(result.media[0].ID) }
220
+ });
221
+ ```
222
+
223
+ The result keeps `media` and `media_errors`, including a failed upload represented
224
+ by an empty media array. A valid HTTP response alone does not mean every file
225
+ was uploaded. If attachment succeeds and updating the draft fails, the app can
226
+ retry only the post update or explicitly remove the orphan attachment; no
227
+ automatic rollback is performed.
228
+ [Upload](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/new/).
229
+
230
+ `media.update` edits metadata sparsely; an empty alt/caption clears it and
231
+ parent_id changes the attached post. `media.delete` requires
232
+ `confirmDeletion: true` and permanently removes the item. It is not a trash
233
+ action. No automatic retry, binary download, URL sideloading, multiple-file
234
+ request or video-specific settings are supplied. The app may compose repeated
235
+ explicit uploads and inspect each outcome.
236
+ [Edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/$media_ID/),
237
+ [delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/media/$media_ID/delete/).
238
+
239
+ ## Comments and moderation
240
+
241
+ Select `comments` and reconnect if an existing grant lacks it. The provider
242
+ still enforces the site's commenting and moderation permissions. The app owns
243
+ its discussion screen, spam policy and which people can act as the connected
244
+ account. A shared account does not identify every app user as a WordPress author.
245
+
246
+ `comments.list` supports number (1–100), page, order and approved/unapproved/spam/
247
+ trash/all status, returning the provider's count and comment records.
248
+ `comments.get` reads one commentId. `comments.create` takes postId/content;
249
+ `comments.reply` takes commentId/content. Both send the exact content using
250
+ form encoding, and return the resulting moderation status. Creation may become
251
+ public immediately under the site's rules; there is no local draft queue.
252
+ [Listing](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/comments/),
253
+ [post reply](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/posts/$post_ID/replies/new/),
254
+ [comment reply](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/replies/new/).
255
+
256
+ `comments.update` requires an explicit status even when editing content, because
257
+ the provider defaults to approval. Use unapproved to keep a comment under review,
258
+ approved to publish, spam/unspam or trash/untrash for moderation. Unspam/untrash
259
+ can restore visibility. `comments.delete` requires confirmDeletion: true; inspect
260
+ the returned status because deletion may be permanent. Neither operation retries
261
+ automatically. Author identity edits, hierarchical listing and likes are not
262
+ supplied. The native-framework equivalent uses the same comments routes and
263
+ form fields with the application's token.
264
+ [Edit/moderate](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/),
265
+ [delete](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/comments/$comment_ID/delete/).
266
+
267
+ ```js
268
+ const queue = await connections.invoke({
269
+ context, integrationId: "publishing", operation: "comments.list",
270
+ input: { siteId: 81, status: "unapproved", number: 20, page: 1 }
271
+ });
272
+ // After an authorized moderator selects a comment:
273
+ await connections.invoke({
274
+ context, integrationId: "publishing", operation: "comments.update",
275
+ input: { siteId: 81, commentId: selectedCommentId, status: "approved" }
276
+ });
277
+ ```
278
+
279
+ ## Statistics and taxonomy
280
+
281
+ Select `stats` and reconnect to read `stats.read({siteId})`. It preserves the
282
+ provider's date, statistics and visits structures, including zero counts. The
283
+ app should label the returned reporting date and render the returned metric
284
+ keys; this is not live tracking, a scheduled collector or an analytics dashboard.
285
+ Site/account entitlements still apply. Native frameworks use an authenticated
286
+ GET to `/rest/v1.1/sites/{siteId}/stats`.
287
+ [Site statistics](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/stats/).
288
+
289
+ Select `taxonomy` for `categories` and `tags` operations. Each supports list, get,
290
+ create, update and delete. Lists accept number (1–1000), page and search. Get,
291
+ update and delete use the returned termSlug, encoded as one path segment.
292
+ Creation requires name, with optional description and a numeric parent for
293
+ categories. Updates are sparse; deletion requires confirmDeletion: true. The
294
+ provider owns default-category constraints and the effect on existing posts.
295
+ Renaming may change the returned slug; use that new value for later requests.
296
+ No automatic deletion recovery or term synchronization is supplied.
297
+
298
+ ```js
299
+ const category = await connections.invoke({
300
+ context, integrationId: "publishing", operation: "categories.create",
301
+ input: { siteId: 81, name: "Opening hours", description: "Business news" }
302
+ });
303
+ await connections.invoke({
304
+ context, integrationId: "publishing", operation: "posts.update",
305
+ input: { siteId: 81, postId: draft.ID, categories: [category.ID] }
306
+ });
307
+ ```
308
+
309
+ Post create/update accepts existing numeric category/tag IDs, at most 100 each.
310
+ These replace the supplied taxonomy selection; omitted fields stay untouched.
311
+ Empty lists request clearing, subject to the site's default-category behavior.
312
+ The app owns selecting IDs and retaining desired existing assignments. This
313
+ post operation needs posts permission; managing the terms themselves needs
314
+ taxonomy permission. Custom taxonomies are not supplied.
315
+
316
+ Native frameworks use the same category/tag routes, form-encoded writes and
317
+ `slug:{encodedSlug}` targets. Retain successful term creation if a later post
318
+ assignment fails; retry the assignment explicitly instead of creating duplicates.
319
+ [Category list](https://developer.wordpress.com/docs/api/1.1/get/sites/$site/categories/),
320
+ [create](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/categories/new/),
321
+ [edit](https://developer.wordpress.com/docs/api/1.1/post/sites/$site/categories/slug:$category/),
322
+ [tag and taxonomy reference](https://developer.wordpress.com/docs/api/rest-api-reference/).
323
+
324
+ ## Read batches
325
+
326
+ `batch.read` accepts siteId and one to six distinct resources selected from posts,
327
+ media, comments, categories, tags and stats. It builds GET-only endpoint paths for
328
+ one numeric site and requests 20 records per collection. It never accepts a URL,
329
+ write action, arbitrary endpoint or cross-site batch. Use individual list calls
330
+ for pagination/filtering and explicit writes for publishing. No transactional
331
+ write batch exists in this helper.
332
+
333
+ Select `batch` and the permissions for the resources you intend to read, then
334
+ reconnect. Local invocation checks batch permission; WordPress.com checks access
335
+ to each nested resource. The app must also authorize its resource selection and
336
+ siteId; do not expose an unrestricted batch route to app users. The returned
337
+ object keeps each endpoint's result or error. An outer success does not mean all
338
+ reads succeeded, and this operation does not normalize or retry individual errors.
339
+
340
+ ```js
341
+ const results = await connections.invoke({
342
+ context, integrationId: "publishing", operation: "batch.read",
343
+ input: { siteId: 81, resources: ["posts", "media"] }
344
+ });
345
+ for (const [endpoint, result] of Object.entries(results)) {
346
+ // Route provider errors to the app's feedback UI and render successful data.
347
+ if (result.error) showResourceError(endpoint, result.error);
348
+ else showResourceData(endpoint, result);
349
+ }
350
+ ```
351
+
352
+ Native frameworks send authenticated GET `/rest/v1.3/batch/` with repeated
353
+ `urls[]` query values such as `/sites/81/posts?context=edit&number=20`. Paths are
354
+ relative endpoints, not external URLs. The provider client returns results keyed
355
+ by endpoint.
356
+ [Batch API](https://developer.wordpress.com/docs/api/1.1/get/batch/),
357
+ [current client](https://github.com/Automattic/wp-calypso/blob/trunk/packages/wpcom.js/src/lib/batch.js),
358
+ [official archived composition test](https://github.com/Automattic/wpcom.js/blob/master/test/test.wpcom.batch.js).
@@ -0,0 +1,252 @@
1
+ # WordPress (self-hosted)
2
+
3
+ Import `wordpressSelfHostedProvider` from
4
+ `@jskit-ai/connectors-catalog/server/wordpress-self-hosted`. It verifies an
5
+ authenticated WordPress user and manages posts, pages, media and users under that
6
+ account. It does not implement
7
+ WordPress.com OAuth or application-user login.
8
+
9
+ ## Manual setup
10
+
11
+ 1. Sign into the HTTPS site's dashboard. Open **Users**, then edit the intended
12
+ user's profile. Record that user's login name.
13
+ 2. Find **Application Passwords**, enter a name such as `my-app-reader`, and
14
+ choose **Add New Application Password**. Copy the displayed password.
15
+ 3. Store it as `WORDPRESS_APPLICATION_PASSWORD` in the backend environment.
16
+ In the editor enter **Site URL**, **Username** and **Application password
17
+ reference** (`env:WORDPRESS_APPLICATION_PASSWORD`). Save configuration.
18
+
19
+ Application Passwords authenticate through HTTPS Basic authentication and are
20
+ available in WordPress core from 5.6. Use an Application Password rather than
21
+ the user's interactive login password.
22
+ [Authentication](https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/).
23
+
24
+ The profile shows each password's name and revocation control. Hosting or
25
+ plugins can disable this facility; the administrator must enable the intended
26
+ access if it is unavailable. The owning user's role remains relevant to which
27
+ resources are accessible.
28
+ [Application Passwords integration guide](https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/).
29
+
30
+ ## Portable configuration and runtime
31
+
32
+ ```json
33
+ {
34
+ "schemaVersion": 1,
35
+ "registrations": {},
36
+ "integrations": {
37
+ "publishing": {
38
+ "provider": "wordpress-self-hosted",
39
+ "displayName": "Company posts",
40
+ "accountMode": "shared",
41
+ "scopes": [],
42
+ "authentication": {
43
+ "method": "api-key",
44
+ "secretRef": "env:WORDPRESS_APPLICATION_PASSWORD"
45
+ },
46
+ "settings": {
47
+ "siteUrl": "https://publisher.example/blog/",
48
+ "username": "editor"
49
+ }
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ `api-key` is the common credential-reference configuration method; the provider
56
+ runtime turns this username/password pair into the correct Basic header. It
57
+ never inserts the password into a URL or source file. The site URL includes
58
+ the installation path but excludes `/wp-json`. Usernames reject colons and
59
+ control characters and are limited to 60 characters by this fragment.
60
+
61
+ Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with
62
+ `providers: [wordpressSelfHostedProvider]`, environment resolution and the file
63
+ connection store. CLI and editor share the same schema and JSON. Runtime state
64
+ uses encrypted text files outside source. No database or editor is required
65
+ by the consuming application.
66
+
67
+ ```js
68
+ await connections.connectApiKey({ context, integrationId: "publishing" });
69
+ const posts = await connections.invoke({
70
+ context, integrationId: "publishing", operation: "posts.list",
71
+ input: { page: 1, per_page: 20, status: "publish", context: "view" }
72
+ });
73
+ ```
74
+
75
+ Verification uses `GET /wp-json/wp/v2/users/me`, requiring a user object with
76
+ an ID, name and slug. An unauthenticated public-post response cannot verify
77
+ the account. `users.me` is also callable without input after connection.
78
+ [User endpoints](https://developer.wordpress.org/rest-api/reference/users/).
79
+
80
+ `posts.list` reads `/wp-json/wp/v2/posts`. Its default is ten published posts,
81
+ page 1 and view context. Optional `search` filters results; draft/private reads
82
+ require the owning user's access. Select `context: "edit"` explicitly when
83
+ needed. The response includes provider fields such as rendered titles/content.
84
+ [Posts](https://developer.wordpress.org/rest-api/reference/posts/).
85
+
86
+ This fragment bounds `per_page` to 1–100, `page` to 1–100000 and search to 500
87
+ characters. It accepts statuses publish/future/draft/pending/private and
88
+ contexts view/edit/embed. It returns one array; pagination headers and automatic
89
+ traversal are not exposed. An empty array is valid; malformed records and error
90
+ objects fail validation. Returned HTML and links are data. The application owns
91
+ safe HTML rendering and does not automatically fetch embedded links.
92
+
93
+ The configured destination may be an operator-owned private HTTPS host or use
94
+ a nondefault port. Embedded URL credentials, query strings, fragments and
95
+ parent-path segments are rejected. This validation is not DNS/SSRF filtering:
96
+ the application controls who can edit destinations and its outbound-network
97
+ policy. Operations cannot supply another host; redirects fail instead of
98
+ forwarding credentials. Changing site, path or username requires verification
99
+ again. Updating the environment binding rotates the password. Disconnect
100
+ removes local state; revoke the provider password separately.
101
+
102
+ ## Posts and pages publishing
103
+
104
+ Both `posts` and `pages` expose `.get`, `.create`, `.update` and `.trash`.
105
+ `pages.list` accepts the same page/per_page/search/context inputs as posts,
106
+ with publish/draft/pending/private status filters. All requests use the configured
107
+ site and installation path, authenticate with its Application Password and rely
108
+ on WordPress to enforce that user's capabilities. A successful `users.me` check
109
+ does not establish permission to edit or publish.
110
+
111
+ - `.get`: positive integer `id` and optional view/edit/embed `context`.
112
+ - `.create`: nonempty `title`, optional `content`, `excerpt`, `slug`, `status`,
113
+ `featured_media`, `comment_status`; omitted status creates a draft.
114
+ - `.update`: `id` and at least one of those fields. Omitted fields remain
115
+ untouched. Empty content/excerpt clears it; `featured_media: 0` removes the
116
+ featured image. Page operations also accept `parent` (0 for none) and
117
+ `menu_order` (signed integer).
118
+ - `.trash`: `id`; sends DELETE with `force=false`. Permanent deletion cannot be
119
+ requested through this operation. A site with trash disabled can reject it.
120
+
121
+ Supported write statuses are draft/pending/private/publish. Scheduling, custom
122
+ post types/fields, taxonomy editing and permanent deletion are not provided by
123
+ these operations. Raw content and excerpt whitespace is preserved, including
124
+ block markup. The framework must handle authoring/rendering HTML appropriately;
125
+ these methods are not a visual editor or HTML sanitizer.
126
+ [Posts](https://developer.wordpress.org/rest-api/reference/posts/),
127
+ [pages](https://developer.wordpress.org/rest-api/reference/pages/).
128
+
129
+ For a simple publishing workflow, create a draft, show the returned content and
130
+ link to an authorized reviewer, then make an explicit publish request:
131
+
132
+ ```js
133
+ const draft = await connections.invoke({ context, integrationId: "publishing",
134
+ operation: "posts.create", input: { title, content } });
135
+ // The application obtains the reviewer's decision and checks their authority.
136
+ await connections.invoke({ context, integrationId: "publishing",
137
+ operation: "posts.update", input: { id: draft.id, status: "publish" } });
138
+ ```
139
+
140
+ The app must authorize each resource and action before invoking it. Shared
141
+ credentials act as the connected WordPress user for every permitted app caller.
142
+ WordPress may reject creation, editing another author's content, publishing or
143
+ trashing under that user's role. Return that failure; do not reconnect as an
144
+ administrator or silently change roles. Updating published content can take
145
+ effect immediately and may trigger site plugins/notifications. There is no
146
+ transaction spanning multiple calls and no blind retry of an uncertain write;
147
+ inspect the site's content before deciding whether to repeat it.
148
+
149
+ A non-Node framework uses its own HTTPS client, the same site URL/Env username
150
+ and password binding, and these native `/wp-json/wp/v2/posts` or `/pages` routes.
151
+ Use GET for reads, JSON POST for create/update, and DELETE with force=false for
152
+ trash. There is no Vibe64 runtime or JSKIT service requirement for that framework.
153
+
154
+ ## Media and user operations
155
+
156
+ `media.list` accepts page/per_page/search/context and an optional `media_type`
157
+ (image/video/text/application/audio). `media.get` takes `id` and optional context.
158
+ Both return metadata, including the media URL; they do not fetch the linked file
159
+ or forward credentials to a CDN. `media.update` accepts `id` and one or more of
160
+ `title`, `caption`, `description`, `alt_text`, `post` (0 detaches the attachment).
161
+
162
+ `media.upload` accepts `filename`, `mimeType`, canonical `contentBase64` and those
163
+ optional metadata fields. The runtime decodes at most **5 MiB** into an ordinary
164
+ multipart `file` upload; WordPress enforces allowed types, upload_files capability
165
+ and any smaller site limit. No filesystem path or source URL is fetched by the
166
+ connector. The framework validates its incoming upload and size before encoding
167
+ it. A Node backend can use `Buffer.from(fileBytes).toString("base64")`; another
168
+ framework can send its native multipart upload to the same media endpoint.
169
+
170
+ ```js
171
+ const attachment = await connections.invoke({ context, integrationId: "publishing",
172
+ operation: "media.upload", input: { filename: "cover.png", mimeType: "image/png",
173
+ contentBase64: Buffer.from(fileBytes).toString("base64"), alt_text: "Cover image" } });
174
+ await connections.invoke({ context, integrationId: "publishing",
175
+ operation: "posts.update", input: { id: draft.id, featured_media: attachment.id } });
176
+ ```
177
+
178
+ These are separate writes. If attaching the image fails, the uploaded attachment
179
+ can still exist. Show that outcome and allow explicit recovery; do not silently
180
+ repeat uploads or delete the attachment. `media.delete` requires `id` and
181
+ `force: true`, returns WordPress's deletion response, and **permanently removes**
182
+ the attachment/file. It is deliberately different from post/page trash. The app
183
+ must obtain the intended user's confirmation and authorize that exact resource.
184
+ [Media endpoint reference](https://developer.wordpress.org/rest-api/reference/media/).
185
+
186
+ `users.list` takes page/per_page/search/context; `users.get` takes id/context.
187
+ Public view may expose only authors; edit context and full lists require the
188
+ connected account's capabilities. `users.create` requires username, email,
189
+ password and explicit roles; it never uses an implicit site's default role.
190
+ Supported optional profile fields are name, first_name, last_name, nickname and
191
+ description. `users.update` takes id and at least one profile/email/password/roles
192
+ field; omitted fields remain unchanged. Role IDs may be custom site roles;
193
+ WordPress checks whether the actor is allowed to assign them. There is no local
194
+ role elevation or change to the application's own login system.
195
+
196
+ Passwords here are transient **server-side operation input**, not fields in
197
+ integrations.json or the connection store. The framework must keep them out of
198
+ chat, URL parameters, logs and client responses. Prefer the site's own onboarding
199
+ and password-reset flow when an administrator should not handle new passwords.
200
+ Returned user records cannot include a password. Changing the credential owner's
201
+ profile or deleting that owner may interrupt subsequent connector use.
202
+
203
+ `users.delete` requires id, force:true and an explicit positive `reassign` user ID
204
+ for the removed user's content. It is permanent, not a trash action. The app
205
+ must authorize this administrative action; multisite and site plugins may impose
206
+ additional restrictions or trigger notifications. Failures are returned without
207
+ automatic retries. No batch transaction, role provisioning or multisite network
208
+ administration is implemented.
209
+ [Users endpoint reference](https://developer.wordpress.org/rest-api/reference/users/).
210
+
211
+ For read-only public content a framework can make its own unauthenticated REST
212
+ reads. This connector always authenticates; it never falls back to anonymous
213
+ access after denial. Shared-account operations must remain behind application
214
+ permissions even when some records happen to be public.
215
+
216
+ ## Automation and application ownership
217
+
218
+ An AI can prepare the files and library composition. An authorized operator
219
+ with shell access can provision a password using
220
+ `wp user application-password create <user> <app-name> --porcelain`.
221
+ The command prints the new credential; an automation must capture it directly
222
+ into the secret store and keep it out of logs.
223
+ [WP-CLI password creation](https://developer.wordpress.org/cli/commands/user/application-password/create/).
224
+
225
+ The REST API also supports creating and deleting passwords at
226
+ `/wp-json/wp/v2/users/{userId}/application-passwords`. It requires an already
227
+ authorized identity, so it does not bootstrap an unknown site's credentials.
228
+ The fragment does not expose these administrative operations.
229
+ [Application Passwords API](https://developer.wordpress.org/rest-api/reference/application-passwords/).
230
+
231
+ These are passwords owned by a user on a particular site, not global OAuth
232
+ registrations. Use a recognizable application name for revocation and
233
+ attribution. Separate passwords do not provide independent site capacity. The
234
+ application selects its private Env binding and enforces its own access policy;
235
+ the connected site remains owned by that customer.
236
+
237
+ Manual authentication has no callback, so editor VM and deployed-app domains
238
+ do not need registration. Use the site's final HTTPS address. Moving that site
239
+ or changing its installation path requires configuration and verification again.
240
+ The adapter does not configure per-password scopes, generate passwords, install
241
+ plugins, change WordPress roles or enable disabled REST routes.
242
+
243
+ ## Focused proof and limits
244
+
245
+ The WordPress-family suite uses simulated provider replies and actual encrypted
246
+ JSON persistence. It covers authenticated verification, posts/drafts, Basic
247
+ headers, site paths, field/input validation, rotation, restart, ownership,
248
+ disconnect, changed destinations and failure responses. Editor checks cover
249
+ fields, error feedback, references, setup links and reload. Live administration,
250
+ provider use and sample-app generation are excluded. Post/page writes, exact multipart upload bytes, media management and user
251
+ administration have controlled fixtures. Custom post types, scheduling, taxonomy
252
+ editing, binary downloads and alternative authentication plugins are not supplied.