signs-of-ai
A privacy-first writing integrity toolkit with offline-first tools for detecting AI writing, checking originality, and verifying document authenticity. Two optional features require sending text to the server.
Analyze AI Writing: Score text 0–100 for AI-writing tells (lexical, rhetorical, syntactic, burstiness) with per-finding explanations and actionable fixes. Offline.
Check Originality: Compare multiple documents for verbatim copied passages (accent/case-insensitive), returning overlap percentages and shared evidence. Not an internet-wide check. Offline.
Check Paraphrase: Detect reworded copies (even cross-language) between two texts using sentence embeddings. Sends text to server (opt-in).
Measure Predictability: Compute perplexity as a signal of generic phrasing (not proof). Sends text to server (opt-in).
Inspect Characters: Identify invisible/zero-width characters, homoglyph substitutions, and text direction controls, distinguishing clustered vs. spread artifacts. Offline.
Check Citations: Validate in-text citations against the bibliography for missing references, impossible years, malformed DOIs, and style issues (APA/MLA/IEEE). Offline.
Search Catalog: Search the library of AI-writing signs (lexical, rhetorical, syntactic, statistical) in English and Spanish, with explanations and fixes. Offline.
Extract Distinctive Phrases: Find unique phrases and generate exact-phrase search links (Google, Bing, DuckDuckGo). Does not search itself. Offline; optional automatic search if server-configured.
Compare to Baseline: Compare text to a writer’s earlier work using Burrows's Delta (function-word frequencies), returning stylistic distance. Returns "Undetermined" if evidence is insufficient. Offline.
✍︎ Signs of AI Writing
Are you a teacher? Start here → — what this does and what it cannot do, in plain language, with the error rate drawn rather than tabulated. No badges, no interval notation, nothing to install. English & Spanish.
Try the live demo → — English & Spanish, runs in your browser. No signup, and the analysis uploads nothing.
Download the Windows app → — the same tool in a window. Nothing to install alongside it: the .NET runtime is bundled.

Real recording of the live demo — the score updates as you type, and every highlight comes with a suggested fix.
Rather watch than read? The two-minute explainer: English · Español
A free, privacy-first toolkit for academic and writing integrity. It does two things:
De-AI-ify linter — flags the tells of AI-generated writing (overused vocabulary, rhetorical crutches, robotic sentence rhythm) and, for every finding, tells you how to fix it.
Originality checker — "did they write it, or copy it?" Compares documents against each other and surfaces the passages they share — verbatim copies, reworded paraphrases (even across languages), and a whole-cohort overview — as evidence a human judges. Not a black-box verdict.
🔒 The analysis runs entirely in your browser, and nothing is uploaded to run it. No account, no telemetry, no server that sees your text.
Four features can send text off the device, and not one of them runs unless you turn it on, each disclosed in the interface at the moment you choose it: the paraphrase check and the perplexity measurement (both call a server you or we host), the live rewrite when you supply your own API key — the key stays on your device, the text goes to the provider you picked — and the optional web spot-check for a distinctive phrase, which exists only if the operator configured a search provider.
Everything else — every rule, the score, the character scan, the citation cross-check, the writer baseline, the report — is computed locally and stays there. In the desktop app, the perplexity measurement is local too.
The Windows app can also check whether a newer version has been published, because it has no auto-update and never will. That is not one of the four: it sends no text, no account and no identifier — one request to GitHub's public release list, the same one a browser would make. It asks before its first check, at most one a day, and it never downloads or runs anything for you.
Built with .NET 10 and Blazor WebAssembly by Pedro Hernández (PeopleWorks), Microsoft MVP for .NET — for the .NET and Microsoft developer community, por y para la comunidad educativa.
Repo: https://github.com/peopleworks/SignsofAI
English and Spanish are supported in two independent ways:
The interface switches EN ⇄ ES instantly from the toolbar — no page reload, remembered per browser, and it follows your browser's language on a first visit. Translations are plain JSON files anyone can contribute: see Translating the interface.
The analysis runs against a per-language rule-pack, auto-detected or selectable. The Spanish rule-pack is an original derivation of AI-writing markers for Spanish.
The two are separate on purpose, so findings stay in the language of the text being analyzed: advice about English prose is given in English even when the interface is in Spanish, because that's the language the advice is about.
How often is it wrong about a human?
Every AI detector gets asked this and almost none of them answer. Docs/CALIBRATION.md
is the answer, measured against 296 texts written before 2022 — open-access
research articles, pre-2022 encyclopedia revisions in both languages, and 206 classroom essays by
adult learners of English, one per student, from a corpus collected between 2006 and 2012.
At a threshold of 30/100 it flags 2 of them: an observed 0.7%, with a 95% interval reaching 2.4%. The recommendation is made from the uncertain end of the interval rather than the flattering one, so it stays cautious while the corpus is small, and it follows the data in whichever direction they move as the corpus grows.
The learners are the group this whole category is accused of harming — studies report that other detectors flag 61% of their essays — and they are the reason the boundary sits at 30 rather than the 25 it sat at before they joined: at 25 the tool flagged 9 of their 206 essays, 4.4%, and none of the 90 published texts. That figure is on the page, by group, rather than averaged away. It is far below the numbers reported for other tools, and it is not zero.
It is deliberately not an accuracy figure. Accuracy needs a collection of machine-written text, which is a sample of whichever models were around that month; a false-positive rate needs only human writing, and it measures the harm this category actually causes — studies report that detectors flag 61% of essays by non-native English speakers, and none of them publish that about themselves.
The report also names which rules misfire, ranked. That list is uncomfortable and it is the most useful thing the exercise produces.
The corpus is a JSON manifest anyone can extend, the tool that builds and measures it is in
tools/SignsOfAI.Calibration, and the whole thing re-runs in one command. See
Docs/Calibration/README.md — Spanish academic writing is the most
wanted contribution.
Related MCP server: BeLikeNative Grammar Server
For teachers: the part that is not software
A detector is not what you need first. Docs/Teaching/ is syllabus
language you can paste, a one-page sheet to hand students before anything goes wrong, and a procedure
for the day a question becomes formal — all bilingual, all free of any licence, attribution or
permission.
None of it requires this tool. It exists because the hard part of AI writing in a classroom was never detection; it is what you do on the morning you suspect something and have nobody to ask. All three documents are built on the same rule: a score is never the reason for a decision about a student, and a conversation about the work settles what no software can.
1. The AI-writing linter ("Analyze")
Unlike black-box detectors that only spit out a score, this is an explainable, actionable, educational
linter. Paste, upload (.docx / .txt / .md), or just start typing — the 0–100 score, highlights,
statistics, and per-finding fixes update as you write.
Category | Examples |
Lexical | delve, tapestry, multifaceted, nuanced, pivotal, underscore, showcase, testament… (weighted by post-ChatGPT excess frequency) |
Rhetorical | Negative parallelisms ("it's not just X, it's Y"), cliché openers ("in today's digital age"), hedging ("it's worth noting that"), false ranges, rule-of-three |
Syntactic | Copula avoidance ("serves as a…", "a testament to…"), inflated constructions ("plays a crucial role") |
Statistical | Burstiness — sentence-length uniformity. Machine text hovers at 0.0–0.2; human prose 0.6–0.8 |
Sentence-rhythm visualization — a per-sentence bar chart that makes burstiness visible.
Per-finding recommendations — every flagged tell carries a concrete fix and the research behind it.
Live rewrite (on-device, no key) — your text and a de-AI-ified version side by side, rebuilt on every keystroke, with the score dropping as you go. It runs off the rule-pack — no model, no network, no API key — so it is instant and free. Every change is listed with alternatives to pick from and a one-click leave this one alone. Three strengths, from only the strongest tells to delete the empty intensifiers too.
It only does what a word swap can honestly do, and declines the edits it would get wrong: it won't turn "delve into" into "examine into", won't drop the "just" that a "not just X, it's Y" construction depends on, and won't put "el" in front of a feminine noun. Rhythm and rhetorical structure need real rewriting, so those stay in the recommendations — and the panel says how many.
Humanize (optional, BYOK) — connect an AI provider and rewrite the flagged text in one click. Anthropic (
claude-opus-4-8, works from the browser), OpenAI / DeepSeek, Azure OpenAI, or Ollama (local, no key). Credentials live only in your browser and are sent directly to the provider.Before/after diff and a shareable result card (a PNG summary that never includes your text).
Custom catalogs (BYO rules) — paste banned words or import a rule-pack JSON; merges live.
Catalog page — a searchable library of every AI-writing sign, in both languages, ranked with an in-browser BM25 index.

