New to Claude Skills? Learn how to install them →

sickn33 on GitHub

Azure AI Content Safety

Free

Analyze text and images for harmful content.

Get this skill

Free · Opens the source repo

What Azure AI Content Safety does

The Azure AI Content Safety skill provides developers with a robust REST SDK for analyzing both text and images for potentially harmful content. Utilizing customizable blocklists, this skill allows for tailored content moderation that can adapt to specific needs. By integrating this SDK into applications, developers can ensure that user-generated content aligns with safety and community standards, reducing the risk of harmful interactions.

The skill supports a variety of harmful content categories, including hate speech, sexual content, violence, and self-harm. It offers different severity levels for each category, allowing developers to determine the appropriate response based on the severity of the content detected. The API is designed to be straightforward, requiring minimal setup with just a few environment variables and authentication steps, making it accessible for developers of varying skill levels.

In addition to content analysis, the skill features blocklist management capabilities, enabling users to create, update, and delete blocklists as needed. This flexibility allows organizations to maintain control over the terms and phrases that are deemed unacceptable within their specific context. The ability to analyze content against these blocklists ensures that any flagged content can be appropriately handled, whether that means blocking it outright or flagging it for further review.

Overall, this skill is ideal for developers looking to implement content moderation in applications that allow user-generated content. Its easy integration and comprehensive analysis features make it a valuable tool for enhancing user safety and maintaining community standards.

When to use it

Use this skill when building applications that require content moderation, such as social media platforms, forums, or any service that allows user submissions.

When not to use it

This skill may not be suitable for applications that do not require content moderation or where real-time analysis is not critical.

What you can build with it

Moderating User Comments

Implement the skill to analyze comments on a blog or forum, ensuring that harmful language is flagged or blocked.

Image Upload Moderation

Use the skill to analyze images uploaded by users, automatically detecting and handling inappropriate content before it is displayed.

Custom Blocklist for Community Standards

Create a custom blocklist tailored to your community's guidelines, allowing for specific terms to be flagged during content analysis.

How to install Azure AI Content Safety

View source

1. Install with the skills CLI

npx skills add sickn33/agentic-awesome-skills/azure-ai-contentsafety-ts --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by sickn33

Azure AI Content Safety REST SDK for TypeScript

Analyze text and images for harmful content with customizable blocklists.

Installation

npm install @azure-rest/ai-content-safety @azure/identity @azure/core-auth

Environment Variables

CONTENT_SAFETY_ENDPOINT=https://<resource>.cognitiveservices.azure.com
CONTENT_SAFETY_KEY=<api-key>

Authentication

Important: This is a REST client. ContentSafetyClient is a function, not a class.

API Key

import ContentSafetyClient from "@azure-rest/ai-content-safety";
import { AzureKeyCredential } from "@azure/core-auth";

const client = ContentSafetyClient(
  process.env.CONTENT_SAFETY_ENDPOINT!,
  new AzureKeyCredential(process.env.CONTENT_SAFETY_KEY!)
);

DefaultAzureCredential

import ContentSafetyClient from "@azure-rest/ai-content-safety";
import { DefaultAzureCredential } from "@azure/identity";

const client = ContentSafetyClient(
  process.env.CONTENT_SAFETY_ENDPOINT!,
  new DefaultAzureCredential()
);

Analyze Text

import ContentSafetyClient, { isUnexpected } from "@azure-rest/ai-content-safety";

const result = await client.path("/text:analyze").post({
  body: {
    text: "Text content to analyze",
    categories: ["Hate", "Sexual", "Violence", "SelfHarm"],
    outputType: "FourSeverityLevels"  // or "EightSeverityLevels"
  }
});

if (isUnexpected(result)) {
  throw result.body;
}

for (const analysis of result.body.categoriesAnalysis) {
  console.log(`${analysis.category}: severity ${analysis.severity}`);
}

Analyze Image

Base64 Content

import { readFileSync } from "node:fs";

const imageBuffer = readFileSync("./image.png");
const base64Image = imageBuffer.toString("base64");

const result = await client.path("/image:analyze").post({
  body: {
    image: { content: base64Image }
  }
});

if (isUnexpected(result)) {
  throw result.body;
}

for (const analysis of result.body.categoriesAnalysis) {
  console.log(`${analysis.category}: severity ${analysis.severity}`);
}

Blob URL

const result = await client.path("/image:analyze").post({
  body: {
    image: { blobUrl: "https://storage.blob.core.windows.net/container/image.png" }
  }
});

Blocklist Management

Create Blocklist

const result = await client
  .path("/text/blocklists/{blocklistName}", "my-blocklist")
  .patch({
    contentType: "application/merge-patch+json",
    body: {
      description: "Custom blocklist for prohibited terms"
    }
  });

if (isUnexpected(result)) {
  throw result.body;
}

