@archy-ai/blog-post-mcp
v0.0.3
Published
Minimal MCP server that exposes tools to: - summarize the current git workspace changes - create/update/publish blog posts - trigger featured image / featured video generation via the existing Archy admin API
Readme
Blog Post MCP (Archy)
Minimal MCP server that exposes tools to:
- summarize the current git workspace changes
- create/update/publish blog posts
- trigger featured image / featured video generation via the existing Archy admin API
Env vars
ARCHY_BLOG_BASE_URL(default:http://localhost:4280)ARCHY_PUBLISHER_KEY(recommended; per-user key sent asx-archy-publisher-key)ARCHY_INTEGRATIONS_API_KEY(legacy/shared integration key; sent as Bearer orx-archy-api-key)ARCHY_API_KEY_HEADER(optional:authorization,x-archy-api-key, orx-archy-publisher-key; default:authorization)
Auth notes
- In your API, server-to-server auth is controlled by
INTEGRATIONS_API_KEY+INTEGRATIONS_API_ROLES.- Publishing and AI image/video require
adminrole. - Draft creation can work with
writerrole.
- Publishing and AI image/video require
- For local development you can bypass auth entirely by setting
LOCAL_DEV_ADMIN_BYPASS=truein the API environment.
Run
Standalone (recommended)
After publishing this package, you can run it without cloning meet.archy-ai.com:
ARCHY_BLOG_BASE_URL=https://meet.archy-ai.com \
ARCHY_INTEGRATIONS_API_KEY=... \
npx -y @archy-ai/blog-post-mcpNotes:
- The
archy_workspace_summarytool is optional; it will only be useful when run in a folder that is a git repo.
CLI flags (no env vars)
The published binary also supports flags that populate env vars internally (useful for VS Code MCP configs):
npx -y @archy-ai/blog-post-mcp \
--base https://meet.archy-ai.com \
--header x-archy-publisher-key \
--publisher-key pk_...
--timeout-ms 120000 \
--debugNotes:
--debuglogs only to stderr (stdout stays clean for MCP protocol).--timeout-mscontrols how long the MCP waits for API responses before aborting (useful when image/video prompts are complex).
From source
cd meet.archy-ai.com/tools/blog-post-mcp
npm install
ARCHY_BLOG_BASE_URL=http://localhost:4280 \
ARCHY_INTEGRATIONS_API_KEY=... \
node ./index.mjsYou can also pass flags when running from source:
node ./index.mjs \
--base http://localhost:7072 \
--header x-archy-publisher-key \
--publisher-key pk_...Smoke test (recommended)
Use this when you want a repeatable, one-command verification that:
- VS Code can spawn the MCP server (stdio)
- the full toolchain works end-to-end
- the backing local SWA dev server is reachable (
ARCHY_BLOG_BASE_URL)
What it does
The smoke script runs only via MCP tool calls (not curl):
archy_blog_create_draft(creates a dev-only draft)archy_blog_ai_draft(fills body + SEO)archy_blog_ai_image(generates a featured image)archy_blog_attach_feature_imagearchy_blog_ai_video(starts a featured video job conditioned on the image)archy_blog_ai_video_status(polls until succeeded/failed)archy_blog_attach_feature_videoarchy_blog_publish
Prereqs
- Start your local SWA stack so
http://localhost:4280is serving:npm run swa:dev(frommeet.archy-ai.com)
- Auth:
- Local dev: set
LOCAL_DEV_ADMIN_BYPASS=truein the API environment (recommended), OR - Provide
ARCHY_INTEGRATIONS_API_KEY/INTEGRATIONS_API_KEYso the admin endpoints authorize.
- Local dev: set
Run
From meet.archy-ai.com:
npm run mcp:blog:smokeOptional flags:
node ./scripts/archy-blog-mcp-smoke.mjs \
--base http://localhost:4280 \
--title "MCP Smoke Test (manual title)" \
--video-polls 30 \
--video-poll-ms 5000Expected result
On success, it prints a single JSON object like:
{
"ok": true,
"baseUrl": "http://localhost:4280",
"post": {
"id": "...",
"slug": "...",
"status": "published",
"publishedAt": "..."
},
"featureImage": { "assetId": "...", "url": "..." },
"featureVideo": { "requestId": "...", "assetId": "...", "url": "..." }
}If it fails, it exits non-zero and prints an error with context.
Agentic composer
These tools help an agent compose a validated TipTap/ProseMirror doc body from a safe “blocks” spec, then write it to a post.
Tools
archy_blog_get_post: fetch a post by idarchy_blog_compose_doc: convert blocks → TipTapdocJSON (no network)archy_blog_set_body_from_blocks: replace the post body with blocksarchy_blog_append_blocks: append blocks to an existing TipTapdoc
Block format (overview)
Each block is an object with a type.
Supported type values:
heading(attrs:level1-3; content fromtextorinlines)paragraph(content fromtextorinlines)quote(paragraphs: string[])bulletList,orderedList(items: string[])image(src, optionalalt)video(src)embed(url, optionalprovider)slider(items: [{ src, alt?, assetId? }])cardcardSet(cards: [...])cta
Inline rich text is supported in heading and paragraph via:
inlines: [{ text, bold?, italic?, href? }] where href must be http(s)://... or a site-relative path like /pricing.