This is the difference: not "87% AI", but which words, why they were flagged, and what to write instead.
2. The Originality checker ("Originality")
"¿Lo escribió la IA, lo copiaste, o lo parafraseaste para esconderlo?" Drop in two or more documents — a thesis and its sources, a batch of student submissions — and see exactly what they share. The guiding principle is honest: we surface the evidence and highlight it; a human judges. We never accuse. This is not a whole-internet index like Turnitin.
Phase | What it catches | How | Where it runs |
A — Literal copy | verbatim shared passages, resistant to changed capitalization/accents | accent/case-folded word k-shingles + greedy longest-match tiling, verified token-by-token | 🔒 in your browser |
B — Paraphrase | reworded copies — same idea, different words — even across languages | sentence embeddings (Google EmbeddingGemma-300M, ONNX) + cosine similarity | 🌐 optional server (opt-in) |
C — Cohort | who copied whom across a whole class, at a glance | batch upload + an N×N overlap heatmap; click a cell to inspect the pair | 🔒 in your browser |
D — Web spot-check | whether a passage already exists online | extracts a document's most distinctive passages and hands you one-click exact-phrase searches (Google/Bing/DuckDuckGo) | 🔒 in your browser |
Shared-passage evidence — matches are highlighted in both documents, side by side; the headline overlap number equals exactly what you see highlighted (the evidence is the score).
Phase B is the one feature that leaves the device. It's opt-in, disclosed in the UI, and sends only the sentences you choose to check to the PeopleWorks server. Everything else stays on your machine.
Phase D is deliberately honest: we can't index the whole web, so instead of pretending to, we surface the passages worth checking and prepare the searches — nothing is sent anywhere until you click one. An optional automatic web search can be enabled by the server operator (see Optional server below).

