PrivacyOps
Use PrivacyOps to track credit-report disputes locally, calculate response deadlines, draft dispute letters, and inspect module/settings information.
List, filter, page, and retrieve dispute records, including status, dates, letters, and history.
Create and update disputes, set sent dates, add notes, and record every change in history.
View open disputes with statutory deadlines, days remaining, overdue flags, next actions, sources, and known unknowns.
Generate CRA or furnisher dispute letters from fixed templates into local text files, optionally attaching them to a dispute.
View letter templates, checked agency contact details, and the legal disclaimer.
Preview and delete dispute records with approval; letter files are not deleted.
Inspect enabled modules, available tools, data folder, config file, skills, and disclaimer.
Keep records local: no outbound network calls, telemetry, API keys, or Social Security numbers.
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., "@PrivacyOpsadd an Equifax dispute for a late payment I sent yesterday and tell me the deadline"
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.
PrivacyOps
Made by Seaynic Labs. Need tools like this built around your own systems? We do that.
PrivacyOps lets an AI assistant track your credit-report disputes and draft dispute letters, with every record kept in a file on your own computer. It works out the statutory response deadline for each open dispute, and it ships skills that walk you through a dispute from gathering facts to following up.
Not legal advice. PrivacyOps is a tracking and drafting aid. It does not know your facts or the law in your state. The letter templates have not been reviewed by a lawyer. For legal questions, ask a lawyer or a consumer-protection agency.
Security card | |
Network | None. PrivacyOps makes no outbound network calls and has no telemetry. Only |
Files | Reads its config file ( |
Secrets | PrivacyOps stores no passwords or API keys and has no tool that takes one. It never asks for a Social Security number. |
Read-only tools | 5: |
Writes on this computer |
|
Needs your approval |
|
Startup cost | about 5,900 tokens (9 tools, 2 skill prompts) |
Changes | Tool descriptions are locked by hash ( |
It is a bundle: tools, skills and instructions in one install. The tools are one server made of modules. You switch on the modules you use. New modules arrive switched off, so an update never changes what your assistant can do until you choose to.
Module | What it does | Status |
| Track disputes with consumer reporting agencies (Equifax, Experian, TransUnion) and with furnishers (the companies that report to them): status, sent dates, response deadlines, and a history of changes | 0.2 |
| Dispute letters from two fixed templates, saved as text files on your computer | 0.1 |
Planned, not built: data-broker opt-outs and credit-freeze tools. These are ideas, not commitments.
Audience: consumers who want their own record of disputes and clear letters. PrivacyOps is not for lawyers, credit repair businesses, or anyone handling other people's identity information.
Skills
Skills are short guides your assistant reads before it does a job. PrivacyOps ships two, in two forms from one source: a skills/ folder for apps that read Agent Skills (Claude Code and others), and MCP prompts for every other MCP app.
Skill | What it covers | By |
| Setup, the data folder, settings, | Seaynic Labs, MIT |
| Gathering facts, choosing the agency or company route, certified mail, deadlines, follow-up, and when to get help | Seaynic Labs, MIT |
No third-party skills ship with PrivacyOps. See CREDITS.md.
Related MCP server: filesystem-mcp
What stays on your computer
Dispute records are kept in one JSON file in your data folder. Default:
~/.local/share/privacyops/privacyops.json. SetPRIVACYOPS_DATA_DIRto choose another folder.Letters are saved as Markdown text files in
letters/inside that folder.Approval decisions for deletes are appended to
~/.local/state/privacyops/approvals.jsonl: ids and decisions only.Nothing is sent to Seaynic Labs or to any other service. PrivacyOps makes no outbound network calls.
The files are created readable only by you (mode
0600), but they are not encrypted. Anyone with access to your account can read them. Keep the folder out of shared or synced folders you do not control.Your AI assistant can see what you type into the chat, and so can the company that runs it. PrivacyOps cannot change that.
PrivacyOps never asks for a Social Security number. If a bureau asks for identifying numbers, you write them in by hand on the printed letter.
Install
PrivacyOps needs Python 3.11 or newer. With uv you do not install anything ahead of time:
uvx privacyops-mcp --version
uvx privacyops-mcp --doctor # checks your data folder and records, prints fixesPin the exact version if you want updates only when you choose them: uvx privacyops-mcp==0.2.2.
Or with pip:
pip install privacyops-mcpAs a Claude Code plugin (server and skills in one step, once the seayniclabs/plugins marketplace lists PrivacyOps):
/plugin marketplace add seayniclabs/plugins
/plugin install privacyops@seayniclabsUninstalling with pip uninstall privacyops-mcp removes the program only. Your records and letters stay in the data folder. Delete that folder yourself if you want them gone.
Settings
PrivacyOps starts without any settings. The defaults are safe.
Variable | Module | What it does |
| all | Folder for your records and letters. Default |
| disputes |
|
| all | Path of the approval log. Default |
| any |
|
Config file (optional). PrivacyOps also reads ~/.config/privacyops/config.toml, or the file named by PRIVACYOPS_CONFIG. Environment variables win over the file.
data_dir = "/Users/you/Documents/privacyops"
[disputes]
allow_delete = false
[letters]
enabled = trueAdd it to your MCP client
Most clients use the same JSON shape. Put it where your client keeps MCP servers:
{
"mcpServers": {
"privacyops": {
"command": "uvx",
"args": ["privacyops-mcp"],
"env": {
"PRIVACYOPS_DATA_DIR": "/Users/you/Documents/privacyops"
}
}
}
}Client | Where the config goes |
Claude Desktop |
|
Claude Code |
|
Cursor |
|
VS Code |
|
Sonique, Hermes, OpenClaw, others | Any client that launches a stdio MCP server: command |
Over HTTP. For clients that connect to a URL instead of launching a process:
privacyops-mcp --transport http --port 8765It serves streamable HTTP at http://127.0.0.1:8765/mcp and listens only on your own machine by default. Put authentication in front of it before exposing it anywhere else.
Try these
Paste one into your assistant once PrivacyOps is set up:
"Open a dispute with Experian about a late payment I made on time, and draft the letter. Don't send anything yet."
"Which of my disputes are overdue, and what should I do next?"
"Walk me through disputing an item on my credit report, one step at a time."
"Show me where my dispute records are stored and what the file contains."
"Delete the dispute for the card issuer, but show me the preview first."
Tools
Tool | What it returns |
| Which modules are on, what each tool does, where your data is, the skills, and the disclaimer. Call this first. |
| Dispute summaries, filtered by status or party type, paged with |
| One dispute with its details, due date, letters written, and history |
| Open disputes with the statutory response deadline for each, days remaining, an overdue flag, the next action, and the facts it cannot know |
| Starts tracking a dispute |
| Changes status, sets the sent date, or adds a note. Every change goes into the history. |
| Deletes a dispute record. Preview first; you approve it. Letter files are not deleted. |
| The templates, the agencies with checked contact details, and the disclaimer |
| Writes a letter to a text file. Attaches it to a dispute if you give its id. |
Every tool returns structured data with a published schema. Errors read privacyops.<module>.<code>: <message> Fix: <hint>.
Response deadlines
disputes_deadlines counts the periods that the statute sets, from the sent date you record:
Consumer reporting agency: the agency must reinvestigate within 30 days of receiving your dispute, 15 U.S.C. 1681i(a)(1)(A). It may extend that by up to 15 days only if you send relevant information during the 30 days, and not if it finds the item inaccurate or cannot verify it in that period, 1681i(a)(1)(B)–(C). Source: https://www.law.cornell.edu/uscode/text/15/1681i
Furnisher (the company that reported the item): a direct dispute must be investigated and answered before the period in 1681i(a)(1) ends, 15 U.S.C. 1681s-2(a)(8)(E)(iii). A dispute an agency forwards follows 1681s-2(b)(2). Source: https://www.law.cornell.edu/uscode/text/15/1681s-2
The tool counts from your sent date. The statute counts from the day the other side receives the dispute, so the real deadline is the same or later. The tool does not know when the letter arrived, whether you sent extra information, or which route a furnisher dispute took, so it says so in each row instead of guessing. The periods were checked against the official text on 2026-10-27.
Letter templates and sources
Both templates are fixed text. Nothing is generated by a model. Each citation was checked against the official statute text on 2026-10-27.
Template | Used for | Cites (15 U.S.C.) | Source |
| Asking a consumer reporting agency to reinvestigate an item | 1681i(a)(1)(A), (a)(5)(A), (a)(6)(A), (a)(7) | |
| Disputing directly with the company that reported the item | 1681s-2(a)(8), (a)(8)(D), (a)(8)(E) |
Contact details are included only where the agency's own site was checked on 2026-10-27:
Agency | Mailing address in letters | Online disputes | Checked |
Equifax | Not published on the official page: fill in by hand | https://www.equifax.com/personal/credit-report-services/credit-dispute/ | 2026-10-27 |
Experian | Experian, Dispute by Mail, P.O. Box 4500, Allen, TX 75013 | https://www.experian.com/disputes/main.html (sign-in required) | 2026-10-27 |
TransUnion | Not verified (the official page returned an error when checked): fill in by hand | Not verified: fill in by hand | not checked |
Check any address against the agency's own website before you mail a letter. Agencies change their addresses.
Safety
PrivacyOps makes no outbound network calls and sends nothing anywhere.
Deleting a dispute record asks you first, through your MCP client's approval prompt. The assistant cannot approve on your behalf. Some clients cannot show approval prompts. In those, deletes are refused unless you set
PRIVACYOPS_DISPUTES_ALLOW_DELETE=true.Every delete decision (asked, approved, declined, refused) is appended to the approval log with the dispute id. The log never holds names, item text, reasons, notes or letter text.
Writes never delete other records. A failed save leaves the previous file unchanged, and an unreadable file is never overwritten.
The disclaimer appears in the server's instructions, in
privacyops_modules, in every skill, and in every letter's footer.
Check your setup
uvx privacyops-mcp --doctorDoctor reads your data folder, records file, letter folder and approval log. It prints ok or FIX for each item, with the step to take, and exits 1 when something needs fixing. It makes no network calls and changes no files.
Develop
uv venv -p 3.11 && uv pip install -e '.[dev]'
.venv/bin/pytest
python3 scripts/check_skills.py
.venv/bin/python scripts/tool_lock.py --check
.venv/bin/python scripts/security_card.py --checkThe tests use temporary data folders and make no network calls. scripts/tool_lock.py (without --check) rewrites the lock after a deliberate change to a tool, prompt or the instructions. Add a changelog line in the same change.
Security
Report a vulnerability privately through GitHub (Security tab, "Report a vulnerability"). See SECURITY.md.
License
MIT. Published by Seaynic Labs.
Built by Seaynic Labs. We build tools like this around a business's own systems: local-first, with a person approving every change. See custom integrations.
Available Tools
9 toolsdisputes_createC
Start tracking a dispute. party_type is consumer_reporting_agency or furnisher. Use the item's description, not full account numbers.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| status | No | draft | |
| sent_date | No | ||
| party_name | Yes | ||
| party_type | Yes | ||
| item_description | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| reason | No | |
| status | Yes | |
| history | No | |
| due_date | No | |
| due_note | Yes | |
| sent_date | No | |
| created_at | Yes | |
| party_name | Yes | |
| party_type | Yes | |
| updated_at | Yes | |
| letter_files | No | |
| item_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-readonly, non-destructive, non-idempotent, closed-world mutation. The description adds a useful privacy/safety instruction about not using full account numbers, but does not explain side effects, permissions, or what happens to duplicate submissions despite the non-idempotent hint.
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 short sentences with the purpose stated first and the parameter guidance second. It is efficient, though the second sentence mixes two separate constraints in a way that could be clearer.
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?
An output schema exists, so return values need not be explained. However, for a six-parameter creation tool with 0% schema description coverage, the description is too thin: it does not document most parameters, defaults such as status='draft,' or behavioral expectations around the create operation.
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 0%, so the description must compensate. It only addresses party_type values and item_description content; party_name, reason, status, and sent_date are left undocumented, and party_type enum values are already present in 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 says 'Start tracking a dispute,' which conveys creation of a dispute record. It is reasonably clear as a distinct action from list/get/update/delete siblings, though 'start tracking' is softer and less precise than 'create.'
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 gives a narrow data-entry guideline ('use the item's description, not full account numbers') but does not explain when to use this tool versus disputes_update, disputes_get, or other siblings. No exclusions or alternative routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disputes_deadlinesARead-only
Open disputes (draft, sent, response_received) with the statutory response deadline for each. An agency must reinvestigate within 30 days of receiving the dispute, 15 U.S.C. 1681i(a)(1)(A) (https://www.law.cornell.edu/uscode/text/15/1681i). A furnisher must report results before that period ends, 15 U.S.C. 1681s-2(a)(8)(E)(iii) and (b)(2) (https://www.law.cornell.edu/uscode/text/15/1681s-2). Counted from the sent date you recorded, so the real date is the same or later. Returns days remaining, an overdue flag (past the 30-day date), the next action, and the facts the tool cannot know (the start of the clock, the 15-day extension, a furnisher's extension). Not legal advice. Set as_of (YYYY-MM-DD) to check another day. Page with offset=<next_offset>.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| as_of | Yes | |
| sources | Yes | |
| disputes | Yes | |
| has_more | Yes | |
| disclaimer | Yes | |
| open_total | Yes | |
| next_offset | No | |
| overdue_total | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: it explains the deadline is counted from the recorded sent date so the real date is the same or later, and it explicitly discloses what the tool cannot know (clock start, 15-day extension, furnisher extension), plus a 'not legal advice' caveat. That is exactly the kind of computed-estimate limitation an agent needs before presenting results.
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?
Front-loaded with the core purpose and output contract, and the operational notes (as_of, paging) sit at the end where they belong. The two full statutory citations with URLs are long but arguably earn their place by grounding the 30-day rule; they could be compressed.
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?
An output schema exists, so the description need not explain return values, yet it still names the key fields and the limitations of the computation. The main residual gap is the undocumented limit parameter and the absence of explicit sibling routing.
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 0% across three parameters. The description compensates for as_of (YYYY-MM-DD format, purpose of checking another day) and offset (paging via next_offset) but never explains limit or its default of 20, so the coverage gap is only partially closed.
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+resource (returns open disputes in draft/sent/response_received states with their statutory response deadline) and enumerates the outputs: days remaining, overdue flag, next action. It is clearly distinct from a plain list tool, though it never names disputes_list as the alternative, so sibling differentiation is inferred rather than stated.
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?
Usage is implied by the content: check deadlines, pass as_of to evaluate another day, page with offset=<next_offset>. There is no explicit statement of when to use this versus disputes_list or disputes_get, and no when-not guidance, so the agent must infer the routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disputes_deleteADestructiveIdempotent
Delete a dispute record. Without confirm=true this only returns a preview. With confirm=true the person is asked to approve (unless deletes are pre-approved in settings). Letter files on disk are not deleted. The assistant cannot approve on the person's behalf.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| note | No | |
| deleted | Yes | |
| preview | No | |
| approved_by | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say destructive/non-readonly, and the description adds substantially more: the preview-vs-execute split, the approval gate and pre-approval settings override, and the side effect that letter files on disk survive deletion. The assistant's inability to self-approve is a critical, non-obvious behavioral fact that annotations cannot express.
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?
Five short sentences, front-loaded with the action, then the confirm semantics, then the side effects and the approval constraint. No filler and nothing repeated from annotations or schema.
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?
An output schema exists, so return-value explanation is unnecessary. For a destructive, approval-gated operation with two parameters, the description covers the safety model, side effects, and the actor constraint — nothing an agent needs is missing.
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 0%, so the description carries the burden for `confirm`, and it does: default-false means preview, true means request approval. `id` is left implicit, but "a dispute record" makes its meaning evident. Not a full 5 because the description never explicitly ties the two schema fields to the described behavior by name.
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?
Opens with a specific verb+resource: "Delete a dispute record." That alone distinguishes it from every sibling (disputes_list, disputes_get, disputes_create, disputes_update) without needing to name them.
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?
Clearly explains the two-mode workflow: without confirm=true it is only a preview, with confirm=true the person is asked to approve. It also states a hard constraint — the assistant cannot approve on the person's behalf — which is exactly the kind of guidance that prevents misuse. It stops short of saying when deletion is preferable to alternatives, but no sibling is a plausible substitute for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disputes_getBRead-only
The full record for one dispute: details, due date, letters written, and history.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| reason | No | |
| status | Yes | |
| history | No | |
| due_date | No | |
| due_note | Yes | |
| sent_date | No | |
| created_at | Yes | |
| party_name | Yes | |
| party_type | Yes | |
| updated_at | Yes | |
| letter_files | No | |
| item_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds a content preview (letters written, history, due date) that helps an agent judge whether this call returns what it needs, but says nothing about the identifier requirement, not-found behavior, or size of the returned record.
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 compact sentence with the resource front-loaded and the value proposition (what the record contains) immediately after. No filler, though it is a fragment rather than a full sentence.
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?
An output schema exists, so return values need not be spelled out, and annotations cover the read-only profile. For a one-parameter lookup tool the description is close to sufficient; the only missing piece is any statement about the required identifier.
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% for the single required `id` parameter, so the description carries the burden and only implies that one dispute is identified, without stating that `id` is a dispute identifier or its format. The parameter name is largely self-explanatory, which keeps this from being a serious gap.
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?
States a specific retrieval of 'the full record for one dispute' and enumerates the content (details, due date, letters written, history), which distinguishes it from the list-style sibling disputes_list. It never names a sibling outright, so differentiation is inferred from the singular framing rather than stated.
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?
There is no explicit guidance on when to call this versus disputes_list, disputes_deadlines, or disputes_update, and no preconditions or exclusions are given. The only signal is 'one dispute', which weakly implies single-record retrieval by identifier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disputes_listARead-only
List disputes, newest first. Filter by status or party_type. Page with offset=<next_offset>.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No | ||
| party_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| disputes | Yes | |
| has_more | Yes | |
| next_offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real behavioral context by disclosing the sort order (newest first) and the paging convention (feed the response's next_offset back as offset). It stops short of stating page-size behavior or default 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?
Three short sentences with the core purpose and ordering front-loaded, then filters, then paging. No filler and nothing repeated from the schema verbatim.
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 an output schema present, return values need not be explained, and the description covers purpose, filters, and pagination adequately for a four-parameter read-only tool. The only notable omission is the limit parameter and its interaction with paging.
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 0%, so the description must carry parameter meaning. It touches status, party_type, and offset, but says nothing about limit, does not clarify what party_type values represent, and gives no guidance on enum choices, so compensation is only partial.
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?
Starts with a specific verb+resource ("List disputes") and adds ordering ("newest first"), which reads clearly as a collection endpoint distinct from the singular sibling disputes_get. It does not explicitly name or contrast with siblings, so it stays just shy of a 5.
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?
Filtering by status or party_type and paging via offset are presented as the intended usage, which implies when to reach for this tool versus disputes_get. However, there is no explicit statement of when to use this over disputes_deadlines or other dispute siblings, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
disputes_updateA
Change a dispute's status, set its sent date, or add a note. Every change is recorded in history. Setting status to sent without a sent date uses today's date.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| note | No | ||
| status | No | ||
| sent_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| reason | No | |
| status | Yes | |
| history | No | |
| due_date | No | |
| due_note | Yes | |
| sent_date | No | |
| created_at | Yes | |
| party_name | Yes | |
| party_type | Yes | |
| updated_at | Yes | |
| letter_files | No | |
| item_description | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-destructive, non-idempotent, so the safety burden is light. The description still adds real value beyond them: every change is recorded in history (audit trail) and setting status to 'sent' without a date defaults to today.
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?
Three short sentences, front-loaded with the core actions and followed by the two behavioral rules that matter. 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?
With annotations covering the mutation profile and an output schema present, the description sufficiently covers what the tool does and the one surprising default. It could be slightly more complete by noting that only `id` is required and that unspecified fields are left untouched.
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 0%, so the description must carry the parameter burden and largely does: it maps status, sent_date, and note to concrete effects and supplies a non-obvious default rule for sent_date. It never mentions the required `id` or enumerates the status values, leaving small gaps.
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?
States a specific verb ("Change") plus concrete resources: status, sent date, note on a dispute. It is clearly the mutation counterpart to disputes_create/delete/get/list, though it does not name those siblings explicitly.
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?
Usage is implied by the field list (use this to modify an existing dispute rather than create one), but there is no explicit when-to-use/when-not guidance or pointer to siblings such as disputes_create or disputes_delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
letters_generateB
Write a dispute letter from a fixed template to a text file. Your name, address and signature are placeholders to fill in by hand. For a credit agency pass agency_key (equifax, experian, transunion) or recipient_name. Pass dispute_id to attach the letter to a dispute record. Not legal advice.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | ||
| template | Yes | ||
| agency_key | No | ||
| dispute_id | No | ||
| recipient_name | No | ||
| item_description | Yes | ||
| recipient_address | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| text | Yes | |
| template | Yes | |
| letter_id | Yes | |
| recipient | Yes | |
| disclaimer | No | |
| dispute_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false, destructiveHint=false, idempotentHint=false, and the description is consistent with a file-writing operation. It adds real behavioral context that annotations cannot: the letter contains hand-fillable placeholders for name/address/signature, and the 'Not legal advice' caveat. It omits what an agent most needs for a non-idempotent writer: where the file is written and whether repeat calls overwrite or accumulate files.
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?
Four short sentences, purpose stated first, parameter coaching second, disclaimer last; nothing is padded. Density is appropriate for a 7-parameter tool, though the parameter tips could be tightened into one clause.
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?
An output schema exists, so return-value explanation is correctly omitted, and the placeholder caveat covers the biggest interpretive risk. Still incomplete for a mutation tool: the destination/location of the text file and the distinction between the two template values are missing, alongside the undocumented item_description and reason parameters.
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?
With 0% schema description coverage, the description must carry parameter meaning, and it only does so for part of the surface. agency_key, recipient_name and dispute_id are explained with concrete semantics, but item_description, reason and recipient_address receive no explanation at all, and the template enum's two values (cra_dispute, furnisher_dispute) are not distinguished beyond 'fixed template'.
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 first sentence names a specific verb and resource plus the output medium: 'Write a dispute letter from a fixed template to a text file.' That is far more than a restatement of the name and lets an agent distinguish this from a template-listing sibling. It stops short of explicitly naming or contrasting letters_templates, so not a 5.
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?
'For a credit agency pass agency_key (equifax, experian, transunion) or recipient_name' and 'Pass dispute_id to attach the letter to a dispute record' give conditional guidance on choosing inputs. However, nothing states when to call this versus letters_templates, or what happens if neither agency_key nor recipient_name is supplied. Usage is implied by the parameter coaching rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
letters_templatesARead-only
The letter templates, the agencies with checked contact details, and the disclaimer. Read this before generating a letter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| agencies | Yes | Only contact details checked on the official site are shown. |
| templates | Yes | |
| disclaimer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered structurally. The description adds that this is prerequisite context for letter generation, which is useful, but says nothing about response size, whether data is bundled or paged, or how fresh the contact details are.
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 with no filler, and the imperative 'Read this before generating a letter' is placed last where it acts as a call to action. The noun-list opening is slightly dense but every item is 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?
An output schema exists, so return-value details are not the description's burden, and the tool has no parameters to document. The one gap is that it doesn't hint at the shape or volume of the bundled data, but for a zero-arg reference fetch with an output schema this is 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 takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-arg tool applies. The description correctly implies no inputs are required by framing it as a fetch of existing reference data.
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 enumerates the exact resources returned: letter templates, agencies with verified contact details, and the disclaimer. It is clearly distinguishable from the sibling letters_generate (which produces output) since this one is framed as reference data to read first. It lacks an explicit verb like 'retrieve/list', but the enumerated content makes the purpose unambiguous.
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?
'Read this before generating a letter' gives explicit sequencing relative to letters_generate, which is the actionable guidance an agent needs. It does not state when-not to call it or mention alternatives, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
privacyops_modulesBRead-only
Which modules are on, what each tool does, where your data is kept, the skills, and the disclaimer. Pass a module name for its full settings list.
| Name | Required | Description | Default |
|---|---|---|---|
| module | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| skills | Yes | |
| modules | Yes | |
| version | Yes | |
| data_dir | Yes | |
| homepage | No | |
| publisher | No | |
| disclaimer | Yes | |
| config_file | Yes | |
| config_error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered by structured data, not the description. The description contributes the useful nuance that this is a discovery/overview call with an optional drill-down, but says nothing about response shape, cost, or whether module settings include sensitive values.
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 with no filler, and the drill-down instruction is placed second where it belongs. The first sentence is a noun list lacking a verb, which slightly weakens front-loading but costs little in 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?
An output schema exists, so return values need not be described. For a discovery tool whose only parameter is a module name, though, the description never tells the agent how to obtain valid module names — a meaningful gap for a one-parameter lookup where the caller must supply an arbitrary string.
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 0% and the single parameter has no enum, so the description carries the full burden. It does explain the parameter's effect (a module name yields that module's full settings list) and implies behavior when omitted; the notable gap is that no valid module names or format are given.
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 reads as a comma-separated list of content nouns (modules on, tool descriptions, data storage, skills, disclaimer) without a clear verb, so the action is implied rather than stated. It is distinguishable from siblings like disputes_list and letters_generate because nothing about disputes or letters appears, but the agent must infer that this is a meta/discovery endpoint rather than a data query.
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?
'Pass a module name for its full settings list' implies the no-argument vs. with-argument split (overview vs. detail), which is useful context. However, there is no statement of when to call this versus any alternative, no prerequisite info, and no guidance on where to find valid module names.
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.
9 tool updates
v0.2.0- First observed
disputes_create - First observed
disputes_deadlines - First observed
disputes_delete - First observed
disputes_get - First observed
disputes_list - First observed
disputes_update - First observed
letters_generate - First observed
letters_templates - First observed
privacyops_modules
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose: CRUD for disputes, deadline tracking, letter template discovery/generation, and module metadata. The disputes tools are differentiated by action and output focus, and letters_templates vs letters_generate are easy to distinguish.
Most tools follow a consistent resource_action pattern such as disputes_list, disputes_get, disputes_create, and letters_generate. The main deviations are letters_templates (noun rather than verb) and privacyops_modules (meta-tool), but the naming remains predictable and readable.
Nine tools is well-scoped for a dispute-tracking and letter-generation server. Each tool earns its place, with no excessive surface or trivial filler.
The surface covers dispute CRUD, deadline tracking, letter template discovery, letter generation, and module information. Minor gaps exist around managing generated letters or templates, but core workflows are complete.
Maintenance
Related MCP Connectors
Track subscriptions and renewals from your AI chat: schedules, due dates, reminders, local data.
Track budgets from your AI chat: envelopes, monthly limits, variance reports. All data is local.
Safe folder access for ChatGPT and Claude: read, write and search files, risky tools opt-in.
Read and search folders on your own computer with explicit consent. Files are never uploaded.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to track and manage expenses, including adding, viewing, and summarizing expenses by category, date, or amount, with persistent local storage.2-
- AlicenseAqualityFmaintenanceEnables AI assistants to read, write, and manage files on the local system with security features like path restrictions and optional read-only mode.92MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with local documents (PDF, Markdown, TXT) through tools for discovery, reading, extraction, summarization, comparison, keyword extraction, search, and analysis, ensuring privacy and offline capability.-
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered consumer dispute resolution by providing tools for secure evidence storage with confidence scoring, autonomous negotiation, formal dispute notice generation, and consumer rights verification under the Consumer Protection Act.Apache 2.0