npx skills add ...
npx skills add acedatacloud/skills --skill blogger
Publish posts to your Blogger blog and read your blogs / posts via the Blogger API v3. Use when the user mentions Blogger, blogspot, publishing a post to their blog, listing their blogs, or updating an existing Blogger post.
npx skills add acedatacloud/skills --skill blogger
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:
When the user asks to publish / post / 发布 / 发出去, publish it live
with ?isDraft=false (the default below) — do NOT silently save a draft
and stop. Only pass ?isDraft=true when the user explicitly asks for a
draft or to review before going public. After publishing, always report
the returned live url back to the user.
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.accessNotConfigured.403 "Method doesn't allow unregistered callers" means the request
carried no token (empty $GOOGLE_BLOGGER_TOKEN) — ask the user to
(re)connect the Blogger connector, don't blame their Google Cloud setup.{"kind":"blogger#blogList"} (no items) means the connected
Google account owns no blog — tell the user to create one at blogger.com
or reconnect with the account that has the blog.content must be HTML; passing raw Markdown will render literally.&pageToken=$PAGE_TOKEN from the previous .nextPageToken.After you successfully publish and obtain the live result URL, call the built-in
publish_artifact tool ONCE so the user can track this deliverable in My Outputs:
Use the real returned URL — never fabricate one. Call it once per published item,
only after delivery is confirmed; skip it (or use status="failed") if publishing failed.
See _shared/artifacts.md.
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}'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}'publish_artifact(kind="article", channel="blogger", title="<title>", url="<the REAL returned URL>", status="delivered")