{"skill":{"slug":"farcaster-skill","displayName":"Farcaster Skill","summary":"Post, read, search, and engage on Farcaster via the Neynar API. Use when an agent needs to: (1) post casts with text, embeds, or in channels, (2) reply to or thread casts, (3) read a user's feed or a channel feed, (4) search casts by keyword, (5) look up user profiles by username or FID, (6) like or recast, (7) delete casts, (8) list or search channels. Pure bash+curl+jq — zero npm dependencies.","description":"---\nname: farcaster-skill\ndescription: \"Post, read, search, and engage on Farcaster via the Neynar API. Use when an agent needs to: (1) post casts with text, embeds, or in channels, (2) reply to or thread casts, (3) read a user's feed or a channel feed, (4) search casts by keyword, (5) look up user profiles by username or FID, (6) like or recast, (7) delete casts, (8) list or search channels. Pure bash+curl+jq — zero npm dependencies.\"\n---\n\n# Farcaster Skill (Neynar v2)\n\nAll scripts use the Neynar v2 REST API. Requires `curl` and `jq`.\n\n## Setup\n\nSet these env vars (or pass `--api-key` / `--signer` flags):\n\n```bash\nexport NEYNAR_API_KEY=\"your-api-key\"\nexport NEYNAR_SIGNER_UUID=\"your-signer-uuid\"   # required for write ops\n```\n\nAlternatively, put credentials in a JSON file and source them:\n```bash\neval $(jq -r '\"export NEYNAR_API_KEY=\\(.apiKey)\\nexport NEYNAR_SIGNER_UUID=\\(.signerUuid)\"' /path/to/neynar.json)\n```\n\n## Scripts\n\n### fc_cast.sh — Post a Cast\n\nPost text, with optional embeds, channel, or reply-to.\n\n```bash\n# Simple text cast\nscripts/fc_cast.sh --text \"Hello Farcaster!\"\n\n# Cast with image/video embed\nscripts/fc_cast.sh --text \"Check this out\" --embed \"https://example.com/image.png\"\n\n# Cast with two embeds (max 2)\nscripts/fc_cast.sh --text \"Links\" --embed \"https://a.com\" --embed \"https://b.com\"\n\n# Post to a channel\nscripts/fc_cast.sh --text \"gm\" --channel \"base\"\n\n# Reply to a cast\nscripts/fc_cast.sh --text \"Great point!\" --parent \"0xabcdef1234...\"\n\n# Quote-cast (embed another cast)\nscripts/fc_cast.sh --text \"This 👆\" --embed-cast \"0xabcdef1234...\" --embed-cast-fid 12345\n```\n\nOutput: JSON `{success, hash}`.\n\n### fc_feed.sh — Read Feeds\n\n```bash\n# User's casts by FID\nscripts/fc_feed.sh --fid 3 --limit 10\n\n# User's casts by username\nscripts/fc_feed.sh --username \"vitalik\" --limit 5\n\n# Channel feed\nscripts/fc_feed.sh --channel \"base\" --limit 10\n\n# Following feed (casts from people the signer follows)\nscripts/fc_feed.sh --following --fid 3 --limit 10\n\n# Cast replies/thread\nscripts/fc_feed.sh --thread \"0xabcdef...\"\n\n# Pagination with cursor\nscripts/fc_feed.sh --fid 3 --cursor \"eyJwYWdlIjoxfQ==\"\n```\n\nOutput: JSON array of casts with `{hash, author, text, timestamp, embeds, reactions, replies}`.\n\n### fc_user.sh — User Lookup\n\n```bash\n# By username\nscripts/fc_user.sh --username \"dwr\"\n\n# By FID\nscripts/fc_user.sh --fid 3\n\n# By Ethereum address (verified)\nscripts/fc_user.sh --address \"0x1234...\"\n\n# Bulk by FIDs\nscripts/fc_user.sh --fids \"3,194,6131\"\n```\n\nOutput: JSON user object(s) with `{fid, username, display_name, bio, follower_count, following_count, verified_addresses}`.\n\n### fc_search.sh — Search Casts\n\n```bash\n# Search by keyword\nscripts/fc_search.sh --query \"base chain\"\n\n# Search with author filter\nscripts/fc_search.sh --query \"ethereum\" --author-fid 3\n\n# Search in channel\nscripts/fc_search.sh --query \"gm\" --channel \"base\"\n\n# Limit results\nscripts/fc_search.sh --query \"nft\" --limit 5\n```\n\nOutput: JSON array of matching casts.\n\n### fc_react.sh — Like / Recast\n\n```bash\n# Like a cast\nscripts/fc_react.sh --like \"0xabcdef...\"\n\n# Unlike\nscripts/fc_react.sh --like \"0xabcdef...\" --undo\n\n# Recast\nscripts/fc_react.sh --recast \"0xabcdef...\"\n\n# Undo recast\nscripts/fc_react.sh --recast \"0xabcdef...\" --undo\n```\n\n### fc_delete.sh — Delete a Cast\n\n```bash\nscripts/fc_delete.sh --hash \"0xabcdef...\"\n```\n\n### fc_channels.sh — List and Search Channels\n\n```bash\n# Search channels by keyword\nscripts/fc_channels.sh --search \"defi\"\n\n# Get channel details by ID\nscripts/fc_channels.sh --id \"base\"\n\n# List trending channels\nscripts/fc_channels.sh --trending --limit 10\n```\n\n## Common Patterns\n\n### Thread a multi-cast announcement\n\n```bash\nHASH1=$(scripts/fc_cast.sh --text \"Thread 🧵 1/3: Big news!\" --channel \"base\" | jq -r .hash)\nHASH2=$(scripts/fc_cast.sh --text \"2/3: Details here...\" --parent \"$HASH1\" | jq -r .hash)\nscripts/fc_cast.sh --text \"3/3: Link below\" --parent \"$HASH2\" --embed \"https://example.com\"\n```\n\n### Monitor mentions (poll loop)\n\n```bash\nwhile true; do\n  scripts/fc_search.sh --query \"@yourusername\" --limit 5\n  sleep 300\ndone\n```\n\n### Post with media (upload first, then embed)\n\n```bash\n# Upload to catbox/litterbox first\nURL=$(curl -sS -F \"reqtype=fileupload\" -F \"time=72h\" \\\n  -F \"fileToUpload=@/path/to/image.png\" \\\n  https://litterbox.catbox.moe/resources/internals/api.php)\n\n# Then embed the URL\nscripts/fc_cast.sh --text \"Check this out!\" --embed \"$URL\"\n```\n\n## Free vs Paid Tier\n\nNot all endpoints are available on Neynar's free plan.\n\n| Feature | Script | Free? |\n|---------|--------|-------|\n| Post cast | fc_cast.sh | ✅ |\n| User casts feed | fc_feed.sh --fid | ✅ |\n| User lookup (username/FID/address) | fc_user.sh | ✅ |\n| Like / recast | fc_react.sh | ✅ |\n| Following feed | fc_feed.sh --following | ✅ |\n| Channel feed | fc_feed.sh --channel | ❌ Paid |\n| Cast search | fc_search.sh | ❌ Paid |\n| Channel search/details/trending | fc_channels.sh | ❌ Paid |\n| Delete cast | fc_delete.sh | ❌ Paid |\n| Thread/conversation | fc_feed.sh --thread | ✅ |\n\nScripts that hit paid endpoints will exit non-zero with a clear `402 PaymentRequired` error.\n\n## Error Handling\n\nAll scripts exit 0 on success, non-zero on failure. Errors print to stderr as JSON:\n```json\n{\"error\": \"message\", \"status\": 403}\n```\n\nCommon errors:\n- `401` — Invalid API key\n- `402` — Feature requires paid Neynar plan\n- `403` — Signer not approved or not paired with API key\n- `404` — Cast/user/channel not found\n- `429` — Rate limited (Neynar free tier: 300 req/min)\n\n## API Reference\n\nSee `references/neynar_endpoints.md` for the full endpoint list and parameter docs.\n","tags":{"latest":"1.0.1"},"stats":{"comments":0,"downloads":1494,"installsAllTime":56,"installsCurrent":3,"stars":0,"versions":2},"createdAt":1770615875729,"updatedAt":1779219493410},"latestVersion":{"version":"1.0.1","createdAt":1770621564714,"changelog":"Republish to fix registry visibility","license":null},"metadata":null,"owner":{"handle":"openclaw-consensus-bot","userId":"s17abyc0z9d80ev1crpcrxzt1h884mfk","displayName":"openclaw-consensus-bot","image":"https://avatars.githubusercontent.com/u/258721376?v=4"},"moderation":{"isSuspicious":false,"isMalwareBlocked":false,"verdict":"clean","reasonCodes":["review.llm_review"],"summary":"Review: review.llm_review","engineVersion":"v2.4.24","updatedAt":1779961518809}}