# Send Meta Business Suite to your agent
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
## Fast path
- Download the package from Yavira.
- Extract it into a folder your agent can access.
- Paste one of the prompts below and point your agent at the extracted folder.
## Suggested prompts
### New install

```text
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
```
### Upgrade existing

```text
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
```
## Machine-readable fields
```json
{
  "schemaVersion": "1.0",
  "item": {
    "slug": "meta-business-suite",
    "name": "Meta Business Suite",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Nachx639/meta-business-suite",
    "canonicalUrl": "https://clawhub.ai/Nachx639/meta-business-suite",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadUrl": "/downloads/meta-business-suite",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=meta-business-suite",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "packageFormat": "ZIP package",
    "primaryDoc": "SKILL.md",
    "includedAssets": [
      "SKILL.md"
    ],
    "downloadMode": "redirect",
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/meta-business-suite"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    }
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/meta-business-suite",
    "downloadUrl": "https://openagent3.xyz/downloads/meta-business-suite",
    "agentUrl": "https://openagent3.xyz/skills/meta-business-suite/agent",
    "manifestUrl": "https://openagent3.xyz/skills/meta-business-suite/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/meta-business-suite/agent.md"
  }
}
```
## Documentation

### Configuration

CRITICAL: Never hardcode tokens or IDs in commands. Always use variables.

### Option A: Environment variables (recommended)

Set these environment variables before using the skill:

export META_PAGE_ACCESS_TOKEN="your-page-access-token"
export META_PAGE_ID="your-page-id"

Then use them directly:

PAGE_TOKEN="$META_PAGE_ACCESS_TOKEN"
PAGE_ID="$META_PAGE_ID"

The same Page Access Token works for both Facebook and Instagram (the IG Business account is linked to the Page).

### Option B: Token cache file (alternative)

If environment variables are not set, credentials can be read from ~/.meta_tokens_cache.json (chmod 600):

