Manage an emdash CMS blog deployed on Cloudflare — create, edit, publish, and schedule content, upload media, manage SEO metadata, organize taxonomies, plan content strategy, and distribute across channels. Use when the agent needs to work with emdash, blog management, content publishing, CMS operations, or when tasks mention "emdash," "blog post," "publish article," "content calendar," "editorial," "media upload," "SEO metadata," "categories," "tags," "blog strategy," "content schedule," "draft," "revision," or "blog analytics." For Cloudflare deployment of the emdash instance itself, see cloudflare-deploy.
Skill for managing an emdash blog. Covers content lifecycle, media, SEO, taxonomies, content strategy, and distribution.
Verify these env vars are set before any operation:
EMDASH_URL — Base URL of the emdash instance (e.g., https://blog.example.com)EMDASH_API_TOKEN — Personal Access Token (ec_pat_*) with appropriate scopesTest connectivity by calling the content_list MCP tool or schema_list_collections. If MCP is not available, see references/connection.md for REST API fallback.
Use MCP tools as the primary interface. Only fall back to REST API when MCP doesn't cover the operation (SEO, redirects, settings).
$EMDASH_URL/_emdash/api/mcp, stateless HTTP transport$EMDASH_URL/_emdash/api/emdash command with --url and --token flagsMCP covers content, schema, media, search, taxonomy, menus, and revisions. For SEO metadata, comments, redirects, sections, widgets, and settings — use the REST API.
Content task?
├─ Create / edit / delete posts → references/content/
├─ Publish / unpublish / schedule → references/content/
├─ Manage revisions / drafts → references/content/
├─ Compare live vs draft → references/content/
├─ Duplicate or translate content → references/content/
└─ Full-text search → references/content/
Media task?
├─ Upload images / files → references/media/
├─ Update alt text / captions → references/media/
├─ List / browse media library → references/media/
└─ Delete media files → references/media/
SEO task?
├─ Set meta title / description → references/seo/
├─ Manage slugs → references/seo/
├─ Configure sitemap → references/seo/
├─ Set up redirects / fix 404s → references/seo/
└─ Add structured data → references/seo/
Taxonomy task?
├─ Create / manage categories → references/taxonomy/
├─ Create / manage tags → references/taxonomy/
├─ Build hierarchical taxonomies → references/taxonomy/
├─ Assign terms to content → references/taxonomy/
└─ Manage navigation menus → references/taxonomy/
Strategy task?
├─ Build content calendar → references/strategy/
├─ Research topics / keywords → references/strategy/
├─ Plan editorial cadence → references/strategy/
├─ Analyze content gaps → references/strategy/
└─ Define content pillars → references/strategy/
Distribution task?
├─ Create social media posts → references/distribution/
├─ Draft newsletter content → references/distribution/
├─ Cross-promote across channels → references/distribution/
└─ Repurpose content for platforms → references/distribution/
| Domain | MCP Tools | REST API | CLI | Reference |
|---|---|---|---|---|
| Content | 15 tools | Full CRUD + workflow | emdash content | references/content/ |
| Media | 4 tools | Full CRUD + upload | emdash media | references/media/ |
| SEO | -- | Via content + redirects | -- | references/seo/ |
| Taxonomy | 3 tools | Full CRUD | emdash taxonomy | references/taxonomy/ |
| Strategy | -- | -- | -- | references/strategy/ |
| Distribution | -- | -- | -- | references/distribution/ |
| Schema | 6 tools | Full CRUD | emdash schema | references/connection.md |
| Search | 1 tool | Full-text + rebuild | emdash search | references/content/ |
| Menus | 2 tools | Full CRUD | emdash menu | references/taxonomy/ |
| Revisions | 2 tools | List + restore | -- | references/content/ |
| Comments | -- | Admin moderation | -- | references/content/ |
| Settings | -- | Get / update | -- | references/connection.md |
EmDash uses a database-first schema. Each collection gets a real SQL table (ec_*) with standard columns:
id, slug, status, author_id, created_at, updated_atpublished_at, scheduled_at, deleted_atlive_revision_id, draft_revision_idlocale, translation_groupRich text is stored as Portable Text (JSON), not HTML. This is critical — never send raw HTML to content fields. Use the TipTap/Portable Text format.
Important: Field names are schema-dependent. Always call schema_get_collection with includeFields: true before creating content to discover the correct field names (e.g., the rich text field might be content, body, or text).
| Role | Level | Can Do |
|---|---|---|
| SUBSCRIBER | 10 | Read content, media, taxonomies |
| CONTRIBUTOR | 20 | Create content, upload media |
| AUTHOR | 30 | Edit/publish own content |
| EDITOR | 40 | Edit/publish any content, manage taxonomies |
| ADMIN | 50 | Everything: schema, users, settings, plugins |
Agents control content and structure (data layer), not visual design (code layer):
| Can do via API | Cannot do via API |
|---|---|
Site title and tagline (PUT /settings) | Change CSS, colors, fonts, spacing |
| Reusable sections (hero, CTA blocks) | Switch templates (blog → portfolio) |
| Widget areas and widgets (sidebar, footer) | Modify component layout or header style |
| Navigation menus | Install or change themes |
| Content schema (add fields, collections) | Edit Astro template code |
Design changes require modifying the Astro source code in the site repository and redeploying. This is by design — emdash treats visual design as code and content as data.
emdash whoami._rev token on update. Re-fetch the item, get current _rev, retry.