Research: Existing Tools and Building Blocks
Research: Existing Tools and Building Blocks
Crosspost (@humanwhocodes/crosspost) is almost exactly what we need for the publishing layer. It's a single Node.js package that works as a CLI, a programmatic API, and an MCP server — meaning Claude Code can post directly to X, Bluesky, LinkedIn, Mastodon, Discord, Telegram, and more within a session. No browser, no credential juggling. For polishing, there's no off-the-shelf skill, but that's fine — we'd build custom Claude Code skills with platform-specific prompts and tone guidance. Claude itself is the polishing engine. The LangChain Social Media Agent is interesting as a reference but is more heavyweight than we need.
Top pick: Crosspost (@humanwhocodes/crosspost)
A Node.js package that is a CLI tool, programmatic API, and MCP server in one. Supports X/Twitter, Bluesky, Mastodon, LinkedIn, Discord, Telegram, Dev.to, and Nostr. The MCP integration means Claude Code can publish directly within a session. This is the single best fit for our "agent workflow" approach.
- Repo: https://github.com/humanwhocodes/crosspost
- npm:
@humanwhocodes/crosspost
Multi-platform publishing tools
| Tool | Type | Platforms | Notes |
|---|---|---|---|
| Crosspost | CLI/MCP/API | 8+ platforms | Top pick — native Claude Code integration |
| Late CLI | CLI (commercial) | 13+ platforms | Free tier (10 posts/mo), JSON output, scheduling built-in |
| Postiz | Self-hosted app | 30+ platforms | Open source (20k stars), has REST API and MCP server |
| Simplex | Shell script | X, Mastodon, Bluesky, LinkedIn | Opens editor like git commit, posts everywhere |
| social-cross-post | Python CLI | Bluesky, Mastodon, X, Instagram, Facebook | Lightweight cross-poster |
Platform-specific libraries (if we need fine-grained control)
- X/Twitter:
tweepy(Python) — requires Basic plan ($100/mo) for write access - Bluesky:
atproto(Python) — full AT Protocol SDK, free - LinkedIn:
linkedin-api-python-client(Python) — official SDK
AI agent / content workflows
- LangChain Social Media Agent — LangGraph-based agent that generates Twitter/LinkedIn posts from URLs, with human-in-the-loop approval. TypeScript. Repo: https://github.com/langchain-ai/social-media-agent
- Claude Code custom skills — no existing social media polishing skill found, but the SKILL.md infrastructure is purpose-built for this. We'd create our own polishing skills with platform-specific prompts, character limits, and tone guidance.
MCP servers for social platforms
| Server | Platforms | Notes |
|---|---|---|
| Crosspost MCP | 8+ platforms | Built into crosspost package |
| Postiz MCP | 30+ platforms | Requires self-hosted Postiz instance |
| OpenTweet MCP | X/Twitter | 12 tools for full tweet lifecycle |
| bsky-mcp-server | Bluesky | AT Protocol via natural language |
| mcp-linkedin | Via Unipile API |
Recommended stack
- Polishing: Custom Claude Code skills (SKILL.md) — Claude itself is the polishing engine, guided by platform-specific prompts and tone rules
- Publishing: Crosspost as MCP server + CLI — one tool for all platforms, native agent integration
- Scheduling (if needed later): Late CLI or Postiz API
First Prototype Validation
The first prototype is intentionally lightweight:
- one top-level fast social skill
- local context docs for stream, tone, and channels
- loose markdown examples as test inputs
The question for this validation pass is not "is it complete?" but "does this shape feel fast enough to use?"
Example: feature-note.md
What worked:
- the source is thin but still enough to infer a Flowershow or Datopian publishing angle
- the "less friction" angle is clear and easy to turn into short social copy
- this is a good example of the kind of real input the workflow should handle
What felt weak:
- without reading the PR, the skill would need to stay generic
- product identity is a little ambiguous, so this is a likely case for one short clarifying question
What to tighten:
- make it explicit in the skill that when product identity is ambiguous, it should choose the safer framing instead of pausing too long
Example: dataset-update.md
What worked:
- this is ideal MVP input because the product, audience, and value are easy to infer
- the "publishing data well matters" angle is stronger than a generic release note
- should produce good
XandLinkedIndrafts quickly
What felt weak:
- the input does not include any concrete dataset detail, so posts may risk sounding generic
What to tighten:
- encourage one specific concrete detail where available, but do not require it
Example: thought-leadership-note.md
What worked:
- the note is strong enough to produce a clean, opinion-led post
- this tests whether the skill can choose one angle without turning into a workshop
What felt weak:
- this kind of input can easily trigger too much ideation and too many alternatives
What to tighten:
- bias the skill toward choosing one strong framing and drafting immediately
Example: video-link.md
What worked:
- the desired angle is already well constrained: one practical takeaway rather than full summary
- this is a good pattern for YouTube or podcast-derived posts
What felt weak:
- if the linked content cannot be inspected, the workflow depends entirely on the short context note
What to tighten:
- tell the skill to ask for one takeaway sentence only if the link context is too thin
Validation Summary
The current prototype direction looks viable for the MVP.
Strengths:
- the workflow is lightweight enough to stay inside one thread
- the skill can work from rough markdown rather than a structured brief
- the context pack removes the need for repeated tone and product questions
Risks:
- generic outputs when the source lacks one concrete detail
- over-questioning or over-ideating on thought-leadership inputs
- publishing still depends on external tooling that is not yet integrated here
Most important next refinement:
- tighten the orchestrator skill so it defaults to drafting faster and explaining less
Publishing Decision For The Next Iteration
The smallest publish path worth prototyping next is:
- keep the skill producing copy-ready output by default
- separately test
Crosspostas the first real publishing integration
Recommendation:
- do not block the MVP on full publish-in-thread support
- test the polish workflow first
- if the polish flow feels genuinely fast, add one publish helper using Crosspost rather than building custom platform code
Main blocker to true publish-in-thread behavior:
- credential setup and tool configuration, not content generation