AI · live

Built for agents.

SocialKit speaks MCP, returns structured JSON, and is designed to live inside a loop. Score, rewrite, regrade, ship. No prompt gymnastics, no JSON-mode bandaids.

MCP server

36 tools

One HTTP endpoint, bearer auth, every SocialKit capability exposed as a tool. Drop the config into any MCP-aware client.

# Add the remote MCP server (recommended):
claude mcp add --transport http socialkit \
  https://mcp.socialkit.sh \
  --header "Authorization: Bearer $SOCIALKIT_KEY"

# Or add it to .mcp.json by hand:
# {
#   "mcpServers": {
#     "socialkit": {
#       "type": "http",
#       "url": "https://mcp.socialkit.sh",
#       "headers": { "Authorization": "Bearer $SOCIALKIT_KEY" }
#     }
#   }
# }
# ~/.cursor/mcp.json
{
  "mcpServers": {
    "socialkit": {
      "type": "http",
      "url": "https://mcp.socialkit.sh",
      "headers": { "Authorization": "Bearer $SOCIALKIT_KEY" }
    }
  }
}
# discovery is keyless: read the catalog before you sign up
curl https://mcp.socialkit.sh/tools/list

# tools: score_post, rewrite_post,
#        validate_post, generate_post, plan_week,
#        build_voice, create_brand,
#        update_brand, delete_brand,
#        create_voice, update_voice,
#        delete_voice, create_post,
#        update_post, delete_post,
#        schedule_post, bulk_schedule,
#        cancel_post, publish_post,
#        refresh_metrics, list_posts,
#        get_post, score_saved_post,
#        get_post_metrics, get_post_scores,
#        get_calibration, get_analytics,
#        get_calendar, list_brands,
#        list_voices, list_channels,
#        get_account

The server also ships prompts, the canonical workflows your client can surface directly. prompts/list returns them; prompts/get fills in your brief.

And resources, your account context as attachable, read-only JSON. resources/list enumerates them; resources/read returns the document so your model can ground a draft in your own brand and voice without a tool call.

Agents

draft → grade → rewrite

The pattern that actually works: let your model draft freely, then use SocialKit as the judge and the rewriter. Three attempts is usually enough to land 80+.

import Anthropic from "@anthropic-ai/sdk";

const claude = new Anthropic();

// SocialKit is plain JSON over HTTPS. No SDK to install.
async function sk(path: string, body: unknown) {
  const res = await fetch(`https://api.socialkit.sh/v1/${path}`, {
    method: "POST",
    headers: {
      "content-type": "application/json",
      authorization: `Bearer ${process.env.SOCIALKIT_KEY}`,
    },
    body: JSON.stringify(body),
  });
  if (!res.ok) throw new Error(`socialkit ${path}: ${res.status}`);
  return res.json();
}

async function draftAndGrade(brief: string) {
  let draft = await claude.messages.create({
    model: "claude-sonnet-4-6",
    max_tokens: 800,
    messages: [{ role: "user", content: `Write a LinkedIn post: ${brief}` }],
  }).then(r => r.content[0].text);

  for (let attempt = 0; attempt < 3; attempt++) {
    const grade = await sk("score", { post: draft });
    if (grade.overall >= 80) return { draft, grade };

    const { rewrite, after } = await sk("rewrite", { post: draft });
    draft = rewrite;
    if (after.overall >= 80) return { draft, grade: after };
  }
  return { draft, grade: await sk("score", { post: draft }) };
}
1

Draft

Your model writes from a brief. No scoring constraints.

2

Grade

/v1/score returns 0-100 with ranked signals.

3

Rewrite

/v1/rewrite fixes weak dimensions, keeps the voice, returns before and after.

4

Ship

Loop until score ≥ target or max attempts. Return both.

Ship pixels

finished posts, rendered

The same key reaches the visual engine: a brief and a brand kit go in, a finished post comes out with rendered image masters, the design judge's score, and a revisable spec. Your agent asks in plain words; the engine decides, renders, judges, and revises before answering. The full pipeline is on how it works.

# Slow call by API standards (tens of seconds to minutes).
# Always send an Idempotency-Key so a retry can't double-spend.
curl -X POST https://api.socialkit.sh/v1/generate-visual-v2 \
  -H "Authorization: Bearer $SOCIALKIT_KEY" \
  -H "Idempotency-Key: post-2026-07-27-a" \
  -d '{
    "businessContext": { "businessName": "Driftwood Roasters",
                         "brandKit": { ... } },
    "seed": { "platform": "instagram", "idea": "the Tuesday roast" }
  }'

# -> { masters: [{ aspectRatio: "4:5", imageUrl }, ...],
#      caption, hashtags,
#      score: { verdict: "SHIP", score: 95, ... },
#      spec: { ...hand back to /v1/revise-visual-v2 } }

A revision is one more call with the spec and freeform feedback, and it is surgical: the photo stays while the headline moves. Decks work the same way through /v1/generate-carousel-v2. One credit per successful call; a blocked result costs nothing.

MCP-native agents get the same power as tools: generate_visual, revise_visual, generate_carousel, and revise_carousel, annotated as credit-bearing and slow so a well-behaved agent knows what it is spending before it calls. Each artifact has its own page: images, carousels, and video (video powers Taka in production and is not on the public surface yet).

Models

honest names, split jobs

Different jobs get different models, and none of them touch the pixels. The edge isn't a secret ranker. It's what each model is told before it works, and what the code refuses to let them do.

Opus 4.8brains + judge

Claude Opus decides what a visual post says: the brief, the angles, the copy. Then a vision pass of the same model judges the finished render against four hard gates and eleven weighted dimensions, with forced tool use so the verdict is typed JSON, not prose.

  • Grounded in the business context and proof bank.
  • Judges the render it did not draw. No self-grading of pixels.
  • Verdict, score, and the single best fix ride the response.
Sonnet 4.6fast loop

Claude Sonnet runs the text intelligence: scoring, drafts, rewrites, and week plans. It scores against a written evidence base of how each feed actually ranks, and it is re-graded after every rewrite, always.

  • Platform-specific rubrics for LinkedIn and X.
  • Runs via Cloudflare AI Gateway, cached 30 days per input.
  • Same evidence base our own writers post against weekly.
Gemini 3.1 Flash Imagescenes

When a brand has no usable photo, Gemini paints a name-free, text-free atmospheric scene. It never renders words: the text layer is composited by code, which is why warped glyphs and garbled logos are structurally impossible.

  • Business name never enters the image prompt.
  • Real brand photos always take priority.
  • Every scene faces the same judge as everything else.

Where this goes next: a calibrated ranker trained on real outcomes, scoring dwell and reshare likelihood directly. That's on the roadmap, not in the box yet. We'd rather tell you what runs today than ship a number we can't stand behind.

Want a different model in the loop?

We can route grading to your own judge or your own ranker. Tell us what you're optimizing for.

hello@socialkit.sh