Unprofane
Server Details
Should I allow this text? Profanity and toxicity checks that are hard to fool, with the evidence.
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: single-text checking, batch checking, integration code retrieval, usage inspection, and error reporting. Although check_batch and check_text are related, their boundaries are explicitly described and easy to distinguish. No two tools appear interchangeable.
All tool names use consistent snake_case with a predictable verb_noun structure: check_batch, check_text, get_integration_snippet, get_usage, report_result. The prefixes check_, get_, and report_ accurately reflect their operations.
Five tools are well-scoped for a profanity-checking API: single check, batch check, integration snippet, usage, and feedback. Each tool earns its place without redundancy or missing essential surface. The count is neither thin nor excessive.
The tool set covers the core lifecycle of checking text, batch checking, retrieving integration code, monitoring usage, and reporting incorrect results. Minor gaps exist around configuration or retrieval of past results, but these are not essential for the stated purpose and can be worked around.
Available Tools
5 toolscheck_batchCheck many textsARead-onlyIdempotentInspect
Check up to 100 texts in one call, 30,000 characters in all, with the same settings. Each item has your id and a text; results come back in order, each with its id and either a result (as check_text returns) or an error. Read-only; counts one check per item.
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | How "censored" hides a matched word: asterisk (****), first_letter (f***), grawlix (#$@!) or remove. Omit for the project's default, asterisk unless the project set one. | |
| mode | No | How much to ask the model: fast never asks the model; balanced, the default, asks it about every text but a word or two the rules block outright; thorough asks it about every text. Omit for the project's default. | |
| items | Yes | The texts to check, each with an id of yours to match its result. | |
| policy | No | How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces), casual (swearing welcome, swearing at someone still blocked). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default. | |
| context | No | Where the text is shown, which changes how it is read: username (a public handle; reserved names match), display_name (a name beside content), comment, chat, gaming (taunts about play are not abuse), review, educational (quoted words are discussed, not used), creative (dialogue in fiction), custom_text (engraving or printing), general (anything else). Omit for the project's default, general unless the project set one. | |
| country | No | Where the readers are, as a two-letter country code (MX, ES, BR): a word rude in some countries and innocent in others is read as theirs reads it. Omit to count a word rude anywhere. | |
| language | No | The language the text is in, when you know it: a short text that shows no other language is read in it. Defaults to auto. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior. The description adds important operational context beyond that: batch limits, ordered per-item results/errors, and that billing counts one check per item.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences front-load the batching purpose and limits, then cover input shape, output shape, and operational notes. Every sentence earns its place with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema, full parameter descriptions, an output schema, and explicit annotations, the description supplies the remaining operational essentials: batch limits, ordering, per-item error handling, and check counting. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains every parameter in detail. The description adds only that items have an id and text and that results return in order with matching ids, which is useful but mostly repeats schema-level semantics rather than adding new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Check up to 100 texts in one call.' It adds the defining scope of batching with shared settings and limits, making it clearly distinguishable from the singular sibling check_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear this is for batches of texts using the same settings, which implicitly guides agents away from using it for single-item checks or per-item settings. It does not explicitly name check_text as the alternative for one text, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_textCheck a textARead-onlyIdempotentInspect
Decide whether one text should be allowed: profanity, slurs, insults, threats and sexual language, disguised spellings included (sh1t, f.u.c.k, leetspeak, homoglyphs). Returns the action (allow, review, block), the matches with their categories and the tricks used, a one-sentence reason and a censored version. Read-only; counts one check against the plan. If the action is wrong, report it with report_result and the result's id.
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | How "censored" hides a matched word: asterisk (****), first_letter (f***), grawlix (#$@!) or remove. Omit for the project's default, asterisk unless the project set one. | |
| mode | No | How much to ask the model: fast never asks the model; balanced, the default, asks it about every text but a word or two the rules block outright; thorough asks it about every text. Omit for the project's default. | |
| text | Yes | The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name. | |
| policy | No | How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces), casual (swearing welcome, swearing at someone still blocked). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default. | |
| context | No | Where the text is shown, which changes how it is read: username (a public handle; reserved names match), display_name (a name beside content), comment, chat, gaming (taunts about play are not abuse), review, educational (quoted words are discussed, not used), creative (dialogue in fiction), custom_text (engraving or printing), general (anything else). Omit for the project's default, general unless the project set one. | |
| country | No | Where the readers are, as a two-letter country code (MX, ES, BR): a word rude in some countries and innocent in others is read as theirs reads it. Omit to count a word rude anywhere. | |
| language | No | The language the text is in, when you know it: a short text that shows no other language is read in it. Defaults to auto. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| score | Yes | |
| action | Yes | |
| engine | Yes | |
| reason | Yes | |
| allowed | Yes | |
| evasion | Yes | |
| matches | Yes | |
| censored | Yes | |
| language | Yes | |
| severity | Yes | |
| timing_ms | Yes | |
| categories | Yes | |
| decided_by | Yes | |
| obfuscated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Read-only' adds nothing. The genuinely new disclosure is the quota cost ('counts one check against the plan') and the feedback loop via report_result, which are useful but thin for a tool with a model-in-the-loop mode parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the decision and the scope of detection, then return shape, then the feedback escape hatch. No sentence restates structured data unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter classifier with full enum documentation and an output schema, the description covers purpose, obfuscation scope, cost, and the correction workflow. Nothing an agent needs before calling it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum descriptions (mask, mode, policy, context, country) are already richer than anything in the tool description. The description adds no parameter-level guidance of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Decide whether one text should be allowed') and enumerates the exact content classes it judges, including obfuscation handling. The singular 'one text' scopes it against the sibling check_batch without needing either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear operating condition and a corrective path: 'If the action is wrong, report it with report_result and the result's id.' It does not explicitly route multi-text callers to check_batch, so the when-not case is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_integration_snippetGet an integration recipeARead-onlyIdempotentInspect
A complete, runnable recipe for adding Unprofane to a platform in a language: code to paste. Use it when asked to add a profanity or username filter to an app. Read-only and free: it checks no text.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | The programming language of the recipe. | |
| platform | Yes | Where the check runs: the auth or backend platform the app uses, a game engine, or http for any server. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false). The description adds value beyond them by clarifying the return ('code to paste') and that it is 'free' and performs no text checking, though it says nothing about latency or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what is returned, then when to use it, then the read-only caveat. Slight awkwardness in 'a platform in a language: code to paste', but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two enum parameters, full annotations, and no output schema, the description supplies what an agent needs: what comes back, when to call it, and that it is side-effect free. Return format details beyond 'code to paste' are the only minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters enum-constrained and described, so the schema does the heavy lifting. The description only alludes to 'platform' and 'language' generically and adds no syntax or combination guidance beyond what the enums already state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('complete, runnable recipe for adding Unprofane to a platform in a language') and says exactly what is produced ('code to paste'). The clause 'it checks no text' cleanly separates it from the sibling check_text/check_batch tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it when asked to add a profanity or username filter to an app' gives a concrete triggering scenario. It stops short of explicitly naming the alternative siblings for cases where the agent needs an actual check, but the implied contrast is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usageGet usage this periodARead-onlyIdempotentInspect
The checks this key's account has used in the current billing period, how many its plan includes and any overage, with the share answered by the rules alone, the model or the cache. Counts up to the last full hour. Read-only and free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | Yes | |
| checks | Yes | |
| period | Yes | |
| routes | Yes | |
| overage | Yes | |
| degraded | Yes | |
| included | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is to add context. It does: 'Counts up to the last full hour' discloses data freshness/possible lag, and 'free' discloses cost, both of which are not in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the primary payload (usage counts) before the breakdown and freshness/cost caveats. It is efficient, though the enumeration is packed enough that a second short sentence separating the freshness/cost note would read better.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is already covered; the description adds the freshness window and cost profile an agent needs before calling. The only real gap is the absence of usage guidance relative to siblings, which is minor for a zero-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No misleading parameter language is present.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: the checks this key's account consumed in the current billing period, plan allowance, overage, and the breakdown by rules/model/cache. An agent knows exactly what data comes back without opening the schema, and no sibling tool overlaps this functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to call this versus alternatives, nor any preconditions. 'Read-only and free' weakly implies it is safe to call at will, but the agent must infer that on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_resultReport a wrong resultAInspect
Tell Unprofane a check got it wrong (or right): the result's id, the verdict and, if you know it, the action it should have taken. A person reads every report and corrections ship in a later engine. Writes a report; it changes no result and counts no check.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Why, in a sentence: what the text means where it was written. | |
| text | No | The text itself, only if its writer's permission allows: it is kept with the account so a person can read it, and deleted with the account. Omit it and the report carries the id alone. | |
| verdict | Yes | false_positive: blocked or held something fine. false_negative: allowed something it should not have. correct: right, worth saying for a close call. | |
| check_id | Yes | The "id" of the result being reported (chk_...). | |
| expected_action | No | The action the check should have taken, when you know it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| received | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the write leaves results untouched and counts no check, a human reviews every report, and fixes only land in a later engine (implying no immediate effect). This complements readOnlyHint=false/destructiveHint=false with the actual side-effect scope and review latency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and its arguments, followed by the behavioral payoff. No filler or repetition; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple feedback-write tool with an output schema, full schema coverage and annotations that establish the write profile, the description supplies the missing pieces (no effect on results, human review, delayed fix). Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents check_id, verdict, expected_action, note and text including retention/permission caveats. The description only restates the same fields ('the result's id, the verdict and ... the action it should have taken'), adding no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: report that a check got it wrong (or right), with the id, verdict and suggested action. It is clearly distinguished from the sibling check_* tools, which produce results, while this one reports feedback on them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use: every report is read by a person and corrections ship in a later engine, and the verdict guidance covers the close-call 'correct' case. It never names an alternative tool or an explicit trigger such as 'call this after check_text returns a disputed result', so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
check_batch1 field changed- changed
Output schema / properties / results / items / anyOfPrevious value: -[ - { - "properties": { - "id": { - "type": "string" - }, - "result": { - "properties": { - "action": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "allowed": { - "type": "boolean" - }, - "categories": { - "properties": { - "insult": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "mild_profanity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "profanity": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "reserved": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "rude": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "self_harm": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "sexual": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "sexual_minors": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "slur": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "threat": { - "maximum": 1, - "minimum": 0, - "type": "number" - } - }, - "required": [ - "mild_profanity", - "profanity", - "sexual", - "insult", - "slur", - "threat", - "rude", - "sexual_minors", - "self_harm", - "reserved" - ], - "type": "object" - }, - "censored": { - "type": "string" - }, - "engine": { - "properties": { - "degraded": { - "type": "boolean" - }, - "route": { - "enum": [ - "rules", - "model", - "cache" - ], - "type": "string" - }, - "version": { - "pattern": "^\\d{4}-\\d{2}-\\d{2}$", - "type": "string" - } - }, - "required": [ - "version", - "route", - "degraded" - ], - "type": "object" - }, - "evasion": { - "items": { - "enum": [ - "homoglyph", - "zero_width", - "separator", - "leetspeak", - "repeated_chars", - "diacritics", - "mixed_script", - "fullwidth", - "combining_marks", - "phonetic", - "reversed", - "concatenation", - "case_mixing", - "self_censored", - "misspelled", - "spoonerism", - "pun" - ], - "type": "string" - }, - "type": "array" - }, - "id": { - "pattern": "^chk_[A-Za-z0-9]{16,32}$", - "type": "string" - }, - "language": { - "properties": { - "confidence": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "detected": { - "type": "string" - } - }, - "required": [ - "detected", - "confidence" - ], - "type": "object" - }, - "matches": { - "items": { - "properties": { - "category": { - "enum": [ - "profanity", - "sexual", - "insult", - "slur", - "threat", - "reserved" - ], - "type": "string" - }, - "end": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "evasion": { - "items": { - "enum": [ - "homoglyph", - "zero_width", - "separator", - "leetspeak", - "repeated_chars", - "diacritics", - "mixed_script", - "fullwidth", - "combining_marks", - "phonetic", - "reversed", - "concatenation", - "case_mixing", - "self_censored", - "misspelled", - "spoonerism", - "pun" - ], - "type": "string" - }, - "type": "array" - }, - "normalized": { - "type": "string" - }, - "severity": { - "enum": [ - "none", - "mild", - "moderate", - "strong", - "extreme" - ], - "type": "string" - }, - "start": { - "maximum": 9007199254740991, - "minimum": 0, - "type": "integer" - }, - "term_id": { - "type": "string" - }, - "text": { - "type": "string" - } - }, - "required": [ - "start", - "end", - "text", - "normalized", - "term_id", - "category", - "severity", - "evasion" - ], - "type": "object" - }, - "type": "array" - }, - "obfuscated": { - "type": "boolean" - }, - "reason": { - "type": "string" - }, - "score": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "severity": { - "enum": [ - "none", - "mild", - "moderate", - "strong", - "extreme" - ], - "type": "string" - }, - "timing_ms": { - "minimum": 0, - "type": "number" - } - }, - "required": [ - "id", - "allowed", - "action", - "score", - "severity", - "categories", - "obfuscated", - "evasion", - "matches", - "censored", - "reason", - "language", - "engine", - "timing_ms" - ], - "type": "object" - } - }, - "required": [ - "id", - "result" - ], - "type": "object" - }, - { - "properties": { - "error": { - "type": "string" - }, - "id": { - "type": "string" - } - }, - "required": [ - "id", - "error" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "id": { + "type": "string" + }, + "result": { + "properties": { + "action": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "allowed": { + "type": "boolean" + }, + "categories": { + "properties": { + "insult": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "mild_profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reserved": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "rude": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "self_harm": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual_minors": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "slur": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "threat": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mild_profanity", + "profanity", + "sexual", + "insult", + "slur", + "threat", + "rude", + "sexual_minors", + "self_harm", + "reserved" + ], + "type": "object" + }, + "censored": { + "type": "string" + }, + "decided_by": { + "items": { + "properties": { + "action": { + "enum": [ + "review", + "block" + ], + "type": "string" + }, + "category": { + "enum": [ + "mild_profanity", + "profanity", + "sexual", + "insult", + "slur", + "threat", + "rude", + "sexual_minors", + "self_harm", + "reserved" + ], + "type": "string" + }, + "from": { + "enum": [ + "words", + "context" + ], + "type": "string" + } + }, + "required": [ + "category", + "action", + "from" + ], + "type": "object" + }, + "type": "array" + }, + "engine": { + "properties": { + "degraded": { + "type": "boolean" + }, + "route": { + "enum": [ + "rules", + "model", + "cache" + ], + "type": "string" + }, + "version": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "version", + "route", + "degraded" + ], + "type": "object" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "id": { + "pattern": "^chk_[A-Za-z0-9]{16,32}$", + "type": "string" + }, + "language": { + "properties": { + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "detected": { + "type": "string" + } + }, + "required": [ + "detected", + "confidence" + ], + "type": "object" + }, + "matches": { + "items": { + "properties": { + "category": { + "enum": [ + "profanity", + "sexual", + "insult", + "slur", + "threat", + "reserved" + ], + "type": "string" + }, + "end": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "normalized": { + "type": "string" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "start": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "term_id": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "start", + "end", + "text", + "normalized", + "term_id", + "category", + "severity", + "evasion" + ], + "type": "object" + }, + "type": "array" + }, + "obfuscated": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "score": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "timing_ms": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "allowed", + "action", + "score", + "severity", + "categories", + "obfuscated", + "evasion", + "matches", + "censored", + "reason", + "decided_by", + "language", + "engine", + "timing_ms" + ], + "type": "object" + } + }, + "required": [ + "id", + "result" + ], + "type": "object" + }, + { + "properties": { + "error": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "error" + ], + "type": "object" + } +]
- Changed
check_text2 fields changed- added
Output schema / properties / decided_byAdded value: +{ + "items": { + "properties": { + "action": { + "enum": [ + "review", + "block" + ], + "type": "string" + }, + "category": { + "enum": [ + "mild_profanity", + "profanity", + "sexual", + "insult", + "slur", + "threat", + "rude", + "sexual_minors", + "self_harm", + "reserved" + ], + "type": "string" + }, + "from": { + "enum": [ + "words", + "context" + ], + "type": "string" + } + }, + "required": [ + "category", + "action", + "from" + ], + "type": "object" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "id", - "allowed", - "action", - "score", - "severity", - "categories", - "obfuscated", - "evasion", - "matches", - "censored", - "reason", - "language", - "engine", - "timing_ms" -]New value: +[ + "id", + "allowed", + "action", + "score", + "severity", + "categories", + "obfuscated", + "evasion", + "matches", + "censored", + "reason", + "decided_by", + "language", + "engine", + "timing_ms" +]
2 tool updates
- Changed
check_batch1 field changed- changed
Input schema / properties / mode / descriptionPrevious value: -"How much to ask the model: fast never asks the model; balanced, the default, asks it about every text the rules do not block outright; thorough asks it about every text. Omit for the project's default."New value: +"How much to ask the model: fast never asks the model; balanced, the default, asks it about every text but a word or two the rules block outright; thorough asks it about every text. Omit for the project's default."
- Changed
check_text1 field changed- changed
Input schema / properties / mode / descriptionPrevious value: -"How much to ask the model: fast never asks the model; balanced, the default, asks it about every text the rules do not block outright; thorough asks it about every text. Omit for the project's default."New value: +"How much to ask the model: fast never asks the model; balanced, the default, asks it about every text but a word or two the rules block outright; thorough asks it about every text. Omit for the project's default."
2 tool updates
- Changed
check_batch3 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "Where the readers are, as a two-letter country code (MX, ES, BR): a word rude in some countries and innocent in others is read as theirs reads it. Omit to count a word rude anywhere.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" +} - changed
Input schema / properties / policy / anyOfPrevious value: -[ - { - "enum": [ - "kids", - "teen", - "standard", - "strict" - ], - "type": "string" - }, - { - "pattern": "^pol_[A-Za-z0-9]{8,32}$", - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "insult": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "mild_profanity": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "profanity": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "reserved": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "rude": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "self_harm": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "sexual": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "sexual_minors": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "slur": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "threat": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "enum": [ + "kids", + "teen", + "standard", + "strict", + "casual" + ], + "type": "string" + }, + { + "pattern": "^pol_[A-Za-z0-9]{8,32}$", + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "insult": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "mild_profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "reserved": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "rude": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "self_harm": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual_minors": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "slur": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "threat": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + } + }, + "type": "object" + } +] - changed
Input schema / properties / policy / descriptionPrevious value: -"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default."New value: +"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces), casual (swearing welcome, swearing at someone still blocked). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default."
- Changed
check_text3 fields changed- added
Input schema / properties / countryAdded value: +{ + "description": "Where the readers are, as a two-letter country code (MX, ES, BR): a word rude in some countries and innocent in others is read as theirs reads it. Omit to count a word rude anywhere.", + "pattern": "^[A-Za-z]{2}$", + "type": "string" +} - changed
Input schema / properties / policy / anyOfPrevious value: -[ - { - "enum": [ - "kids", - "teen", - "standard", - "strict" - ], - "type": "string" - }, - { - "pattern": "^pol_[A-Za-z0-9]{8,32}$", - "type": "string" - }, - { - "additionalProperties": false, - "properties": { - "insult": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "mild_profanity": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "profanity": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "reserved": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "rude": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "self_harm": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "sexual": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "sexual_minors": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "slur": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - }, - "threat": { - "enum": [ - "allow", - "review", - "block" - ], - "type": "string" - } - }, - "type": "object" - } -]New value: +[ + { + "enum": [ + "kids", + "teen", + "standard", + "strict", + "casual" + ], + "type": "string" + }, + { + "pattern": "^pol_[A-Za-z0-9]{8,32}$", + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "insult": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "mild_profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "reserved": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "rude": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "self_harm": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual_minors": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "slur": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "threat": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + } + }, + "type": "object" + } +] - changed
Input schema / properties / policy / descriptionPrevious value: -"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default."New value: +"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces), casual (swearing welcome, swearing at someone still blocked). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default."
2 tool updates
- Added
get_usage - Added
report_result
3 tool updates
- Changed
check_batch19 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / context / descriptionAdded value: +"Where the text is shown, which changes how it is read: username (a public handle; reserved names match), display_name (a name beside content), comment, chat, gaming (taunts about play are not abuse), review, educational (quoted words are discussed, not used), creative (dialogue in fiction), custom_text (engraving or printing), general (anything else). Omit for the project's default, general unless the project set one." - added
Input schema / properties / context / enumAdded value: +[ + "general", + "username", + "display_name", + "comment", + "chat", + "gaming", + "educational", + "creative", + "review", + "custom_text" +] - added
Input schema / properties / items / descriptionAdded value: +"The texts to check, each with an id of yours to match its result." - added
Input schema / properties / items / items / additionalPropertiesAdded value: +false - added
Input schema / properties / items / items / properties / id / descriptionAdded value: +"Your id for this text, returned with its result." - added
Input schema / properties / items / items / properties / id / maxLengthAdded value: +64 - added
Input schema / properties / items / items / properties / id / minLengthAdded value: +1 - added
Input schema / properties / items / items / properties / text / descriptionAdded value: +"The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name." - added
Input schema / properties / items / items / properties / text / maxLengthAdded value: +10000 - added
Input schema / properties / items / items / properties / text / minLengthAdded value: +1 - added
Input schema / properties / items / minItemsAdded value: +1 - added
Input schema / properties / language / descriptionAdded value: +"The language the text is in, when you know it: a short text that shows no other language is read in it. Defaults to auto." - added
Input schema / properties / maskAdded value: +{ + "description": "How \"censored\" hides a matched word: asterisk (****), first_letter (f***), grawlix (#$@!) or remove. Omit for the project's default, asterisk unless the project set one.", + "enum": [ + "asterisk", + "first_letter", + "grawlix", + "remove" + ], + "type": "string" +} - added
Input schema / properties / modeAdded value: +{ + "description": "How much to ask the model: fast never asks the model; balanced, the default, asks it about every text the rules do not block outright; thorough asks it about every text. Omit for the project's default.", + "enum": [ + "fast", + "balanced", + "thorough" + ], + "type": "string" +} - added
Input schema / properties / policy / anyOfAdded value: +[ + { + "enum": [ + "kids", + "teen", + "standard", + "strict" + ], + "type": "string" + }, + { + "pattern": "^pol_[A-Za-z0-9]{8,32}$", + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "insult": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "mild_profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "reserved": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "rude": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "self_harm": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual_minors": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "slur": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "threat": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / policy / descriptionAdded value: +"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default." - removed
Input schema / properties / policy / typeRemoved value: -"string" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "results": { + "items": { + "anyOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "result": { + "properties": { + "action": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "allowed": { + "type": "boolean" + }, + "categories": { + "properties": { + "insult": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "mild_profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reserved": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "rude": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "self_harm": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual_minors": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "slur": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "threat": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mild_profanity", + "profanity", + "sexual", + "insult", + "slur", + "threat", + "rude", + "sexual_minors", + "self_harm", + "reserved" + ], + "type": "object" + }, + "censored": { + "type": "string" + }, + "engine": { + "properties": { + "degraded": { + "type": "boolean" + }, + "route": { + "enum": [ + "rules", + "model", + "cache" + ], + "type": "string" + }, + "version": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "version", + "route", + "degraded" + ], + "type": "object" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "id": { + "pattern": "^chk_[A-Za-z0-9]{16,32}$", + "type": "string" + }, + "language": { + "properties": { + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "detected": { + "type": "string" + } + }, + "required": [ + "detected", + "confidence" + ], + "type": "object" + }, + "matches": { + "items": { + "properties": { + "category": { + "enum": [ + "profanity", + "sexual", + "insult", + "slur", + "threat", + "reserved" + ], + "type": "string" + }, + "end": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "normalized": { + "type": "string" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "start": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "term_id": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "start", + "end", + "text", + "normalized", + "term_id", + "category", + "severity", + "evasion" + ], + "type": "object" + }, + "type": "array" + }, + "obfuscated": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "score": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "timing_ms": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "allowed", + "action", + "score", + "severity", + "categories", + "obfuscated", + "evasion", + "matches", + "censored", + "reason", + "language", + "engine", + "timing_ms" + ], + "type": "object" + } + }, + "required": [ + "id", + "result" + ], + "type": "object" + }, + { + "properties": { + "error": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "error" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "results" + ], + "type": "object" +}
- Changed
check_text11 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / context / descriptionAdded value: +"Where the text is shown, which changes how it is read: username (a public handle; reserved names match), display_name (a name beside content), comment, chat, gaming (taunts about play are not abuse), review, educational (quoted words are discussed, not used), creative (dialogue in fiction), custom_text (engraving or printing), general (anything else). Omit for the project's default, general unless the project set one." - added
Input schema / properties / mask / descriptionAdded value: +"How \"censored\" hides a matched word: asterisk (****), first_letter (f***), grawlix (#$@!) or remove. Omit for the project's default, asterisk unless the project set one." - added
Input schema / properties / mode / descriptionAdded value: +"How much to ask the model: fast never asks the model; balanced, the default, asks it about every text the rules do not block outright; thorough asks it about every text. Omit for the project's default." - added
Input schema / properties / policy / anyOfAdded value: +[ + { + "enum": [ + "kids", + "teen", + "standard", + "strict" + ], + "type": "string" + }, + { + "pattern": "^pol_[A-Za-z0-9]{8,32}$", + "type": "string" + }, + { + "additionalProperties": false, + "properties": { + "insult": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "mild_profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "profanity": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "reserved": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "rude": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "self_harm": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "sexual_minors": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "slur": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "threat": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + } + }, + "type": "object" + } +] - added
Input schema / properties / policy / descriptionAdded value: +"How strict to be. A preset: kids (under 13, blocks everything), teen, standard (adults; the default), strict (brand-safe surfaces). Or a saved policy id (pol_...), or an object giving an action per category. Omit for the project's default." - removed
Input schema / properties / policy / enumRemoved value: -[ - "kids", - "teen", - "standard", - "strict" -] - removed
Input schema / properties / policy / typeRemoved value: -"string" - added
Input schema / properties / text / descriptionAdded value: +"The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name." - added
Input schema / properties / text / minLengthAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "properties": { + "action": { + "enum": [ + "allow", + "review", + "block" + ], + "type": "string" + }, + "allowed": { + "type": "boolean" + }, + "categories": { + "properties": { + "insult": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "mild_profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "profanity": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "reserved": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "rude": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "self_harm": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "sexual_minors": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "slur": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "threat": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "mild_profanity", + "profanity", + "sexual", + "insult", + "slur", + "threat", + "rude", + "sexual_minors", + "self_harm", + "reserved" + ], + "type": "object" + }, + "censored": { + "type": "string" + }, + "engine": { + "properties": { + "degraded": { + "type": "boolean" + }, + "route": { + "enum": [ + "rules", + "model", + "cache" + ], + "type": "string" + }, + "version": { + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } + }, + "required": [ + "version", + "route", + "degraded" + ], + "type": "object" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "id": { + "pattern": "^chk_[A-Za-z0-9]{16,32}$", + "type": "string" + }, + "language": { + "properties": { + "confidence": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "detected": { + "type": "string" + } + }, + "required": [ + "detected", + "confidence" + ], + "type": "object" + }, + "matches": { + "items": { + "properties": { + "category": { + "enum": [ + "profanity", + "sexual", + "insult", + "slur", + "threat", + "reserved" + ], + "type": "string" + }, + "end": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "evasion": { + "items": { + "enum": [ + "homoglyph", + "zero_width", + "separator", + "leetspeak", + "repeated_chars", + "diacritics", + "mixed_script", + "fullwidth", + "combining_marks", + "phonetic", + "reversed", + "concatenation", + "case_mixing", + "self_censored", + "misspelled", + "spoonerism", + "pun" + ], + "type": "string" + }, + "type": "array" + }, + "normalized": { + "type": "string" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "start": { + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" + }, + "term_id": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "start", + "end", + "text", + "normalized", + "term_id", + "category", + "severity", + "evasion" + ], + "type": "object" + }, + "type": "array" + }, + "obfuscated": { + "type": "boolean" + }, + "reason": { + "type": "string" + }, + "score": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "severity": { + "enum": [ + "none", + "mild", + "moderate", + "strong", + "extreme" + ], + "type": "string" + }, + "timing_ms": { + "minimum": 0, + "type": "number" + } + }, + "required": [ + "id", + "allowed", + "action", + "score", + "severity", + "categories", + "obfuscated", + "evasion", + "matches", + "censored", + "reason", + "language", + "engine", + "timing_ms" + ], + "type": "object" +}
- Changed
get_integration_snippet3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / language / descriptionAdded value: +"The programming language of the recipe." - added
Input schema / properties / platform / descriptionAdded value: +"Where the check runs: the auth or backend platform the app uses, a game engine, or http for any server."
2 tool updates
- Changed
check_batch1 field changed- added
Input schema / properties / languageAdded value: +{ + "enum": [ + "auto", + "en", + "es", + "pt", + "fr", + "de", + "it", + "nl", + "pl", + "tr", + "ru", + "ar", + "he", + "hi", + "id", + "ja", + "zh", + "ko" + ], + "type": "string" +}
- Changed
check_text1 field changed- added
Input schema / properties / languageAdded value: +{ + "description": "The language the text is in, when you know it: a short text that shows no other language is read in it. Defaults to auto.", + "enum": [ + "auto", + "en", + "es", + "pt", + "fr", + "de", + "it", + "nl", + "pl", + "tr", + "ru", + "ar", + "he", + "hi", + "id", + "ja", + "zh", + "ko" + ], + "type": "string" +}
3 tool updates
- First observed
check_batch - First observed
check_text - First observed
get_integration_snippet
Related MCP Connectors
Toxicity scores (0-1) for text before an agent posts it. Perspective API compatible. No LLM.
Toxicity, sentiment, NER, PII detection, and language identification tools
Sentiment, toxicity, entity extraction, PII, translation, summary, QA, fraud scoring, safety audit.
Sentiment, language detection, readability, keywords, summaries and profanity filtering
Related MCP Servers
- AlicenseBqualityBmaintenanceContent moderation and profanity detection MCP server with 19 tools, 24 language support, leetspeak/Unicode obfuscation detection, context-aware analysis, batch processing, and user tracking for AI-powered content safety.244 npm65MIT
- AlicenseAqualityBmaintenanceProvides a single-purpose content-moderation gate that evaluates text and returns structured verdicts (spam/toxic probabilities, severity, confidence) with suggested actions (allow/review/block) for automated decision-making.11MIT
- AlicenseAqualityAmaintenanceStdio MCP server (Python, standard library only, server.py in this repo) with one tool, analyze_toxicity: scores English text for toxicity, insults, profanity, threats and identity attacks (0 to 1). Perspective API compatible. No LLM.41MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to detect and censor English profanity, including obfuscated spellings, through a single MCP tool. It uses a word list rather than AI.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.