Skip to main content
Glama

Check text for AI-writing tells

check_ai_writing
Read-onlyIdempotent

Flags writing habits. It cannot say who wrote the text. Best for: "which parts of this email sound like AI?", "find the filler in my draft" or "does this cover letter lean on stock phrases?". Returns: up to 60 findings in text order, each with rule, severity (high, medium or low), start and end offsets, the matched words, the problem and a fix; a 0 to 100 score with its basis; the rule source and date. Under 40 words the answer is still a normal result: score null, level too_short, findings listed. Input tips: send text exactly as written, at most 12,000 characters. Never paraphrase it: the offsets point into it. A longer text is refused with text_too_long; split it at paragraph breaks and check each part. Not for: deciding whether an AI wrote the text, rewriting it, or checking facts, grammar or plagiarism. The rules are fixed patterns, not an AI model, and the text is not stored.

Input Schema

NameRequiredDescriptionDefault
textYesThe text to check, copied exactly as the user wrote it, such as "Great question! I hope this helps." At most 12,000 characters (about 2,000 words); a score needs at least 40 words. Plain text or Markdown. Code blocks, inline code and web links are not checked, but they still count in the offsets, which always point into the text as sent.

Output Schema

NameRequiredDescriptionDefault
textYesSize of the text that was checked.
as_ofYesDate the rule set was last reviewed (YYYY-MM-DD).
caveatYesFixed reminder to pass on: a finding is a place to look at, not proof of who wrote the text.
sourceYesWhere the rules come from: fixed patterns written for this service, with no AI model.
summaryYes
findingsYesAt most 60, in text order. When more exist, the most severe are kept.
truncatedYesTrue when there were more than 60 findings; summary still counts all of them.
rules_versionYesVersion of the rule set, such as 1. The same text and version always give the same answer.
not_authorshipYesFixed. A low score is not an authorship verdict.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "text": "It is important to note that we delve into a rich tapestry of ideas."
      +  }
      +]
  2. Changed41 schema fields changed
    • changedInput schema / properties / text / description
      Previous value: -"The text to check, exactly as written (at most 12,000 characters, about 2,000 words). Plain text or Markdown; code blocks and links are skipped."New value: +"The text to check, copied exactly as the user wrote it, such as \"Great question! I hope this helps.\" At most 12,000 characters (about 2,000 words); a score needs at least 40 words. Plain text or Markdown. Code blocks, inline code and web links are not checked, but they still count in the offsets, which always point into the text as sent."
    • addedOutput schema / properties / caveat / description
      Added value: +"Fixed reminder to pass on: a finding is a place to look at, not proof of who wrote the text."
    • changedOutput schema / properties / findings / description
      Previous value: -"At most 60, in text order."New value: +"At most 60, in text order. When more exist, the most severe are kept."
    • changedOutput schema / properties / findings / items / properties / end / description
      Previous value: -"Offset just after the last character."New value: +"Offset just after the last matched character; text.slice(start, end) gives the matched words."
    • addedOutput schema / properties / findings / items / properties / end / minimum
      Added value: +0
    • addedOutput schema / properties / findings / items / properties / excerpt / description
      Added value: +"The matched words, the text from start to end, cut to 120 characters with … when longer."
    • addedOutput schema / properties / findings / items / properties / fix / description
      Added value: +"A concrete change the writer can make."
    • addedOutput schema / properties / findings / items / properties / problem / description
      Added value: +"Why this habit reads like AI writing, in plain words."
    • changedOutput schema / properties / findings / items / properties / rule / description
      Previous value: -"Rule id, such as hedging-opener."New value: +"Rule id, such as hedging-opener or dash-density."
    • addedOutput schema / properties / findings / items / properties / rule / enum
      Added value: +[
      +  "chatbot-wrapper",
      +  "sycophantic-praise",
      +  "knowledge-limit",
      +  "stock-opener",
      +  "hedging-opener",
      +  "stacked-hedges",
      +  "deep-sounding-saying",
      +  "dramatic-closer",
      +  "generic-closer",
      +  "connector-opener",
      +  "overused-word",
      +  "inflated-significance",
      +  "participle-rider",
      +  "sales-language",
      +  "plain-verb-avoidance",
      +  "unnamed-authority",
      +  "contrast-formula",
      +  "argues-with-no-one",
      +  "rule-of-three",
      +  "dash-density",
      +  "uniform-sentence-length",
      +  "repeated-sentence-opening",
      +  "decorative-formatting"
      +]
    • addedOutput schema / properties / findings / items / properties / severity / description
      Added value: +"How strongly the habit reads as AI writing: high 3 points, medium 2, low 1."
    • changedOutput schema / properties / findings / items / properties / start / description
      Previous value: -"Offset of the first character in the text as sent (UTF-16 code units)."New value: +"Offset of the first matched character in the text as sent (UTF-16 code units)."
    • addedOutput schema / properties / findings / items / properties / start / minimum
      Added value: +0
    • addedOutput schema / properties / findings / items / required
      Added value: +[
      +  "rule",
      +  "severity",
      +  "start",
      +  "end",
      +  "excerpt",
      +  "problem",
      +  "fix"
      +]
    • addedOutput schema / properties / findings / maxItems
      Added value: +60
    • addedOutput schema / properties / rules_version / description
      Added value: +"Version of the rule set, such as 1. The same text and version always give the same answer."
    • addedOutput schema / properties / source / description
      Added value: +"Where the rules come from: fixed patterns written for this service, with no AI model."
    • changedOutput schema / properties / summary / properties / basis / description
      Previous value: -"How the score is worked out."New value: +"How the score is worked out. For a too_short text it also says how many words to send for a score."
    • addedOutput schema / properties / summary / properties / by_rule / additionalProperties
      Added value: +{
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / summary / properties / by_rule / description
      Added value: +"Findings per rule id, most frequent first. Only rules with a finding appear."
    • addedOutput schema / properties / summary / properties / by_severity / description
      Added value: +"Findings per severity."
    • addedOutput schema / properties / summary / properties / by_severity / properties
      Added value: +{
      +  "high": {
      +    "description": "High-severity findings.",
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "low": {
      +    "description": "Low-severity findings.",
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "medium": {
      +    "description": "Medium-severity findings.",
      +    "minimum": 0,
      +    "type": "integer"
      +  }
      +}
    • addedOutput schema / properties / summary / properties / by_severity / required
      Added value: +[
      +  "high",
      +  "medium",
      +  "low"
      +]
    • addedOutput schema / properties / summary / properties / findings / description
      Added value: +"All findings, including any left out of the findings list."
    • addedOutput schema / properties / summary / properties / findings / minimum
      Added value: +0
    • addedOutput schema / properties / summary / properties / level / description
      Added value: +"low under 15, moderate 15 to 39, high 40 or more; too_short under 40 words, with findings still listed."
    • changedOutput schema / properties / summary / properties / score / description
      Previous value: -"0 to 100, or null when the text is too short to score."New value: +"0 to 100, or null when the text has fewer than 40 words."
    • addedOutput schema / properties / summary / properties / score / maximum
      Added value: +100
    • addedOutput schema / properties / summary / properties / score / minimum
      Added value: +0
    • addedOutput schema / properties / summary / properties / sentence_length / description
      Added value: +"Sentence lengths in words, the basis of the rhythm rules."
    • addedOutput schema / properties / summary / properties / sentence_length / properties
      Added value: +{
      +  "mean_words": {
      +    "description": "Mean words per sentence, to one decimal.",
      +    "type": "number"
      +  },
      +  "sentences": {
      +    "description": "Sentences and list lines counted.",
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "stdev_words": {
      +    "description": "Standard deviation of words per sentence, to one decimal.",
      +    "type": "number"
      +  }
      +}
    • addedOutput schema / properties / summary / properties / sentence_length / required
      Added value: +[
      +  "sentences",
      +  "mean_words",
      +  "stdev_words"
      +]
    • addedOutput schema / properties / summary / required
      Added value: +[
      +  "score",
      +  "level",
      +  "findings",
      +  "by_severity",
      +  "by_rule",
      +  "sentence_length",
      +  "basis"
      +]
    • addedOutput schema / properties / text / description
      Added value: +"Size of the text that was checked."
    • addedOutput schema / properties / text / properties / characters / description
      Added value: +"Characters in the text as sent, code included."
    • addedOutput schema / properties / text / properties / characters / minimum
      Added value: +0
    • addedOutput schema / properties / text / properties / words / description
      Added value: +"Words in the prose, after code blocks and links are left out."
    • addedOutput schema / properties / text / properties / words / minimum
      Added value: +0
    • addedOutput schema / properties / text / required
      Added value: +[
      +  "characters",
      +  "words"
      +]
    • addedOutput schema / properties / truncated / description
      Added value: +"True when there were more than 60 findings; summary still counts all of them."
    • addedOutput schema / required
      Added value: +[
      +  "not_authorship",
      +  "source",
      +  "as_of",
      +  "rules_version",
      +  "text",
      +  "summary",
      +  "findings",
      +  "truncated",
      +  "caveat"
      +]
  3. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  4. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  5. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, closed-world, but the description adds genuinely non-derivable traits: text is not stored, the rules are fixed patterns rather than an AI model, long input is refused with text_too_long, and sub-40-word input still returns a normal result with score null and level too_short. These are exactly the edge behaviors an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the key limitation, then organized into Returns/Input tips/Not for blocks. Dense but nearly every clause carries information; the return-value sentence is the only part that partially duplicates the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter analysis tool with an output schema, the definition covers scope, edge cases, limits, failure modes, and non-goals. An agent has everything needed to call it correctly and interpret a too_short or text_too_long result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema property already documents the 12,000-character cap and exact-copy requirement, so the description is partly redundant. It still adds value by explaining why exactness matters (the returned offsets point into the text as sent) and by giving a recovery strategy (split at paragraph breaks) that the schema does not mention.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Flags writing habits', 'find the filler', 'AI-writing tells' per title) and immediately bounds it with 'It cannot say who wrote the text'. That negative clause distinguishes it from any authorship-detection tool an agent might otherwise conflate it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete 'Best for' phrasings, an explicit 'Not for' list (authorship decisions, rewriting, facts, grammar, plagiarism), and operational guidance for the long-text case (split at paragraph breaks after text_too_long). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.