@privacytracker/mcp
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., "@@privacytracker/mcpwhat's changed in Signal's privacy policy recently?"
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.
@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/mcpFor local development from a clone:
pnpm install
pnpm build
node dist/index.jsConfiguration
The server reads three environment variables:
Variable | Required | Default | Notes |
| no |
| Origin of the running PrivacyTracker instance. No trailing slash. |
| conditional | — | Required when the upstream server has |
| no |
| 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 |
| Every tracked app with identity + change counts. Optional |
| Full privacy dossier for one app (privacy types, categories, last snapshot, policy summary). |
| iTunes Store search by name and/or bundle id. Returns App Store URLs. |
| Universal cross-app change feed with filtering (app, time, type, category) and pagination. |
| Full changelog for one app in chronological order. |
| Per-quarter category trend and change-event sparkline for one app (Q1 2021 forward). |
| Privacy-policy AI run status for one app (idle/running/done/error + log). |
| Line+word diff between a policy version and its predecessor. |
| Side-by-side privacy comparison of two apps (tracked or untracked URL). |
| 30 most recent privacy-change notifications + unread count. |
| Background sync scheduler state (running, last/next run, interval). |
Available resources
URI | Description |
| Flat JSON list of every tracked app. |
| Full privacy dossier for one app. Replace |
Local development
pnpm install
pnpm dev # tsx watch mode
pnpm typecheck
pnpm test
pnpm lint
pnpm buildTo smoke-test against a running PrivacyTracker instance:
PRIVACYTRACKER_BASE_URL=http://localhost:3000 pnpm startThe server speaks JSON-RPC over stdio. Use the MCP Inspector for interactive exploration:
npx @modelcontextprotocol/inspector node dist/index.jsVersioning
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 toolscompare_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.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | Either `id:<numeric Apple track ID>` for a tracked app or `url:<App Store URL>` for an untracked candidate (scraped fresh, not persisted). | |
| b | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The numeric Apple track ID extracted from /id<NNN> in the App Store URL. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The numeric Apple track ID. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive upper bound on snapshot timestamp (epoch milliseconds). | |
| from | No | Inclusive lower bound on snapshot timestamp (epoch milliseconds). | |
| type | No | Filter to specific entry types. OR within the list. | |
| appId | No | Restrict to one tracked app (numeric Apple track ID). | |
| limit | No | Page size. Default 100, capped server-side at 500. | |
| offset | No | Skip N rows from the start of the sorted result set. | |
| category | No | Filter to specific entry categories. OR within the list, AND with `type`. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The numeric Apple track ID. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The numeric Apple track ID. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| versionId | Yes | The id of the policy version to diff against its immediate predecessor. |
TDQS
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.
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.
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.
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.
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.
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.
| 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 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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| grouped | No | When true, returns apps bucketed by their dominant privacy category instead of a flat list. |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| names | No | Free-text app names to search via the iTunes Search API. | |
| country | No | ISO 3166-1 alpha-2 country code for the storefront. Defaults to US. | |
| bundleIds | No | iOS bundle identifiers (e.g. "com.apple.mobilemail"). More accurate than name search when known. |
TDQS
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.
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.
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.
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.
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.
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.
11 tool updates
v0.1.0- First observed
compare_apps - First observed
get_app - First observed
get_app_changelog - First observed
get_changelog - First observed
get_history_stats - First observed
get_notifications - First observed
get_policy_status - First observed
get_policy_version_diff - First observed
get_sync_status - First observed
list_apps - First observed
search_apps
TDQS
Scored across 11 tools
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.
All tools follow a consistent verb_noun snake_case pattern (list_, get_, search_, compare_). No mixed conventions or vague verbs.
11 tools cover the full read/analysis surface of a privacy tracker without redundancy. The count fits the domain well.
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
Related MCP Connectors
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
The official Planning Center MCP server for interacting with your ministry's data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceSelf-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
- FlicenseNot gradedqualityCmaintenanceCustom MCP server connected to a read-only SQLite database, exposing a schema resource and a query tool for safe data retrieval.-
- AlicenseAqualityBmaintenanceA read-only MCP server for querying Timely time tracking data, providing tools for project overviews, time spent summaries, and work log entries.3MIT
- FlicenseNot gradedqualityCmaintenanceA Python MCP server for querying grant applications and previewing or committing scoped reviewer reassignments.-