Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Post, read, and search X (Twitter) content using x-cli or the X API v2
.claude/skills/taracodlabs-xitter/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 598% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 23% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 43% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 57% | 0% |
Read, post, and search X content using the x-cli command-line tool or the X API v2 directly. Requires X API credentials.
Register at https://developer.twitter.com → Create Project → Create App. Get:
API_KEY, API_SECRETACCESS_TOKEN, ACCESS_TOKEN_SECRETBEARER_TOKEN (for read-only app-only auth)powershell$env:X_BEARER_TOKEN = "your_bearer_token" $env:X_API_KEY = "your_api_key" $env:X_API_SECRET = "your_api_secret" $env:X_ACCESS_TOKEN = "your_access_token" $env:X_ACCESS_SECRET = "your_access_secret"
pythonimport requests, os def search_tweets(query, max_results=10): headers = {"Authorization": f"Bearer {os.environ['X_BEARER_TOKEN']}"} params = { "query": f"{query} -is:retweet lang:en", "max_results": max_results, "tweet.fields": "created_at,author_id,public_metrics" } resp = requests.get("https://api.twitter.com/2/tweets/search/recent", headers=headers, params=params) resp.raise_for_status() for tweet in resp.json().get("data", []): print(f"• {tweet['text'][:120]}") print(f" {tweet['created_at']} likes={tweet['public_metrics']['like_count']}\n") search_tweets("Aiden AI agent 2026", max_results=5)
pythonimport requests, os, time, hashlib, hmac, base64, urllib.parse, uuid def post_tweet(text): url = "https://api.twitter.com/2/tweets" params = {"text": text} # OAuth 1.0a signature oauth_params = { "oauth_consumer_key": os.environ["X_API_KEY"], "oauth_nonce": uuid.uuid4().hex, "oauth_signature_method": "HMAC-SHA1", "oauth_timestamp": str(int(time.time())), "oauth_token": os.environ["X_ACCESS_TOKEN"], "oauth_version": "1.0", } signing_key = "&".join([urllib.parse.quote(os.environ["X_API_SECRET"], safe=""), urllib.parse.quote(os.environ["X_ACCESS_SECRET"], safe="")]) base_string = "&".join(["POST", urllib.parse.quote(url, safe=""), urllib.parse.quote("&".join(f"{k}={v}" for k,v in sorted(oauth_params.items())), safe="")]) signature = base64.b64encode(hmac.new(signing_key.encode(), base_string.encode(), hashlib.sha1).digest()).decode() oauth_params["oauth_signature"] = signature auth_header = "OAuth " + ", ".join(f'{k}="{urllib.parse.quote(v, safe="")}"' for k,v in oauth_params.items()) resp = requests.post(url, json=params, headers={"Authorization": auth_header, "Content-Type": "application/json"}) resp.raise_for_status() print(f"Posted tweet: {resp.json()['data']['id']}") post_tweet("Hello from Aiden! 🤖 #AI #automation")
pythonimport requests, os def get_user_timeline(username, max_results=10): headers = {"Authorization": f"Bearer {os.environ['X_BEARER_TOKEN']}"} user = requests.get(f"https://api.twitter.com/2/users/by/username/{username}", headers=headers).json() user_id = user["data"]["id"] resp = requests.get( f"https://api.twitter.com/2/users/{user_id}/tweets", headers=headers, params={"max_results": max_results, "tweet.fields": "created_at,public_metrics", "exclude": "retweets"} ) for tweet in resp.json().get("data", []): print(f"• {tweet['text'][:120]}\n {tweet['created_at']}\n") get_user_timeline("elonmusk", max_results=5)
pythonimport requests, os def get_mentions(user_id, max_results=10): headers = {"Authorization": f"Bearer {os.environ['X_BEARER_TOKEN']}"} resp = requests.get( f"https://api.twitter.com/2/users/{user_id}/mentions", headers=headers, params={"max_results": max_results, "tweet.fields": "created_at,author_id"} ) for tweet in resp.json().get("data", []): print(f"• {tweet['text'][:120]}\n {tweet['created_at']}\n")
"Search for recent tweets about LLM agents" → Use step 2 with query "LLM agents".
"Post a tweet saying 'Aiden just automated my morning report'" → Ask user to confirm before posting, then use step 3.
"Show me the last 10 tweets from a specific account" → Use step 4 with the target username.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,640 | 3,180 | -31% | 1 | 1 | 0% | 698 | 2,121 | +204% | 0 | 0 | — |
case-02 | fail→fail | 5,431 | 6,221 | +15% | 1 | 1 | 0% | 852 | 1,854 | +118% | 0 | 0 | — |
case-03 | fail→pass | 3,907 | 12,277 | +214% | 1 | 1 | 0% | 605 | 4,223 | +598% | 0 | 0 | — |
case-04 | fail→pass | 12,144 | 7,583 | -38% | 1 | 1 | 0% | 2,342 | 3,158 | +35% | 0 | 0 | — |
case-05 | pass→pass | 13,275 | 7,732 | -42% | 1 | 1 | 0% | 2,579 | 3,176 | +23% | 0 | 0 | — |
case-06 | pass→pass | 9,184 | 5,661 | -38% | 1 | 1 | 0% | 1,997 | 2,859 | +43% | 0 | 0 | — |
case-07 | pass→pass | 11,196 | 8,821 | -21% | 1 | 1 | 0% | 2,247 | 3,523 | +57% | 0 | 0 | — |
case-08 | pass→pass | 9,321 | 5,390 | -42% | 1 | 1 | 0% | 2,087 | 2,845 | +36% | 0 | 0 | — |
case-09 | fail→fail | 11,980 | 11,818 | -1% | 1 | 1 | 0% | 2,421 | 3,940 | +63% | 0 | 0 | — |
case-10 | pass→pass | 8,337 | 3,408 | -59% | 1 | 1 | 0% | 1,640 | 2,326 | +42% | 0 | 0 | — |
case-11 | pass→pass | 13,693 | 8,686 | -37% | 1 | 1 | 0% | 2,935 | 3,876 | +32% | 0 | 0 | — |
case-12 | pass→pass | 4,696 | 2,872 | -39% | 1 | 1 | 0% | 928 | 2,116 | +128% | 0 | 0 | — |
case-13 | pass→pass | 3,624 | 1,960 | -46% | 1 | 1 | 0% | 542 | 2,018 | +272% | 0 | 0 | — |
case-14 | pass→pass | 11,941 | 11,782 | -1% | 1 | 1 | 0% | 2,289 | 3,488 | +52% | 0 | 0 | — |
case-15 | pass→pass | 6,682 | 3,638 | -46% | 1 | 1 | 0% | 1,555 | 2,431 | +56% | 0 | 0 | — |
case-16 | pass→pass | 8,449 | 3,310 | -61% | 1 | 1 | 0% | 1,526 | 2,279 | +49% | 0 | 0 | — |
case-17 | pass→pass | 6,052 | 3,315 | -45% | 1 | 1 | 0% | 1,230 | 1,961 | +59% | 0 | 0 | — |
case-18 | pass→pass | 8,445 | 4,218 | -50% | 1 | 1 | 0% | 1,859 | 2,608 | +40% | 0 | 0 | — |
case-19 | pass→pass | 2,120 | 2,486 | +17% | 1 | 1 | 0% | 398 | 1,975 | +396% | 0 | 0 | — |
case-20 | pass→pass | 11,580 | 8,977 | -22% | 1 | 1 | 0% | 2,754 | 3,522 | +28% | 0 | 0 | — |
case-21 | pass→pass | 7,486 | 7,024 | -6% | 1 | 1 | 0% | 1,666 | 3,144 | +89% | 0 | 0 | — |
case-22 | pass→pass | 8,790 | 6,269 | -29% | 1 | 1 | 0% | 2,077 | 3,062 | +47% | 0 | 0 | — |
case-23 | pass→pass | 6,337 | 3,719 | -41% | 1 | 1 | 0% | 1,343 | 2,407 | +79% | 0 | 0 | — |
case-24 | pass→pass | 7,645 | 4,626 | -39% | 1 | 1 | 0% | 1,701 | 2,635 | +55% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +8 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.