home / skills / openclaw / skills / tootbot

tootbot skill

/skills/behrangsa/tootbot

This skill posts updates to Mastodon, including statuses and media, empowering you to publish timely content with automation.

npx playbooks add skill openclaw/skills --skill tootbot

Review the files below or copy the command above to add this skill to your agents.

Files (4)
SKILL.md
4.5 KB
---
name: mastodon-publisher
description: Publish content to Mastodon. Use when you need to post a Mastodon status.
author: Behrang Saeedzadeh
version: 0.5.0
triggers:
  - "post to mastodon"
  - "publish status to mastodon"
metadata: { "clawdbot": { "emoji": "🐘" }, "requires": { "bins": ["bun"] } }
---

# Mastodon Publisher

Publish content to Mastodon. Use when you need to share updates, posts, or media.

## Usage

### Post one or more statuses to Mastodon

Post a new status to Mastodon with Bun:

```bash
bun {baseDir}/scripts/tootbot.js '{"status": "Hello, Mastodon!"}' '{"status": "Goodby, Mastodon!"}'
```

JSON fields

| Name                  | Description                              | Type                                            | Example                                               | Required | Default  |
| --------------------- | ---------------------------------------- | ----------------------------------------------- | ----------------------------------------------------- | -------- | -------- |
| `status`              | The text content of the status           | string                                          | "Hello, World"                                        | yes^1    | N/A      |
| `visibility`          | Sets the visibility of the posted status | `public` or `private` or `unlisted` or `direct` | "private"                                             | no       | "public" |
| `language`            | ISO 639-1 language code for this status  | ISO-639-1 Language Code                         | "en"                                                  | no       |          |
| `scheduledAt`         | Datetime at which to schedule a status   | RFC3339 date time                               | "2029-02-03T15:30:45.000Z"                            | no       |          |
| `quoteApprovalPolicy` | Sets who is allowed to quote the status  | `public` or `followrs` or `nobody`              | "nobody"                                              | no       | "public  |
| `media`               | Media to be attached to the status       | array of `{file, description}` objects          | `{"file": "/path/to/foo.png", "description" : "Foo"}` | no^2     |          |

- ^1 `status` can be ommitted when one or `--media-path` parameters are present
- ^2 one or `media` objects must be present if `status` is ommitted
- ^2 `media.description` is optional

Environment Variables

| Name                    | Description                | Example                   |
| ----------------------- | -------------------------- | ------------------------- |
| `MASTODON_URL`          | Your Mastodon instance URL | `https://mastodon.social` |
| `MASTODON_ACCESS_TOKEN` | Your Mastodon access token | `xAyBzC`                  |

## Examples

- **Post a new status**

  ```bash
  bun {baseDir}/scripts/tootbot.js '{"status": "Hello, Mastodon"}'
  ```

  Read the output and summarize it for the user.

- **Post a scheduled status**

  ```bash
  bun {baseDir}/scripts/tootbot.js '{"status": "Hello, future!", "scheduledAt" : "2030-02-05T13:21:34.000Z"}'
  ```

  Read the output and summarize it for the user.

- **Post a scheduled status with visibility, language, quote approval policy, and a single media attachment**

  ```bash
  bun {baseDir}/scripts/tootbot.js <<EOF
  {
    "status" : "Dorood",
    "visibility" : "public",
    "language" : "fa",
    "scheduledAt" : "2029-02-03T15:30:45.123456789+03:30",
    "quoteApprovalPolicy" : "followers",
    "media" : [
      {
        "file" : "/path/to/media.png",
        "description" : "Nowrooz Pirooz"
      }
    ]
  }
  EOF
  ```

  Read the output and summarize it for the user.

- **Post a new status with media multiple attachments**

  ```bash
  bun {baseDir}/scripts/tootbot.js <<EOF
  {
    "status" : "Edsger W Dijkstra",
    "visibility" : "public",
    "language" : "fa",
    "scheduledAt" : "2029-02-03T15:30:45.123456789+03:30",
    "quoteApprovalPolicy" : "followers",
    "media" : [
      {
        "file" : "/path/to/dijkstra.png",
        "description" : "Portrait"
      },
      {
        "file" : "/path/to/signature.png",
        "description" : "Signature"
      }
    ]
  }
  EOF
  ```

- **Post a new status with media attachments and no status text**

  ```bash
  bun {baseDir}/scripts/tootbot.js <<EOF
  {
    "media" : [
      {
        "file" : "/path/to/flower-1.png",
        "description" : "White Rose"
      },
      {
        "file" : "/path/to/flower-2.png",
        "description" : "Red Rose"
      }
    ]
  }
  EOF
  ```

## Notes

- Requires `bun` to be installed and available in the PATH.

Overview

This skill publishes content to Mastodon instances, letting you post statuses, attach media, and schedule posts. It provides a simple JSON-based interface for single or multiple statuses and supports visibility, language, quote approval, and media attachments. Use environment variables for instance URL and access token to authenticate.

How this skill works

You call the publisher with a JSON payload that includes status text, optional scheduling, visibility, language, quote approval policy, and media file descriptors. The skill uploads any provided media files, creates the status or scheduled status on the configured Mastodon instance, and returns the Mastodon API response for summarization. Authentication is handled via MASTODON_URL and MASTODON_ACCESS_TOKEN environment variables.

When to use it

  • Share updates, announcements, or short posts to a Mastodon instance programmatically.
  • Attach images or media when posting without needing the web UI.
  • Schedule posts for future publication on a Mastodon account.
  • Post on multiple accounts or automate regular broadcasts from scripts.
  • Publish a media-only toot (image-only post) without text.

Best practices

  • Set MASTODON_URL and MASTODON_ACCESS_TOKEN in the environment securely before running.
  • Validate media file paths and formats locally before submitting to avoid upload errors.
  • Use RFC3339 timestamps for scheduledAt to ensure correct scheduling across time zones.
  • Prefer shorter statuses to avoid trimming; handle API response to capture post ID and URL.
  • Rate-limit automated posts to comply with instance rules and avoid spam triggers.

Example use cases

  • Post a quick status: send a JSON with status text to publish immediately.
  • Schedule an announcement: include scheduledAt to publish at a future time.
  • Share a photo album: provide multiple media objects with file paths and descriptions.
  • Post media-only content: omit status but include one or more media items.
  • Automate daily summaries: script the skill to post periodic reports to a Mastodon account.

FAQ

What environment variables are required?

Set MASTODON_URL to your Mastodon instance URL and MASTODON_ACCESS_TOKEN to a valid access token.

Can I schedule a post?

Yes. Provide scheduledAt in RFC3339 format to create a scheduled status.