{
 "page": "https://tools.openkrill.app/compare/social-post-drafting-tools",
 "checked": "2026-10-13",
 "tests": [
  {
   "label": "postkit",
   "question": "Is each draft within the platform's published limit, and does the tool report the length the way the platform counts it?",
   "inputs": [
    {
     "input": "tidyjson 1.2 is out. It is an open source command line tool that formats JSON files. Version 1.2 formats large files 3 times faster than 1.1 and adds a --check flag for CI. MIT license. Link: https://example.com/tidyjson",
     "truth": "The link must stay; it counts as 23 on X",
     "sources": [
      "https://docs.x.com/fundamentals/counting-characters",
      "https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json",
      "https://www.linkedin.com/help/linkedin/answer/a528176"
     ]
    },
    {
     "input": "Our city library now lends telescopes. Members can borrow one for 2 weeks at any branch. Full details and the booking form: https://www.example.org/library/services/lending/telescopes/2026/autumn-programme-details?ref=social-launch",
     "truth": "The long URL counts as 23 on X but in full on Bluesky and LinkedIn",
     "sources": [
      "https://docs.x.com/fundamentals/counting-characters",
      "https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json",
      "https://www.linkedin.com/help/linkedin/answer/a528176"
     ]
    },
    {
     "input": "東京のカフェ「青い月」が10月20日に渋谷で二号店を開きます。渋谷駅から徒歩5分、席は24席、営業は朝8時から夜9時まで。開店日は先着50名にドリップコーヒーを無料で出します。",
     "truth": "Japanese text: each CJK character counts as 2 on X, as 1 grapheme on Bluesky",
     "sources": [
      "https://docs.x.com/fundamentals/counting-characters",
      "https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json",
      "https://www.linkedin.com/help/linkedin/answer/a528176"
     ]
    },
    {
     "input": "Riverside Makers Fair returns on Saturday 7 November 2026, 10:00 to 17:00, at the old tram depot on Quay Street. 60 local makers: woodwork, ceramics, bike repair, 3D printing, electronics, textiles and food. Free entry. Workshops: beginner soldering at 11:00, sourdough at 13:00, mending clothes at 15:00, each 45 minutes, sign up on the day at the info desk. Step-free access through the north gate. Bike parking for 200 bikes. The cafe is run by the Riverside Youth Club and all profits go to their summer camp. Organised by Riverside Community Trust, charity number 1234567. Volunteers still needed for setup on Friday 6 November from 16:00. Website: https://example.net/makers-fair",
     "truth": "Long source: the X and Bluesky drafts must be cut to fit, and LinkedIn has room",
     "sources": [
      "https://docs.x.com/fundamentals/counting-characters",
      "https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json",
      "https://www.linkedin.com/help/linkedin/answer/a528176"
     ]
    },
    {
     "input": "🚀 Launch day: Ferrite 0.9, a Rust library for reading sensor data over I2C and SPI, now supports 14 sensor chips, up from 6. Works on no_std. Docs at https://example.dev/ferrite. Use the hashtags #rustlang and #embedded.",
     "truth": "The emoji counts as 2 on X and 1 grapheme on Bluesky; the link and both hashtags should stay",
     "sources": [
      "https://docs.x.com/fundamentals/counting-characters",
      "https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/post.json",
      "https://www.linkedin.com/help/linkedin/answer/a528176"
     ]
    }
   ],
   "scoring": "One call per input asks for X, Bluesky and LinkedIn drafts. The right answer for each draft is its length by the platform's own counting rule, which our script counts from the draft text. Correct means all 3 drafts are within the limit, the reported length equals that count, and the link is kept. On LinkedIn we count code points, since its help page names no unit for emoji. ChatGPT and Claude ran in different setups, a signed-out visitor chat and the API with thinking on, so the gap between them may come from the setup as much as from the product. The 3 times are taken in different ways, as each row says, so compare them only roughly.",
   "sourceLabel": "Counting rule"
  }
 ],
 "results": [
  {
   "name": "Buffer MCP",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Needs a Buffer account and a connected social account.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Postiz",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Needs a Postiz account or a self-hosted install, and connected social accounts.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Metricool MCP",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Needs a Metricool account and its API token.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Blotato",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Needs a Blotato account and API key.",
     "inScope": null
    }
   ]
  },
  {
   "name": "ChatGPT",
   "ours": false,
   "tests": [
    {
     "tested": true,
     "correct": 0,
     "answered": 5,
     "medianMs": 23164,
     "inScope": null,
     "how": "its chat app by hand, signed out as a visitor with no account, web search off: the same prompt Claude got, one new chat per input",
     "notes": "Every draft kept its link, but on all 5 inputs at least one reported length differs from the platform's count (X on input 3: said 105, the weighted count is 181), and the input 4 Bluesky draft is 302 graphemes, over the 300 limit. Time is by hand, from send to the last change on the page."
    }
   ]
  },
  {
   "name": "Ayrshare",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Needs a paid Ayrshare API key.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Claude",
   "ours": false,
   "tests": [
    {
     "tested": true,
     "correct": 5,
     "answered": 5,
     "medianMs": 12317,
     "inScope": null,
     "how": "through the Anthropic API (claude-sonnet-5-5, no web search), because our test browser has no Claude chat session; the same prompt ChatGPT got",
     "notes": "Every reported length equals the count by each platform's rule, and every link is kept. Inputs 3 and 4 first used the whole 2,000-token reply cap on thinking and were asked again with 8,000. The lengths are the model's own count; nothing checks them in code. Time is from the call to the reply."
    }
   ]
  },
  {
   "name": "Typefully",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Its MCP needs a Typefully account through OAuth or an API key.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Publer",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Its API key comes only with a Business plan.",
     "inScope": null
    }
   ]
  },
  {
   "name": "Social Post Formatter & Validator",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "Runs as an Apify actor and needs an Apify account.",
     "inScope": null
    }
   ]
  },
  {
   "name": "AT Protocol MCP (cameronrye)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "local install only, and the test rules allow no installs",
     "inScope": null
    }
   ]
  },
  {
   "name": "X MCP (vidhupv)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "needs your own X API keys",
     "inScope": null
    }
   ]
  },
  {
   "name": "Twitter MCP (EnesCinr)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "needs your own X API keys",
     "inScope": null
    }
   ]
  },
  {
   "name": "Bluesky MCP Server (brianellin)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "needs Bluesky app password",
     "inScope": null
    }
   ]
  },
  {
   "name": "LinkedIn MCP Server (stickerdaniel)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "needs LinkedIn sign-in in a browser",
     "inScope": null
    }
   ]
  },
  {
   "name": "LinkedIn MCP Server (souravdasbiswas)",
   "ours": false,
   "tests": [
    {
     "tested": false,
     "correct": null,
     "answered": null,
     "medianMs": null,
     "how": null,
     "notes": "needs your own LinkedIn app (OAuth)",
     "inScope": null
    }
   ]
  },
  {
   "name": "Post Kit",
   "ours": true,
   "tests": [
    {
     "tested": true,
     "correct": 5,
     "answered": 5,
     "medianMs": 14233,
     "inScope": null,
     "how": "remote MCP tools/call draft_posts {topic, platforms:[x,bluesky,linkedin]} on https://postkit.openkrill.app/mcp",
     "notes": "Inputs 1 to 4: all 12 reported lengths equal our count and every link is kept. Input 5 got no answer on the first call (HTTP 000 after about 20 s); one repeat call answered in 10 s with all 3 lengths right. The input 3 Bluesky draft added 2 small claims that are not in the facts ('good location' and 'calm space'); its lengths were still right. The median time is over inputs 1 to 4, from the call to the reply."
    }
   ]
  }
 ]
}
