Directory / plugin
CloseHub Connector
v1.3.0 · by Close·technology
Connect WordPress to CloseHub with one API key and expose content and site tools to MCP clients such as Claude.
About this plugin
CloseHub Connector replaces the multiple credentials previously required to link a WordPress site with CloseHub — a marketing project management platform.
Once the plugin is activated, it generates a secure API key and exposes a dedicated REST API namespace (/wp-json/closehub/v1/) that CloseHub uses to interact with your site.
It also exposes content abilities through the WordPress MCP Adapter. MCP clients can discover, list, read, create, update, upload an image, update a post slug, replace one exact Gutenberg block, and send posts to the trash using the server at /wp-json/mcp/mcp-adapter-default-server. closehub/upload-media accepts an image as data_base64, returns its Media Library URL, and requires the user’s upload_files capability; pass that URL as featured_image_url to create or update content without uploading a duplicate. closehub/update-post-slug accepts a post ID and slug, then returns the normalized unique slug and resulting URL. closehub/get-post returns a content_hash; use it with closehub/replace-gutenberg-block, a zero-based block_path, the current block name, and one replacement serialized block so a stale read cannot overwrite newer content. These abilities default to the post type but accept a post_type input for any other post type registered with an admin UI — pages, WooCommerce products (including product types WooCommerce’s own MCP abilities don’t support, such as subscriptions), or custom post types. Authenticate with OAuth as a WordPress user, or use the same CloseHub API key as a Bearer token for a shared Claude Team connector. The API key acts with the capabilities of the WordPress user who last generated it.
Settings: One page under Settings CloseHub (Network Admin Settings CloseHub on multisite) shows the API key, the CloseHub endpoint, the MCP server URL, and the user the key acts as. The same API key connects CloseHub and Claude.
Claude Team: In Claude, add a custom connector with the MCP server URL from Settings CloseHub, choose No sign-in, and add a request header named authorization with the value Bearer <your API key>. The URL uses a ?rest_route= query to help preserve the header when a server rewrite strips it from /wp-json/ requests. Everyone sharing this connector has the WordPress permissions of the user who last generated the key. Regenerating the key disconnects CloseHub and every Claude user until updated. OAuth per-user sign-in remains available under Advanced.
When WPML is active, create-post and POST /closehub/v1/posts also accept language and an optional translation_of source post ID. The connector assigns the new post to the requested language and joins it to the source post’s translation group. List/get/create responses include the language and translation-group details. Existing posts retain their language on update.
For WooCommerce, MCP clients with the manage_woocommerce capability can retrieve an order summary for a date range, including order count, total sales, average order value, and matching orders.
It also exposes a set of “site” abilities for the CLOSE web go-live checklist — configuration steps that used to be manual or wp-cli only. Each requires the WordPress capability noted below.
Available MCP site abilities:
closehub/search-replace-domain(manage_options) — Replaceold_domainwithnew_domainacross post content, options, comments, and meta tables, re-serializing serialized values safely. Skipswp_posts.guid. Passdry_run: trueto preview the number of rows that would change per table without writing anything. Example:{ "old_domain": "staging.example.com", "new_domain": "example.com" }.closehub/set-robots-txt(manage_options) — Writecontenttorobots.txt, physically if the site root is writable, otherwise served virtually through therobots_txtfilter. Example:{ "content": "User-agent: *\nDisallow:\nSitemap: https://example.com/sitemap.xml" }.closehub/set-post-noindex(edit_poston the targetpost_id) — Set or clear the noindex robots meta for one post/page using whichever SEO plugin (Rank Math or Yoast) is active. Example:{ "post_id": 42, "noindex": true }.closehub/flush-permalinks(manage_options) — Regenerate rewrite rules, equivalent towp rewrite flush. Takes no parameters.closehub/get-htaccess(manage_options, read-only) — Return whether.htaccessexists and its current content. Takes no parameters.closehub/set-site-settings(manage_options) — Update the site timezone and/or admin email; at least one is required. Example:{ "timezone": "Europe/Madrid", "admin_email": "[email protected]" }.closehub/reassign-posts-author(edit_others_posts) — Reassign every post ofpost_type(defaultpost) fromfrom_author_idtoto_author_id, with a per-post success result. Example:{ "from_author_id": 3, "to_author_id": 1 }.closehub/install-wp-org-plugin(install_plugins) — Install (without activating) a plugin from the WordPress.org plugin directory byslug. Example:{ "slug": "two-factor" }.closehub/list-unused-plugins(activate_plugins, read-only) — List installed plugins that are not currently active, as removal candidates. Takes no parameters.closehub/update-plugins-and-core(update_pluginsandupdate_core) — Update every plugin with an available update and WordPress core to the latest version, with a per-plugin success result. Takes no parameters.closehub/create-site-user(create_users, pluspromote_userswhenroleisadministrator) — Create a WordPress user for the site’s client.roledefaults toeditor;usernamedefaults to the local part ofemailwhen omitted. Example:{ "email": "[email protected]", "role": "editor" }.closehub/clear-cache(rocket_purge_cacheormanage_options) — Purge the page cache of the active caching plugin (currently WP Rocket).scopeisall(default, whole site) orposts(only the givenpost_ids; IDs that don’t match a post are reported back ininvalid_post_ids). Passminify: trueto also clear minified CSS/JS files. Returns503when no supported cache plugin is active. On multisite it purges only the site the MCP request is made against; on a subdirectory network, purging the main site with WP Rocket also clears the subsites’ cached pages, since they live inside the main site’s cache folder. Example:{ "scope": "posts", "post_ids": [ 42, 57 ] }.
What it replaces:
- WordPress Application Password (username + password)
- WooCommerce REST API consumer key and consumer secret
- Gravity Forms API key
You only need to share two things with CloseHub:
- Your site URL
- The generated API key (found at Settings CloseHub)
Available endpoints:
GET /closehub/v1/ping— verify the connectionPOST /closehub/v1/posts— publish or draft a post (or another post type viapost_type), including optional SEO metadata (Rank Math or Yoast), featured image, categories, and WPMLlanguage/translation_ofwhen WPML is activePUT /closehub/v1/posts/{id}— update a post’s (or other post type’s) title, content, excerpt, status, SEO metadata, featured image, or categoriesGET /closehub/v1/woocommerce/orders— fetch order data (requires WooCommerce)GET /closehub/v1/gravity-forms/forms— list forms (requires Gravity Forms)GET /closehub/v1/gravity-forms/forms/{id}— get form detailsGET /closehub/v1/gravity-forms/forms/{id}/entries— count form entries by date rangePOST /closehub/v1/elm-releases— create an Easy License Manager release for a product (byproduct_idorproduct_sku) and update its WooCommerce download file to the givenzip_urlin one call; optionaltested,requires,requires_php,upgrade_noticePUT /closehub/v1/elm-releases/{id}— update fields on an existing release (all optional) and, ifzip_urlis given, its product’s download file
WooCommerce, Gravity Forms, and Easy License Manager endpoints return a clear error if those plugins are not active — they are not required.
Multisite networks:
On a WordPress Multisite network, the same endpoints listed above are shared by every site in the network — there is no separate namespace or key to manage. Activate the plugin network-wide and go to Network Admin Settings CloseHub to find one API key shared by the whole network. Every request to those endpoints automatically returns a sites array with one entry per site in the network (site_id, url, and that site’s data or an error message), instead of a single site’s result — handy when a network is used to run the same company in multiple languages.