agentsclimarketplace

Blogger

Skill AceDataCloud/Skills/skills/blogger

Agent Skills for AceDataCloud AI services — music, image, video generation, web search, and more. Compatible with Claude Code, GitHub Copilot, Gemini CLI, and all agentskills.io-compatible agents.

Install
npx -y skills add AceDataCloud/Skills --skill blogger

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 13 stars13 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

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.

The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

3.8 KB, as published. Nobody here has run it

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}'

Publish a post

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.

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).

  • Publish a staged draft: POST /blogs/{blogId}/posts/{postId}/publish.
  • Update a post: PUT /blogs/{blogId}/posts/{postId} with the same shape.

List / read posts

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}'

Gotchas

  • Enable the Blogger API on the Google Cloud project backing the OAuth client, or calls 403 with accessNotConfigured.
  • A 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.
  • An empty {"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.
  • Paginate with &pageToken=$PAGE_TOKEN from the previous .nextPageToken.

Record the output

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:

publish_artifact(kind="article", channel="blogger", title="<title>", url="<the REAL returned URL>", status="delivered")

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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.