post — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited post (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Publish a post or thread directly to X using chrome browser automation.
The user provides one of:
/compose or /thread invocation in this session/mediaIf the content includes a link reply (a separate reply containing a URL), handle that as a follow-up reply after the main post.
Before doing anything:
mcp__claude-in-chrome__tabs_context_mcp(createIfEmpty: true)Check if there's an existing tab on x.com. If yes, use it. If not, create a new tab.
mcp__claude-in-chrome__navigate(url: "https://x.com", tabId: <tab>)Wait for the page to load. Take a screenshot to verify you're on X and logged in.
mcp__claude-in-chrome__computer(action: "screenshot", tabId: <tab>)If not logged in: Stop and tell the user they need to log in manually. Do NOT attempt to handle authentication.
Navigate directly to the compose URL (most reliable):
mcp__claude-in-chrome__navigate(url: "https://x.com/compose/post", tabId: <tab>)Wait for the compose dialog to fully load:
mcp__claude-in-chrome__computer(action: "wait", duration: 2, tabId: <tab>)mcp__claude-in-chrome__find(query: "tweet text input area", tabId: <tab>)mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)mcp__claude-in-chrome__computer(action: "type", text: "<post_content>", tabId: <tab>)mcp__claude-in-chrome__find(query: "add another tweet button or plus button to add to thread", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)mcp__claude-in-chrome__find(query: "empty tweet text input", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "type", text: "<tweet_content>", tabId: <tab>)If the original content included a link that should go in a reply:
mcp__claude-in-chrome__computer(action: "wait", duration: 3, tabId: <tab>)mcp__claude-in-chrome__find(query: "reply button on the latest post", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)mcp__claude-in-chrome__computer(action: "type", text: "<link_reply_content>", tabId: <tab>)This is the critical confirmation flow. Every post and reply goes through this loop before publishing.
mcp__claude-in-chrome__computer(action: "screenshot", tabId: <tab>)For threads, scroll through to capture all tweets if needed.
Use AskUserQuestion to present the post and collect feedback:
AskUserQuestion:
"Here's your [post/thread/reply] ready to publish:
[Show the full text of what will be posted]
✅ 'post' — publish now
✏️ Reply with changes — I'll revise and show you again
❌ 'cancel' — abort without posting"If the user says "post", "yes", "go", "send it", or similar affirmative: → Proceed to click the Post button:
mcp__claude-in-chrome__find(query: "post button or tweet button", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)Wait for publish:
mcp__claude-in-chrome__computer(action: "wait", duration: 3, tabId: <tab>)Take confirmation screenshot:
mcp__claude-in-chrome__computer(action: "screenshot", tabId: <tab>)If the user requests changes (e.g., "make the hook stronger", "remove the last line", "add a question at the end"): → Apply the requested changes:
The loop continues until the user approves or cancels. There is no limit on revision rounds.
If the user says "cancel", "abort", "nevermind": → Close the compose dialog (press Escape or navigate away) → Confirm: "Post cancelled. The draft is still available if you want to revise it."
Media attachment happens BEFORE the review loop, so the user sees the full post with media in the screenshot.
If the media is a screenshot captured during this Claude Code session (e.g., from /media taking a screenshot of a webpage):
mcp__claude-in-chrome__find(query: "add photo or media button in compose", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)mcp__claude-in-chrome__find(query: "file input for media upload", tabId: <tab>)mcp__claude-in-chrome__upload_image(imageId: "<screenshot_id>", ref: "<file_input_ref>", tabId: <tab>)mcp__claude-in-chrome__computer(action: "wait", duration: 3, tabId: <tab>)For local files on disk (e.g., a Remotion-rendered .mp4 at marketing/out/video.mp4):
The chrome upload_image tool cannot directly access local filesystem files. Use this approach:
mcp__claude-in-chrome__find(query: "add photo or media button in compose", tabId: <tab>)
mcp__claude-in-chrome__computer(action: "left_click", ref: "<ref_id>", tabId: <tab>)AskUserQuestion:
"I've opened the media upload dialog. Please select your file:
📁 [file path, e.g., marketing/out/video.mp4]
Navigate to this file in the picker and click Open.
Let me know once the file is selected and uploading."mcp__claude-in-chrome__computer(action: "wait", duration: 5, tabId: <tab>)mcp__claude-in-chrome__computer(action: "screenshot", tabId: <tab>)If the user wants to screenshot a webpage to attach:
mcp__claude-in-chrome__tabs_create_mcp()
mcp__claude-in-chrome__navigate(url: "<url>", tabId: <new_tab>)
mcp__claude-in-chrome__computer(action: "wait", duration: 3, tabId: <new_tab>)mcp__claude-in-chrome__computer(action: "screenshot", tabId: <new_tab>)| Format | X Support | Notes |
|---|---|---|
| .png, .jpg, .gif | Yes | Images up to 5MB, GIFs up to 15MB |
| .mp4 | Yes | Video up to 512MB, 2:20 max duration |
| .mov | Yes | Converted to MP4 by X |
| .webp | Limited | Convert to PNG/JPG first |
After successful posting:
"Posted! 🎯
Remember: reply to every comment in the first hour — that's the 75–150× conversation velocity multiplier.
Run /engage on this post in 30-60 minutes to manage replies."If the user says "dry run", "preview only", or "don't actually post":
x.com/compose/postwait with 2-3 seconds between navigation and interactionjavascript_tool to set the value directly via DOM~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.