mod-actions

v2026.09.24

Comprehensive moderation toolkit: user actions (ban/mute/DM), strike system, image moderation, report handling, generation moderation, content/training moderation, and NCMEC/CSAM reporting. All via Civitai tRPC API.

GitHub
Install command
npx skhub add civitai/mod-actions
Markdown
SKILL.md

Moderator Actions

Comprehensive moderation toolkit for Civitai. Covers user actions, strike management, image moderation, report handling, generation moderation, content/training moderation, and NCMEC/CSAM reporting.

All scripts use the Civitai tRPC API with Bearer token authentication, ensuring actions go through the proper service layer with full side effects.

Setup

  1. Copy .env-example to .env in this skill directory
  2. Add your Civitai API key (must belong to a moderator account)
  3. Optionally set the API URL (defaults to production)
cp .claude/skills/mod-actions/.env.example .claude/skills/mod-actions/.env
# Edit .env and add your API key

Important: The API key must belong to a user with moderator privileges.

VariableRequiredDefaultDescription
CIVITAI_API_KEYYes-Your Civitai API key
CIVITAI_API_URLNohttps://civitai.comAPI base URL

Skill Files

FileDomainCommands
query.mjsUser moderationuser, ban, mute, leaderboard, remove-content, dm
strikes.mjsStrike systemget-user, standings, list, create, void
images.mjsImage moderationreview-queue, review-counts, moderate, tos-violation, rescan, report-csam, poi-tags, user-images, rating-requests, ingestion-errors, resolve-ingestion, downleveled, pending-ingestion, toggle-flag
reports.mjsReport handlinglist, set-status, bulk-status, update, appeals, appeal-details, resolve-appeal
generation.mjsGeneration moderationflagged-consumers, flagged-reasons, consumer-strikes, review-strikes, user-generations, restrictions, resolve-restriction, allowlist-add, debug-audit, todays-counts, suspicious-matches
content.mjsContent moderationmodels, flagged-models, resolve-flagged, model-versions, rescan-model, restore-model, toggle-cannot-promote, toggle-cannot-publish, articles, mod-rule
model3ds.mjs3D Models moderationlist, get, files, unpublish, delete, restore, set-nsfw-level, toggle-tos, toggle-poi, toggle-minor, toggle-nsfw, toggle-unlisted
csam.mjsNCMEC/CSAM reportingreports, stats, image-resources, create-report

query.mjs — User Moderation

node .claude/skills/mod-actions/query.mjs <command> [options]
CommandDescription
user <id|username>Look up user info
ban <id|username>Toggle ban status
mute <id|username>Toggle mute status
leaderboard <id|username> <true|false>Set leaderboard eligibility
remove-content <id|username>Remove all user content (DESTRUCTIVE)
dm <id|username>Send a DM (requires --message)

Options: --json, --dry-run, --reason <code>, --message <text>, --internal <text>

Ban Reason Codes: SexualMinor, SexualMinorGenerator, SexualMinorTraining, SexualPOI, Bestiality, Scat, Nudify, Harassment, SpamBot, LeaderboardCheating, BuzzCheating, RRDViolation, Other

node .claude/skills/mod-actions/query.mjs user 3879899
node .claude/skills/mod-actions/query.mjs ban 3879899 --reason Other --message "ToS violation" --dry-run
node .claude/skills/mod-actions/query.mjs dm 3879899 --message "Please review our guidelines"

strikes.mjs — Strike System

node .claude/skills/mod-actions/strikes.mjs <command> [options]
CommandR/WDescription
get-user <userId>READStrike history for a user
standingsREADUser standings (filter: active/muted/flagged)
listREADPaginated strike list with filters
create <userId>WRITEIssue a strike (requires --reason, --description)
void <strikeId>WRITEVoid a strike (requires --reason)

Strike Reasons: BlockedContent, RealisticMinorContent, CSAMContent, TOSViolation, HarassmentContent, ProhibitedContent, ManualModAction

Options: --reason, --description, --points <1-3>, --entity-type, --entity-id, --report-id, --expires-days, --status <Active,Expired,Voided>, --sort <points|score|lastStrike|created>, --sort-order <asc|desc>, --flagged-for-review, --has-active-strikes, --page, --limit, --json, --dry-run

