
Should I allow this text? Profanity and toxicity checks that are hard to fool, with the evidence.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer up_live_… (an Unprofane API key from https://unprofane.com/app/keys/)
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
The texts to check, each with an id of yours to match its result.
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.
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.
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.
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.
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.
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.
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.
| Argument | Type | Description |
|---|---|---|
| mask | string | 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 | string | 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. |
| items* | array | The texts to check, each with an id of yours to match its result. |
| policy | any | 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 | string | 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 | string | 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 | string | 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. |
{
"type": "object",
"required": [
"items"
],
"properties": {
"mask": {
"enum": [
"asterisk",
"first_letter",
"grawlix",
"remove"
],
"type": "string",
"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."
},
"mode": {
"enum": [
"fast",
"balanced",
"thorough"
],
"type": "string",
"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."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"text"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Your id for this text, returned with its result."
},
"text": {
"type": "string",
"maxLength": 10000,
"minLength": 1,
"description": "The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name."
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "The texts to check, each with an id of yours to match its result."
},
"policy": {
"anyOf": [
{
"enum": [
"kids",
"teen",
"standard",
"strict",
"casual"
],
"type": "string"
},
{
"type": "string",
"pattern": "^pol_[A-Za-z0-9]{8,32}$"
},
{
"type": "object",
"properties": {
"rude": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"slur": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"insult": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"sexual": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"threat": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"reserved": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"profanity": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"self_harm": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"sexual_minors": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"mild_profanity": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
}
},
"additionalProperties": false
}
],
"description": "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": {
"enum": [
"general",
"username",
"display_name",
"comment",
"chat",
"gaming",
"educational",
"creative",
"review",
"custom_text"
],
"type": "string",
"description": "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": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"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."
},
"language": {
"enum": [
"auto",
"en",
"es",
"pt",
"fr",
"de",
"it",
"nl",
"pl",
"tr",
"ru",
"ar",
"he",
"hi",
"id",
"ja",
"zh",
"ko"
],
"type": "string",
"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."
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| mask | string | 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 | string | 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. |
| text* | string | The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name. |
| policy | any | 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 | string | 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. |
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.
| Argument | Type | Description |
|---|---|---|
| language* | string | The programming language of the recipe. |
| platform* | string | Where the check runs: the auth or backend platform the app uses, a game engine, or http for any server. |
{
"type": "object",
"required": [
"platform",
"language"
],
"properties": {
"language": {
"enum": [
"curl",
"javascript",
"typescript",
"python",
"csharp",
"gdscript",
"go",
"php",
"ruby"
],
"type": "string",
"description": "The programming language of the recipe."
},
"platform": {
"enum": [
"http",
"supabase",
"clerk",
"firebase",
"auth0",
"better-auth",
"unity",
"godot"
],
"type": "string",
"description": "Where the check runs: the auth or backend platform the app uses, a game engine, or http for any server."
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| note | string | Why, in a sentence: what the text means where it was written. |
| text | string | 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* | string | 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* | string | The "id" of the result being reported (chk_...). |
| expected_action | string | The action the check should have taken, when you know it. |
{
"type": "object",
"required": [
"check_id",
"verdict"
],
"properties": {
"note": {
"type": "string",
"maxLength": 500,
"description": "Why, in a sentence: what the text means where it was written."
},
"text": {
"type": "string",
"maxLength": 10000,
"description": "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": {
"enum": [
"false_positive",
"false_negative",
"correct"
],
"type": "string",
"description": "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": {
"type": "string",
"pattern": "^chk_[A-Za-z0-9]{16,32}$",
"description": "The \"id\" of the result being reported (chk_...)."
},
"expected_action": {
"enum": [
"allow",
"review",
"block"
],
"type": "string",
"description": "The action the check should have taken, when you know it."
}
},
"additionalProperties": false
}| country | string | 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 | string | 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. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"mask": {
"enum": [
"asterisk",
"first_letter",
"grawlix",
"remove"
],
"type": "string",
"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."
},
"mode": {
"enum": [
"fast",
"balanced",
"thorough"
],
"type": "string",
"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."
},
"text": {
"type": "string",
"maxLength": 10000,
"minLength": 1,
"description": "The text to check, exactly as the person typed it: up to 10,000 characters, 64 for a username or display name."
},
"policy": {
"anyOf": [
{
"enum": [
"kids",
"teen",
"standard",
"strict",
"casual"
],
"type": "string"
},
{
"type": "string",
"pattern": "^pol_[A-Za-z0-9]{8,32}$"
},
{
"type": "object",
"properties": {
"rude": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"slur": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"insult": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"sexual": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"threat": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"reserved": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"profanity": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"self_harm": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"sexual_minors": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
},
"mild_profanity": {
"enum": [
"allow",
"review",
"block"
],
"type": "string"
}
},
"additionalProperties": false
}
],
"description": "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": {
"enum": [
"general",
"username",
"display_name",
"comment",
"chat",
"gaming",
"educational",
"creative",
"review",
"custom_text"
],
"type": "string",
"description": "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": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"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."
},
"language": {
"enum": [
"auto",
"en",
"es",
"pt",
"fr",
"de",
"it",
"nl",
"pl",
"tr",
"ru",
"ar",
"he",
"hi",
"id",
"ja",
"zh",
"ko"
],
"type": "string",
"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."
}
},
"additionalProperties": false
}