Skip to main content
Glama

differino-mcp

MCP (Model Context Protocol) server for Differino -- compare PDF, DOCX, and TXT documents from any AI agent.

Setup

1. Install

pnpm add -g differino-mcp

2. Get an API Key

  1. Sign up at differino.com

  2. Go to Settings → API Key

  3. Click Generate Key and copy it

3. Add to Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "differino": {
      "command": "pnpm",
      "args": ["dlx", "differino-mcp"],
      "env": {
        "DIFFERINO_API_KEY": "dfn_your_api_key_here"
      }
    }
  }
}

Local development

From the repository root:

pnpm install
pnpm --dir mcp build

Variable

Required

Description

DIFFERINO_API_KEY

Yes

Your API key -- generate at Settings → API Key

DIFFERINO_URL

No

Base URL (default: https://www.differino.com)

Related MCP server: Docalyze

Tools

compare_documents

Compare two local files and get a diff summary plus the visual document-review manifest when available. This is the only tool that consumes a comparison (your free comparison or 1 credit).

Parameters:

  • file_a_path (required) -- Absolute path to the original document

  • file_b_path (required) -- Absolute path to the modified document

  • comparison_mode (optional) -- visual for full document review, or text for fast text-only comparison (default: visual)

The tool uploads both files, waits for extraction and comparison, and returns a summary with added/removed/modified block counts plus a link to the full comparison. Successful responses include creditsRemaining and freeComparisonRemaining. If the server is still working when the internal wait expires, the response has status: "processing"; poll get_comparison with the returned id until status is ready.

Files up to 45 MB each are supported. Small pairs (up to ~4 MB combined) go through the multipart endpoint; larger files are uploaded automatically via signed upload URLs (POST /api/v1/uploads -> direct PUT to storage -> POST /api/v1/uploads/complete -> compare by version ids). This is transparent: you always just call compare_documents.

Responses include visual artifact metadata when available:

  • comparisonMode: visual or text

  • visual.status: ready, pending, missing, or disabled

  • visual.manifest: the document-review contract when visual.status is ready

    • pages[]: side-by-side page pairs with image URLs and dimensions

    • pages[].regions[]: red/green-ready change regions with leftBox, rightBox, snippets, change type, salience metadata, and a stable groupId

    • regions[].groupId: shared identity for paired change fragments, including changes that cross page boundaries

    • regions[].salience: subtle, visible, structural, or technical, plus salienceReason when available

    • totalChanges and changedPageCount: summary fields for compact controls and optional review navigation; paired fragments with the same groupId count as one change

  • visual.diffUrl: signed URL for the visual diff JSON when available

Agents should treat visual.manifest as the primary surface for professional document review: render the two documents continuously, draw exact inline highlights when coordinates are present, use groupId for selection and synchronized scrolling, and derive center-gutter/minimap markers from the region coordinates. If visual.status is not ready, agents should use the text diff summary and comparison URL instead of assuming there are no visual changes.

Example:

{
  "name": "compare_documents",
  "arguments": {
    "file_a_path": "/docs/contract_v1.pdf",
    "file_b_path": "/docs/contract_v2.pdf",
    "comparison_mode": "visual"
  }
}

get_comparison

Check the status and results of a comparison by its UUID. Returns the same visual artifact contract as compare_documents, with fresh signed URLs. Use it to poll comparisons that returned status: "processing". Free (does not consume credits).

Parameters:

  • comparison_id (required) -- The comparison UUID

list_comparisons

List recent comparisons in your workspace, newest first. Returns id, status, comparisonMode, file_a/file_b name and type, summary counters, created_at, and completed_at for each comparison. Useful to recover a comparison id or check recent activity. Free.

Parameters:

  • limit (optional) -- Maximum results, 1 to 50 (default: 10)

  • status (optional) -- Filter by pending, processing, ready, or failed

Example:

{
  "name": "list_comparisons",
  "arguments": { "limit": 5, "status": "ready" }
}

export_comparison_pdf

Export a finished comparison as a PDF report and get a temporary download URL (valid for about 5 minutes). With wait: true (default) the tool polls the export job every 2 seconds for up to 3 minutes and returns the downloadUrl. Free workspaces get a watermarked PDF; workspaces with credits export without watermark. Free (exports do not consume credits).

Parameters:

  • comparison_id (required) -- The comparison UUID (must have status: "ready")

  • include_unchanged (optional) -- Include unchanged content in the report (default: false)

  • locale (optional) -- Report language: en, es, zh, fr, de, or hi (default: en)

  • wait (optional) -- Poll until the export completes (default: true)

Example:

{
  "name": "export_comparison_pdf",
  "arguments": {
    "comparison_id": "8f14e45f-...",
    "locale": "es",
    "include_unchanged": false
  }
}

summarize_visual_diff

Compact, page-by-page summary of the visual diff: one entry per change group (fragments that share a groupId are deduplicated), with change type, title, salience, and optional text snippets. No image URLs and no pixel coordinates, so it is the cheapest way for an agent to understand what changed and where. Requires a visual comparison with visual.status: "ready". Free.

Parameters:

  • comparison_id (required) -- The comparison UUID

  • min_salience (optional) -- Only include changes at or above this prominence level; order is technical < subtle < visible < structural

  • include_snippets (optional) -- Include snippetA/snippetB excerpts (default: true)

  • max_changes_per_page (optional) -- Cap per page, extra changes are counted as omitted (default: 20)

Example:

{
  "name": "summarize_visual_diff",
  "arguments": {
    "comparison_id": "8f14e45f-...",
    "min_salience": "visible",
    "max_changes_per_page": 10
  }
}

get_text_diff

Fetch the block-level text diff of a finished comparison. Returns the diff summary counters plus the diff blocks: added and removed blocks carry the affected text, modified blocks also carry word-level spans marking exactly which words changed. By default only changed blocks are returned. Best when you need to quote exact text changes. Free.

Parameters:

  • comparison_id (required) -- The comparison UUID (must have status: "ready")

  • only_changed (optional) -- Skip equal blocks (default: true)

  • max_blocks (optional) -- Maximum blocks returned (default: 100)

Example:

{
  "name": "get_text_diff",
  "arguments": { "comparison_id": "8f14e45f-...", "max_blocks": 50 }
}

get_balance

Get the account status of the workspace behind the API key: credit balance, whether the lifetime free comparison is still available, effective plan, and workspace id. Useful before compare_documents or after a [NO_CREDITS] error. Free.

Parameters: none

Example response:

{
  "credits": 42,
  "freeComparisonRemaining": 0,
  "plan": "pro",
  "workspaceId": "3b2f...",
  "buyUrl": "https://www.differino.com/billing?pack=comparino"
}

REST API

The MCP server uses the Differino REST API under the hood. You can also call it directly:

# Compare two SMALL files (multipart body limited to ~4.5 MB total on Vercel)
curl -X POST https://www.differino.com/api/v1/compare \
  -H "Authorization: Bearer dfn_your_api_key" \
  -H "Idempotency-Key: my-unique-key-001" \
  -F "file_a=@original.pdf" \
  -F "file_b=@modified.pdf" \
  -F "comparison_mode=visual" \
  -F "accuracy_mode=balanced"

# Check comparison status
curl https://www.differino.com/api/v1/comparisons/{id} \
  -H "Authorization: Bearer dfn_your_api_key"

# List recent comparisons
curl "https://www.differino.com/api/v1/comparisons?limit=10&status=ready" \
  -H "Authorization: Bearer dfn_your_api_key"

# Account status: credits, free comparison, plan
curl https://www.differino.com/api/v1/me \
  -H "Authorization: Bearer dfn_your_api_key"

# Export a comparison as PDF, then poll for the download URL
curl -X POST https://www.differino.com/api/v1/comparisons/{id}/export \
  -H "Authorization: Bearer dfn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"format": "pdf", "includeUnchanged": false, "locale": "en"}'

curl "https://www.differino.com/api/v1/comparisons/{id}/export?jobId={jobId}" \
  -H "Authorization: Bearer dfn_your_api_key"

Large files: the signed-upload flow

Multipart POST /api/v1/compare is limited to about 4.5 MB of TOTAL request body (Vercel limit); above that it returns 413 PAYLOAD_TOO_LARGE. For files up to 45 MB each, upload directly to storage:

# 1. Init: declare both files, get signed upload URLs + version ids
curl -X POST https://www.differino.com/api/v1/uploads \
  -H "Authorization: Bearer dfn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"fileA": {"name": "original.pdf", "type": "application/pdf", "size": 10485760},
       "fileB": {"name": "modified.pdf", "type": "application/pdf", "size": 11534336}}'

