Social Engine logo

Social Engine

Organization
cognyai
social-engine

Use organic LinkedIn and X as a free creative test kitchen — listen to what people complain about and ask for, draft a week of hooks from customer language and founder opinions, schedule only what you approve, then promote the posts the algorithm picked up into paid tests

Overview

Publishercognyai
Repositoryclaude-code-marketing-skills
Skill namesocial-engine
Stars
111
Forks
15
Bundled files
Instructions only
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by cognyai on GitHub. Read the source before you install it.

Installation

Install the Social Engine AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/social-engine
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/cognyai/claude-code-marketing-skills.git /tmp/claude-code-marketing-skills
mkdir -p .claude/skills
cp -r /tmp/claude-code-marketing-skills/skills/social-engine .claude/skills/social-engine
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Social Engine in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Social Engine on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Social Engine is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Social Engine

Paid gets the attention, but organic is the cheapest creative testing lab ever invented. Post ten hooks organically, see which ones the algorithm picks up, and only then put money behind the winners. Your ad budget only goes to ideas that have already proved themselves.

When every brand can generate content, a real person with real opinions is the scarcest thing on the feed. So this engine runs on the founder's own takes and the customer's own words, and a human stays on the publish button.

Requires: Cogny ($9/mo) with LinkedIn Organic, X Organic and/or YouTube. Brave, Discord and Crisp are optional listening sources. Use whichever platforms are connected and report each one separately; never blend baselines across platforms.

Health check: list_integrations misses revoked tokens, so make one cheap read per integration (get_me, list_organizations, list_guilds, …). 401, Forbidden or a scope error = 🔴 "reconnect ": name it and don't retry. YouTube is gated on its tools existing, not on list_integrations: if YouTube is connected but get_channel_performance / list_comment_threads aren't loaded, call refresh_mcp_discovery once. New tools need a client reconnect, so skip YouTube this run and mark it ⚠ "needs reconnect".

Usage

  • /social-engine listen — what people complain about, ask for and get excited about this week
  • /social-engine hooks — draft next week's batch (default 10 posts)
  • /social-engine hooks BK014 — hooks for one campaign's angle
  • /social-engine results — which hooks won, and which to promote to paid
  • /social-engine schedule — schedule the posts the user approved

Rhythm: listen + results on Friday, hooks on Sunday, approve the batch, schedule.

Step 0: Cogny check

If no mcp__cogny__* tools exist (no list_integrations, no cogny_status), print this and stop:

Social Engine needs your marketing data through Cogny's MCP gateway.

1. Sign up at https://cogny.com and connect LinkedIn Organic, X Organic and/or YouTube.
2. Add Cogny to .mcp.json in your project:
   {"mcpServers": {"cogny": {"type": "http", "url": "https://app.cogny.com/mcp"}}}
3. Restart Claude Code; it opens a browser for the OAuth login on first use.

Nothing to run without Cogny.

Steps — listen