node .claude/skills/mod-actions/strikes.mjs get-user 3879899
node .claude/skills/mod-actions/strikes.mjs standings --has-active-strikes --limit 10
node .claude/skills/mod-actions/strikes.mjs create 3879899 --reason BlockedContent --description "Uploaded prohibited content" --points 1 --dry-run
node .claude/skills/mod-actions/strikes.mjs void 42 --reason "False positive from scanner"

images.mjs — Image Moderation

node .claude/skills/mod-actions/images.mjs <command> [options]
CommandR/WDescription
review-queueREADImage review queue
review-countsREADQueue tab counts
moderate <ids> <action>WRITEBlock/unblock images
tos-violation <imageId>WRITEFlag as TOS violation
rescan <imageId>WRITERe-ingest/rescan image
report-csam <imageIds>WRITEReport images as CSAM
poi-tagsREADPerson-of-interest tags
user-images <userId>READAll images for a user
rating-requestsREADNSFW rating review requests
ingestion-errorsREADImages with ingestion errors
resolve-ingestion <id>WRITEResolve ingestion error
downleveledREADDownleveled images
pending-ingestionREADPending ingestion images
toggle-flag <imageId>WRITEToggle image flag

Options: --ids, --action, --review-type, --cursor, --page, --limit, --json, --dry-run

node .claude/skills/mod-actions/images.mjs review-counts
node .claude/skills/mod-actions/images.mjs review-queue --limit 20
node .claude/skills/mod-actions/images.mjs moderate 12345,67890 block --dry-run
node .claude/skills/mod-actions/images.mjs user-images 3879899 --json
node .claude/skills/mod-actions/images.mjs rescan 12345

reports.mjs — Report Handling

node .claude/skills/mod-actions/reports.mjs <command> [options]
CommandR/WDescription
listREADReports by entity type (requires --type)
set-status <reportId> <status>WRITESet report status
bulk-status <status>WRITEBulk update statuses (requires --ids)
update <reportId>WRITEUpdate report with status/notes
appealsREADRecent appeals
appeal-details <id>READAppeal details
resolve-appealWRITEResolve appeal (requires --ids, --entity-type, --status)

Report Entity Types: model, comment, commentV2, image, resourceReview, article, post, reportedUser, collection, bounty, bountyEntry, chat, comicProject

Report Statuses: Pending, Processing, Actioned, Unactioned

Appeal Statuses: Pending, Approved, Rejected

Options: --type, --status, --ids, --entity-type, --internal, --message, --user-id, --start-date, --page, --limit, --query, --json, --dry-run

node .claude/skills/mod-actions/reports.mjs list --type image --limit 20
node .claude/skills/mod-actions/reports.mjs set-status 456 Actioned --dry-run
node .claude/skills/mod-actions/reports.mjs bulk-status Actioned --ids 1,2,3
node .claude/skills/mod-actions/reports.mjs appeals --user-id 3879899
node .claude/skills/mod-actions/reports.mjs resolve-appeal --ids 10,11 --entity-type Image --status Approved

generation.mjs — Generation Moderation

node .claude/skills/mod-actions/generation.mjs <command> [options]
CommandR/WDescription
flagged-consumersREADFlagged generation consumers
flagged-reasonsREADFlagging reasons
consumer-strikes <userId>READConsumer's generation strikes
review-strikes <userId>WRITEMark strikes as reviewed
user-generations <userId>READUser's generated images
restrictionsREADAll generation restrictions
resolve-restriction <id>WRITEResolve restriction (Upheld/Overturned)
allowlist-addWRITEAdd prompt trigger to allowlist
debug-audit <prompt>READTest prompt auditing
todays-countsREADToday's prohibited request counts
suspicious-matchesREADSaved suspicious audit matches

Options: --status <Pending|Upheld|Overturned>, --reason, --start-date, --message, --trigger, --category, --negative-prompt, --user-id, --username, --restriction-id, --page, --limit, --json, --dry-run

node .claude/skills/mod-actions/generation.mjs flagged-consumers
node .claude/skills/mod-actions/generation.mjs consumer-strikes 3879899
node .claude/skills/mod-actions/generation.mjs restrictions --status Pending
node .claude/skills/mod-actions/generation.mjs resolve-restriction 42 --status Upheld --message "Confirmed violation" --dry-run
node .claude/skills/mod-actions/generation.mjs debug-audit "some prompt text"
node .claude/skills/mod-actions/generation.mjs allowlist-add --trigger "girl" --category "age" --reason "False positive"

content.mjs — Content Moderation