console.log(`Created: ${result.body.blocklistName}`);

Add Items to Blocklist

const result = await client
  .path("/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems", "my-blocklist")
  .post({
    body: {
      blocklistItems: [
        { text: "prohibited-term-1", description: "First blocked term" },
        { text: "prohibited-term-2", description: "Second blocked term" }
      ]
    }
  });

if (isUnexpected(result)) {
  throw result.body;
}

for (const item of result.body.blocklistItems ?? []) {
  console.log(`Added: ${item.blocklistItemId}`);
}

Analyze with Blocklist

const result = await client.path("/text:analyze").post({
  body: {
    text: "Text that might contain blocked terms",
    blocklistNames: ["my-blocklist"],
    haltOnBlocklistHit: false
  }
});

if (isUnexpected(result)) {
  throw result.body;
}

// Check blocklist matches
if (result.body.blocklistsMatch) {
  for (const match of result.body.blocklistsMatch) {
    console.log(`Blocked: "${match.blocklistItemText}" from ${match.blocklistName}`);
  }
}

List Blocklists

const result = await client.path("/text/blocklists").get();

if (isUnexpected(result)) {
  throw result.body;
}

for (const blocklist of result.body.value ?? []) {
  console.log(`${blocklist.blocklistName}: ${blocklist.description}`);
}

Delete Blocklist

await client.path("/text/blocklists/{blocklistName}", "my-blocklist").delete();

Harm Categories

CategoryAPI TermDescription
Hate and FairnessHateDiscriminatory language targeting identity groups
SexualSexualSexual content, nudity, pornography
ViolenceViolencePhysical harm, weapons, terrorism
Self-HarmSelfHarmSelf-injury, suicide, eating disorders

Severity Levels

LevelRiskRecommended Action
0SafeAllow
2LowReview or allow with warning
4MediumBlock or require human review
6HighBlock immediately

Output Types:

  • FourSeverityLevels (default): Returns 0, 2, 4, 6
  • EightSeverityLevels: Returns 0-7

Content Moderation Helper

import ContentSafetyClient, { 
  isUnexpected, 
  TextCategoriesAnalysisOutput 
} from "@azure-rest/ai-content-safety";

interface ModerationResult {
  isAllowed: boolean;
  flaggedCategories: string[];
  maxSeverity: number;
  blocklistMatches: string[];
}

async function moderateContent(
  client: ReturnType<typeof ContentSafetyClient>,
  text: string,
  maxAllowedSeverity = 2,
  blocklistNames: string[] = []
): Promise<ModerationResult> {
  const result = await client.path("/text:analyze").post({
    body: { text, blocklistNames, haltOnBlocklistHit: false }
  });

  if (isUnexpected(result)) {
    throw result.body;
  }

  const flaggedCategories = result.body.categoriesAnalysis
    .filter(c => (c.severity ?? 0) > maxAllowedSeverity)
    .map(c => c.category!);

  const maxSeverity = Math.max(
    ...result.body.categoriesAnalysis.map(c => c.severity ?? 0)
  );

  const blocklistMatches = (result.body.blocklistsMatch ?? [])
    .map(m => m.blocklistItemText!);

  return {
    isAllowed: flaggedCategories.length === 0 && blocklistMatches.length === 0,
    flaggedCategories,
    maxSeverity,
    blocklistMatches
  };
}

API Endpoints

OperationMethodPath
Analyze TextPOST/text:analyze
Analyze ImagePOST/image:analyze
Create/Update BlocklistPATCH/text/blocklists/{blocklistName}
List BlocklistsGET/text/blocklists
Delete BlocklistDELETE/text/blocklists/{blocklistName}
Add Blocklist ItemsPOST/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems
List Blocklist ItemsGET/text/blocklists/{blocklistName}/blocklistItems
Remove Blocklist ItemsPOST/text/blocklists/{blocklistName}:removeBlocklistItems

Key Types

import ContentSafetyClient, {
  isUnexpected,
  AnalyzeTextParameters,
  AnalyzeImageParameters,
  TextCategoriesAnalysisOutput,
  ImageCategoriesAnalysisOutput,
  TextBlocklist,
  TextBlocklistItem
} from "@azure-rest/ai-content-safety";

Best Practices

  1. Always use isUnexpected() - Type guard for error handling
  2. Set appropriate thresholds - Different categories may need different severity thresholds
  3. Use blocklists for domain-specific terms - Supplement AI detection with custom rules
  4. Log moderation decisions - Keep audit trail for compliance
  5. Handle edge cases - Empty text, very long text, unsupported image formats

When to Use

This skill is applicable to execute the workflow or actions described in the overview.

Limitations

  • Use this skill only when the task clearly matches the scope described above.
  • Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
  • Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.

Frequently asked questions about Azure AI Content Safety

Similar skills