# 2. PUT each file body to its uploadUrl (URLs are valid for 2 hours)
curl -X PUT "{fileA.uploadUrl}" \
  -H "Content-Type: application/pdf" \
  --data-binary @original.pdf
curl -X PUT "{fileB.uploadUrl}" \
  -H "Content-Type: application/pdf" \
  --data-binary @modified.pdf

# 3. Complete: verify the stored objects and queue extraction
curl -X POST https://www.differino.com/api/v1/uploads/complete \
  -H "Authorization: Bearer dfn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"versionIds": ["{fileA.versionId}", "{fileB.versionId}"]}'

# 4. Compare the uploaded versions (JSON body instead of multipart)
curl -X POST https://www.differino.com/api/v1/compare \
  -H "Authorization: Bearer dfn_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"versionAId": "{fileA.versionId}", "versionBId": "{fileB.versionId}", "comparisonMode": "visual"}'

Steps 1-3 are free; only step 4 consumes the free comparison or a credit.

Idempotency

POST /api/v1/compare accepts an optional Idempotency-Key header (up to 200 characters). Repeating a key within your workspace returns the existing comparison (idempotentReplay: true) without charging again. Use it to make retries safe.

Rate limits

All limits are per workspace. Exceeding one returns 429 with code: "RATE_LIMITED", a retryAfter field (seconds), and a Retry-After header.

