BlackOps Center Skill
Control your BlackOps Center sites from OpenClaw. Create, publish, and manage blog posts with advanced features for hero images, SEO, and multi-site support.
Setup
Generate an API token in BlackOps Center:
- Go to Settings → Browser Extension
- Copy your Personal Access Token
Configure the skill:
cd ~/.openclaw/skills/blackops-center cp config.example.yaml config.yaml # Edit config.yaml and paste your tokenDiscover your sites:
blackops-center list-sitesThis will show all sites associated with your token. No manual configuration needed!
Configuration
Create config.yaml with just your token:
api_token: "your-token-here"
base_url: "https://blackopscenter.com" # or your custom domain
# Optional: Set a default site (not recommended for multi-site users)
# default_domain: "yourdomain.com"
Sites are automatically discovered from your account. Run list-sites to see them.
Important for Multi-Site Users:
- Always specify
--domainexplicitly when running commands - If you have multiple sites, do NOT set
default_domainin config - OpenClaw agents should ask which site to use if not specified in your request
Available Commands
All commands use the blackops-center CLI wrapper.
List Sites
Show all sites you have access to (auto-discovered from your token):
blackops-center list-sites
Returns JSON with all your sites:
{
"sites": [
{
"id": "abc-123",
"domain": "yourdomain.com",
"name": "Your Site Name"
}
]
}
No manual configuration needed — your token determines which sites you can access.
Get Voice Profile
Get the AI-analyzed voice profile for a site. BlackOps Center analyzes your published blog posts to extract your authentic writing voice — tone scores, style features, expertise areas, and common patterns. This is not a marketing persona — it's a data-driven fingerprint of how you actually write.
# Get voice profile for default site
blackops-center get-voice
# Get voice for specific site
blackops-center get-voice --domain benenewton.com
Returns JSON with your analyzed voice profile:
{
"voice_profile": {
"tone_scores": {
"casual": 0.5,
"friendly": 0.62,
"humorous": 0.23,
"technical": 0.76,
"analytical": 0.69,
"professional": 0.72,
"authoritative": 0.68,
"conversational": 0.61
},
"style_features": [
"technical_density",
"personal_anecdotes",
"avg_sentence_length",
"code_examples_usage",
"paragraph_structure"
],
"expertise_areas": [
"software development",
"AI integration",
"DevOps",
"frontend architecture"
],
"common_patterns": [
"What if",
"Here's how",
"The problem was",
"Sound familiar?"
],
"compiled_prompt": "Writing style: technical, professional, analytical...",
"sample_size": 10
},
"examples": [],
"analysis_count": 10
}
Key fields:
tone_scores— Numeric breakdown of your writing tone (0-1 scale)style_features— Structural characteristics of your writingexpertise_areas— Topics extracted from your postscommon_patterns— Phrases and hooks you frequently usecompiled_prompt— Ready-to-use prompt for AI content generationsample_size/analysis_count— Number of posts analyzed
Use case: Feed the compiled_prompt (or the full profile) to AI models for content generation (tweets, replies, blog posts) that match your authentic voice — not a marketing persona.
If no posts have been analyzed yet, returns:
{
"voice_profile": null,
"examples": [],
"analysis_count": 0
}
List Posts
List posts for your site:
# List all posts
blackops-center list-posts
# List only published posts
blackops-center list-posts --status published
# List only drafts
blackops-center list-posts --status draft
# Limit results
blackops-center list-posts --limit 10
Get a Post
Get full details of a specific post:
blackops-center get-post <post-id>
Create a Post
Create a new draft post:
blackops-center create-post \
--title "My Post Title" \
--content "Post content in markdown" \
--excerpt "Optional excerpt" \
--tags "tag1,tag2,tag3"
All posts are created as drafts by default.
Output:
{"post": {...}, "site": {...}} # JSON response on stdout
✓ Post created: draft
Preview: https://yoursite.com/preview/my-post-title?token=abc123
The command outputs JSON on stdout (for programmatic use) and a human-readable preview link on stderr.
Update a Post
Update an existing post:
# Update title
blackops-center update-post <post-id> --title "New Title"
# Update content
blackops-center update-post <post-id> --content "New content"
# Publish a draft
blackops-center update-post <post-id> --status published
# Unpublish (back to draft)
blackops-center update-post <post-id> --status draft
You can combine multiple flags to update multiple fields at once.
Output when publishing:
{...} # JSON response
✓ Post published
Live URL: https://yoursite.com/post-slug
Output for draft updates:
{...} # JSON response
✓ Post updated: draft
Preview: https://yoursite.com/preview/post-slug?token=abc123
Delete a Post
blackops-center delete-post <post-id>
Generate Hero Image
Generate an AI-powered hero image for a post:
# Auto-generate from post content
blackops-center generate-hero --post-id abc123
# Custom prompt
blackops-center generate-hero --post-id abc123 \
--prompt "futuristic AI assistant coding" \
--style modern
# For specific site
blackops-center generate-hero --post-id abc123 \
--domain example.com
Styles: modern, minimal, tech, artistic
Update SEO Metadata
Update SEO fields for better search visibility:
# Update SEO title and description
blackops-center update-seo --post-id abc123 \
--title "Best AI Tools for 2026" \
--description "Comprehensive guide to AI automation tools"
# Update all SEO fields
blackops-center update-seo --post-id abc123 \
--title "Complete Guide" \
--description "Everything you need" \
--keywords "ai,automation,productivity" \
--og-image "https://example.com/hero.jpg"
Manage Tags
Advanced tag management operations:
# Add tags to existing tags
blackops-center manage-tags --post-id abc123 \
--action add --tags "ai,automation"
# Remove specific tags
blackops-center manage-tags --post-id abc123 \
--action remove --tags "outdated,deprecated"
# Replace all tags
blackops-center manage-tags --post-id abc123 \
--action replace --tags "new,fresh,updated"
# List current tags
blackops-center manage-tags --post-id abc123 --action list
Send Tweet
Send a tweet or thread to Twitter:
# Single tweet (immediate)
blackops-center send-tweet \
--text "Just shipped a new feature for BlackOps Center 🚀"
# Thread (immediate)
blackops-center send-tweet \
--thread "1/ Just launched a major update..." \
--thread "2/ New features include AI-powered hero images..." \
--thread "3/ Check it out at blackopscenter.com"
# Scheduled tweet
blackops-center send-tweet \
--text "Weekly content marketing tip 💡" \
--scheduled-for "2026-02-10T14:30:00Z"
# Different site with scheduling
blackops-center send-tweet \
--domain benenewton.com \
--text "Personal update about my latest project" \
--scheduled-for "2026-02-10T08:00:00-05:00"
Options:
--text TEXT- Send a single tweet (either this or --thread required)--thread TEXT- Add a tweet to a thread (repeatable)--domain DOMAIN- Target specific site (uses default if not set)--scheduled-for DATE- Schedule for later (ISO 8601 format, must be future date)
Scheduling:
- Scheduled tweets are processed by the BlackOps Center cron job (runs every 5 minutes)
- Format: ISO 8601 with timezone (e.g.,
2026-02-10T14:30:00Zor2026-02-10T09:30:00-05:00) - Must be a future date/time
- View scheduled tweets in the BlackOps Center Twitter dashboard
Output (immediate):
✓ Tweet posted
URL: https://x.com/BlackOpsTools/status/123456789
Output (scheduled):
✓ Tweet scheduled for 2026-02-10T14:30:00Z
List Scheduled Tweets
List all scheduled tweets for a site:
# List for default site
blackops-center list-scheduled-tweets
# List for specific site
blackops-center list-scheduled-tweets --domain blackopscenter.com
# Extract just IDs for bulk operations
blackops-center list-scheduled-tweets | jq -r '.[].id'
Output:
[
{
"id": "abc123",
"title": "Thread preview...",
"content": ["Tweet 1", "Tweet 2", "Tweet 3"],
"scheduledFor": "2026-02-11T09:00:00-05:00",
"tweetCount": 3,
"createdAt": "2026-02-10T05:26:00Z"
}
]
Delete Scheduled Tweet
Delete a scheduled tweet by ID:
# Delete by ID
blackops-center delete-scheduled-tweet --id abc123
# Delete from specific site
blackops-center delete-scheduled-tweet --id abc123 --domain blackopscenter.com
# Delete all scheduled tweets (be careful!)
blackops-center list-scheduled-tweets | jq -r '.[].id' | while read id; do
blackops-center delete-scheduled-tweet --id "$id"
done
Options:
--id ID- Scheduled tweet ID (required)--domain DOMAIN- Target specific site (uses default if not set)
Output:
✓ Scheduled tweet deleted: abc123
Reply to Tweet
Reply to a tweet on Twitter:
# Reply to a tweet by URL
blackops-center reply-tweet \
--tweet-url "https://x.com/user/status/123456789" \
--text "Great point! I wrote about this here: https://example.com/blog/post"
# Reply by tweet ID
blackops-center reply-tweet \
--tweet-id "123456789" \
--text "Exactly what I've been thinking 💯"
# Reply from specific site
blackops-center reply-tweet \
--domain example.com \
--tweet-url "https://x.com/user/status/123" \
--text "This aligns with our research"
Options:
--text TEXT- Reply text (required)--tweet-url URL- Tweet URL to reply to (either this or tweet-id required)--tweet-id ID- Tweet ID to reply to (either this or tweet-url required)--domain DOMAIN- Target specific site (uses default if not set)
Search Tweets
Search for tweets matching a query (last 7 days):
# AI agents with engagement
blackops-center search-tweets \
--query "AI agents -is:retweet min_faves:5"
# Content creation pain points
blackops-center search-tweets \
--query "struggling with content creation" \
--max-results 20
# Monitor specific accounts
blackops-center search-tweets \
--query "from:levelsio OR from:naval"
# Indie hacker discussions
blackops-center search-tweets \
--query "#indiehacker -is:reply min_faves:10"
# Different site
blackops-center search-tweets \
--domain example.com \
--query "AI automation"
Options:
--query, -q TEXT- Search query (required)--max-results, -n NUM- Maximum results (default: 10, max: 100)--domain DOMAIN- Target specific site (uses default if not set)
Query Operators:
keyword- Match keyword in tweet text"exact phrase"- Exact phrase match-keyword- Exclude keywordfrom:username- Tweets from specific userto:username- Replies to specific usermin_faves:N- Minimum likesmin_retweets:N- Minimum retweets-is:retweet- Exclude retweets-is:reply- Exclude replieslang:en- Language filter
Output:
✓ Found 8 tweets
Usage: 108 reads this month (1392 remaining)
Returns JSON with tweet data (id, text, author, metrics) and usage tracking.
Note: Searches are tracked for pay-as-you-go billing (no monthly caps).
Multi-Site Support
All commands support --domain or --site-id flags to target specific sites:
# List posts for Your Site
blackops-center list-posts --domain yourdomain.com
# Create post on Another Site
blackops-center create-post --domain example.com \
--title "Personal Post" --content "..."
# Generate hero for Third Site post
blackops-center generate-hero --post-id xyz789 \
--domain anothersite.com --style tech
Usage from OpenClaw
When you invoke this skill from a OpenClaw session, you can use natural language:
User: "Create a blog post about AI agents titled 'The Future of Automation'"
Assistant will:
- Ask which site if you have multiple sites and didn't specify
- Extract title and content from your message
- Run
blackops-center create-post --domain yourdomain.com --title "..." --content "..." - Return the post ID and preview URL
User: "Tweet from BlackOps Tools: 'Just shipped a new feature'"
Assistant will:
- Identify the site from context (BlackOps Tools = blackopscenter.com)
- Run
blackops-center send-tweet --domain blackopscenter.com --text "Just shipped a new feature" - Return the posted tweet URL
User: "Reply to https://x.com/user/status/123 with 'Great insight!' from my personal site"
Assistant will:
- Identify site from context (personal site = benenewton.com)
- Run
blackops-center reply-tweet --domain benenewton.com --tweet-url "..." --text "Great insight!" - Return the posted reply URL
Important for Agents:
- Always include
--domainflag in commands - If site is ambiguous, ask the user which site to use
- Use
list-sitesto show available options if needed
API Details
This skill uses the BlackOps Center Extension API (/api/ext/*):
Content Management:
GET /api/ext/sites- List sitesGET /api/ext/posts- List postsPOST /api/ext/posts- Create postGET /api/ext/posts/:id- Get postPUT /api/ext/posts/:id- Update postDELETE /api/ext/posts/:id- Delete post
Advanced Features (v1.2.0+):
POST /api/ext/posts/:id/generate-hero- Generate AI hero imagePUT /api/ext/posts/:id/seo- Update SEO metadataPOST /api/ext/posts/:id/tags- Manage tags
Twitter Integration:
POST /api/ext/twitter/send- Send tweet or threadPOST /api/ext/twitter/reply- Reply to a tweetPOST /api/ext/twitter/generate-reply- Generate AI reply text (UI only)
All requests require Authorization: Bearer <token> header.
Multi-site routing: All endpoints support ?domain= or ?site_id= query parameters.
Error Handling
- 401 Unauthorized: Token is invalid or revoked. Generate a new token in BlackOps Center.
- 404 Site not found: The domain associated with your token doesn't exist.
- 404 Post not found: Post ID doesn't exist or belongs to a different site.
- 400 Bad Request: Missing required fields (e.g., title, content for create).
Examples
Create and publish workflow
# Create draft
POST_ID=$(blackops-center create-post \
--title "My Post" \
--content "# My Post\n\nGreat content here." | jq -r '.post.id')
# Review, edit if needed...
# Publish when ready
blackops-center update-post "$POST_ID" --status published
Bulk operations
# Get all draft posts
DRAFTS=$(blackops-center list-posts --status draft)
# Publish all drafts (careful!)
echo "$DRAFTS" | jq -r '.posts[].id' | while read id; do
blackops-center update-post "$id" --status published
done
Troubleshooting
"Unauthorized" error:
- Verify your token in
config.yaml - Check token hasn't been revoked in BlackOps Center
- Generate a new token if needed
"Site not found":
- Each token is tied to a specific site domain
- If you need to manage multiple sites, generate separate tokens for each
Command not found:
- Make sure
bin/is executable:chmod +x ~/.openclaw/skills/blackops-center/bin/* - Skill should be installed via ClawdHub or symlinked to
~/.openclaw/skills/
Development
Test the API directly with curl:
curl -H "Authorization: Bearer YOUR_TOKEN" \
https://blackopscenter.com/api/ext/posts
Support
- BlackOps Center: https://blackopscenter.com
- Issues: https://github.com/openclaw/skills (if published)
- Documentation: This file