Skip to main content
Glama
privacykey
by privacykey

@privacytracker/mcp

Model Context Protocol server for PrivacyTracker. Exposes the local privacy library — apps, privacy labels, change history, AI policy summaries — to any MCP-compatible client (Claude Desktop, Claude Code, Cline, etc.).

This is a read-only proxy. It talks to a running PrivacyTracker instance over its existing HTTP API; it does not touch the SQLite database directly and never mutates state.

Prerequisites

  • A running PrivacyTracker instance (local pnpm dev, Docker, or remote install).

  • Node.js 20 or newer on the machine running the MCP client.

Related MCP server: paycoreDb

Install

You don't need to clone this repo to use the server — every MCP client can spawn it via npx:

npx -y @privacytracker/mcp

For local development from a clone:

pnpm install
pnpm build
node dist/index.js

Configuration

The server reads three environment variables:

Variable

Required

Default

Notes

PRIVACYTRACKER_BASE_URL

no

http://localhost:3000

Origin of the running PrivacyTracker instance. No trailing slash.

PRIVACYTRACKER_ADMIN_TOKEN

conditional

Required when the upstream server has AUDITOR_ADMIN_TOKEN set, OR when the MCP server is reaching it across a non-local hostname. Sent as x-auditor-admin-token on every request.

PRIVACYTRACKER_TIMEOUT_MS

no

30000

Per-request timeout.

A 401 response from the server triggers a clear MCP error explaining which side of the token contract is wrong.

Claude Desktop config

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "privacytracker": {
      "command": "npx",
      "args": ["-y", "@privacytracker/mcp"],
      "env": {
        "PRIVACYTRACKER_BASE_URL": "http://localhost:3000",
        "PRIVACYTRACKER_ADMIN_TOKEN": "..."
      }
    }
  }
}

Restart Claude Desktop and the privacytracker server will appear in the tools menu.

Available tools

All tools are read-only and map 1:1 to existing PrivacyTracker API endpoints.

Tool

Description

list_apps

Every tracked app with identity + change counts. Optional grouped view.

get_app

Full privacy dossier for one app (privacy types, categories, last snapshot, policy summary).

search_apps

iTunes Store search by name and/or bundle id. Returns App Store URLs.

get_changelog

Universal cross-app change feed with filtering (app, time, type, category) and pagination.

get_app_changelog

Full changelog for one app in chronological order.

get_history_stats

Per-quarter category trend and change-event sparkline for one app (Q1 2021 forward).

get_policy_status

Privacy-policy AI run status for one app (idle/running/done/error + log).

get_policy_version_diff

Line+word diff between a policy version and its predecessor.

compare_apps

Side-by-side privacy comparison of two apps (tracked or untracked URL).

get_notifications

30 most recent privacy-change notifications + unread count.

get_sync_status

Background sync scheduler state (running, last/next run, interval).

Available resources

URI

Description

apps://list

Flat JSON list of every tracked app.

app://{appId}

Full privacy dossier for one app. Replace {appId} with the numeric Apple track ID.

Local development

pnpm install
pnpm dev          # tsx watch mode
pnpm typecheck
pnpm test
pnpm lint
pnpm build

To smoke-test against a running PrivacyTracker instance:

PRIVACYTRACKER_BASE_URL=http://localhost:3000 pnpm start

The server speaks JSON-RPC over stdio. Use the MCP Inspector for interactive exploration:

npx @modelcontextprotocol/inspector node dist/index.js

Versioning

This package versions independently of PrivacyTracker itself. Tag a release (v0.x.y) on main and the publish workflow ships it to npm automatically.

License

Apache-2.0. See LICENSE.

Available Tools

11 tools
compare_appsA

Compare the privacy posture of two apps side by side. Each side can be a tracked app (id:) or an untracked App Store URL (url:<...>) which is scraped fresh without persisting.

ParametersJSON Schema
NameRequiredDescriptionDefault
aYesEither `id:<numeric Apple track ID>` for a tracked app or `url:<App Store URL>` for an untracked candidate (scraped fresh, not persisted).
bYes

TDQS

A3.9/5.0
Behavior3/5

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

The description adds a behavioral note that untracked URLs are scraped fresh and not persisted, which is useful. But with no annotations, it does not disclose whether the tool is read-only, if any caching occurs, or what the response looks like, leaving significant gaps for a non-annotated tool.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the main action and object. The second sentence efficiently explains the dual input types with no redundancy or filler, making it appropriately sized and well-structured.

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

Completeness3/5

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

