Publishes posts to Blogger blogs and reads blogs/posts via the Blogger API v3. Handles drafts, publishing, updating, and listing posts.
How this skill is triggered — by the user, by Claude, or both
Slash command
/acedatacloud-ai-media:bloggerWhen to use
Trigger when the user wants to publish a post to their Blogger blog, list their blogs, list / read posts on a blog, or update an existing post. The connector grants the Blogger scope (read + write); confirm before publishing publicly (you can insert as a draft first).
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Call the **Blogger API v3** with `curl + jq`. The user's OAuth bearer token is
Call the Blogger API v3 with curl + jq. The user's OAuth bearer token is
in $GOOGLE_BLOGGER_TOKEN; every call needs
Authorization: Bearer $GOOGLE_BLOGGER_TOKEN. Base URL:
https://www.googleapis.com/blogger/v3.
Errors are {"error": {"code": ..., "message": ...}} — show them verbatim.
401 → token expired, re-connect the Blogger connector.
Always start by listing the user's blogs to get a blogId:
curl -sS -H "Authorization: Bearer $GOOGLE_BLOGGER_TOKEN" \
"https://www.googleapis.com/blogger/v3/users/self/blogs" \
| jq '.items[] | {id, name, url}'
Confirm before publishing publicly. Use ?isDraft=true to stage a draft.
BLOG_ID="1234567890"
jq -n --arg t "My title" --arg c "<p>HTML content of the post…</p>" \
'{kind:"blogger#post", title:$t, content:$c, labels:["ai","video"]}' \
| curl -sS -X POST \
"https://www.googleapis.com/blogger/v3/blogs/$BLOG_ID/posts/?isDraft=false" \
-H "Authorization: Bearer $GOOGLE_BLOGGER_TOKEN" \
-H "Content-Type: application/json" \
-d @- \
| jq '{id, url, status}'
content is HTML (not Markdown) — convert Markdown to HTML first
(e.g. with pandoc -f markdown -t html or a simple converter).
POST /blogs/{blogId}/posts/{postId}/publish.PUT /blogs/{blogId}/posts/{postId} with the same shape.curl -sS -H "Authorization: Bearer $GOOGLE_BLOGGER_TOKEN" \
"https://www.googleapis.com/blogger/v3/blogs/$BLOG_ID/posts?maxResults=20&status=live" \
| jq '.items[] | {id, title, url, published}'
accessNotConfigured.content must be HTML; passing raw Markdown will render literally.&pageToken=$PAGE_TOKEN from the previous .nextPageToken.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub acedatacloud/skills --plugin acedatacloud-ai-tools