Claude Editorial Bridge
WordPress plugin — AI Editorial Bridge for Claude. Create and edit drafts via REST API.
by Steve Macias · github.com/stevemacias/claude-editorial-bridge · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/stevemacias/claude-editorial-bridge/archive/refs/heads/main.zipReadme
Claude Editorial Bridge
A secure WordPress plugin that lets Claude create drafts and propose edits via a controlled REST API. You remain the final publisher on every piece of content.
REST namespace: /wp-json/claude-editor/v1/
Custom post type: claude_edit_proposal
Requires: WordPress 6.0+, PHP 8.0+
Installation
- Copy the
claude-editorial-bridge/folder towp-content/plugins/ - Activate in Plugins → Installed Plugins
- Go to Claude Editor → Settings
- Click Generate New Token and store it in your password manager
- Configure rate limits and other settings
- Point Claude at
https://www.stevemacias.com/wp-json/claude-editor/v1/
Endpoints
| Method | Path | Description |
|---|---|---|
GET |
/status |
Health check; returns plugin config visible to Claude |
POST |
/drafts/post |
Create a draft blog post |
POST |
/drafts/page |
Create a draft page |
GET |
/content/search |
Search existing posts/pages |
GET |
/content/{id} |
Read a post/page |
POST |
/content/{id}/proposal |
Propose an edit to an existing post/page |
GET |
/proposals |
List proposals (filter by status) |
POST |
/proposals/{id}/approve |
Approve and apply a proposal |
POST |
/proposals/{id}/reject |
Reject a proposal |
Authentication
All requests require:
Authorization: Bearer YOUR_TOKEN
Or alternatively:
X-Claude-Editor-Token: YOUR_TOKEN
curl Reference
Check status
curl -s \
-H "Authorization: Bearer YOUR_TOKEN" \
https://www.stevemacias.com/wp-json/claude-editor/v1/status
Create an Anglican theology draft
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "The Historic Episcopate and Anglican Identity",
"content": "<p>The threefold ministry of bishops, priests, and deacons...</p>",
"excerpt": "An exploration of how the historic episcopate shapes Anglican identity.",
"categories": ["Anglican Theology"],
"tags": ["bishops", "episcopacy", "church history", "orders"],
"source_notes": "Expanded from sermon notes, June 2026",
"editorial_notes": "Needs featured image and pull quote",
"seo_title": "The Historic Episcopate — Anglican Identity | stevemacias.com",
"meta_description": "How the threefold order of ministry defines Anglican faith and practice."
}' \
https://www.stevemacias.com/wp-json/claude-editor/v1/drafts/post
Create a sermon draft
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Sermon: The Third Sunday after Trinity",
"content": "<p>In the name of the Father...</p>",
"excerpt": "A sermon preached at Saint Paul'\''s on the Third Sunday after Trinity.",
"categories": ["Sermons"],
"tags": ["Third Sunday after Trinity", "1928 BCP", "Anglican"],
"source_notes": "Transcript from recording, lightly edited",
"seo_title": "Third Sunday after Trinity Sermon | stevemacias.com",
"meta_description": "Full text of the sermon preached on the Third Sunday after Trinity."
}' \
https://www.stevemacias.com/wp-json/claude-editor/v1/drafts/post
Create a headmaster/school reflection draft
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Headmaster'\''s Reflection: Virtue and Classical Education",
"content": "<p>Classical education is not merely an accumulation of facts...</p>",
"excerpt": "On the formation of virtue as the goal of a classical education.",
"categories": ["Classical Education", "Headmaster Reflections"],
"tags": ["virtue", "classical education", "formation"],
"source_notes": "Adapted from end-of-year address",
"editorial_notes": "Review for school website publication"
}' \
https://www.stevemacias.com/wp-json/claude-editor/v1/drafts/post
Search existing posts before drafting
curl -s \
-H "Authorization: Bearer YOUR_TOKEN" \
"https://www.stevemacias.com/wp-json/claude-editor/v1/content/search?keyword=episcopate&post_type=post&status=publish,draft"
Read an existing post
curl -s \
-H "Authorization: Bearer YOUR_TOKEN" \
https://www.stevemacias.com/wp-json/claude-editor/v1/content/42
Propose edits to an existing post
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"proposed_title": "The Historic Episcopate: Anglican Identity and Apostolic Succession",
"proposed_content": "<p>Revised and expanded content...</p>",
"proposed_excerpt": "A deeper look at how apostolic succession shapes Anglican identity.",
"proposed_tags": ["bishops", "episcopacy", "apostolic succession", "church history"],
"seo_title": "Historic Episcopate and Apostolic Succession | stevemacias.com",
"meta_description": "Updated meta description with target keyword.",
"source_content": "Original pasted text provided to Claude",
"editorial_notes": "Expanded the historical section; added three sources",
"explanation": "The original title undersells the apostolic succession angle. Added two paragraphs on the Lambeth Quadrilateral and expanded the conclusion."
}' \
https://www.stevemacias.com/wp-json/claude-editor/v1/content/42/proposal
List pending proposals
curl -s \
-H "Authorization: Bearer YOUR_TOKEN" \
"https://www.stevemacias.com/wp-json/claude-editor/v1/proposals?status=pending"
Approve a proposal (via API)
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
https://www.stevemacias.com/wp-json/claude-editor/v1/proposals/99/approve
Reject a proposal
curl -s -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
https://www.stevemacias.com/wp-json/claude-editor/v1/proposals/99/reject
JSON field reference
POST /drafts/post
{
"title": "Required. Post title.",
"content": "Required. HTML content (wp_kses_post sanitized).",
"excerpt": "Optional. Short summary.",
"slug": "Optional. URL slug (auto-generated from title if omitted).",
"categories": ["Optional. Array of category names or IDs."],
"tags": ["Optional. Array of tag names. Created if they don't exist."],
"featured_image_url": "Optional. Stored as meta for manual review.",
"source_notes": "Optional. What raw material was given to Claude.",
"editorial_notes": "Optional. Claude's notes for the editor.",
"seo_title": "Optional. SEO page title.",
"meta_description": "Optional. Meta description.",
"status": "Optional. 'draft' (default) or 'publish' (only if Allow Publish is on)."
}
POST /drafts/page
Same as above, minus categories, tags, featured_image_url. Adds:
{
"parent_page": 0
}
POST /content/{id}/proposal
{
"proposed_title": "Optional. New title.",
"proposed_content": "Optional. New HTML content.",
"proposed_excerpt": "Optional. New excerpt.",
"proposed_slug": "Optional. New URL slug.",
"proposed_categories": ["Optional. Array of category names or IDs."],
"proposed_tags": ["Optional. Array of tag names."],
"seo_title": "Optional. SEO title override.",
"meta_description": "Optional. Meta description override.",
"source_content": "Optional. Raw content provided to Claude.",
"editorial_notes": "Optional. Claude's notes.",
"explanation": "Required. Claude's explanation of proposed changes."
}
SEO meta keys
The plugin stores SEO fields under these meta keys regardless of whether an SEO plugin is active:
| Meta key | Description |
|---|---|
_ceb_seo_title |
SEO title override |
_ceb_meta_description |
Meta description |
If Yoast SEO, Rank Math, or All in One SEO is detected, values are also written to that plugin's native meta keys automatically.
Security
See SECURITY.md for the full security model.
Claude cannot: delete content, manage users, install plugins, edit themes, execute PHP, run SQL, or change site settings.
Changelog
See CHANGELOG.md.