A whole class at a glance: every document against every other, then the shared passages themselves — evidence, not an accusation.
3. The predictability meter (optional server)
An honest reframing of perplexity. A small language model (Qwen2.5-0.5B or Microsoft Phi-4-mini, int8 ONNX) measures how predictable / generic a text's phrasing is. This is not an AI-vs-human verdict — on a labelled corpus the two overlap badly (memorized human text scores predictable too). We surface predictability honestly as one signal among many, calibrated per language. Opt-in; runs on the PeopleWorks server. The model lazily loads and idle-unloads to keep the server light.
4. Use it from other apps — MCP server
Everything above is also available to Claude Desktop and any MCP
client through SignsOfAI.Mcp, a Model Context Protocol server (built on the official
ModelContextProtocol SDK, stdio transport). Because
the engine lives in SignsOfAI.Core — pure .NET, no browser — the server just exposes it as tools:
Tool | What it does | Where it runs |
| score + verdict + findings (with fixes) + statistics | 🔒 on-device |
| overlap % and shared passages across 2+ documents | 🔒 on-device |
| search the catalog of AI-writing signs (EN/ES) | 🔒 on-device |
| distinctive phrases + ready-made web-search links | 🔒 on-device |
| invisible characters & letters impersonating Latin ones, with line/column | 🔒 on-device |
| where a document contradicts its own bibliography, with the line of each | 🔒 on-device |
| how a piece sits against the same writer's earlier work, on their own scale | 🔒 on-device |
| perplexity via the optional server | 🌐 server (opt-in) |
| reworded/translated matches via EmbeddingGemma | 🌐 server (opt-in) |
The first seven run entirely on the machine; the last two disclose that they send text to the server
(endpoint via the SIGNSOFAI_API_ENDPOINT environment variable).
It ships on NuGet as SignsOfAI.Mcp, so nothing needs
building. Point Claude Desktop at it:
// %APPDATA%\Claude\claude_desktop_config.json
{ "mcpServers": { "signs-of-ai": {
"command": "dnx",
"args": ["SignsOfAI.Mcp", "--yes"]
}}}Or install it as a global tool once — dotnet tool install --global SignsOfAI.Mcp — and use
"command": "signsofai-mcp". See src/SignsOfAI.Mcp/README.md for details.
VS Code: the package ships an MCP manifest, so its
NuGet page has an MCP Server tab with the config
already generated — copy it into .vscode/mcp.json and you're done.
5. Use it as an agent skill — /signs-of-ai
Prefer to work inside your editor? SKILL.md is a drop-in agent skill that de-slops a
draft — or reports the tells a text carries — in English and Spanish. It is a human-readable
distillation of the same rules.en.json / rules.es.json taxonomy, so it edits by the same rules the
engine scores by.
# Claude Code, Codex, Gemini CLI, Cursor and the rest, in one command
npx skills add peopleworks/SignsofAI -g# …or as a Claude Code plugin, from the marketplace manifest in this repository
/plugin marketplace add peopleworks/SignsofAI
/plugin install signs-of-aiThen:
/signs-of-ai <your draft> # edit mode: rewrite + change summary
/signs-of-ai is this AI slop? <the text> # examine mode: the tells, quoted, no rewriteThe skill deliberately never fakes a numeric score, and never says who wrote a text — for a
calibrated 0–100 score, burstiness, originality, citations, a writer baseline or perplexity it hands
off to this engine (web app, CLI, or the MCP tools above). It carries the same six rules about what a
finding may claim that the report does, including the error rate that has to travel with any score.
See skill/README.md.
Architecture
SignsOfAI.slnx
├─ src/
│ ├─ SignsOfAI.Core # Pure C# engines (no UI/server deps)
│ │ ├─ Analyzers/ # Lexical, Pattern, Burstiness (IAnalyzer)
│ │ ├─ Originality/ # OriginalityChecker (shingles+tiling), ParaphraseFinder,
│ │ │ # DistinctivePhraseExtractor
│ │ ├─ Rewriting/ # LocalRewriter — on-device de-AI-ifying, no model or network
│ │ ├─ Rules/Packs/ # rules.en.json, rules.es.json (embedded, community-extensible)
│ │ ├─ Text/ # Tokenizer, sentence splitter, language detector, statistics
│ │ └─ AiWritingAnalyzer # Public facade: Analyze(text, language)
│ ├─ SignsOfAI.UI # The whole interface (Analyze, Originality, Catalog) — shared by
│ │ │ # both hosts below, so a change lands in web and desktop at once
│ │ └─ wwwroot/i18n/ # UI translations: en.json, es.json + locales.json (community-extensible)
│ ├─ SignsOfAI.Web # Host: Blazor WebAssembly, runs in the browser
│ ├─ SignsOfAI.Desktop # Host: WPF + WebView2, runs offline and reaches local models
│ ├─ SignsOfAI.Cli # `dotnet tool` for CI pipelines
│ ├─ SignsOfAI.Mcp # MCP server (stdio): the engine as tools for Claude Desktop / any client
│ └─ SignsOfAI.Perplexity.Api # Optional ASP.NET Core server: predictability + embeddings
│ ├─ Engine/ # OnnxPerplexityEngine, OnnxEmbeddingEngine (lazy-load + idle-unload)
│ └─ Config/ # model profiles, calibration, embedding + web-search options
└─ tests/
└─ SignsOfAI.Core.Tests # xUnit (120+, incl. guards for the community locale files)The Core engines are decoupled from the UI and server — the CLI, the Blazor app, and the API all reuse them.
Run it
dotnet run --project src/SignsOfAI.Web
# then open http://localhost:5019Test
dotnet testCommand line & CI (dotnet tool)
The linter ships as a global tool so you can gate prose in CI:
dotnet tool install --global SignsOfAI.Cli
signsofai check README.md # pretty report
signsofai check article.docx --lang en # Word documents too
signsofai check post.md --json # machine-readable
signsofai check post.md --max-score 40 # exit 1 if it reads too much like AI → fails CI
signsofai check post.md --rules my-style.json # your custom catalogThe analysis engine is also a library — dotnet add package SignsOfAI.Core:
var result = new SignsOfAI.Core.AiWritingAnalyzer().Analyze(text, "auto");
Console.WriteLine($"{result.OverallScore}/100 — {result.Verdict}");Optional server (SignsOfAI.Perplexity.Api)
The client works fully on its own; this server only powers the opt-in features (the predictability meter and the Phase B paraphrase check). It's ASP.NET Core (.NET 10) hosting ONNX models with lazy-load and idle-unload so it stays light. Model files are not in git — they download on first use.
The client points at a hosted instance by default; to run your own, set the endpoint in the app's server settings and configure CORS for your origin.
Enabling the optional automatic web search (Phase D)
By default Phase D is the on-device, one-click-search experience (no key, nothing sent until you click). An operator can additionally enable an automatic web search — useful for presentations — by configuring a search provider on the server (the key never touches the browser). It stays off unless configured:
// appsettings.json (or environment variables)
"WebSearch": {
"Enabled": true,
"Provider": "brave", // Brave Search API (free tier); provider-abstracted
"ApiKey": "", // prefer the BRAVE_API_KEY environment variable
"MaxPhrasesPerDoc": 8,
"MaxResultsPerPhrase": 5
}When enabled, the server advertises the capability and the client offers an automatic "search the web" action that reports pages containing a passage verbatim. If it's off, quota-exhausted, or errors, the UI falls back to the manual one-click searches — it never breaks.
Extending the rules
Add entries to src/SignsOfAI.Core/Rules/Packs/rules.<lang>.json — lexical rules match single word
tokens, pattern rules are regexes for multi-word tells. Each sets a weight, severity, and suggestion.
A lexical rule can also tell the live rewriter what to do, which suggestion cannot: that field is
prose for a person ("mix, blend, range — or just name the thing"), and a program shouldn't be reading
intent out of prose.
{ "id": "lex.utilize", "terms": ["utilize", "utilizes"], "weight": 3.5, "severity": "Medium",
"suggestion": "use", "replacements": ["use"] }, // what to substitute, best first
{ "id": "lex.just", "terms": ["just"], "weight": 1.0, "severity": "Info",
"suggestion": "empty intensifier — usually deletable", "delete": true } // remove the word insteadBoth are optional. Without them the rewriter falls back to reading a comma-separated list off
suggestion, and refuses to guess at anything else — a lone term could be a replacement ("use") or a
description ("muletilla"), and telling them apart needs to know the language. So a rule with no explicit
field is simply reported and never auto-edited, which is why every built-in rule states its fix outright
(there's a test that keeps it that way).
Translating the interface
If you speak a language this tool doesn't, you can add it — and you don't need to know C#.
The interface is plain JSON: one file per language in
src/SignsOfAI.UI/wwwroot/i18n/, plus a locales.json manifest.
Adding a language is copy en.json, translate the values on the right, add one line to the manifest.
No build step, no code to read, and the language switch picks it up on its own.
You don't have to finish. Any key you leave out falls back to English, so a partial translation ships as partly translated rather than as a page full of blanks — translate the navigation and the main page, open the pull request, come back for the rest whenever. Contributors are credited on the switch itself.
Every pull request runs a set of locale tests that name the exact mistake — a mistyped key, a
duplicated entry, a lost {0} placeholder — so a translation can be reviewed on evidence instead of by
reading JSON side by side. They deliberately do not fail for an incomplete translation.
Full guide → Docs/TRANSLATING.md
Deploy
The Blazor client is a static bundle (hosts anywhere free). Included GitHub Actions:
GitHub Pages (
deploy-pages.yml) — Settings → Pages → Source: "GitHub Actions". The workflow rewrites the base href and writes an SPA404.htmlfallback.Azure Static Web Apps (
azure-static-web-apps.yml) — add the deployment token as a repo secret.
The optional server is a normal ASP.NET Core app (dotnet publish the SignsOfAI.Perplexity.Api project).
Credits
Created by Pedro Hernández — PeopleWorks, Microsoft MVP for .NET. Detection markers are grounded in
linguistics research on AI stylometry — see Docs/GoogleResearch.md.
The chat.* rules — the assistant's own turn, left in the document — were adapted from the pattern
set of amanmaqsood/prose-humanizer (MIT), a writing
skill rather than a detector. They entered the packs the way everything here does: screened against
the calibration corpus first, where all six scored zero. Twelve other candidates from the same source
did not enter, because they fire on writing from before 2022.
Available Tools
10 toolsanalyze_ai_writingARead-only
Analyzes text for the stylometric tells of AI writing (English & Spanish): overused vocabulary, rhetorical crutches, syntactic tells, and low burstiness (uniform sentence rhythm). Returns an overall 0-100 "reads like AI" score, a plain-language verdict, per-category counts, document statistics, and a list of findings — each with the exact offending text, why it reads as AI, and an actionable fix. Runs fully offline; the text never leaves the machine. This is a signal, not proof of AI authorship.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to analyze. | |
| language | No | Language: "en", "es", or "auto" to detect. Default "auto". | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict this. It adds valuable behavioral context beyond the annotation: 'Runs fully offline; the text never leaves the machine' and the caveat 'This is a signal, not proof of AI authorship.' It also outlines the return structure, which is helpful given no output schema.
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?
The description is three sentences, each earning its place: first defines the analysis scope, second details the rich output structure, third includes offline privacy and an interpretive caveat. It is front-loaded with the primary action and avoids redundancy, making it highly efficient.
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 no output schema, the description thoroughly covers return values (score, verdict, counts, statistics, findings with fixes), languages, offline behavior, and limitations ('signal, not proof'). For a two-parameter tool, this is complete and leaves no significant gaps for an agent to invoke it correctly.
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%, so the baseline is 3. The description adds minimal parameter meaning beyond the schema: it mentions English & Spanish, aligning with the language parameter, but does not provide additional syntax, defaults, or constraints beyond what the schema already states. The purpose context is helpful but does not materially enrich parameter understanding.
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 clearly states a specific verb ('analyzes'), resource ('text'), and scope ('stylometric tells of AI writing'), enumerating the categories and outputs. It distinguishes itself from siblings by focusing on AI-writing detection and returning a 0-100 score, while sibling tools like 'measure_predictability' and 'check_originality' target different aspects.
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 implies when to use the tool by detailing its capabilities (e.g., analyzing text for AI tells, offline privacy), but it does not explicitly state when to use it versus alternatives or mention any exclusions. Users can infer usage context but receive no direct guidance on selecting this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_citationsARead-only
Compares a document against its own reference list and reports where the two disagree: a source cited in the text that appears nowhere in the bibliography, a number cited beyond the end of a numbered list, one DOI on two different works, a malformed DOI, a publication year that has not happened yet, a duplicated entry. Works for English and Spanish, numbered (IEEE/Vancouver) and author-year (APA/MLA) styles, and returns the line of every problem. Runs FULLY OFFLINE and looks nothing up: it cannot tell you whether a well-formed reference is a real paper, only whether the document contradicts itself. That is often enough, because an invented bibliography tends to fail against itself first. Nothing is sent anywhere. A missing reference is usually a slip rather than dishonesty, and it is always the writer's to explain — the correct response to a finding is to ask them for the source.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The document, including its reference list. | |
| language | No | Language for the wording of the messages: "en" or "es". Default "en". | en |
| currentYear | No | What counts as the future, for the impossible-year check. Omit to use the current year. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true is already present, and the description adds substantial beyond-annotation context: it runs fully offline, sends nothing, cannot determine real vs. fake references, and notes that a missing reference is usually a slip rather than dishonesty. This paints a complete behavioral picture and explains the tool's intent and limitations.
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?
The description is longer than average but every sentence earns its place: it front-loads the core function, then lists specific check types, supported styles, offline behavior, limitations, and even advice on handling findings. No fluff or repetition, just dense, useful 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?
Given the tool's complexity and the absence of an output schema, the description does well by stating that it returns 'the line of every problem' and explaining the conceptual approach (self-contradiction detection). It lacks an exact return structure, but that is not fully required, and the description covers language, year handling, and offline behavior sufficiently for an agent to gauge whether this tool fits.
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 input schema already provides 100% coverage for all three parameters, including defaults and descriptions for each. The tool description does not add any new parameter-level semantics, so it rests at the baseline of 3; it neither clarifies nor conflicts with 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?
The description begins with a specific verb and resource: 'Compares a document against its own reference list and reports where the two disagree.' It enumerates concrete checks (malformed DOI, impossible year, duplicates) and explicitly distinguishes itself from sibling tools like check_originality or check_paraphrase by focusing on internal consistency rather than external similarity.
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 clearly states supported languages and citation styles, and explicitly identifies a key limitation: it cannot verify whether references are real papers, only whether the document contradicts itself. It does not name specific alternative tools, but the 'nothing is sent anywhere' and offline nature help the agent decide when this (vs. a look-up tool) is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_originalityARead-only
Compares two or more documents AGAINST EACH OTHER to find copied passages — a cohort of student submissions, a draft against its sources. For each document pair it returns the overlap percentage (case- and accent-insensitive) and the actual shared passages as evidence. This is NOT a whole-internet index like Turnitin; it only compares the documents you provide, fully offline. It surfaces evidence and lets a human judge — it never accuses.
| Name | Required | Description | Default |
|---|---|---|---|
| documents | Yes | Two or more documents to compare. Each has an optional title and its text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations declare readOnlyHint=true, the description goes beyond this by disclosing specific behavioral traits: case- and accent-insensitive matching, return of overlap percentage and shared passages, fully offline processing, and a non-accusatory stance. These details provide useful context that annotations alone would not convey.
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?
The description is three sentences long, each earning its place: the first defines the action and gives examples, the second details output and sensitivity, and the third clarifies scope and philosophy. There is zero filler and the most important information is front-loaded.
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 single-parameter tool with no output schema, the description is remarkably complete. It covers purpose, return values (overlap percentage and shared passages), limitations (not internet-indexed, offline), and intended usage context. An agent would have all necessary information to invoke the tool correctly.
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 input schema has 100% description coverage for the sole 'documents' parameter, so the baseline is 3. The description adds context that the documents are compared against each other, but it does not add specific format or usage details beyond what the schema already states, so it neither improves nor harms parameter understanding.
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 uses a specific verb ('Compares') and resource ('documents AGAINST EACH OTHER') to clearly define the tool's function. It distinguishes itself from internet-wide plagiarism tools like Turnitin and from sibling tools by emphasizing pairwise document comparison, ensuring no confusion with tools like compare_to_baseline or check_citations.
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 explicitly states when to use this tool—comparing a closed set of documents against each other—and provides concrete use cases (student submissions, draft vs sources). It also explicitly excludes a major alternative ('NOT a whole-internet index like Turnitin') and notes the tool operates offline, giving clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_paraphraseARead-only
Finds REWORDED copies between two texts — same meaning, different words, including across languages (e.g. English vs Spanish) — that a literal copy check can't see. It embeds each sentence and compares cosine similarity. NOTE: this SENDS BOTH TEXTS to the SignsOfAI server to embed them (endpoint from SIGNSOFAI_API_ENDPOINT). Requires the embedding feature to be enabled on the server.
| Name | Required | Description | Default |
|---|---|---|---|
| textA | Yes | First document. | |
| textB | Yes | Second document. | |
| threshold | No | Cosine similarity threshold 0..1 to count as a paraphrase. Default 0.72. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical behavioral details: it sends both texts to the SignsOfAI server and requires the embedding feature to be enabled. This is significant operational context not captured by annotations, and there is no contradiction.
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?
The description is exactly two sentences: the first states the core purpose, the second covers mechanism, data flow, and requirements. No wasted words; every sentence earns its place.
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?
Without an output schema, the description covers the tool's purpose, method, external data transmission, and prerequisite. It does not explicitly state what the tool returns (e.g., matched sentences, similarity score), which would be helpful. Overall, it is fairly complete for a two-input analysis 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?
Schema description coverage is 100% for all three parameters. The description's mention of cosine similarity reinforces the threshold parameter's semantics but does not add new meaning beyond the schema's own description. Baseline 3 is appropriate.
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 clearly states the tool finds reworded copies between two texts (same meaning, different words), including cross-language, and explicitly distinguishes itself from literal copy checks. This gives a specific verb+resource and differentiates it from sibling tools like check_originality.
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 provides clear context for when to use the tool (when a literal copy check is insufficient) and notes a prerequisite (embedding feature enabled). However, it does not explicitly name alternative tools or state when not to use it, though sibling context hints at this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_to_baselineARead-only
Compares one piece of writing against several earlier pieces by the SAME person, using function-word frequencies (Burrows's Delta). Returns how far the questioned text sits from that writer's centre, alongside how far each of the writer's own pieces sits from it — measured identically, so the scale is the writer's own variation rather than a threshold invented by this tool. Also returns which function words differ most, with rates per 1,000 words, and how many words are used at a rate the writer has never used them at. Runs fully offline; nothing is sent anywhere. WHAT THIS CANNOT DO: it cannot tell you who wrote something. There is no "different author" result and there must not be one in your summary either. Style moves with the assignment, the genre, the deadline, a co-author, an editor, and with a person simply getting better. A text outside the range is a reason to ask what changed; it is NEVER a conclusion, an accusation, or evidence of misconduct. The most valuable outcome is the reassuring one: a text INSIDE the range settles a suspicion, and saying so plainly is usually the most useful thing you can do with this tool. It refuses to answer on thin evidence and returns "Undetermined" instead of a number — do not work around that by rerunning with less text or by estimating one yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language: "en" or "es". Default "en". | en |
| earlierWork | Yes | Earlier pieces by the same writer. At least ~1,400 words in total across them. | |
| questionedText | Yes | The piece being asked about. At least 300 words. | |
| questionedTitle | No | Optional title for the questioned piece. | questioned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses rich behavioral details: it runs fully offline, refuses on thin evidence returning 'Undetermined', uses the writer's own variation as the scale, and explicitly forbids interpreting results as a 'different author' conclusion. No contradictions with 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?
Although lengthy, every sentence earns its place. The description is well-structured: definition, limitations, recommended use, and behavioral caveats are clearly separated. The 'WHAT THIS CANNOT DO' section is critical and formatted for emphasis, adding value without redundancy.
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 complex tool with no output schema, the description fully explains expected return values (distances, function-word rates, never-used rates) and handling of insufficient evidence ('Undetermined'). It also covers interpretation and ethical cautions, making it complete for real-world use.
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%, so parameters are fully documented in the input schema. The description adds conceptual context (e.g., 'earlier pieces by the SAME person') but does not add significant new parameter-specific details beyond what the schema already states. 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?
The description clearly states the tool's function: 'Compares one piece of writing against several earlier pieces by the SAME person, using function-word frequencies (Burrows's Delta).' This specifies the verb and resource, and the explicit note that it cannot determine authorship distinguishes it from sibling analysis 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?
The description provides explicit when-to-use guidance: 'The most valuable outcome is the reassuring one: a text INSIDE the range settles a suspicion.' It also states what it cannot do ('it cannot tell you who wrote something') and advises against workarounds for 'Undetermined' results, giving clear exclusions and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_distinctive_phrasesARead-only
Extracts the most DISTINCTIVE phrases from a document — long, specific, proper-noun- or number-bearing wording most worth checking on the web — and returns each with ready-made exact-phrase search links (Google, Bing, DuckDuckGo). It does NOT search the web itself; it hands you the searches to run. Offline.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The document text. | |
| maxPhrases | No | Maximum phrases to return. Default 8. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint provided, the description adds valuable context: it is offline, does not search the web, and returns ready-made search links. This goes beyond the annotation without contradicting it.
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?
The description is three concise sentences, front-loaded with the main action, and the negative clarification is compact. Every sentence earns its place.
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 two-parameter, read-only extraction tool, the description fully covers purpose, output format (search links), and behavioral constraints (offline, no searching). No output schema is needed as the output is described in prose.
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 descriptions for text and maxPhrases. The tool description does not add extra parameter semantics, so a baseline 3 is appropriate.
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 clearly states the tool 'Extracts' the specific resource 'DIStinctive phrases from a document' and defines what makes them distinctive. It also distinguishes itself from web-searching siblings by explicitly noting it does not search the web.
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?
It explicitly states when to use the tool (to get phrases worth checking on the web) and when not to use it (it does NOT search the web itself). The note 'Offline' further clarifies the operating context, preventing misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_charactersARead-only
Reports characters present in a text that typing does not produce: invisible/zero-width characters, letters borrowed from another alphabet to impersonate Latin ones (a Cyrillic "а" for an "a"), text direction controls, and hidden tag characters. Tools that rewrite text to defeat AI detectors insert these deliberately. Returns the exact codepoint, line and column of every occurrence, plus whether they are clustered (which ordinary copy-paste from a web page or a PDF produces) or spread through the whole document (which is what a rewriting tool leaves behind). Language-independent and fully offline. This is a checkable fact about a file, NOT proof of dishonesty and NOT a claim about who wrote the text: legitimate documents pick these up from PDFs, web pages and multilingual writing. The correct response to a finding is to ask the writer how the document was produced.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to inspect, exactly as it arrived — not a cleaned copy. | |
| language | No | Language for the wording of the messages: "en" or "es". Default "en". | en |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite the readOnlyHint annotation already signaling a safe read operation, the description goes far beyond by detailing output specifics (codepoint, line, column, clustering), explaining semantic interpretation (clustered vs. spread), and adding context about legitimate sources. It also clearly states the tool's limitations (not proof of authorship), which is critical behavioral context not conveyed by schemas.
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?
The description is longer than typical but every section earns its place: it explains what the tool does, what it returns, how to interpret results, and important caveats. The main purpose is front-loaded in the first sentence, and the subsequent content is organized logically. Minor redundancy (e.g., 'exactly as it arrived' is repeated in schema) could be trimmed, but overall it is effectively structured.
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?
Given the tool's complexity and the absence of an output schema, the description is remarkably complete. It covers the tool's scope, return values, interpretation of clustering, language independence, offline capability, and limitation of evidence. There is no gap that would leave an agent unsure about invocation or result interpretation.
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%, with both parameters (text and language) already described adequately in the input schema. The tool description does not add additional parameter-level semantics, staying within the baseline 3 for schema-covered parameters. No extra syntax, format, or edge-case details are provided 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?
The description opens with a specific verb ('Reports characters') and a precise resource ('text' inspected for non-typing characters), immediately distinguishing it from sibling tools like measure_predictability or check_originality. It lists concrete categories (invisible, Cyrillic impostors, direction controls, hidden tags) and explicitly frames it as a 'checkable fact,' making the tool's unique contribution unmistakable.
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 provides clear context for when to use this tool: detecting deliberately inserted characters by rewriting tools, and it gives explicit interpretive guidance ('NOT proof of dishonesty') and a recommended action ('ask the writer'). However, it does not name sibling alternatives or state when not to use it, which leaves a small gap in usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
measure_predictabilityARead-only
Measures how PREDICTABLE (generic) a language model finds the phrasing — its perplexity. Predictable, generic wording is common in AI writing, but formulaic human text scores predictable too and stylized AI can score varied: it is a signal, not proof. NOTE: unlike the offline tools, this SENDS THE TEXT to the SignsOfAI server to run the model (endpoint from SIGNSOFAI_API_ENDPOINT; defaults to the hosted API).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to score. | |
| model | No | Optional model id (see the server's model list). Empty = server default. | |
| language | No | Language: "en", "es", or "auto". Default "auto". | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint and openWorldHint, but the description goes further by explicitly warning that the text is sent to the SignsOfAI server, mentions the configurable endpoint, and clarifies interpretive limitations. This adds substantial behavioral context beyond 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?
The description is three sentences, each with a distinct purpose: definition, interpretation caveat, and network warning. It is front-loaded and free of fluff, making every sentence earn its place.
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?
The description covers the core purpose, caveats, and network behavior, which addresses most usage concerns. However, with no output schema, it would be more complete if it explicitly stated the return format (e.g., a numeric perplexity score). This minor gap prevents a perfect score.
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 input schema has 100% parameter description coverage for text, model, and language, so the description adds no new parameter-level semantics. The baseline of 3 applies because the schema already documents the parameters sufficiently.
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 clearly identifies the tool's function: measuring perplexity/predictability of phrasing. The verb 'measures' and the resource (language model's predictability) are specific, and the mention of 'unlike the offline tools' helps distinguish it from sibling 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?
The description provides important usage context: it is a signal, not proof, and it highlights that this tool sends text to a remote server unlike offline tools. However, it does not explicitly state when to prefer this tool over alternatives like check_originality or analyze_ai_writing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogARead-only
Searches the catalog of AI-writing "signs" the analyzer looks for (English & Spanish) — each with why it reads as AI and how to fix it. Useful as a reference / study aid, or to explain a finding in depth. Filter by keyword, language ("en"/"es"), and/or category (Lexical, Rhetorical, Syntactic, Statistical). Offline.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Keyword filter (matches title, examples, message, suggestion). Empty = all. | |
| category | No | Category filter: Lexical, Rhetorical, Syntactic, Statistical, or empty. | |
| language | No | Language filter: "en", "es", or empty for both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds the 'Offline' behavioral trait and what the returned entries contain. This supplements, rather than contradicts, the annotation. The bar is lower due to the annotation, and the added context is valuable.
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?
The description is two sentences, front-loaded with the action ('Searches the catalog'), and every clause adds relevant information (languages, content, filters, offline nature). No redundant or vague wording.
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?
This is a simple, read-only search tool with no output schema and only optional filters. The description fully covers what the tool does, what results contain, supported filters, and the offline behavior. Nothing critical is missing for a tool of this complexity.
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 input schema already documents all three parameters with descriptions (keyword, category, language) at 100% coverage. The description repeats some examples ('Lexical, Rhetorical...') but does not add significant new meaning beyond the schema. Baseline 3 is appropriate.
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 clearly states the tool's purpose: it searches a catalog of AI-writing 'signs' with English/Spanish coverage, and describes what each entry contains (why it reads as AI and how to fix it). It differentiates itself from sibling analysis tools by explicitly calling it a reference/study aid.
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 provides clear context on when to use it ('Useful as a reference / study aid, or to explain a finding in depth'). It implies it is not the primary analysis tool but does not explicitly name alternatives or state when not to use it, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_reportARead-only
Produces the full analysis as a Markdown document a person can keep, forward to a writer, or take to an academic-integrity committee — the finished artefact rather than a summary to paraphrase. It contains the score, the signals that counted and the ones found at a rate people write at, the characters found in the file with their line and column, and the places where the document's citations disagree with its own bibliography. Checkable facts are named at the top and kept apart from the score, which is an opinion about prose. Every report prints how often this build is wrong, measured for the language actually analysed against texts published before generative models existed, and names the rules known to fire on human writing so the reader can weigh evidence that leans on one. Below the threshold that measurement supports, no verdict is given at all. Runs FULLY OFFLINE. The result contains material from the document, so treat it as you would the coursework itself: hand it to the person who asked, do not post it anywhere. Prefer this over paraphrasing the other tools' output when the user wants something to send, save, print or attach.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The document to analyse and describe. | |
| title | No | Title for the document. Defaults to a title in the report language. | |
| language | No | "en", "es", or "auto" to detect. Defaults to auto. | |
| documentName | No | Name of the file or assignment, printed on the report. Optional. | |
| interfaceLanguage | No | Reader-facing report language: "en" or "es". Independent from the analysed text. Defaults to English. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that the tool runs FULLY OFFLINE, that the output contains material from the document (privacy caution), and that it reports its own error rates and rules that may fire on human writing. It also explains the threshold-based verdict suppression.
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?
The description is longer than typical (7 sentences) but every sentence contributes meaningful detail about purpose, contents, limitations, and usage. It is front-loaded with the main purpose and uses clear structure, though it could be slightly tighter without losing value.
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?
The description comprehensively covers what the report includes (score, signals, character locations, citation discrepancies), reliability metrics, threshold rules, offline behavior, and privacy considerations. This is especially important because there is no output schema, and the description fully compensates for that.
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 input schema provides 100% coverage with clear descriptions for all 5 parameters. The tool description does not add significant meaning beyond what the schema already offers; it references report contents but doesn't elaborate on individual parameter behavior.
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 clearly states the tool produces a complete Markdown analysis document, distinguishing it from sibling tools that provide individual analyses. It identifies the resource (full analysis report) and the specific verb 'produces', and explicitly contrasts with paraphrasing other 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?
The description gives explicit usage guidance: 'Prefer this over paraphrasing the other tools' output when the user wants something to send, save, print or attach.' It also mentions that no verdict is given below a reliability threshold, setting expectations for when output may be withheld.
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. Dates show when Glama detected each change.
1 tool update
- Added
write_report
9 tool updates
v0.3.0- First observed
analyze_ai_writing - First observed
check_citations - First observed
check_originality - First observed
check_paraphrase - First observed
compare_to_baseline - First observed
extract_distinctive_phrases - First observed
inspect_characters - First observed
measure_predictability - First observed
search_catalog
TDQS
Each tool targets a distinct detection dimension: character-level artifacts, perplexity, literal copying, paraphrased copying, citation integrity, stylometric analysis, reference catalog, phrase extraction, and authorship baseline comparison. Descriptions clarify when to use each, with no two tools serving the same purpose.
All tool names follow a consistent verb_noun snake_case pattern (inspect_characters, check_citations, extract_distinctive_phrases, compare_to_baseline). The verbs are specific and the pattern is uniform, making the set predictable and easy to navigate.
Nine tools cover the full landscape of AI-writing detection without redundancy. Each tool adds a distinct capability, and the count is within the ideal 3-15 range for a focused domain.
The set covers character-level artifacts, statistical perplexity, stylistic tells, literal and semantic copy detection, citation self-contradictions, author-style comparison, and a supporting reference catalog. No obvious operations are missing for the stated purpose of identifying signs of AI writing.
Maintenance
Related MCP Connectors
Find AI-isms with evidence and fingerprint a writing voice from samples. 3 of 5 free.
Free mechanical checks for AI text: unnamed counts, dangling references, bad arithmetic, misquotes.
Catch AI-fabricated citations (real DOI + fake title). Retraction, open-access, 10,000+ CSL styles.
Prose linter + AI-slop detector: weasel words, passive voice, hedging, and research-cited AI tells
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceDetects AI-generated content by analyzing 24 writing patterns, provides style analysis, plagiarism check, text humanization suggestions, and offers batch detection and version comparison tools.-
- FlicenseAqualityBmaintenanceL1-aware grammar, style, translation & tone tools with 70 local rules. Zero API keys needed.4-
- AlicenseNot gradedqualityBmaintenanceEnables multi-tier AI-detection screening on academic papers by extracting text from .tex and .docx files, splitting into standard sections, and running a pipeline of statistical and LLM-based analysis.MIT
- AlicenseAqualityBmaintenanceA private, open-source AI-text checker. Get a read on whether text looks AI-written, the exact AI-tell spans to fix, a reuse check, and a grammar pass.4MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/peopleworks/SignsofAI'
If you have feedback or need assistance with the MCP directory API, please join our Discord server