Endpoint

Limit

POST /api/v1/compare

10 / minute

POST /api/v1/comparisons/{id}/export

20 / hour, plus at most 5 pending/processing export jobs (429 EXPORT_QUEUE_FULL)

GET endpoints (list, get, export status, me)

120 / minute (shared)

POST /api/v1/uploads + /uploads/complete

30 / minute (shared)

accuracy_mode

POST /api/v1/compare accepts an optional accuracy_mode form field:

  • fast -- quickest results, best for plain text and simple layouts (default for comparison_mode=text)

  • balanced -- good accuracy/speed trade-off (default for comparison_mode=visual)

  • thorough -- maximum accuracy for complex layouts, slower

Error codes

HTTP

code

Meaning

400

Invalid request: missing files, unsupported file type, file too large, or invalid parameters

400

INVALID_FILE

File content does not match its extension (magic-byte check), or upload verification failed

400

FILE_TOO_LARGE

Declared file size exceeds the 45 MB per-file limit

400

VERSION_FAILED / VERSION_NOT_PENDING

Referenced version cannot be used (processing failed, or already completed)

401

Missing or invalid API key

402

NO_CREDITS

No free comparison left and no credits remaining; the response includes buyUrl (https://www.differino.com/billing?pack=comparino)

404

VERSION_NOT_FOUND

Comparison, version, or export job not found in your workspace

413

PAYLOAD_TOO_LARGE

Multipart body exceeds ~4.5 MB total; use the signed-upload flow

429

RATE_LIMITED

Rate limit exceeded; retry after retryAfter seconds

429

EXPORT_QUEUE_FULL

More than 5 export jobs pending/processing in your workspace

When present, the code field is machine-readable; the MCP server prefixes it to error messages (for example [NO_CREDITS] No credits remaining...) and appends retryAfter / buyUrl details when the API provides them.

Supported Formats

  • PDF (.pdf)

  • Word (.docx)

  • Plain Text (.txt)

Credits

Every account gets 1 free comparison (lifetime, not monthly). After that, each comparison costs 1 credit. Checking results, listing comparisons, exporting PDFs, and reading diffs are always free. Buy credit packs at differino.com/pricing.

About this repository

This repo contains the source of the differino-mcp npm package: a thin MCP client for the Differino REST API. The Differino comparison engine, web app, and infrastructure are proprietary and not part of this repository. Using the API consumes Differino credits; see pricing.

License

MIT (this MCP client only).

Available Tools

7 tools
compare_documentsA

Compare two documents (PDF, DOCX, or TXT) and see the differences. Reads files from local disk, uploads them to Differino, and returns a text diff summary. Files up to 45 MB each are supported: large files are uploaded automatically via signed upload URLs. Use comparison_mode="visual" for the full document-review manifest with page images, red/green change regions, stable groupId values, and salience metadata; use comparison_mode="text" for faster text-only comparison. If the response has status="processing", the comparison is still running: poll get_comparison with the returned id until status="ready". Consumes the free comparison or 1 credit; the response includes creditsRemaining and freeComparisonRemaining.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_a_pathYesAbsolute path to the original document
file_b_pathYesAbsolute path to the modified document
comparison_modeNovisual for full document review, or text for fast text-only comparisonvisual

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations supplied, the description fully discloses key behaviors: local disk reading, upload to Differino, 45 MB limit, signed URL uploads, credit consumption, async status, and polling. It also explains what each mode returns, including page images and metadata.

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

Conciseness5/5

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

The description is appropriately detailed without fluff; each sentence adds a distinct fact. The first sentence defines purpose, followed by upload process, size, modes, async handling, and cost—logical flow.

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

Completeness5/5

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

Given no output schema or annotations, this description covers all essential operational aspects: file types, size, modes, polling behavior, and credit consumption. It leaves no critical gaps for an agent to invoke the tool successfully.

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

Parameters4/5

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

Schema covers 100% of parameters, so baseline is 3. The description adds meaningful context for comparison_mode by linking 'visual' to a full manifest with page images and 'text' to faster text-only output, plus file size limits beyond the schema. This elevates the value.

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

Purpose5/5

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

Clearly states a specific action: 'Compare two documents (PDF, DOCX, or TXT) and see the differences.' It names supported file types, mentions upload to Differino, and distinguishes from siblings by implying it creates a new comparison rather than retrieving existing ones.

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

Usage Guidelines4/5

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

Provides explicit mode guidance (visual vs text) and directs the agent to poll get_comparison when status is 'processing.' However, it does not explicitly contrast with sibling tools like get_text_diff or list_comparisons, despite the workflow being implied.

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

export_comparison_pdfA

Export a finished comparison as a PDF report and return a temporary download URL (valid for about 5 minutes). With wait=true (default) it polls the export job every 2 seconds for up to 3 minutes and returns { jobId, status: "completed", downloadUrl }. With wait=false it returns { jobId, status } immediately; call again later or poll the REST endpoint to fetch the URL. The comparison must have status="ready". Free workspaces get a watermarked PDF; workspaces with credits export without watermark. Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNoPoll until the export completes (up to 3 minutes) and return the downloadUrl
localeNoLanguage for the report labelsen
comparison_idYesThe comparison UUID
include_unchangedNoInclude unchanged content in the PDF report, not only the changes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does an excellent job. It discloses the 5-minute URL validity, 2-second polling interval, 3-minute timeout, return shapes for both wait values, the readiness prerequisite, watermarking policy based on credits, and the fact that no credits are consumed.

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

Conciseness5/5

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

The description is compact yet information-dense, with no filler. It front-loads the main purpose and then succinctly explains the two wait modes. Each sentence earns its place without redundancy.

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

Completeness5/5

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

Despite having no output schema, the description provides comprehensive context: return objects for both wait settings, prerequisites, polling details, watermark differences, URL expiration, and credit impact. This fully equips an agent to use the tool correctly for a complex export operation.

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

Parameters4/5

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

The schema covers all 4 parameters at 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining the wait parameter in depth (polling behavior, return payloads) and the prerequisite on comparison_id. It does not rehash locale or include_unchanged, which are already self-explanatory in the schema.

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

Purpose5/5

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

The description clearly states a specific verb+resource: "Export a finished comparison as a PDF report and return a temporary download URL." It distinguishes itself from sibling tools (e.g., get_text_diff, summarize_visual_diff) by focusing on PDF export rather than inline diff or summary output.

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

Usage Guidelines4/5

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

The description gives clear usage context: it requires the comparison to have status="ready", and it explains the two wait-mode workflows (blocking with polling vs. immediate return). It does not explicitly name alternative tools or when-not-to-use, but the context is sufficient for correct selection.

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

get_balanceA

Get the account status of the workspace behind the API key: credit balance, whether the lifetime free comparison is still available, effective plan, and workspace id. Use it before compare_documents to know whether a comparison can be paid for, or after a [NO_CREDITS] error to confirm the balance and get the purchase URL. Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses a key behavioral trait: 'Does not consume credits.' It also implies read-only nature and provides context about error handling (NO_CREDITS). This is solid coverage for a simple tool, though it does not mention potential rate limits or other failure modes.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by usage context and a crucial note about credits. It is compact, every sentence adds value, and there is no redundancy.

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

Completeness4/5

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

For a parameterless tool with no output schema, the description sufficiently conveys the return fields and the main use cases. It includes workspace ID, balance, plan, and free comparison status, which are the essentials. It could explicitly list all return fields, but the provided info is sufficient for an agent to understand and invoke the tool.

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

Parameters4/5

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

The tool has zero parameters, and the schema coverage is 100% (empty schema). The description adds value by explaining what the response contains (credit balance, free comparison availability, plan, workspace ID), which is more than the schema provides.

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

Purpose5/5

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

The description clearly states the tool's function: getting account status including credit balance, free comparison availability, plan, and workspace ID. This is specific and distinct from sibling tools like compare_documents or export_comparison_pdf, which focus on document operations.

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

Usage Guidelines4/5

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

Explicit usage guidance is provided: use before compare_documents to ensure payment capability, or after a NO_CREDITS error to confirm balance and obtain a purchase URL. This gives clear context but does not explicitly mention when not to use it relative to other siblings, though the separation is evident from purpose.

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

get_comparisonA

Get the status and results of a specific comparison by its ID, including visual.status and the visual.manifest document-review contract with grouped change identities and salience metadata when visual artifacts are available. Use it to poll a comparison that is still processing, or to re-fetch results (including fresh signed URLs) for an existing comparison. Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
comparison_idYesThe comparison UUID

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that results may include processing status (polling), that signed URLs are refreshed, that visual artifacts may or may not be available, and that the operation does not consume credits. These are meaningful behavioral traits beyond the bare 'get' operation.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and every clause adds useful information. There is no repetition of schema fields or fluff; the second sentence gives actionable usage guidance. Highly concise and well-structured.

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

Completeness5/5

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

For a simple single-parameter tool with no annotations and no output schema, the description covers the key aspects: what it returns (including conditional visual data), when to use it (polling and re-fetching), and cost behavior. It is sufficiently complete for an AI agent to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema fully documents the only parameter (comparison_id as UUID, 100% coverage). The description merely references 'by its ID' without adding any new semantic detail about the parameter itself. Baseline 3 is appropriate because the schema already handles this.

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

Purpose5/5

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

The description opens with a specific verb-resource pair ('Get the status and results of a specific comparison by its ID') and elaborates on the exact contents (visual.status, visual.manifest contract, grouped change identities, salience metadata). This clearly distinguishes it from sibling tools like list_comparisons or get_text_diff.

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

Usage Guidelines4/5

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

The description explicitly states when to use the tool: 'to poll a comparison that is still processing, or to re-fetch results (including fresh signed URLs) for an existing comparison.' It also notes 'Does not consume credits,' which is a relevant selection factor. It does not name alternatives or provide explicit when-not guidance, so it misses the '5' threshold.

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

get_text_diffA

Fetch the block-level text diff of a finished comparison. Returns summary counters plus diff blocks with their content: added and removed blocks carry the affected text, modified blocks also carry word-level spans marking exactly which words changed. By default only changed blocks are returned (only_changed=true); set only_changed=false to include equal blocks for full context. Best when you need to quote exact text changes. Works for both text and visual comparisons. Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_blocksNoMaximum number of blocks to return
only_changedNoReturn only added/removed/modified blocks, skipping equal ones
comparison_idYesThe comparison UUID

TDQS

A4.5/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral disclosure. It describes the return format, default filtering behavior, ability to include equal blocks, support for both text and visual comparisons, and explicitly states 'Does not consume credits.' This goes well beyond the minimal requirement.

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

Conciseness5/5

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

The description is three sentences, front-loaded with the core purpose, then details, then usage guidance. Every sentence contributes unique information with no redundancy or filler.

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

Completeness5/5

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

Despite having no output schema, the description thoroughly explains the return structure and behavior. It covers prerequisites ('finished comparison'), parameter behavior, credit implications, and text vs. visual support, making it complete for an API with 3 well-documented parameters.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds a small amount of value by explaining the default behavior of only_changed and the use case for setting it to false, but it does not provide deeper semantics beyond what the schema already documents.

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

Purpose5/5

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

The description clearly identifies the tool's function: fetching block-level text diff of a finished comparison, including specific output details (summary counters, diff blocks, word-level spans). This distinguishes it from siblings like summarize_visual_diff or get_comparison by focusing on exact text changes.

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

Usage Guidelines4/5

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

The description provides clear usage context with 'Best when you need to quote exact text changes' and notes it works for both text and visual comparisons. It does not explicitly name alternative tools or state when not to use it, but the guidance is sufficient for selection.

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

list_comparisonsA

List recent comparisons in the workspace, newest first. Returns for each comparison: id, status, comparisonMode, file_a/file_b name and type, summary counters, created_at, and completed_at. Use it to find a comparison id when you do not have one, to check recent activity, or to locate unfinished comparisons (status filter). Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of comparisons to return (1-50)
statusNoOnly return comparisons with this status

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses return fields, ordering, status filtering, and that it does not consume credits. It does not mention pagination behavior beyond the limit parameter, but the limit is in the schema, so this is adequate.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose, then details. Every sentence earns its place, and the information density is high without being verbose.

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

Completeness5/5

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

For a simple list tool, the description is complete. It covers the return fields, ordering, status filter, use cases, and credit cost, making it sufficient for an agent to decide when and how to invoke the tool.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already well-documented. The description adds a small note about using status to find unfinished comparisons, but does not add substantive meaning beyond the schema.

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

Purpose5/5

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

The description states the verb ('List'), resource ('comparisons'), and scope ('in the workspace, newest first'). It distinguishes from siblings by focusing on listing recent comparisons vs. getting a single comparison or exporting PDF.

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

Usage Guidelines5/5

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

Explicitly states use cases: 'find a comparison id when you do not have one, to check recent activity, or to locate unfinished comparisons (status filter).' This implies when not to use it (when you already have an id, use get_comparison).

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

summarize_visual_diffA

Compact page-by-page summary of the visual diff of a finished visual comparison: one entry per change group (fragments sharing a groupId are deduplicated), with type, title, salience, and optional text snippets. No image URLs and no pixel coordinates, so it is the cheapest way for an agent to reason about what changed and where. Use min_salience to hide low-prominence changes; prominence order is technical < subtle < visible < structural. Requires visual.status="ready"; for text-mode comparisons use get_text_diff instead. Does not consume credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
min_salienceNoOnly include changes at or above this prominence level
comparison_idYesThe comparison UUID
include_snippetsNoInclude snippetA/snippetB text excerpts for each change
max_changes_per_pageNoMaximum changes listed per page; extra changes are counted as omitted

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses key behavioral traits: deduplication by groupId, no image URLs/coordinates, prerequisite status, and that it does not consume credits. It stops short of error behavior or side effects, but is substantially transparent.

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

Conciseness5/5

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

The description is dense but each sentence earns its place, covering purpose, deduplication, output constraints, salience ordering, prerequisite, alternative, and cost. It is front-loaded with the core purpose and avoids redundancy.

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

Completeness5/5

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

Despite no output schema and no annotations, the description fully specifies what the tool returns (one entry per change group with type, title, salience, snippets), what it omits (image URLs, coordinates), and when it is applicable. This is complete for an agent to decide whether to invoke it.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining min_salience with the prominence order and framing the tool as the cheapest way to reason about changes, which helps parameter selection. The other parameters are well-covered by the schema descriptions.

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

Purpose5/5

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

The description states a specific verb ('summarize') and resource ('visual diff of a finished visual comparison'), and clearly distinguishes from siblings by explicitly naming get_text_diff for text-mode comparisons. It also explains the unique output characteristics (page-by-page, deduplicated groups).

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

Usage Guidelines5/5

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

The description explicitly says when to use it (finished visual comparison, visual.status='ready') and when not to (text-mode comparisons, use get_text_diff instead). It also mentions it is the cheapest way, helping the agent weigh it against alternatives.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.5.1
    • First observedcompare_documents
    • First observedexport_comparison_pdf
    • First observedget_balance
    • First observedget_comparison
    • First observedget_text_diff
    • First observedlist_comparisons
    • First observedsummarize_visual_diff

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: starting comparisons, retrieving status, listing, exporting, summarizing visual diffs, fetching text diffs, and checking account balance. No two tools overlap in scope, and the descriptions make the differences explicit.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., compare_documents, get_comparison, list_comparisons). The verbs are action-oriented and predictable, making it easy to infer what each tool does.

Tool Count5/5

Seven tools is well-scoped for a document comparison server. Each tool addresses a specific part of the workflow (initiate, retrieve, list, export, summarize, text diff, account), with no redundant or unnecessary entries.

Completeness5/5

The tool surface covers the full lifecycle: creating comparisons, polling for status, retrieving results in both text and visual forms, exporting reports, listing history, and managing account credits. There are no obvious missing operations for the stated purpose.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    D
    maintenance
    An efficient MCP server for performing accurate, deep comparisons between JSON objects or strings using the deepdiff engine. It provides AI agents with standardized difference reports, supporting nested structures and various input formats to ensure precise data analysis.
    1
    -
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that lets AI assistants read and visually analyze local documents — PDFs, Excel spreadsheets, CSV files, Word documents, PowerPoint presentations, and images.
    4
    42 npm
    72 PyPI
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for parsing, diffing, and validating Turkish public construction unit price catalogs (ÇŞB birim fiyat) from PDFs, enabling AI agents to compute with structured price data.
    1
    MIT