aadc-audit-mcp
This server provides a local-only MCP toolset to audit software projects against the UK ICO Age Appropriate Design Code (AADC / Children's Code). All operations run on your machine — source code never leaves the device.
Audit Tools
aadc.audit_all— Run all audits at once and get a consolidated PASS/WARN/FAIL/N/A resultaadc.audit_permissions— Check iOSInfo.plistand AndroidAndroidManifest.xmlfor permissions outside the AADC-safe allowlistaadc.audit_sdks— Scanpubspec.yaml,package.json, andrequirements.txtfor analytics, advertising, tracking, or profiling SDKsaadc.audit_launchurl— Detect unsafelaunchUrl()calls and web external-navigation escapes that could expose children to uncontrolled browser sessionsaadc.audit_network_isolation— Verify protected paths (microphone, camera, on-device data) do not import network APIsaadc.audit_defaults— Heuristic scan for suspicious privacy keys (share/track/profile) defaulting totrueaadc.audit_reading_grade— Check user-facing copy for age-appropriate reading levelaadc.audit_placeholders— Flag unreplaced lorem ipsum, TODO, TBD, or dummy text in shipped contentaadc.audit_link_reachability— Warn-only check that external links are not deadaadc.audit_volume_cap— Verify all audio/video players declare an explicit volume capaadc.audit_sentry_hygiene— Check Sentry initialisation for PII scrubbing and safe sampling (no session replay)aadc.audit_hardcoded_url— Flag hardcoded URLs that bypass content reviewaadc.audit_policy_mentions_sdks— Warn-only check that the privacy policy names all external-service SDKs used by the app
Reference Tools
aadc.list_standards— List all 15 AADC standards with one-line statutory summariesaadc.read_standard— Retrieve the full ICO-published text of any specific standard (1–15)
Key Features
Supports Flutter/Dart, Web/JS/TS/HTML, Android/iOS native manifests, and Python projects
Configurable per-project allowlists for permissions, SDKs, trusted hosts, and more
Suitable for CI/CD pipelines via CLI mode
Provides compliance auditing for Android apps by inspecting AndroidManifest.xml for permissions outside the AADC allowlist and checking other AADC standards.
Provides compliance auditing for iOS apps by inspecting Info.plist for permissions outside the AADC allowlist and checking network isolation and other AADC standards.
Checks Sentry initialization hygiene for compliance with AADC standards, such as no PII capture and sane sampling.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@aadc-audit-mcpaudit my flutter app for children's code compliance"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
aadc-audit-mcp
A local MCP server (and CLI) that audits a software project against the UK ICO Age Appropriate Design Code (the Children's Code, AADC), the statutorily-enforceable framework that governs any online service "likely to be accessed by children" in the UK.
Runs entirely on your machine over stdio. Your source code never leaves the device.
What it does
Fifteen MCP tools, all local-only: twelve individual audits, plus audit_all, list_standards, and read_standard.
MCP tool | What it does |
| Run every audit against a local project root and return one consolidated result. |
| Inspect iOS |
| Inspect |
| Inspect Dart |
| Inspect declared protected paths (microphone, camera, on-device-only data) for any network API import. Standard 8. |
| Heuristic warn-only scan for default-true on suspicious privacy keys (share / track / profile / etc). Standard 7. |
| Heuristic reading-grade check of user-facing copy. Standards 4, 11. |
| Flag placeholder content not yet replaced (lorem ipsum, TODO, TBD, dummy text). Standards 4, 6. |
| Warn-only check of external link reachability. Standards 4, 6. |
| Require an explicit volume cap on every audio/video player (Dart players and HTML5 |
| Check Sentry initialisation hygiene (e.g. no PII capture, sane sampling). Standards 7, 9. |
| Flag hardcoded URLs outside the CMS, in Dart and web source. Standards 4, 6. |
| Warn-only check that the privacy policy names every external-service SDK (Flutter, npm, and Python). Standards 4, 9. |
| Return the 15 AADC standards with their one-line statutory summaries. |
| Return the full ICO-published text of one standard. |
PASS, WARN, FAIL, and N/A
Each audit reports one of four outcomes. An audit that has zero relevant
inputs to inspect (a Dart/web audit on a project with none of those files,
or a config-gated audit you haven't enabled) reports [N/A], not a green
PASS. N/A means "not applicable", not "passed": "all clean" on a project
whose stack an audit does not cover now reads as N/A so you are never lulled
into reading a non-result as a compliance tick.
N/A never affects the process exit code or the MCP isError flag. Only a real
FAIL on an applicable audit does. The CLI prints a final tally line of the
exact form:
2 passed, 1 warnings, 0 failed, 9 not applicableEach audit result also carries the count of inputs it actually examined
(scanned N), and the structured AuditResult shape exposes two optional
fields for consumers: applicable (boolean) and scanned (number).
Per-stack coverage
Not every audit fires on every stack. This matrix is what gives real signal today. A blank cell is not a failure: it just means that audit reports N/A on that stack (no inputs to inspect). Read it honestly: a green run is only meaningful for the audits that actually applied.
Audit | Flutter / Dart | Web / JS | Native manifest | Python |
permissions | yes | |||
sdks | yes | yes | yes | |
launchurl | yes | yes | ||
network-isolation | yes | yes | yes | |
defaults | yes | yes | yes | |
reading-grade | yes (Info.plist rationale) | |||
placeholders | yes | yes | yes | |
link-reachability | yes | yes | ||
volume-cap | yes | yes | ||
sentry-hygiene | yes | yes | ||
hardcoded-url | yes | yes | ||
policy-mentions-sdks | yes | yes | yes |
Notes:
Web / JS means source with a
.js,.mjs,.cjs,.jsx,.ts,.tsx,.html,.htm,.vue, or.svelteextension. A vanilla HTML/JS PWA now gets real signal: hardcoded URLs in JS/HTML, HTML5<audio>/<video>ornew Audio()without an explicit volume clamp, andwindow.open/location/<a target="_blank">external-navigation escapes.Native manifest means iOS
Info.plistand AndroidAndroidManifest.xml, found anywhere in the tree regardless of layout.reading-grade parses no
.dart(or.js) source at all: its only inputs are the iOSInfo.plist*UsageDescriptionrationale strings (shown in the Native-manifest column) and the privacy policy. The privacy policy is config-driven (any path viaprivacyPolicyPath) and is not tied to a stack, so it does not earn a Flutter/Dart cell.sentry-hygiene only inspects
pubspec.yaml(sentry_flutter) andpackage.json(@sentry/*), then the Dart / JS / TS init source. It never readsrequirements.txtor the Pythonsentry-sdk, so it reports N/A on a Python-only project (hence the blank Python cell).placeholders scans content and source by extension (see below); that set does not include
.pyorrequirements*.txt, so a Python-only project gets no Python-source signal from it (hence the blank Python cell). It still fires on any.md/.json/.yaml/.xmlcontent a Python repo ships.network-isolation,link-reachability,sentry-hygiene, andpolicy-mentions-sdksare config-gated (see below); they apply to a stack only once enabled, otherwise they report N/A.
Layout-agnostic discovery
reading-grade and policy-mentions-sdks no longer assume an
apps/mobile monorepo layout. They walk the whole project for
Info.plist / pubspec.yaml / package.json / requirements*.txt, so any
layout works. policy-mentions-sdks recognises npm and Python
external-service SDKs (Sentry, Firebase / Google Analytics, PostHog,
Mixpanel, Amplitude, Segment, Datadog, Hotjar, Stripe, Intercom, and others)
in addition to the Flutter ones.
Config-gated audits report N/A, not a skipped WARN
Four audits do nothing useful until you point them at something. When they
are not enabled they report [N/A] (not a yellow warn-skip), and each N/A
summary names how to switch it on:
network-isolationneedsprotectedPaths.link-reachabilityneedsAADC_CHECK_LINKS(it makes outbound HTTP requests, so it is opt-in).policy-mentions-sdksneeds a privacy policy at the configured path.sentry-hygieneneeds a Sentry dependency (sentry_flutteror@sentry/*) in the project.
Related MCP server: gridwork-privacy
Install
npm install -g aadc-audit-mcpThen add to your MCP client config. For Claude Code, edit
~/.claude.json:
{
"mcpServers": {
"aadc": {
"command": "aadc"
}
}
}For Claude Desktop, edit
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"aadc": {
"command": "aadc"
}
}
}That's it. Claude will now offer the fifteen aadc.* tools whenever
you're working in a project that looks like it might be accessed by
children.
CLI mode (no MCP needed)
The same binary doubles as a CLI:
aadc audit ./your-project # all audits → exit 0 or 1
aadc audit:permissions ./your-project # one audit
aadc standards # list 15 AADC standards
aadc helpUseful for GitHub Actions or any CI that doesn't have Claude in the
loop. See workflows/aadc-ci.yml for a drop-in.
Per-project allowlist overrides
Each project has different legitimate dependencies and permissions. Override via env vars (work for both MCP server and CLI):
export AADC_PERM_ALLOWLIST_IOS="NSMicrophoneUsageDescription NSBluetoothAlwaysUsageDescription"
export AADC_PERM_ALLOWLIST_ANDROID="android.permission.RECORD_AUDIO ..."
export AADC_SDK_ALLOWLIST_FLUTTER="flutter just_audio webview_flutter ..."
export AADC_SDK_ALLOWLIST_NPM="@cloudflare/workers-types wrangler ..."
export AADC_SDK_ALLOWLIST_PYTHON="fastapi pydantic ..."
export AADC_PROTECTED_PATHS="path/to/sensitive/code/dir ..."
export AADC_TRUSTED_HOSTS="yourapp.com partner.org apps.apple.com ..."
export AADC_FIRST_PARTY_ORIGINS="yourapp.com help.yourapp.com ..."
aadc audit .AADC_TRUSTED_HOSTS sets the host suffixes the link-reachability
audit will probe. It defaults to common app-store, video, and forms
platforms plus the ICO; supply your own list (your app domains,
partner sites, kit vendors, etc) to override it.
AADC_FIRST_PARTY_ORIGINS declares your own site host(s) so a
launchUrl / <a target="_blank"> / window.open to your own help
pages is treated as first-party and is not flagged as an external
escape.
The path/value overrides apply to web source as well as Dart.
AADC_PARENT_AREA_PATHS (env or MCP) marks post-parent-gate surfaces
that may legitimately open the OS browser, and the MCP-only allowlists
urlExemptPaths / urlExemptValues (for hardcoded-url) and
volumeCapExempt (for volume-cap) now match across .js / .ts /
.html / .vue / .svelte as well as .dart.
When called via MCP, the same overrides can be passed as
allowlists.{ios,android,flutter,npm,python,protectedPaths,trustedHosts,firstPartyOrigins,parentAreaPaths,urlExemptPaths,urlExemptValues,volumeCapExempt}
in the tool arguments, useful when Claude is running the audit on
behalf of a project with project-specific allowlists.
Why MCP, why local, why kid-app-specific
Local-only is the whole point. A compliance tool that uploads your source code to a third-party SaaS is a non-starter for a kids-app product. The MCP runs as a subprocess on the user's machine and never reaches the network.
MCP gives Claude (or any MCP-capable AI client) structured function calls. Instead of "Claude reads your repo and tries to remember the AADC", Claude calls
aadc.audit_alland gets a machine-shaped result it can paste straight into a PR description, GitHub issue, or conformance statement.Kid-app-specific because the existing compliance market is enterprise-only. Paid third-party auditors (TestPros, BBB National Programs) start at five figures. Enterprise compliance SaaS (OneTrust, Securiti AI) assumes you have a legal team to configure them. Small kids apps need a drop-in toolkit. This is that toolkit.
What it doesn't do
Doesn't make legal warranties. Best-effort technical scaffolding. A regulator query may still require a paid third-party auditor.
Doesn't automate the 6 judgement-based standards (1 best-interests, 2 DPIA, 3 age-appropriate application, 12 profiling, 13 nudges, 15 online tools). For those, use the conformance-statement template under
templates/and let Claude fill it in by reading your code + the ICO text.
Repo contents
aadc-audit-mcp/
├── README.md, LICENSE
├── package.json, tsconfig.json
├── src/
│ ├── cli.ts (dual-mode entry: MCP server OR CLI)
│ ├── server.ts (MCP server: 15 tools)
│ ├── standards.ts (ICO AADC text loader)
│ └── audits/ (12 audit modules + support files)
│ ├── index.ts (registry)
│ ├── types.ts (AuditResult, AuditOptions)
│ ├── walk.ts (fs traversal)
│ ├── web-source.ts (shared web-file discovery + comment stripping)
│ ├── permissions.ts (Standards 8, 10)
│ ├── sdks.ts (Standards 5, 9, 12, 13)
│ ├── launchurl.ts (Standards 11, 14)
│ ├── network-isolation.ts (Standard 8)
│ ├── defaults.ts (Standard 7)
│ ├── reading-grade.ts (Standards 4, 11)
│ ├── placeholders.ts (Standards 4, 6)
│ ├── link-reachability.ts (Standards 4, 6)
│ ├── volume-cap.ts (Standards 1, 14)
│ ├── sentry-hygiene.ts (Standards 7, 9)
│ ├── hardcoded-url.ts (Standards 4, 6)
│ └── policy-mentions-sdks.ts (Standards 4, 9)
├── aadc/ (canonical ICO text mirror)
│ ├── 1-best-interests-of-the-child.md
│ ├── ... (15 standards + executive summary)
│ └── fetch.sh (refresh from ico.org.uk)
├── templates/
│ ├── AUDIT.md
│ ├── conformance-statement.md
│ ├── privacy-policy.md
│ └── incident-response.md
├── workflows/
│ └── aadc-ci.yml (drop-in GitHub Actions workflow)
├── examples/
│ └── README.md (per-language overrides cookbook)
├── tests/ (node:test suite + tests/fixtures/ project trees)
└── legacy-bash/
└── ... (original bash implementation; kept for
projects that can't depend on Node)Related jurisdictions
The 15 standards are broadly aligned with the new US state laws modelled on the UK AADC (California, South Carolina, Vermont, Nebraska, Maryland as of 2026). The audits here are a good starting point in those jurisdictions, but state-specific deltas should be reviewed separately.
Licence
MIT. The ICO Children's Code text mirrored under aadc/ is
published under the Open Government Licence v3.0. See LICENSE.
Development
npm run build # compile src/ to dist/ via tsconfig.json
npm test # compile via tsconfig.test.json and run the suitenpm test compiles the tests with tsconfig.test.json and runs
node:test against fixture project trees under tests/fixtures/. It
adds no new dependencies (it uses Node's built-in test runner), so it
runs anywhere the tool itself runs.
Contributing
The most useful contributions:
More language adapters (the audits cover Flutter, Node, Python, and vanilla web/JS today; React Native specifics, iOS-Swift-only, Android-Kotlin-only, .NET MAUI would all help).
New checks aligned to AADC standards we haven't automated (Standard 13 nudge-pattern detector especially).
Diff-against-ICO improvements to
aadc/fetch.shso wording drift surfaces as a structured PR.More fixtures under
tests/fixtures/covering stacks and edge cases the current suite doesn't.
Open issues / PRs at https://github.com/Paul-PSDigital/aadc-audit-mcp.
aadc-audit-mcp
Available Tools
15 toolsaadc.audit_allA
Run every AADC compliance audit against a local project and return the consolidated result. Use this whenever the user asks for a full AADC review of a kids app, or before a store submission.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears full burden for behavioral disclosure. It states it runs all audits and returns a consolidated result, but does not disclose whether it modifies the project, permission requirements, or performance implications. While not misleading, it lacks details that would help an agent assess risks or side effects.
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: one clearly stating functionality, one providing usage guidance. No redundant words, front-loaded with the core action. 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?
While the schema covers parameters and the description states purpose, the tool is an aggregate that runs multiple sub-audits. The output format is only vaguely described as 'consolidated result'. Given no output schema, the description could clarify the structure (e.g., list of individual audit results) to help the agent process the response. Adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add any information about parameters beyond what the schema already provides (projectRoot as absolute path, allowlists as per-language overrides). No additional semantic clarity from the description.
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 runs every AADC compliance audit and returns a consolidated result, using specific verb 'run' and resource 'AADC compliance audits'. It distinguishes itself from sibling individual audit tools (e.g., aadc.audit_defaults) by being the aggregate version.
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: 'whenever the user asks for a full AADC review of a kids app, or before a store submission.' This provides clear context and implicitly directs users to sibling tools for specific audits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_defaultsB
Heuristic warn-only scan for default-true on suspicious privacy keys (share / track / profile / etc). Standard 7.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a 'warn-only scan' implying non-destructive behavior, but with no annotations, more detail would be beneficial—e.g., what gets scanned, performance impact, or result handling.
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?
Single sentence with key information front-loaded. Very concise, though the term 'Standard 7' may be obscure.
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?
Adequately describes the tool's scope and non-destructive nature, but lacks explanation of 'Standard 7' and expected output format, which could hinder effective 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 description coverage is 100%, so the baseline is 3. The description adds no additional meaning to the parameters beyond what the schema already provides.
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 ('scan') and resource ('default-true on suspicious privacy keys'), and distinguishes from siblings by referencing 'Standard 7' and a heuristic warn-only approach.
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?
No guidance on when to use this tool versus sibling audits like aadc.audit_all or aadc.audit_permissions. The description lacks explicit context for usage or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_hardcoded_urlB
Flag hardcoded URLs outside the CMS that bypass content review. Standards 4, 6.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description only states it flags URLs but does not disclose behavioral traits such as whether it modifies files, requires authentication, or what the output format is. Missing context on side effects or error conditions.
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 extremely concise (two sentences) and front-loads the core purpose. Every sentence is essential with no filler.
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 no output schema, no annotations, and nested objects in params, the description lacks completeness. It does not explain the return values, how standards 4 and 6 are applied, or provide examples, leaving the agent underinformed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add additional meaning beyond what is already in the input schema. The description does not elaborate on the parameters, so it meets baseline but does not enhance 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 it flags hardcoded URLs outside the CMS that bypass content review, and references specific standards (4, 6). This distinguishes it from other audit siblings like aadc.audit_launchurl or aadc.audit_permissions.
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 usage for detecting hardcoded URLs bypassing CMS review, but does not explicitly state when to use or not use this tool vs alternatives like aadc.audit_all or aadc.audit_link_reachability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_launchurlA
Audit Dart launchUrl() calls so kid-facing files use the safe-link helper and only declared parent-area paths may open the external browser. Standards 11, 14.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full burden. It states the purpose but does not disclose behavioral traits such as read-only nature, required permissions, error conditions, or return behavior. For an audit tool, these are important contextual hints.
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?
Single sentence efficiently conveys purpose and standards. No fluff, front-loaded with key action ('audit') and resource ('Dart launchUrl() calls').
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?
Description explains the audit target and constraints but does not describe the output format (e.g., list of violations, pass/fail). No output schema exists, so the description should provide some expectation of results. References to standards 11 and 14 are unelaborated.
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% (both parameters have descriptions in the schema). The tool description adds no additional parameter meaning beyond what the schema already provides, so 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 audits Dart launchUrl() calls for safe-link helper usage and external browser path restrictions. It references specific standards (11 and 14), distinguishing it from sibling audit tools by specifying a focused scope.
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 the tool is used when auditing launchUrl calls for compliance with standards 11 and 14, but does not explicitly state when to use it versus alternatives like aadc.audit_all or aadc.audit_hardcoded_url. No when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_link_reachabilityC
Warn-only check that external links referenced in content are reachable and not dead. Standards 4, 6.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey all behavioral traits. It states it is 'warn-only,' implying no destructive action, but lacks details on network access requirements, error handling for unreachable links, or what constitutes a warning. Missing context on how 'Standards 4, 6' affect behavior.
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 a single concise sentence that front-loads the key behavior ('Warn-only check'). However, the mention of 'Standards 4, 6' may be unclear without expanding on what those standards entail. No unnecessary words.
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 low complexity (2 optional parameters, no required params) and presence of sibling audit tools, the description provides the core purpose but lacks details about the output format and how results are returned. Since there is no output schema, the description should at least hint at the return value (e.g., list of dead links).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no additional parameter information beyond what the schema already provides. The schema itself describes projectRoot and allowlists adequately.
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 performs a 'warn-only check' for 'external links referenced in content are reachable and not dead.' It references 'Standards 4, 6,' which provides additional context but is somewhat cryptic. The purpose is distinct from sibling audit tools, though it does not explicitly differentiate.
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?
No guidance on when to use this tool versus other audit tools like aadc.audit_all or aadc.audit_hardcoded_url. The description does not mention prerequisites, when not to use it, or alternatives. The 'warn-only' hint is the only usage insight.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_network_isolationC
Audit declared protected paths (microphone, camera, on-device-only data) for any network API import. Standard 8.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility for behavioral disclosure. It only states the audit action without detailing side effects, permissions, or output, leaving significant gaps.
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?
Description is a single sentence, very concise but lacks necessary details. It front-loads the purpose but is too brief to be fully informative.
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 absence of annotations and output schema, the description should provide more context. It fails to explain the audit process, the role of allowlists, or what the output represents, making it incomplete.
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 both parameters. The tool description adds no additional meaning beyond the schema; it only mentions Standard 8 which does not relate to parameters.
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?
Description clearly states it audits protected paths (microphone, camera, on-device-only data) for network API imports and mentions Standard 8. However, it does not distinguish from sibling audit tools like aadc.audit_all or aadc.audit_defaults.
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?
No guidance on when to use this tool versus alternatives. The description lacks context on when to apply this audit or when not to, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_permissionsB
Audit native iOS Info.plist and Android AndroidManifest.xml for any permission outside the AADC-safe allowlist. Standards 8, 10.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the tool audits for permissions outside an allowlist, implying a read-only operation. With no annotations provided, the description carries the full burden, but it lacks details on error handling, file existence assumptions, or side effects. It is minimally adequate.
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 a single sentence that conveys the core purpose and scope. It is concise and front-loaded, but could be slightly more structured without adding length.
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 tool has two optional parameters and no output schema. The description explains the input files and allowlist concept but does not describe return values or error handling. It is adequate for a simple audit tool but lacks completeness for an agent to fully understand behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters adequately described in the schema. The description does not add extra meaning beyond what the schema provides, so a baseline score of 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 identifies the tool's purpose: auditing native iOS Info.plist and Android AndroidManifest.xml for permissions outside an allowlist. It also references standards 8 and 10. However, it does not explicitly differentiate from sibling audit tools, though the specific file types provide some distinction.
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 does not provide guidance on when to use this tool versus other audit tools (e.g., audit_all, audit_defaults). No when-not-to-use or alternative suggestions are given. The agent would need to infer usage from the tool's specific focus on permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_placeholdersC
Scan for unreplaced placeholder content (lorem ipsum, TODO copy, dummy text) in shipped user-facing strings. Standards 4, 6.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. It mentions scanning in 'shipped user-facing strings' but does not clarify if the tool is read-only, destructive, or any side effects. The description lacks details on behavior beyond the scan action.
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 a single concise sentence that covers the core purpose. It is front-loaded and direct, though it could benefit from a slight structure like listing the placeholders checked.
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 has 2 parameters (including a nested object) and no output schema, the description should explain what the tool returns or how to interpret results. It does not mention output format, error conditions, or help for the allowlists parameter, leaving gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds no additional meaning beyond what is in the schema. Baseline of 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 scans for unreplaced placeholder content like lorem ipsum, TODO copy, and dummy text, and references standards 4 and 6. However, it does not explicitly differentiate from sibling tools like audit_all or audit_defaults.
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 no guidance on when to use this tool versus alternatives, no exclusions, and no context about prerequisites or typical use cases. It only states what it does, not when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_policy_mentions_sdksA
Warn-only check that the privacy policy names every external-service SDK the app depends on. Standards 4, 9.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states it is a 'Warn-only check', which indicates non-destructive behavior. However, with no annotations provided, it fails to disclose other behavioral traits such as what happens if the policy is missing, how SDK dependencies are detected, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that clearly conveys the tool's purpose without extraneous information. Every part 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?
The description is adequate for a simple audit check with only two parameters. However, it lacks details about what 'Standards 4, 9' refer to and does not explain the return format or behavior when issues are found. Could be more complete.
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 both parameters (projectRoot, allowlists). The description adds context ('privacy policy', 'external-service SDKs') but does not enhance understanding 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 it is a 'Warn-only check that the privacy policy names every external-service SDK the app depends on', providing a specific verb (check) and resource (privacy policy vs SDKs). It also references 'Standards 4, 9' which differentiates it from other audit tools like 'aadc.audit_sdks' or 'aadc.audit_defaults'.
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 usage contexts (privacy policy checks) but provides no explicit guidance on when to use this tool versus alternatives (e.g., 'aadc.audit_sdks') or when not to use it. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_reading_gradeB
Audit user-facing copy for reading grade above the age-appropriate threshold. Standards 4, 11.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states 'audit' (likely non-destructive) but does not disclose whether the tool modifies files, generates reports, or requires specific permissions. Behavioral details like output format or side effects are missing.
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 a single sentence, highly concise. It front-loads the key action and scope, though it could benefit from a brief note on output or return value to improve structure without adding length.
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 should clarify what the tool returns or produces, but it does not. The reference to standards is modestly helpful given sibling tools for reading standards. Overall, the description is adequate but leaves gaps about outputs and deeper context.
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 description does not need to add parameter details. The description does not provide extra meaning beyond the schema, meeting the baseline of 3.
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 purpose: auditing user-facing copy for reading grade above an age-appropriate threshold, referencing specific standards (4, 11). This distinguishes it from sibling audit tools, though the exact meaning of the standards is not elaborated.
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 usage for reading grade audits by naming the action and standards, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. Given the sibling tools list, the agent can infer specialization, but explicit guidance is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_sdksA
Audit dependency manifests (pubspec.yaml, package.json, requirements.txt) for analytics / advertising / tracking SDKs or any dependency outside the allowlist. Standards 5, 9, 12, 13.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states the tool audits for specific SDKs and outside allowlist, but does not disclose whether it modifies files, what happens on success/failure, or other behaviors like output format or error handling. For a tool with no annotations, this is insufficient transparency.
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 a single sentence that efficiently communicates the main action, target files, and what it audits for. It is front-loaded with the verb and resource, and every part is informative with no 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?
Given the tool has 2 parameters (one nested object) and no output schema, the description adequately covers the purpose and what it checks, but lacks details on output format, how the allowlist parameter works, and how it integrates with sibling tools. It is sufficient but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add meaning beyond the parameter names and schema descriptions. It does not explain how allowlists work or provide examples, so it adds no extra value over 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 clearly states the verb 'Audit' and the specific resource 'dependency manifests (pubspec.yaml, package.json, requirements.txt)'. It further specifies what it audits for: analytics/advertising/tracking SDKs or any dependency outside the allowlist, distinguishing it from sibling audit tools by its focus on SDKs and allowlists.
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 usage for auditing SDK dependencies against allowlists, referencing Standards 5,9,12,13, but it does not explicitly state when to use this tool versus alternatives like aadc.audit_all or aadc.audit_defaults. There is no guidance on when not to use it or what prerequisites are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_sentry_hygieneB
Audit Sentry error-reporting initialisation for child-data hygiene (PII scrubbing, no session replay). Standards 7, 9.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It does not state whether the tool is read-only, requires specific permissions, or has side effects. The term 'Audit' implies read-only, but this is not explicitly confirmed.
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 a single, front-loaded sentence that conveys the essential purpose without extraneous detail. Every word contributes to meaning, making it highly concise and 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?
Given the tool's simplicity (2 optional params, no output schema, no annotations), the description covers the core purpose but lacks details on return format, behavior, or how to interpret results. It is adequate but not comprehensive.
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% coverage, describing both parameters adequately. The description adds marginal value by referencing 'Standards 7, 9' but does not elaborate on parameter usage or provide semantic meaning 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 clearly states the tool audits 'Sentry error-reporting initialisation for child-data hygiene' with specific concerns (PII scrubbing, no session replay) and references 'Standards 7, 9'. This distinguishes it from sibling audit tools that target different resources or standards.
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 no guidance on when to use this tool over sibling audit tools (e.g., audit_all, audit_sdks) or any prerequisites. It only states what the tool does without contextual usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.audit_volume_capB
Verify every audio/video player declares an explicit volume cap. Standards 1, 14.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | No | Absolute path to the target project root. Defaults to the current working directory. | |
| allowlists | No | Per-language allowlist overrides (e.g. ios, android, flutter, npm, python, protectedPaths). Each value is an array of strings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose whether the tool modifies files, requires permissions, or handles non-compliance. The audit nature implies read-only behavior, but this is not explicitly stated, leaving ambiguity.
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 a single, concise sentence that quickly conveys the tool's purpose. It is front-loaded and contains no redundant information, earning 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 tool with no output schema and standard parameters, the description sufficiently covers the audit purpose. However, it could be more complete by indicating what the tool returns (e.g., a report of violations or success) or how failures are handled. Slight gap given absence of output schema.
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 both parameters, so the baseline is 3. The description adds no additional meaning beyond what the schema already provides (projectRoot and allowlists are self-explanatory).
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 verifies that every audio/video player declares an explicit volume cap, referencing specific standards (1 and 14). It uses a specific verb ('verify') and resource ('audio/video player volume cap'), distinguishing it from sibling audit tools like audit_network_isolation or audit_hardcoded_url.
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 no guidance on when to use this tool versus alternatives, such as other audit tools. It does not specify prerequisites, exclusions, or situational context, leaving the agent without decision-making support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.list_standardsA
Return the 15 AADC standards with their one-line statutory summaries. Use this as a reference when filling in a conformance statement.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the tool returns 15 standards with one-line summaries, implying it is a read-only operation. It does not mention format or performance, but for a simple list tool, it is sufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with zero wasted words. The main action ('Return the 15 AADC standards') is front-loaded, and usage guidance is provided succinctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with no parameters and no output schema, the description provides all necessary information: what is returned (15 standards with one-line summaries) and when to use it (filling conformance statements). No gaps.
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?
There are zero parameters, so schema coverage is 100%. The description adds no parameter information because none is needed, meeting the baseline expectation for a parameterless tool.
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 it returns 'the 15 AADC standards with their one-line statutory summaries', using a specific verb ('Return') and resource ('AADC standards'). It distinguishes from sibling tools like aadc.read_standard, which likely returns a single standard, and audit tools that perform different actions.
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 advises using this tool 'as a reference when filling in a conformance statement', providing clear usage context. It does not explicitly state when not to use it or name alternatives, but the sibling context implicitly covers that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aadc.read_standardA
Return the full ICO-published text of one AADC standard by number (1-15). Use this when you need the verbatim wording for a conformance statement or DPIA.
| Name | Required | Description | Default |
|---|---|---|---|
| number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It implies a read-only operation by stating 'return the full text,' but does not explicitly declare it as non-destructive or disclose any side effects. Adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and resource. Every word adds value; no fluff. Ideal conciseness for a simple tool.
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 simplicity (one parameter, no output schema), the description is complete enough: it explains purpose, parameter range, and usage. Could note return format (text string), but not essential.
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 0%, so the description adds crucial meaning: 'by number (1-15)' matches schema constraints and clarifies the parameter's role. It explains what the number represents (the standard number), going beyond the bare 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 clearly states the action (return full text) and resource (AADC standard by number 1-15). It distinguishes from sibling tools implicitly by specifying retrieval of full text, while a sibling lists standards.
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?
Explicit usage context is provided: 'Use this when you need the verbatim wording for a conformance statement or DPIA.' This gives clear guidance, though it does not mention when not to use it or alternative tools.
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.
15 tool updates
v0.3.0- First observed
aadc.audit_all - First observed
aadc.audit_defaults - First observed
aadc.audit_hardcoded_url - First observed
aadc.audit_launchurl - First observed
aadc.audit_link_reachability - First observed
aadc.audit_network_isolation - First observed
aadc.audit_permissions - First observed
aadc.audit_placeholders - First observed
aadc.audit_policy_mentions_sdks - First observed
aadc.audit_reading_grade - First observed
aadc.audit_sdks - First observed
aadc.audit_sentry_hygiene - First observed
aadc.audit_volume_cap - First observed
aadc.list_standards - First observed
aadc.read_standard
TDQS
Scored across 15 tools
Each audit tool targets a distinct compliance check (e.g., hardcoded URLs, permissions, SDKs), and the two reference tools serve unique non-audit purposes. No two tools overlap in function.
All tools follow the 'aadc.audit_<topic>' pattern in snake_case, with reference tools using 'aadc.list_standards' and 'aadc.read_standard'. The naming is uniform and predictable.
With 15 tools covering 13 distinct audits plus two reference tools, the count is well-scoped for a compliance auditing server. Each tool earns its place without bloat.
The server covers major AADC audit areas (defaults, URLs, permissions, SDKs, etc.) and includes a full scan tool. Reference tools for standards complete the surface. No obvious gaps for its stated purpose.
Maintenance
Related MCP Connectors
Scan any MCP server for tool-poisoning, security, auth & license. Trust score before install.
Conformance checker for MCP servers. Free, no key, verdicts recomputable and re-measured daily.
MCP Spec Compliance MCP — audits any MCP server.json against the official Model Context Protocol
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for children's privacy compliance, enabling checks under COPPA, FERPA, UK Age Appropriate Design Code, and EU AI Act provisions for minors.62 PyPI1MIT

gridwork-privacyofficial
AlicenseAqualityDmaintenanceMCP server that audits websites for GDPR, CCPA, and ePrivacy compliance.428 npm1MIT- AlicenseNot gradedqualityCmaintenanceMCP server for UK AI Bill 2026 compliance, implementing a 5-principles framework (Safety, Transparency, Fairness, Accountability, Contestability) to help audit and classify AI systems.MIT
- AlicenseAqualityBmaintenanceA local-first MCP server that scores your codebase's Build Readiness by reading code and running tests on your machine, outputting a diligence-grade score and risk register without uploading your source.563 npmApache 2.0