With no output schema and no annotations, the description supplies core input semantics and a side-effect note, but omits what the comparison output includes, error scenarios, or performance caveats. It is adequate for basic invocation but not fully complete given the lack of structured context.

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

Parameters3/5

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

The description essentially restates the input schema's property descriptions (id vs url) without adding new meaning. Since schema coverage is 50% but the existing descriptions are already clear, the description neither enriches nor harms parameter understanding.

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

Purpose5/5

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

The description clearly states the tool compares the privacy posture of two apps side by side, using a specific action ('Compare') and resource ('privacy posture'). It distinguishes itself from siblings like get_app or list_apps, which do not perform comparisons.

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

Usage Guidelines4/5

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

It explicitly describes the two acceptable input types (tracked id vs untracked URL) and their differing behavior, giving clear context for use. However, it does not name alternative tools or state when not to use this tool, so it stops short of a 5.

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

get_appA

Get the full privacy dossier for a single tracked app: identity, privacy types and categories, last snapshot, and policy summary if one has been generated.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe numeric Apple track ID extracted from /id<NNN> in the App Store URL.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states that the tool returns a privacy dossier with specific components, including a conditional policy summary ('if one has been generated'), which adds useful behavioral context. It does not discuss errors or permissions, but the read-only nature is evident from 'Get' and the focus on returning data.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core action and then lists the return contents in a clear, readable format. Every part adds value, with no wasted words.

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

Completeness5/5

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

For a simple single-parameter tool with no output schema, the description is complete. It explains the scope ('single tracked app'), the nature of the data (privacy dossier), the major return fields, and the conditional policy summary. It gives an agent enough information to decide whether to invoke this tool and what to expect from the result.

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

Parameters3/5

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

Schema description coverage is 100%, so the single parameter appId is already fully documented in the schema, including its format and source (App Store URL /id<NNN>). The description does not add parameter-specific semantics beyond referring to 'a single tracked app,' but this is acceptable because the schema already provides the necessary detail. Baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Get') and resource ('full privacy dossier for a single tracked app'), clearly distinguishing it from sibling tools like list_apps or compare_apps. It also enumerates the returned contents (identity, privacy types/categories, last snapshot, policy summary), making the tool's purpose unmistakable.

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

Usage Guidelines4/5

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

The phrase 'for a single tracked app' provides clear context for when to use this tool—when you need details for one app, not a list or comparison. It does not explicitly mention alternatives or exclusions, but the sibling tool names (list_apps, search_apps, compare_apps) make the distinction implicit.

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

get_app_changelogA

Get the full privacy changelog for one app: every snapshot diff (label changes, policy revisions, wayback baselines) in chronological order with the trigger that produced it.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe numeric Apple track ID.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description must disclose behavior itself. It does so by specifying the exact contents of the output (every snapshot diff, including label changes, policy revisions, wayback baselines), the chronological ordering, and the inclusion of the triggering event. It stops short of mentioning potential size limits, error conditions, or data availability caveats, but for a read-only get tool, the core behavior is well described.

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

Conciseness5/5

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

The description is a single, information-dense sentence with no filler words. It front-loads the main action and then efficiently enumerates what the changelog contains and how it is organized. Every clause adds value, making it highly concise while remaining readable.

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

Completeness5/5

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

Given the tool has only one parameter, no annotations, and no output schema, the description carries the burden of explaining the return value. It thoroughly specifies the output contents (all diff types, chronological order, trigger info), giving the agent a complete picture of what to expect. With full parameter documentation in the schema, nothing else is needed for a tool of this simplicity.

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

Parameters3/5

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

The only parameter appId is fully described in the schema as 'The numeric Apple track ID', so schema coverage is 100%. The description adds no additional meaning about the parameter beyond reinforcing that it identifies 'one app', which is already implied. Baseline 3 is appropriate because the schema handles the semantics completely.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'full privacy changelog for one app', then elaborates with specific content (snapshot diffs, label changes, policy revisions, wayback baselines) and ordering (chronological) plus trigger info. This differentiates it from siblings like get_changelog, which likely covers all apps, by explicitly scoping to a single app.

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

Usage Guidelines4/5

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