node .claude/skills/mod-actions/content.mjs <command> [options]
CommandR/WDescription
modelsREADModels for mod review
flagged-modelsREADFlagged models
resolve-flaggedWRITEResolve flagged models (requires --ids)
model-versionsREADModel versions for mod
rescan-model <id>WRITERe-ingest a model
restore-model <id>WRITERestore deleted model
toggle-cannot-promote <id>WRITEToggle promotion eligibility
toggle-cannot-publish <id>WRITEToggle publish ability
articlesREADArticles for mod review
mod-rule <id>READGet moderation rule

Options: --ids, --page, --limit, --json, --dry-run

Training moderation (list / approve / deny training data) moved to the moderator spoke (/audit/training-models, /audit/training-data) in the moderator-app migration and is no longer reachable via tRPC — see docs/moderator-app/page-migration-checklist.md.

node .claude/skills/mod-actions/content.mjs flagged-models --limit 10
node .claude/skills/mod-actions/content.mjs resolve-flagged --ids 1,2,3 --dry-run
node .claude/skills/mod-actions/content.mjs rescan-model 789

model3ds.mjs — 3D Models Moderation

node .claude/skills/mod-actions/model3ds.mjs <command> [options]
CommandR/WDescription
listRList Model3Ds (--status, --username, --limit, --cursor)
get <id>RGet a Model3D by id
files <id>RList files attached to a Model3D
unpublish <id>WSet status -> Unpublished
delete <id>WSoft-delete (status -> Deleted, sets deletedAt/deletedBy)
restore <id>WRestore (Deleted -> Unpublished, Unpublished -> Published)
set-nsfw-level <id>WOverride nsfwLevel (--level <n> [--lock])
toggle-tos <id>WToggle tosViolation (locks the field)
toggle-poi <id>WToggle poi (locks the field)
toggle-minor <id>WToggle minor (locks the field)
toggle-nsfw <id>WToggle nsfw (locks the field)
toggle-unlisted <id>WToggle unlisted (locks the field)

Strikes against a Model3D use the existing strikes.mjs (the strike system is entity-type-agnostic):

node .claude/skills/mod-actions/strikes.mjs create <userId> \
  --entity-type Model3D --entity-id <model3dId> --reason TOSViolation --points 1

Common flags:

  • --json — raw JSON output
  • --dry-run — preview without making changes (write commands only)

Examples:

node .claude/skills/mod-actions/model3ds.mjs list --status Draft --limit 100
node .claude/skills/mod-actions/model3ds.mjs get 42
node .claude/skills/mod-actions/model3ds.mjs unpublish 42
node .claude/skills/mod-actions/model3ds.mjs set-nsfw-level 42 --level 16 --lock
node .claude/skills/mod-actions/model3ds.mjs toggle-tos 42 --dry-run
node .claude/skills/mod-actions/model3ds.mjs restore 42

csam.mjs — NCMEC/CSAM Reporting

node .claude/skills/mod-actions/csam.mjs <command> [options]
CommandR/WDescription
reportsREADPaginated CSAM reports
statsREADCSAM report statistics
image-resources <imageIds>READResources used to generate flagged images
create-report <userId>WRITECreate NCMEC CyberTipline report

CSAM Report Types: Image, TrainingData, GeneratedImage

Options: --type <CsamReportType>, --image-ids <id1,id2,...>, --minor-depiction <real|non-real>, --page, --limit, --json, --dry-run

node .claude/skills/mod-actions/csam.mjs stats
node .claude/skills/mod-actions/csam.mjs reports --limit 10
node .claude/skills/mod-actions/csam.mjs image-resources 12345,67890
node .claude/skills/mod-actions/csam.mjs create-report 3879899 --type GeneratedImage --image-ids 111,222 --dry-run

Global Options

All scripts support:

FlagDescription
--jsonOutput raw JSON (for agent/scripting consumption)
--dry-runPreview WRITE actions without executing
--page <n>Page number for paginated results (default: 1)
--limit <n>Page size for paginated results (default: 20)

Safety Notes

  • Always use --dry-run first for destructive/write actions
  • All actions are logged in the ModActivity table
  • Ban actions invalidate user sessions immediately
  • CSAM reports are submitted to NCMEC — use with extreme care
  • Document reasons with --reason and --message flags
  • API key must have moderator privileges
  • Use --json for programmatic consumption by agent daemons
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

Apache-2.0

Source path

.claude/skills/mod-actions

Default branch

main

Latest commit

2bc8fe0

Tree SHA

5997db0