PAGE_TOKEN=$(python3 -c "
import json, os
d = json.load(open(os.path.expanduser('~/.meta_tokens_cache.json')))
page_id = list(d['pages'].keys())[0]
print(d['pages'][page_id]['access_token'])
")

PAGE_ID=$(python3 -c "
import json, os
d = json.load(open(os.path.expanduser('~/.meta_tokens_cache.json')))
print(list(d['pages'].keys())[0])
")

IG_ID=$(python3 -c "
import json, os
d = json.load(open(os.path.expanduser('~/.meta_tokens_cache.json')))
print(list(d['instagram'].keys())[0])
")

### API Version

Always use v25.0 in all API calls.

### Text post

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/feed" \\
  -d "message=Tu mensaje aquí" \\
  -d "access_token=$PAGE_TOKEN"

### Post with image (URL)

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/photos" \\
  -d "url=https://example.com/image.jpg" \\
  -d "message=Texto del post" \\
  -d "access_token=$PAGE_TOKEN"

### Post with image (local file)

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/photos" \\
  -F "source=@/path/to/image.jpg" \\
  -F "message=Texto del post" \\
  -F "access_token=$PAGE_TOKEN"

### Post with video

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/videos" \\
  -F "source=@/path/to/video.mp4" \\
  -F "description=Descripción del vídeo" \\
  -F "title=Título del vídeo" \\
  -F "access_token=$PAGE_TOKEN"

### Post with link

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/feed" \\
  -d "message=Mira este artículo" \\
  -d "link=https://example.com/article" \\
  -d "access_token=$PAGE_TOKEN"

### Schedule a post

# Get Unix timestamp: python3 -c "from datetime import datetime; print(int(datetime(2026,3,1,9,0).timestamp()))"

curl -X POST "https://graph.facebook.com/v25.0/$PAGE_ID/feed" \\
  -d "message=Post programado" \\
  -d "published=false" \\
  -d "scheduled_publish_time=UNIX_TIMESTAMP" \\
  -d "access_token=$PAGE_TOKEN"

Note: Must be between 10 minutes and 75 days from now.

### List scheduled posts

curl -s "https://graph.facebook.com/v25.0/$PAGE_ID/scheduled_posts?access_token=$PAGE_TOKEN"

### Page info

curl -s "https://graph.facebook.com/v25.0/$PAGE_ID?fields=name,fan_count,followers_count,about&access_token=$PAGE_TOKEN"

### Recent posts

curl -s "https://graph.facebook.com/v25.0/$PAGE_ID/feed?fields=message,created_time,id,shares,likes.summary(true),comments.summary(true)&limit=10&access_token=$PAGE_TOKEN"

### Page insights

curl -s "https://graph.facebook.com/v25.0/$PAGE_ID/insights?metric=page_views_total,page_fan_adds,page_engaged_users&period=day&access_token=$PAGE_TOKEN"

### Delete a post

curl -X DELETE "https://graph.facebook.com/v25.0/POST_ID?access_token=$PAGE_TOKEN"

### Comment on a post

curl -X POST "https://graph.facebook.com/v25.0/POST_ID/comments" \\
  -d "message=Tu comentario" \\
  -d "access_token=$PAGE_TOKEN"

### Instagram — Publish

Instagram uses a 2-step process: create media container → publish.

### Photo post

# Step 1: Create container
CONTAINER_ID=$(curl -s -X POST "https://graph.facebook.com/v25.0/$IG_ID/media" \\
  -d "image_url=https://example.com/image.jpg" \\
  -d "caption=Tu caption con #hashtags" \\
  -d "access_token=$PAGE_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")

# Step 2: Publish
curl -X POST "https://graph.facebook.com/v25.0/$IG_ID/media_publish" \\
  -d "creation_id=$CONTAINER_ID" \\
  -d "access_token=$PAGE_TOKEN"

### Reel (video)

# Step 1: Create container
CONTAINER_ID=$(curl -s -X POST "https://graph.facebook.com/v25.0/$IG_ID/media" \\
  -d "media_type=REELS" \\
  -d "video_url=https://example.com/video.mp4" \\
  -d "caption=Caption del reel #reels" \\
  -d "access_token=$PAGE_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")

# Step 2: Wait for processing
curl -s "https://graph.facebook.com/v25.0/$CONTAINER_ID?fields=status_code&access_token=$PAGE_TOKEN"
# Poll until status_code = "FINISHED"

# Step 3: Publish
curl -X POST "https://graph.facebook.com/v25.0/$IG_ID/media_publish" \\
  -d "creation_id=$CONTAINER_ID" \\
  -d "access_token=$PAGE_TOKEN"

### Carousel (multiple images)

# Step 1: Create each item
IMG1=$(curl -s -X POST "https://graph.facebook.com/v25.0/$IG_ID/media" \\
  -d "image_url=https://example.com/img1.jpg" \\
  -d "is_carousel_item=true" \\
  -d "access_token=$PAGE_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")

IMG2=$(curl -s -X POST "https://graph.facebook.com/v25.0/$IG_ID/media" \\
  -d "image_url=https://example.com/img2.jpg" \\
  -d "is_carousel_item=true" \\
  -d "access_token=$PAGE_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")

# Step 2: Create carousel container
CAROUSEL=$(curl -s -X POST "https://graph.facebook.com/v25.0/$IG_ID/media" \\
  -d "media_type=CAROUSEL" \\
  -d "children=$IMG1,$IMG2" \\
  -d "caption=Mi carrusel #carousel" \\
  -d "access_token=$PAGE_TOKEN" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")

# Step 3: Publish
curl -X POST "https://graph.facebook.com/v25.0/$IG_ID/media_publish" \\
  -d "creation_id=$CAROUSEL" \\
  -d "access_token=$PAGE_TOKEN"

### Account info

curl -s "https://graph.facebook.com/v25.0/$IG_ID?fields=username,followers_count,follows_count,media_count&access_token=$PAGE_TOKEN"

### Recent media

curl -s "https://graph.facebook.com/v25.0/$IG_ID/media?fields=id,caption,media_type,timestamp,like_count,comments_count,permalink&limit=10&access_token=$PAGE_TOKEN"

### Post insights

curl -s "https://graph.facebook.com/v25.0/MEDIA_ID/insights?metric=impressions,reach,engagement&access_token=$PAGE_TOKEN"

### Delete a post

curl -X DELETE "https://graph.facebook.com/v25.0/MEDIA_ID?access_token=$PAGE_TOKEN"

### Reply to a comment

curl -X POST "https://graph.facebook.com/v25.0/COMMENT_ID/replies" \\
  -d "message=Tu respuesta" \\
  -d "access_token=$PAGE_TOKEN"

### Page Token

Stored in ~/.meta_tokens_cache.json under pages.<PAGE_ID>.access_token
Never expires (expires_at: 0)
Data access expires ~60 days — renew before

### Renew tokens

Go to Graph API Explorer
Select app → Add permissions → Generate Access Token
Exchange for long-lived token via Graph API Explorer or the App Dashboard
Get new page token:

curl -s "https://graph.facebook.com/v25.0/me/accounts?access_token=LONG_LIVED_TOKEN"

Update ~/.meta_tokens_cache.json with new tokens

### Tips

Never hardcode tokens or IDs — always use environment variables or read from ~/.meta_tokens_cache.json
Instagram requires images/videos as public URLs (not local files)
For local files on Instagram, upload to hosting first or use Facebook's photo upload
Reels may take time to process — poll status before publishing
Schedule Facebook posts at least 10 minutes in advance
Instagram does NOT support native scheduling via API
File permissions on cache: chmod 600 ~/.meta_tokens_cache.json
## Trust
- Source: tencent
- Verification: Indexed source record
- Publisher: Nachx639
- Version: 1.0.4
## Source health
- Status: healthy
- Source download looks usable.
- Yavira can redirect you to the upstream package for this source.
- Health scope: source
- Reason: direct_download_ok
- Checked at: 2026-04-30T16:55:25.780Z
- Expires at: 2026-05-07T16:55:25.780Z
- Recommended action: Download for OpenClaw
## Links
- [Detail page](https://openagent3.xyz/skills/meta-business-suite)
- [Send to Agent page](https://openagent3.xyz/skills/meta-business-suite/agent)
- [JSON manifest](https://openagent3.xyz/skills/meta-business-suite/agent.json)
- [Markdown brief](https://openagent3.xyz/skills/meta-business-suite/agent.md)
- [Download page](https://openagent3.xyz/downloads/meta-business-suite)