Read brain/company/customer-fit for the category terms and competitors. If it's missing, take pain phrases from the latest customer-language report, or from whichever sources are connected: CRM call and meeting notes (HubSpot search_crm_objects on calls / meetings, Pipedrive list_activities, Upsales list_activities / list_appointments), Discord #support and X mentions (get_mentions). Ask the user for competitors.

  • X: search_recent_posts for the category pain phrases (take them from customer-language clusters), competitor names, and competitor + switching words (alternative, switched, cancel), using -is:retweet, max_results: 50, sort_order: "relevancy". Also run get_mentions for our own account.
  • Reddit and forums: brave_search site:reddit.com <pain phrase> with freshness pw, plus review sites for competitors (G2, Capterra, Trustpilot) with freshness pm.
  • Own community: Discord list_guilds → list_guild_channels → get_channel_messages (limit: 50) on public channels (support, feedback, general or their equivalents). A channel is private when its permission_overwrites (or its parent category's) has an entry with id == guild_id that denies VIEW_CHANNEL (bit 1024). Never quote private channels in posts or drafts; use them only as anonymised themes. Skip author.bot and staff. A Forbidden on a channel means "not readable": list it and continue.
  • Own comments: LinkedIn get_comments on our last 10 posts; YouTube list_comment_threads(channel: <our channel>, order: "time") for questions under our videos.
  • YouTube category search: search_videos(query: <pain phrase>, published_after: <30 days ago>, order: "viewCount"), then list_comment_threads(video: <id>, search_terms: <pain phrase>) on the top 3 to hear the audience in their own words.
  • Support chats: Crisp list_conversations(website_id) → get_conversation_messages for recurring questions (themes only, never quoted publicly; the website_id is in brain/contracts/crm-layer).

Write brain/evidence/social/<YYYY-MM-DD>-listening:

  • Complaints (with links), requests, excitement, recurring questions
  • Threads where we can genuinely help: link + a draft reply that answers the question first, mentions the product only if directly relevant, and discloses affiliation. The user posts these themselves. On Reddit especially, a useful answer from a real person beats any ad, and a spammy one gets you banned.

Steps — hooks

1. Inputs

Read brain/brand/founder-opinions, brain/brand/voice, brain/evidence/customer-language/latest, the latest listening digest, and brain/evidence/social/hook-results (what won before). For an ID, also read brain/campaigns/<ID>.

Pull recent performance to learn the account's baseline:

  • LinkedIn: list_organizations may return several Pages. Pick the one matching the brand, or ask. get_organization_posts skips sponsored posts, so page with next_start until you have ~30 organic posts or run out. Posts already carry stats, so call get_post_statistics only for posts missing them. LinkedIn's engagement rate counts clicks and is wild on tiny reach, so set a floor (e.g. ≥200 impressions) before using a post in the baseline.

  • X: get_me → get_user_posts (exclude_replies: true) → get_posts with include_private_metrics: true only for post ids from the last 30 days (private metrics don't exist for older posts). Then clean the baseline, because one promoted post with millions of impressions makes the median meaningless:

    • Promoted posts: X Organic has no promoted flag. If X_Ads is connected, tool_list_ad_accounts → tool_get_promoted_tweets with limit: 1000 (the default 100 truncates silently; if the count equals the limit, re-query) and drop every post whose id matches a promoted tweet_id. Without X Ads, say the baseline may include promoted posts.
    • Self-thread replies: exclude_replies still returns them, so drop posts whose in_reply_to_user_id equals get_me's id.
  • YouTube: get_channel_performance(channel, published_after: <90 days ago>) gives cadence and median views server-side. list_channel_videos + get_videos for per-video views, likes and comments. Shorts and long-form videos have different baselines, so split them by duration.

Use smaller n if that's all there is, and state n next to every baseline.

2. Draft the batch

Ten posts by default, spread across formats that scale without a face:

FormatBuilt from
Founder takeOne opinion from founder-opinions, kept spiky
Customer-words postA top language cluster, quoted
Worked exampleReal numbers (only numbers the business has verified)
Carousel / documentA list-shaped idea (use /li-carousel if installed)
MythA category belief that's wrong
Question / pollAn open question from listening
Short video scriptA hook that won as text, recut as a 30–45 s YouTube Short / Reel (script + shot list)

Each post gets a hook_id (<ID or ORG>_<angle>_<format>_h<n>) and a tracking link with utm_campaign=<id>_<slug>&utm_content=<hook_id>. If /li-human is installed, run every draft through it. Otherwise strip em dashes and filler words yourself.

Label AI-generated people and scenes wherever the platform asks.

3. Queue for approval

One review item (Cloud create_ticket, Solo create_finding): "[ME:social-engine] Approve: N organic posts for week of …" with every post, its platform, the proposed slot, and the hook_id. Save the batch at brain/evidence/social/<YYYY-MM-DD>-batch. For hooks <ID>, also write ## Social hooks in brain/campaigns/<ID>: the hook_ids, formats (slugs from the shared list in /campaign-ledger) and a link to the batch node.

Steps — schedule

Only for posts the user explicitly approved in this session. Show the final list and ask once: "Schedule these N posts?" Then:

  • LinkedIn: schedule_post (author: "me" or the Page URN, scheduled_for ISO with offset)
  • X: X Organic has no scheduling tool. Either post at the approved time on the user's instruction (create_post/create_thread), or leave the post as a copy-ready block (or schedule a Claude Code /schedule run that posts it, if the user wants that).
  • YouTube: there's no upload tool, so deliver the script and shot list for the user to film and upload.

Confirm with list_scheduled_posts. Never publish anything that wasn't approved.

Steps — results

After 3–7 days, pull stats for each hook_id (LinkedIn get_post_statistics, X get_posts, YouTube get_videos). If no posts carry hook_ids yet (first run), report the baseline plus the top and bottom organic posts of the last 30 days, with a guess at why, and say hook tracking starts with the next batch. Compare each post to the account's own baseline (median of up to 30 organic posts from the last 90 days, with n stated; older posts make the baseline meaningless), not to vanity numbers:

Hook results — week of YYYY-MM-DD
Baseline (median): LinkedIn 1,450 impr · 2.1% eng | X 820 impr · 1.4% eng
| hook_id | Platform | Impr vs base | Eng. rate | Link clicks | Verdict |
🏆 Promote to paid: <hook_ids ≥2× baseline on engagement AND clicks>

X url_link_clicks is null on posts without a link, so the clicks half of that rule can't fire there. For link-less X posts, use engagements + user_profile_clicks as the clicks signal and say so in the table.

Append winners and losers to brain/evidence/social/hook-results with one line on why each probably won. For each winner, file one ticket: "[ME:social-engine] Promote: <hook_id> → paid test", which hands over to /creative-engine <ID> with the winning hook as concept #1.

Recording findings

Use create_ticket when the workspace has it (Cloud) and create_finding otherwise (Solo). The fields differ; see section 2 of ../marketing-engineer/references/mcp-routing.md.

Critical rules

  1. A human approves every post. Draft freely and publish nothing without a yes.
  2. Founder and customer words over generic content.
  3. Help first in communities. Disclose affiliation, never astroturf, never auto-post replies.
  4. Compare to the account's own baseline.
  5. Winners graduate to paid. That's the whole point of the test kitchen.

Frequently asked questions

What does the Social Engine AI skill do?

Use organic LinkedIn and X as a free creative test kitchen — listen to what people complain about and ask for, draft a week of hooks from customer language and founder opinions, schedule only what you approve, then promote the posts the algorithm picked up into paid tests

Why use Social Engine on TypingMind?

Because you install it once and use it with any model. Social Engine is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Social Engine in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/social-engine. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Social Engine?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Social Engine?

As many as you like. As long as a model supports skills, you can use Social Engine with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Social Engine AI skill free?

It is published on GitHub by cognyai. Check the repository for licensing terms. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