Generated banner for Azure AI Contentsafety TS
Generated logo for Azure AI Contentsafety TS

Azure AI Contentsafety TS

MicrosoftOfficialCreated by Microsoft

  • Skill
  • Tool integration
  • Software development
  • MIT
  • No issues found

From the author

Analyze text and images for harmful content using Azure AI Content Safety (@azure-rest/ai-content-safety). Use when moderating user-generated content, detecting hate speech, violence, sexual content, or self-harm, or managing custom blocklists.
— the description by Microsoft

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides a TypeScript REST client for the Azure AI Content Safety service. It enables developers to programmatically scan text and images for categories such as hate speech, violence, sexual content, and self-harm. Additionally, it supports the management of custom blocklists to filter specific terms, allowing for tailored content moderation workflows.

What it does

  • Analyzes text input for harmful categories with configurable severity levels.
  • Scans images provided as base64 strings or via blob URLs for safety violations.
  • Creates and manages custom text blocklists to filter specific prohibited terms.
  • Provides methods to add, list, and remove items from custom blocklists.
  • Integrates with Azure Identity for secure authentication using API keys or managed identities.

When to use it

  • When building moderation systems for user-generated content.
  • When you need to detect and filter hate speech, violence, or sexual content in applications.
  • When implementing domain-specific keyword filtering alongside AI-based safety analysis.
  • When developing automated pipelines that require content safety checks for images or text.

Advantages

  • Supports both text and image analysis within a single client interface.
  • Allows for granular control over severity thresholds for different harm categories.
  • Enables custom filtering through blocklist management.
  • Provides type-safe error handling using the isUnexpected utility.

Usage examples

“How do I analyze a string of text for hate speech and violence using the Azure Content Safety client?”
The agent provides a code snippet using the client.path('/text:analyze').post method, specifying the categories array and handling the response to log severity levels.
“Show me how to add prohibited terms to a custom blocklist.”
The agent demonstrates the use of the client.path('/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems').post method to upload an array of blocklist items.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/microsoft/azure-ai-contentsafety-ts/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip azure-ai-contentsafety-ts.zip -d .agents/skills

Documentation by Microsoft

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>
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production

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, ManagedIdentityCredential } from "@azure/identity";

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes
// const credential = new ManagedIdentityCredential();

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

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

Files

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an API key, Needs Node.js

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Microsoft
Publisher
Microsoft (Official)
Source
microsoft/skills · .github/plugins/azure-sdk-typescript/skills/azure-ai-contentsafety-ts · commit 0696600
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Microsoft.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download azure-ai-contentsafety-ts.zip