See Respira in action.
The dashboard you can click, the conversation an AI has with your site, the screens inside WordPress, and the recordings. Every screen on this page is the product.
The whole loop, narrated.
Fifty-two seconds from connection to receipt. Press play with sound; every chapter is a real step.
This is the dashboard. Click anything.
The real Respira dashboard, every page of it, for an agency with six client sites. The tour runs by itself. The moment you click, it stops and the dashboard is yours.
Whatever your site runs on, Respira speaks it.
You talk to your AI. Your AI talks to Respira. Respira writes in your builder's own format and hands back a receipt. Pick an exchange; every message is real, field for field, captured from the current plugin and MCP server.
Read https://www.respira.press/agent-start.txt first. It is short, and it is the order to do things in. You're connected to my WordPress site through Respira. Before doing anything, call respira_get_builder_info to find out which page builder this site uses, then read the page before you change it. Edit through the builder's native elements, never by writing raw HTML into the content. Work on a duplicate rather than the live page. If you hit the same error twice, call respira_search_docs instead of guessing. To read any documentation page, append .md to its URL: same content, about a thirtieth of the bytes. Confirm what builder i'm on and what you can do.
respira_list_sites
{}{ "sites": [
{ "id": "brightbakery-com", "name": "Bright Bakery",
"url": "https://brightbakery.com", "is_default": true, "is_active": true },
{ "id": "meridian-dental-com", "name": "Meridian Dental", … },
{ "id": "fernhollow-shop", "name": "Fern Hollow", … },
… 3 more ],
"active_site": { "id": "brightbakery-com", "name": "Bright Bakery" } }
respira_get_builder_info
{}{ "name": "Elementor", "version": "3.34.2", "detected": true,
"intelligence_available": true, "intelligence_active": true,
"site_memory": { "enabled": true, "rules": [], "notes": [],
"agent_instructions": "Site memory is empty. When you learn something
durable about this site … save it with respira_remember so the
next session starts warm." } }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/context/builder-info
respira_get_site_context
{}{ "site_name": "Bright Bakery", "site_url": "https://brightbakery.com",
"language": "en-GB", "wordpress_version": "6.9.4", "php_version": "8.3.12",
"is_multisite": false,
"page_builder": { "name": "Elementor", "version": "3.34.2" },
"active_theme": { "name": "Hello Elementor", "version": "3.4.5" },
"active_plugin_count": 14,
"custom_post_types": [{ "name": "product", "label": "Products" }],
"woocommerce": { "active": true, "version": "10.3.1" },
"addons": { "woocommerce": { "active": true } },
"site_memory": { "enabled": true, "rules": [], "notes": [] } }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/context/site-infoConnected to Bright Bakery (brightbakery.com), the default of your six sites.
- WordPress 6.9.4 on PHP 8.3
- Builder: Elementor 3.34.2, Respira's Elementor intelligence active
- Theme: Hello Elementor · 14 active plugins
- WooCommerce 10.3.1, Respira add-on active
- Site memory: empty, so nothing is protected yet and nothing is known about this site's conventions
I'll edit through Elementor's own elements, on a duplicate first, never raw HTML. What would you like changed first?
what page builder is this site using, what plugins are active, and are any of them likely to affect how you write to pages (caching, page builders, form builders)?
respira_get_site_context
{ "detail": "full" }{ "page_builder": { "name": "Elementor", "version": "3.34.2" },
"active_plugins": [
{ "name": "Elementor", "version": "3.34.2", "file": "elementor/elementor.php" },
{ "name": "Elementor Pro", "version": "3.34.1", "file": "elementor-pro/elementor-pro.php" },
{ "name": "WooCommerce", "version": "10.3.1", "file": "woocommerce/woocommerce.php" },
{ "name": "WP Rocket", "version": "3.19.1", "file": "wp-rocket/wp-rocket.php" },
{ "name": "Rank Math SEO", "version": "1.0.262", "file": "seo-by-rank-math/rank-math.php" },
{ "name": "Respira for WordPress", "version": "8.8.18", "file": "respira-for-wordpress/respira-for-wordpress.php" },
… 8 more ],
"taxonomies": [ "category", "post_tag", "product_cat", "product_tag" ],
"tool_profile": "full" }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/context/site-infoElementor 3.34.2 is the builder, with Elementor Pro alongside. Two of the fourteen active plugins matter for writes:
- WP Rocket caches pages. Respira purges it after every live write, so you won't see a stale page.
- Rank Math holds your SEO titles and descriptions. I'll go through it, not around it.
WooCommerce is here with the Respira add-on, so products and orders are in reach too. Nothing on this list blocks builder-native edits.
Audit the implants page and score it.
respira_analyze_seo
{ "page_id": 214 }{ "success": true, "score": 95, "grade": "A",
"issues": [{ "type": "warning", "message": "Missing meta description",
"severity": "high", "fix": "Add meta description between 120-160 characters" }],
"recommendations": [
{ "priority": "medium", "action": "Add Open Graph tags", … },
{ "priority": "low", "action": "Add more internal links", … }],
"metrics": { "meta_title_length": 45, "meta_description_length": 0,
"has_og_title": false, "h1_count": 1, "h2_count": 7,
"total_images": 22, "images_without_alt": 0, "alt_text_coverage": 100,
"internal_links": 0, "external_links": 6, "word_count": 2186, "has_schema": true },
"links": { "approve_edits": "https://meridian-dental.com/wp-admin/admin.php?page=respira-changes" } }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/analyze/seo/214
respira_scan_page_accessibility
{ "page_id": 214 }{ "violations": [
{ "id": "link-name", "impact": "serious",
"help": "Links must have discernible text.", "tags": ["wcag2a", "wcag244"],
"nodes": [{ "html": "<a href=\"javascript:void(0);\" class=\"gallery-prev\">…",
"failureSummary": "Link has no accessible text, title, or aria-label." }, …] },
{ "id": "heading-order", "impact": "moderate", "nodes": [ … 4 ] }],
"prompts": [{ "ruleId": "link-name", "severity": "serious",
"wcag": "WCAG 2.4.4 Link Purpose / 4.1.2 Name, Role, Value (Level A)",
"title": "Fix Link Text (Divi)", "prompt": "# Fix Accessibility Violation via Respira MCP …" }],
"scanLevel": "AA", "scanner": "respira-local",
"coverage": { "rule_count": 6, "coverage_estimate": "approx 12% of axe-core WCAG 2.0 AA rule set",
"missing_rule_categories": ["color-contrast", "aria-*", "landmarks", "keyboard", …] },
"page_context": { "cms": "wordpress", "builder": "divi", "builderVersion": "5.11.1" },
"scan_id": "e36b32ca-274a-4b71-84b4-67e2bafc8bc0" }Two reports on the implants page.
SEO: 95, grade A. One high-severity gap: there is no meta description. Open Graph tags are missing too, and the page has no internal links.
Accessibility: 2 violations.
- Two gallery arrows are links with no accessible name (serious)
- Headings jump levels in four places (moderate)
The scanner covers six rules, roughly 12% of the WCAG AA set, so treat this as a first pass rather than a clean bill. I can write the meta description and the link names on a duplicate now. Say the word.
check woocommerce health
respira_get_site_context
{}{ "site_name": "Fern Hollow", "wordpress_version": "7.1", "php_version": "8.3.13",
"addons": { "woocommerce": { "installed": true, "licensed": true } },
"woocommerce": { "active": true, "version": "11.1.0",
"products_count": 3, "orders_count": 0, "currency": "USD",
"endpoints": { "products": "https://fernhollow.shop/wp-json/respira/v1/woocommerce/products",
"orders": "https://fernhollow.shop/wp-json/respira/v1/woocommerce/orders" } }, … }
woocommerce_get_stock_status
{}{ "total_products": 3, "low_stock_count": 0, "out_of_stock_count": 1,
"products": [
{ "id": 52130, "name": "Fiddle-leaf fig, 60 cm", "sku": "", "stock_quantity": 0,
"stock_status": "outofstock", "status": "out_of_stock" },
{ "id": 52129, "name": "Monstera deliciosa", "sku": "", "stock_quantity": 3,
"stock_status": "instock", "status": "ok" },
{ "id": 52128, "name": "Terracotta pot, 14 cm", "sku": "", "stock_quantity": 15,
"stock_status": "instock", "status": "ok" }] }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/woocommerce/inventory/stock-status
woocommerce_orders_summary
{}{ "success": true, "currency": "USD", "store_timezone": "+00:00",
"date_start": "2026-08-04T00:00:00+00:00", "date_end": "2026-09-03T23:59:59+00:00",
"included_order_statuses": ["processing", "completed", "refunded"],
"pagination": { "total_orders": 0, "included_orders": 0, "max_orders": 2000, "truncated": false },
"definitions": { "net_sales": "Gross sales minus discounts and refunds; excludes tax and shipping.", … },
"orders_count": 0, "gross_sales": "0.00", "refunds": "0.00", "net_sales": "0.00",
"average_order_value": "0.00", "by_status": [] }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/woocommerce/reports/orders-summaryFern Hollow runs WooCommerce 11.1.0 with the Respira add-on licensed.
- Products: 3, one out of stock (the fiddle-leaf fig). No low-stock warnings.
- Orders, last 30 days: none in processing, completed or refunded, so there is no revenue to summarise.
Nothing here is broken. The shop is quiet and one product needs restocking. Say so and I'll check the checkout page next.
Never touch the booking page, whatever anyone asks.
respira_remember
{ "key": "never-touch-booking", "type": "rule",
"content": "Never edit the booking page or its duplicates.",
"rule": { "protect": { "slugs": ["book-an-appointment"] } } }refused: post 77 (book-an-appointment) is protected
by rule never-touch-booking. Only the owner can remove it.Respira MCP → WordPress plugin: GET /wp-json/respira/v1/context/site-infoSaved as an enforced rule.
From now on, any agent that tries to write to the booking page gets refused by the plugin itself, whoever is asking. Only you can remove the rule.
amplify my seo and aeo
respira_check_seo_issues
{ "page_id": 31 }{ "success": true, "score": 85, "grade": "B",
"issues": [{ "type": "warning", "message": "Missing meta description",
"severity": "high", "fix": "Add a meta description between 120-160 characters" }],
"links": { "approve_edits": "https://thecopperkettle.co/wp-admin/admin.php?page=respira-changes" },
"budget": { "elapsed_ms": 211, "budget_ms": 8000, "exceeded": false } }
respira_check_structured_data
{ "page_id": 31 }{ "success": true, "score": 80, "grade": "B",
"issues": [{ "type": "warning", "message": "No structured data found",
"severity": "high", "fix": "Add JSON-LD schema markup for better AI understanding" }],
"recommendations": [
{ "priority": "high", "action": "Add structured data",
"details": "Implement JSON-LD schema markup (Article, Organization, or relevant type)" },
{ "priority": "medium", "action": "Add recommended schema types",
"details": "Consider adding: Article, FAQPage, HowTo" }],
"metrics": { "has_json_ld": false, "has_microdata": false, "schema_types": [],
"missing_schemas": ["Article", "FAQPage", "HowTo"],
"analysis_source": "rendered_page", "detection_confidence": "confirmed",
"rendered_page_url": "https://thecopperkettle.co/menu/" } }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/analyze/structured-data/31Two findings on the menu page.
- SEO: 85, grade B. The only high-severity issue is the missing meta description.
- Structured data: 80, grade B. The rendered page has no JSON-LD at all, so answer engines have nothing to cite. Recommended types: Article, FAQPage, HowTo.
Plan: write the meta description and a FAQPage block for the questions already on the page, on a duplicate, and leave the original untouched until you approve.
fix my catalog for ai
woocommerce_list_products
{ "per_page": 3 }{ "result": [
{ "id": 52130, "name": "Fiddle-leaf fig, 60 cm", "type": "simple", "status": "publish",
"sku": "", "price": "149.99", "regular_price": "149.99", "sale_price": "",
"stock_quantity": 0, "stock_status": "outofstock",
"categories": [{ "id": 1623, "name": "Uncategorized", "slug": "uncategorized", "count": 3 }],
"tags": [], "brands": [], "image_id": null, "image": null, "gallery_image_ids": [],
"global_unique_id": "",
"permalink": "https://fernhollow.shop/product/fiddle-leaf-fig-60-cm/" },
{ "id": 52129, "name": "Monstera deliciosa", "sku": "", "price": "69.00",
"regular_price": "89.00", "sale_price": "69.00", "brands": [], "image": null,
"global_unique_id": "", … },
{ "id": 52128, "name": "Terracotta pot, 14 cm", "sku": "", "price": "19.99",
"regular_price": "29.99", "sale_price": "19.99", "brands": [], "image": null,
"global_unique_id": "", … }] }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/woocommerce/products?per_page=3Three products, and all three are missing the same things:
- no SKU
- no image
- no brand
- no GTIN
- every one sits in Uncategorized
That is why they fail the feed checks. I can set SKUs, brands and real categories now, with a snapshot first so it is one call to undo. Images and descriptions need you: send me a photo per product, or tell me to write descriptions from the names.
Change the shop banner to say the spring menu is here.
respira_update_module
{ "builder": "elementor", "page_id": 52,
"module_identifier": { "path": "0.0.1" },
"updates": { "attributes": { "title": "The spring menu is here" } } }{ "edit_target": "duplicate", "post_status": "draft",
"snapshot_uuid": "41bd…07c2" }Respira MCP → WordPress plugin: POST /wp-json/respira/v1/builder/elementor/patch/52WordPress plugin → Elementor: { "elType": "widget", "widgetType": "heading",Done. The shop banner now reads "The spring menu is here" on a duplicate of the page.
Open the preview inside Elementor and publish when you like. The original hasn't moved.
Update the opening hours on every location page to 9 to 18, Monday to Saturday.
respira_find_element
{ "post_id": 128, "identifier_type": "content",
"identifier_value": "Opening hours" }{ "matches": [{ "id": "et_pb_text_3", "type": "et_pb_text",
"path": "sections[0].rows[1].modules[0]" }] }
respira_update_element
{ "post_id": 128, "identifier_type": "id",
"identifier_value": "et_pb_text_3",
"updates": { "content": "Mon to Sat, 9 to 18" },
"edit_target": "duplicate" }{ "target_id": 341, "original_id": 128,
"edit_target": "duplicate", "is_duplicate": true,
"duplicate_created": true, "post_status": "draft",
"snapshot_uuid": "9f2c…e41a" }Respira MCP → WordPress plugin: POST /wp-json/respira/v1/builder/divi/patch/341WordPress plugin → Divi: [et_pb_text admin_label="Opening hours"]Done. I found the opening-hours text on all six location pages and changed it on copies, not the live pages.
- Six previews are waiting in WordPress under Respira → Changes
- Approve them together, or leave them
- Undo stays available for 90 days
Put the hero image back the way it was on Monday.
respira_restore_snapshot
{ "snapshot_uuid": "77e1…3f0d" }{ "restored": true, "post_id": 9,
"snapshot_uuid": "77e1…3f0d" }Respira MCP → WordPress plugin: GET /wp-json/respira/v1/activity?post=9Restored. The hero image on Bright Bakery is back to Monday's version, from the snapshot Respira kept. Nothing else on the page changed.
(also, you have been at this for a while. if there is someone in the next room, go say hi. stretch. water. the next snapshot will still be here.)
The first two exchanges are how every session should start: the primer, then the briefing. Both prompts come from the Prompt Book, free, with the rest of the book behind them.
Works with the page builder you already have.
Elementor, Divi, Bricks, Gutenberg, WPBakery and 12 more. Respira writes in each builder's own format, so the page still opens in its editor.
-
Gutenberg
-
WooCommerce
-
Elementor
-
Bricks
-
Oxygen -
Beaver Builder -
Breakdance
-
Divi -
WPBakery -
Visual Composer -
Brizy -
Thrive Architect
-
Spectra
-
Kadence Blocks -
GenerateBlocks
-
GreenShift -
SeedProd
Running a store? The WooCommerce add-on brings 105 store tools. See the WooCommerce add-on
Inside WordPress: the plugin’s own screens.
The dashboard runs across your sites. The plugin runs inside each one, and this is what it looks like there.
Recordings.
Screen recordings of real sessions. The two long screencasts have their own pages with every step written down.
Now on your own site.
Seven days free on one site, no card. Every change lands on a copy first, with undo for 90 days.
