SideShift Scanner
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SideShift Scannerrecommend creators for a brief about sustainable fashion"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Whip UGC Program Automation
The automation layer on top of SideShift for running Whip's UGC creator partnership program. Video performance data already lives in SideShift — this system organizes what SideShift (and Matthew's own judgment) surfaces, turns it into action, and keeps him from manually rebuilding a tracker every week.
Full spec: ugc-program-automation-spec.md. Design principle: Matthew never structures data by hand, and the system never contacts a creator on its own — it drafts, he sends.
flowchart LR
SS["SideShift API"] -- sync --> DB[("Local SQLite store")]
DB -- triage --> DB
DB -- compile --> DG["Weekly Digest"]
DB -- plan --> CAL["Google Calendar\n(via Calendar.app)"]
DG -- Gmail draft --> M["Matthew reviews & sends"]
AGENT["Claude Code / jcode"] -- MCP tools --> DB
M -- voice/typed notes --> AGENTThe core loop (spec section 3)
Ingest —
sync_datapulls a SideShift export into the Content Log, orrecord_manual_contentfiles raw numbers Matthew provides in chat.Triage —
run_triageflags each post Top/Normal/Underperforming relative to that creator's own recent baseline (not a fixed threshold).Surface —
compile_digest/render_digestreturn what's worth watching and why.Capture — Matthew watches, then tells the system his read in plain language;
capture_watch_notesresolves it safely, orfind_content+record_watch_notesfile it against the right content_id.Synthesize —
synthesize_feedback_draftcombines the data pattern with Matthew's notes into a starting draft. Drafted only.Calendar —
sync_calendarkeeps a dedicated Google Calendar current: payment dates, contract renewals, follow-up nudges.Digest —
run_weekly_routineruns the whole automated chain on a schedule;compile_digestanswers on-demand queries any time.
Related MCP server: Influencers Club MCP Server
Human-in-the-loop rule (spec section 5, non-negotiable)
Fully automated: parsing/filing data, flagging performance, synthesizing patterns, drafting feedback text, creating/updating calendar events, compiling the digest.
Requires Matthew's action: anything that reaches a creator. There is no
send_feedback tool anywhere in this codebase — save_feedback_draft only
ever writes a Draft row to the Feedback Log. Getting a draft in front of
Matthew is the calling agent's job (stage it as a Gmail draft with its own
gmail tool), and sending it is Matthew's.
Calendar events are the one thing this system creates/updates without
approval (low-risk, easily corrected) — but sync_calendar only ever
touches events it created itself. Every system-created event is tagged with
a stable marker; a Matthew-made event on the same calendar is never edited
or deleted, even if it collides on date or title. See
calendar_sync.py.
Setup
1. Install
git clone <this-repo>
cd sideshift-scanner
python3 -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"2. SideShift API key — copy the template and paste in your key (SideShift dashboard → Settings → Integrations):
cp .env.example .env3. Point the agent at your Python — copy the template and fill in the
absolute path to .venv/bin/python from step 1:
cp .mcp.json.example .mcp.json4. Add the dedicated calendar to Calendar.app (spec section 8 Q3).
Calendar sync works by driving macOS Calendar.app via JXA rather than the
Google Calendar REST API — no OAuth app, no consent screen, no per-machine
token refresh (see calendar_sync.py
docstring for the full rationale). Create (or pick) a dedicated Google
Calendar for the program, subscribe it in Calendar.app → Settings →
Accounts (it should already be there if it's under the same Google
account as Calendar.app), and note its exact display name. Default is
"whip"; override with calendar_name on any calendar tool/command.
5. Restart Claude Code / jcode in this folder to pick up the MCP server.
That's it — everything else is a chat message or a CLI command.
Just ask (via the agent)
Sync my latest SideShift data and run triage
What should I watch this week?
Ava just posted a TikTok that felt flat, the hook was too slow -- file that
Draft feedback for Marcus based on his last three underperforming posts
Update the calendar with upcoming payments and follow-ups
Give me this week's digestThe agent resolves freeform descriptions to the right creator/content_id
via find_content, files notes, drafts feedback, and stages Gmail drafts
using its own gmail tool — this MCP server never touches Gmail itself.
MCP tools
Tool | Spec step | Purpose |
| 1. Ingest | Pull SideShift data ( |
| 1. Ingest | File raw views + engagement when Matthew states the numbers directly |
| 2. Triage | Recompute Top/Normal/Underperforming per creator baseline |
| 2/3 | Content Log rows, filterable by creator/platform/flag/watched |
| 3/7 | Structured weekly-digest data on demand: per-creator status/trends, top performers with real metrics, trending formats, watchlist |
| 3/7 | Same, as email-ready markdown |
| 4. Capture | Resolve freeform description → candidate content_ids |
| 4. Capture | File Matthew's freeform read against a content_id |
| 4. Capture | Resolve a freeform post reference and file notes only when unambiguous |
| 5. Synthesize | Persist drafted feedback as |
| 5. Synthesize | Create a data- and note-informed feedback |
| 5 | List the Feedback Log |
| roster | Creator Roster CRUD |
| 6. Calendar | Reconcile the dedicated calendar against the roster |
| 6 | Same, without touching Calendar.app |
| 7. Digest | sync → triage → calendar sync → digest, one call |
CLI
Every tool above also has a ugc-cli command (sync, record-content, triage, digest,
creators, content, find-content, watch-notes, draft-feedback,
capture-notes, synthesize-feedback, feedback-drafts, update-creator, calendar-plan, calendar-sync,
weekly-routine):
ugc-cli weekly-routine --today 2026-08-25
ugc-cli digest --format text
ugc-cli calendar-sync --dry-runWeekly automation (spec section 6)
run_weekly_routine / ugc-cli weekly-routine runs sync → triage →
calendar sync → digest compilation in one call and returns
digest_markdown. It never touches Gmail — the scheduled agent wakeup that
drives it (see jcode's ScheduleWakeup, configured separately per
machine) stages that markdown as a Gmail draft addressed to Matthew each
Monday morning, which he reviews and sends like any other draft. On-demand
digests work the same way any time via compile_digest / ugc-cli digest.
Live dashboard
A read-only static dashboard mirrors compile_digest's output (creator
status/trends, top performers with real metrics, trending formats, watch
list, upcoming dates) at https://whip-ugc-digest.vercel.app, refreshed
daily via scripts/refresh_dashboard.sh (sync → triage → export JSON →
vercel deploy) and a separate daily ScheduleWakeup. Source lives in
web/ (single static index.html + public/data.json, no build step,
no framework) and scripts/export_digest.py (thin JSON serializer around
compile_digest, no new computation).
The URL has no authentication — anyone with the link can see creator names, handles, and performance numbers. Fine for a personal quick-glance tool; add Vercel password protection (Project Settings → Deployment Protection) before sharing the link with anyone outside your own use.
To refresh manually: ./scripts/refresh_dashboard.sh (requires the Vercel
CLI logged in via vercel login, run once per machine).
Data model (spec section 4)
Three logical tables backed by SQLite (data/ugc_analytics.db, gitignored
locally but expected to be shared via whatever sync mechanism the deploy
environment uses):
Creator Roster (
creators) — one row per creator: platforms, status, contact, contract/payment/follow-up dates, notes.Content Log (
content_items+performance_metrics+content_annotations) — one logical row per post: SideShift-sourced fields never touch Matthew/system-managed fields (watched,matthew_notes,system_synthesis,performance_flag) on resync.Feedback Log (
feedback_log) — one row per drafted feedback instance:Draftuntil Matthew sends it himself.
Triage formula (spec section 8 Q5 — first pass, not finalized)
performance_flag is a tie-aware percentile of a post's engagement rate
against that same creator's trailing 5 posts on the same platform
(never mixing e.g. YouTube Shorts' high-view/low-engagement pattern into a
TikTok baseline). Top ≥ 70th percentile, Underperforming ≤ 30th, and a
cohort under 3 prior posts is honestly reported as insufficient_data
rather than guessed. See triage.py for the
exact thresholds — these need Matthew's sign-off against real synced data
per the spec.
Tests
pytest -q96 tests cover schema/upsert semantics, triage math (including the
platform-scoping and small-cohort-honesty guarantees), CSV + mocked-API
ingestion, digest compilation and rendering, calendar plan computation +
mocked JXA reconciliation, the weekly routine orchestration, every MCP
tool via mcp.call_tool, and the CLI via Typer's CliRunner. The JXA
calendar script itself (create/update/delete, idempotency, and never
touching a non-marker event) was additionally validated by hand against a
live Google Calendar through Calendar.app — see calendar_sync.py's
module docstring.
Non-goals (v1, spec section 2)
No new video-performance analytics/dashboard (SideShift already covers this), no AI video-watching pipeline (spec section 7, Phase 2), not a CRM/payment processor (tracks dates and status, doesn't execute payments).
Available Tools
8 toolsdetect_trending_formatsB
Format/hook tags whose average performance beats the roster baseline, ranked by multiplier.
Inputs: metric, date_range_end, min_sample_size, date_range_start. Returns: result
generate_content_briefA
Draft a brief tailored to a creator's style, targeting a given or trending format.
Inputs: creator_id (required), based_on_format.
get_creator_profileC
Full creator profile: niche, style, platforms, performance history, best formats.
Inputs: handle, creator_id. Returns: result
get_performance_summaryC
Aggregate metrics + trend direction.
scope: 'global' | 'creator' | 'campaign' | 'format'. scope_id required unless scope='global'.
Inputs: scope, scope_id, date_range_end, date_range_start.
list_creatorsA
List creators, optionally filtered by niche tag, platform, or status.
Inputs: niche, status, platform. Returns: result
recommend_creators_for_briefB
Rank active creators for a brief or set of format tags, with rationale for each match.
Inputs: n, brief_text, format_tags. Returns: result
sync_dataA
Pull latest data via the active ingestion adapter and upsert into the local store.
method='csv': source is a directory containing creators.csv / campaigns.csv /
content_items.csv / performance_metrics.csv (see sample_data/).
method='api': pulls from the real SideShift API. Requires the SIDESHIFT_API_KEY
env var (Settings -> Integrations in the SideShift dashboard).
since (YYYY-MM-DD) limits ingestion to records on/after that date.
Inputs: since, method, source.
top_performersA
Ranked content items by a chosen metric (views/likes/comments/shares/saves/conversions/revenue/engagement_rate).
include_unlisted: whether to include content from creators no longer returned by SideShift's /creators (ghost handles or removed accounts -- SideShift excludes those by design, so this tool can't fetch more about who they are, just show or hide their content).
Inputs: n, metric, date_range_end, date_range_start, +1 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 8 tools
Each tool targets a distinct function: data ingestion, listing vs. detailed profiles, aggregate summaries vs. ranked items, trend detection, creator recommendation, and brief generation. No two tools have overlapping purposes; even related tools (recommend vs. generate) are clearly separated.
Most tools follow a clear verb_noun pattern (sync_data, list_creators, get_creator_profile, detect_trending_formats, generate_content_brief). The exception is 'top_performers' which is noun-only, and 'recommend_creators_for_brief' is slightly longer but still verb_noun. Overall consistent and readable, with one minor deviation.
8 tools is within the optimal 3-15 range, covering ingestion, querying, analytics, and recommendation without feeling bloated. Each tool serves a distinct need in the creator analytics domain.
The tool set covers the core workflow: data ingestion, creator browsing/detail, performance analysis, trend detection, and brief generation. Minor gaps exist (e.g., no direct tool for listing campaigns or content items beyond top_performers), but these are edge cases and the main workflow is well-supported.
Maintenance
Related MCP Connectors
Tokfluence's hosted MCP server connects Claude, ChatGPT, Cursor or any MCP client to the Tokfluence TikTok creator index. Give your agent a brief and it plans the search, pages through keyword and structured results, reads creators' latest posts as evidence, ranks the pool, and saves the list to your Tokfluence dashboard. For niches the index doesn't cover yet, it can start a crawl (it asks you first and shows the credit cost) or hand the brief to Ultra Search for a judged list with a tier, fit and reason for each creator. It's a remote server with nothing to install: sign in with OAuth, or use an API key. Free accounts include 50 API credits; paid plans add more. Creators whose bio states an age under 18 are always excluded.
Give your agents the best data to grow your UGC program. Search 28,000+ Instagram and TikTok UGC creators with public emails, source new creators from a brief, see which of 500+ brands run UGC and who makes it for them, track creator videos, and manage outreach in a creator CRM. Sign in with OAuth (no API key needed); MCP access needs a Premium, Ultra or Enterprise plan, and every plan starts with a 3-day trial. Docs: https://ugcagent.app/features/ugc-agent-mcp/
Remote MCP server for China brand visibility, destination demand, and KOL discovery workflows.
MCP tools to find and hire Instagram and TikTok creators from a plain-language brief.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for analyzing TikTok data for insight extraction6MIT
- AlicenseAqualityBmaintenanceMCP server for the Influencers Club API — creator enrichment, discovery, audience analysis, content data, batch operations, and account management.22112 PyPI13MIT
- FlicenseNot gradedqualityDmaintenanceRemote MCP server that provides Creator Recommendation API tools (creator_research, creator_tagged_media, etc.) with secure authentication, rate limiting, and OAuth support for Claude clients.-
- FlicenseBqualityDmaintenanceA platform-agnostic MCP server that connects Claude to campaign data, institutional knowledge, and historical performance for paid media teams, enabling automated analysis, reporting, and debugging.73-