The description provides clear context: it is for retrieving a comprehensive changelog for a specific app. It implicitly tells the agent when to use this tool (when a detailed, chronological history of an app's privacy changes is needed) but does not explicitly name alternatives or exclusions. The 'for one app' phrasing helps distinguish it from global changelog tools, earning a 4 rather than 3.

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

get_changelogA

Get the universal privacy changelog across every tracked app. Each row is a single change event (added / removed / modified / policy / wayback) with app context. Supports filtering by app, time window, type, and category, with pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoInclusive upper bound on snapshot timestamp (epoch milliseconds).
fromNoInclusive lower bound on snapshot timestamp (epoch milliseconds).
typeNoFilter to specific entry types. OR within the list.
appIdNoRestrict to one tracked app (numeric Apple track ID).
limitNoPage size. Default 100, capped server-side at 500.
offsetNoSkip N rows from the start of the sorted result set.
categoryNoFilter to specific entry categories. OR within the list, AND with `type`.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It explains the row semantics (single change event with app context) and mentions pagination, but it does not disclose whether the operation is read-only, any authentication requirements, rate limits, or ordering behavior. The description adds some useful context beyond the schema but is not fully transparent.

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

Conciseness5/5

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

The description is two sentences with no filler. The first sentence states the core purpose, and the second adds row-level detail and capability highlights. Every clause earns its place, and it is front-loaded with the most important information.

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

Completeness4/5

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

Given the tool has 7 optional parameters, no output schema, and no annotations, the description provides a clear picture of the output (rows of change events) and available filters. It does not explain ordering or default time window, but the schema covers most parameter details. Overall, it is reasonably complete for a read-only list tool, though a bit more detail on sorting or return structure would be helpful.

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

Parameters3/5

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

The input schema has 100% description coverage for all 7 parameters, so the schema already explains each parameter. The description merely lists the filter dimensions (app, time window, type, category) and pagination without adding new meaning or clarifying parameter formats or interactions, so it meets the baseline of 3 without exceeding it.

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

Purpose5/5

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

The description clearly states a specific verb ('Get') and resource ('universal privacy changelog across every tracked app'), and the phrase 'universal' distinguishes it from the sibling tool 'get_app_changelog', which is likely per-app. It also enumerates the event types in each row, removing ambiguity about what is returned.

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

Usage Guidelines3/5

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

The description implies when to use the tool ('Get the universal privacy changelog') and mentions filtering by app, time window, type, and category, but it does not explicitly contrast with alternatives like 'get_app_changelog'. No exclusionary guidance is provided, so while the context is clear, there is no explicit when-not-to-use guidance.

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

get_history_statsA

Get aggregated history stats for one app: per-quarter category trend (added/removed) and a sparkline of change-event counts. Buckets align to calendar quarters from Q1 2021 forward.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe numeric Apple track ID.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It adds useful context like calendar-quarter alignment and the type of outputs, but it does not explicitly state that the operation is read-only or mention any rate limits or error conditions. The 'Get' verb implies safety but doesn't make it explicit.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the verb and resource, and provides precise output details without any fluff. Every word earns its place.

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

Completeness4/5

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

Since there is no output schema, the description does a good job covering the main return components and temporal bucketing. It doesn't mention edge cases like empty results or invalid appId, but it's sufficiently complete for a single-parameter read tool.

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

Parameters3/5

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

The schema fully describes the appId parameter as 'The numeric Apple track ID.' (100% coverage). The tool description adds no additional parameter-level meaning beyond restating the resource context. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly identifies the resource (one app) and the specific outputs (per-quarter category trend with added/removed, and a sparkline of change-event counts). This distinguishes it from siblings like get_changelog that likely return raw events.

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

Usage Guidelines4/5

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

The description implies the tool is for aggregated history stats, but it does not explicitly contrast it with get_changelog or get_app_changelog. It provides clear context without exclusions, so it earns a 4 rather than a 5.

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

get_notificationsA

Get the most recent privacy-change notifications (up to 30) plus the current unread count. Read-only — does not mark anything as read.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool is read-only, does not mark anything as read, and provides the maximum count and unread count. This is adequate for a simple read operation, though it does not mention authentication or rate limits.

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

Conciseness5/5

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

The description is concise and front-loaded, consisting of two sentences that convey all essential information without waste. Every word adds value.

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

Completeness5/5

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

For a simple, parameterless notification retrieval tool without an output schema, the description is complete. It specifies the response content (up to 30 notifications, unread count) and side effects (read-only), which is sufficient for this context.

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

Parameters4/5

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

The tool has zero parameters, so the schema provides no parameter information. The description correctly adds no parameter semantics because there are none, which is appropriate given the baseline of 4 for 0-parameter tools.

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

Purpose5/5

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

The description clearly states the specific action ('Get'), the resource ('privacy-change notifications'), and additional details (up to 30, plus unread count). It is unambiguous and distinct from sibling tools like list_apps or get_changelog.

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

Usage Guidelines3/5

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

The description implies usage for retrieving recent notifications, but it does not explicitly state when to use this tool versus alternatives or mention exclusions. No alternative tools are referenced.

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

get_policy_statusA

Get the privacy-policy AI run status for one app: current run state (idle/running/done/error), start time, last log lines, and whether a structured summary is ready. Use get_app for the actual summary content.

ParametersJSON Schema
NameRequiredDescriptionDefault
appIdYesThe numeric Apple track ID.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It lists the exact data returned (run state, start time, last log lines, summary readiness) and implies a read-only operation. It does not explicitly state side effects or error conditions, but for a status-checking tool this is fairly transparent. A 4 is appropriate because it goes beyond a vague 'get status' and details the output.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the main purpose, and every phrase adds value. It lists the key output fields without clutter and provides a clear pointer to a sibling tool. No wasted words.

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

Completeness5/5

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

Given the tool's simplicity (one parameter, no output schema, no annotations), the description provides a complete picture: it states what the tool does, what fields it returns, and how it relates to get_app. The possible state values (idle/running/done/error) are also included. This is sufficient for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema already describes the only parameter appId as 'The numeric Apple track ID.' Description coverage is 100%, so the schema does the heavy lifting. The description adds no meaningful parameter detail beyond what the schema provides, but it does mention 'for one app,' which aligns with the single parameter. Baseline 3 is correct.

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

Purpose5/5

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

The description clearly states the tool's function: 'Get the privacy-policy AI run status for one app' and enumerates the specific outputs (run state, start time, last log lines, summary ready flag). It also distinguishes itself from the sibling tool get_app by directing users to get_app for the actual summary content.

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

Usage Guidelines5/5

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

The description explicitly mentions an alternative: 'Use get_app for the actual summary content.' This tells the agent when to use this tool (to check status) and when to use a different tool (to fetch the summary), providing clear usage guidance.

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

get_policy_version_diffA

Get a line+word diff between a privacy-policy version and the version immediately before it for the same app. Returns 404 if the given version is the first scrape for its app.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionIdYesThe id of the policy version to diff against its immediate predecessor.

TDQS

A4.2/5.0
Behavior4/5

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

Without annotations, the description adds the key behavioral detail of returning a 404 when the version is the first scrape, and specifies the diff type (line+word). It does not cover other potential traits like auth or rate limits, but for a read-only diff tool this is adequate.

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

Conciseness5/5

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

Two short sentences; the first states the action and scope, the second notes an important edge case. No wasted words.

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

Completeness4/5

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

Given the simple single-parameter tool and no output schema, the description covers purpose, scope, and a key error condition. It lacks explicit output format details, but the 'line+word diff' phrasing gives a general idea.

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

Parameters3/5

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

The only parameter, versionId, has a 100% schema description that already explains its purpose. The description adds no additional parameter semantics beyond the schema.

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

Purpose5/5

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

Description states the specific operation: getting a line+word diff between two consecutive versions of the same app. It clearly distinguishes from siblings like compare_apps (which compares apps) by specifying 'for the same app' and 'immediately before it.'

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

Usage Guidelines4/5

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

The description implies the tool is for viewing changes between adjacent versions, but does not explicitly mention alternatives or when not to use it. Sibling tools like compare_apps exist, but no exclusions are provided.

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

get_sync_statusA

Get the background sync scheduler status: whether it is currently running, when it last ran, when it is next due, and the configured interval.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It clearly discloses the output dimensions (running, last ran, next due, interval), which is helpful. However, it does not mention potential side effects, authentication requirements, or whether the status is real-time or cached. This is acceptable for a simple getter but not deeply transparent.

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

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the operation and resource, then concisely lists all provided status components. There is no unnecessary information or redundancy.

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

Completeness4/5

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

For a parameterless, simple status getter, the description provides enough semantic context about the return content. However, since there is no output schema, it could specify exact response field names or timestamp formats (e.g., ISO 8601) to make it fully complete. The low complexity keeps it adequate.

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

Parameters4/5

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

The tool has zero parameters and schema description coverage is 100% (vacuously). The description does not need to add parameter details, and the baseline for zero parameters is 4. The description adds no parameter-specific meaning, but none is required.

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

Purpose5/5

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

The description clearly states the verb 'Get' and the resource 'background sync scheduler status', and enumerates exactly what information is returned (running state, last run time, next due time, interval). This distinguishes it from sibling tools like get_policy_status and get_history_stats, which target different resources.

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

Usage Guidelines3/5

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

The description implies its use for checking sync health, but does not explicitly state when to use it versus alternatives or mention any exclusions. It lacks guidance like 'use this when you need to verify the scheduler is active' or 'not for checking individual sync errors.'

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

list_appsA

List every app currently tracked in the PrivacyTracker library, with developer, bundle id, change counts, and last-updated timestamps. Optionally returns a grouped view bucketed by dominant privacy category.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupedNoWhen true, returns apps bucketed by their dominant privacy category instead of a flat list.

TDQS

A3.6/5.0
Behavior3/5

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

Since there are no annotations, the description must disclose behavior and does so by listing return fields and the optional grouped view. However, it omits potential behavioral traits such as pagination, sorting, or rate limits, which are relevant for a listing tool.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the primary purpose, and includes the optional grouping in a concise manner. There is no redundant or unnecessary wording.

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

Completeness4/5

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

For a simple list tool, the description covers the operation, return fields, and parameters sufficiently. The absence of an output schema is mitigated by listing the returned data. However, it lacks guidance on alternative tools and edge-case behaviors, which prevents a perfect score.

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

Parameters3/5

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

The only parameter 'grouped' is fully documented in the input schema (100% coverage). The description's phrase 'Optionally returns a grouped view' mirrors the schema without adding new semantic meaning, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states it lists every app in the PrivacyTracker library with specific fields (developer, bundle id, change counts, timestamps). The verb 'List' and scope 'every app' distinguish it from siblings like get_app (single app) and search_apps (filtered search).

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

Usage Guidelines2/5

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

No explicit guidance is provided on when to use this tool versus alternatives. It does not mention that search_apps might be used for filtering or that this tool is the comprehensive listing, leaving the selection criteria to the agent's inference.

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

search_appsA

Search the iTunes Store for App Store entries by name or bundle id. Returns candidate matches with App Store URLs that can be used to add the app to PrivacyTracker. Pass either names or bundleIds (or both).

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNoFree-text app names to search via the iTunes Search API.
countryNoISO 3166-1 alpha-2 country code for the storefront. Defaults to US.
bundleIdsNoiOS bundle identifiers (e.g. "com.apple.mobilemail"). More accurate than name search when known.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full transparency burden. It states that the tool returns candidate matches with App Store URLs, which conveys the search-like, non-exact nature of results and the downstream workflow. It does not detail failure modes or result limits, but these are less critical for a simple read-only search.

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

Conciseness5/5

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

The description is two sentences with no filler. The first sentence gives the core action, and the second adds workflow and parameter-combination guidance. Every sentence earns its place.

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

Completeness4/5

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

For a simple search tool with optional parameters and no output schema, this description is nearly complete: it provides the purpose, return type (candidate matches with App Store URLs), and intended use case. It could elaborate on the structure of each candidate match, but the schema covers parameters and the description is sufficient to invoke the tool correctly.

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

Parameters4/5

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

The input schema already describes all three parameters (100% coverage), but the description adds guidance on combining `names` and `bundleIds` ('Pass either `names` or `bundleIds` (or both)') and clarifies that the returned URLs are for adding to PrivacyTracker. This adds value beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Search') with a clear resource ('iTunes Store for App Store entries') and identifies the key search dimensions (name or bundle id). It also distinguishes the tool from siblings like list_apps or get_app by framing the result as candidate matches for adding to PrivacyTracker.

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

Usage Guidelines4/5

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

The description explains the tool's context: search the App Store to find apps to add to PrivacyTracker. It also instructs to pass either `names` or `bundleIds` (or both). However, it does not explicitly name alternative tools for retrieving existing apps, so it lacks explicit exclusions.

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.

  1. 11 tool updatesv0.1.0
    • First observedcompare_apps
    • First observedget_app
    • First observedget_app_changelog
    • First observedget_changelog
    • First observedget_history_stats
    • First observedget_notifications
    • First observedget_policy_status
    • First observedget_policy_version_diff
    • First observedget_sync_status
    • First observedlist_apps
    • First observedsearch_apps

TDQS

A4.2/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct resource and action. The only possible overlap between get_app and get_policy_status is clarified by descriptions focusing on summary content vs run state.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern (list_, get_, search_, compare_). No mixed conventions or vague verbs.

Tool Count5/5

11 tools cover the full read/analysis surface of a privacy tracker without redundancy. The count fits the domain well.

Completeness4/5

Core workflows (listing, inspecting, changelogs, statistics, policy diffing, comparison) are well covered. Minor gaps include no tool to add/remove tracked apps or mark notifications read, but search_apps supports comparison via URLs.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Self-hosted MCP server for app market intelligence, enabling tools to query app download/revenue estimates, ad intensity proxies, creator mentions, and rank history from local collected data.
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Custom MCP server connected to a read-only SQLite database, exposing a schema resource and a query tool for safe data retrieval.
    -