Skip to main content
Glama
g-digital-by-Garrigues

EAD Factory MCP Server

Official

EAD Factory MCP Server

npm version npm downloads license provenance

MCP server for EAD Factory: qualified evidence, signature, notifications and chat via AI agents.

Quick start

npx -y @g-digital/mcp-ead-factory

Or see ONBOARDING.md for a step-by-step setup guide (≤ 5 minutes).

Related MCP server: ai-economy-infrastructure

Where to install

This MCP is published to every major MCP distribution channel by the g-digital MCP distribution pipeline. Pick whichever fits your stack:

Channel

Install command / URL

npm

npx -y @g-digital/mcp-ead-factorynpmjs.com/package/@g-digital/mcp-ead-factory

Docker Hub

docker pull gdigital/ead-factory:latesthub.docker.com/r/gdigital/ead-factory

MCP Official Registry

Auto-discovered as io.github.g-digital-by-Garrigues/ead-factoryregistry.modelcontextprotocol.io

n8n community node

Install @g-digital/n8n-nodes-ead-factory in n8n Settings → Community Nodes — npmjs.com/package/@g-digital/n8n-nodes-ead-factory

Smithery

smithery mcp install g-digital/ead-factorysmithery.ai/servers/g-digital/ead-factory

Every channel ships the same MCP server contract; the tools and environment configuration below apply regardless of which install path you choose.

Need credentials? Visit: https://digitaltrust.gcloudfactory.com

Installation

Claude Desktop

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Claude Code (CLI)

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Cursor

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Windsurf

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Cline

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

VS Code

{
  "servers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

JetBrains

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Zed

{
  "mcpServers": {
    "ead-factory": {
      "args": [
        "-y",
        "@g-digital/mcp-ead-factory"
      ],
      "command": "npx",
      "env": {
        "MCP_SVC_CLIENT_ID": "<SET_MCP_SVC_CLIENT_ID_HERE>",
        "MCP_SVC_CLIENT_SECRET": "<PASTE_MCP_SVC_CLIENT_SECRET_HERE>",
        "MCP_SVC_TOKEN_URL": "<SET_MCP_SVC_TOKEN_URL_HERE>"
      }
    }
  }
}

Need credentials? See: https://digitaltrust.gcloudfactory.com

Claude Desktop / Claude Code

Add to your ~/.claude.json or claude_desktop_config.json:

{
  "mcpServers": {
    "ead-factory": {
      "command": "npx",
      "args": ["-y", "@g-digital/mcp-ead-factory"],
      "env": {
        "MCP_SVC_TOKEN_URL": "https://your-idp.example.com/oauth2/v1/token",
        "MCP_SVC_CLIENT_ID": "your-client-id",
        "MCP_SVC_CLIENT_SECRET": "your-client-secret"
      }
    }
  }
}

Docker

docker run --rm -i \
  -e MCP_SVC_TOKEN_URL=https://your-idp.example.com/oauth2/v1/token \
  -e MCP_SVC_CLIENT_ID=your-client-id \
  -e MCP_SVC_CLIENT_SECRET=your-client-secret \
  gdigital/ead-factory:latest

Environment Variables

Name

Required

Secret

Description

MCP_ALLOW_INSECURE_FILE_URL

No

No

Set to "true" to allow plain http:// fileUrl downloads in evidence_create (default https-only). Private/internal addresses are rejected regardless (resolution-time check; see the documented DNS TOCTOU limitation in the hosted-deployment runbook).

MCP_ALLOW_UNVERIFIED_BEARER

No

No

Escape hatch for MCP_HTTP_PUBLIC=true WITHOUT inbound-token introspection: set to "true" ONLY when an upstream gateway already verifies Bearer tokens. The server logs a prominent warning and forwards tokens upstream unverified.

MCP_ALLOWED_HOSTS

No

No

Comma-separated allowed Host headers. Empty = Host validation disabled (default). When set, requests with a Host outside the list are rejected.

MCP_ALLOWED_ORIGINS

No

No

Comma-separated allowed browser Origins (DNS-rebinding defense). Empty = reject any request carrying an Origin header; non-browser clients (CLI/SDK) send no Origin and are always allowed. Use '*' to allow all.

MCP_API_BASE_URL

No

No

Gateway ROOT URL (e.g. https://api.int.gcloudfactory.com) — each manager's path prefix is appended automatically; do NOT include a manager path here

MCP_API_BASE_URL_CHAT

No

No

Full base URL override for the chat manager, used as-is (default: https://api.gcloudfactory.com/chat-bot-manager)

MCP_API_BASE_URL_EVIDENCE

No

No

Full base URL override for the evidence manager, used as-is (default: https://api.gcloudfactory.com/digital-trust)

MCP_API_BASE_URL_NOTIFICATION

No

No

Full base URL override for the notification manager, used as-is (default: https://api.gcloudfactory.com/notifications)

MCP_API_BASE_URL_SIGNATURE

No

No

Full base URL override for the signature manager, used as-is (default: https://api.gcloudfactory.com/signature-manager)

MCP_HTTP_HOST

No

No

Interface the HTTP transport binds to. Default 127.0.0.1 (localhost only). Set 0.0.0.0 to expose on all interfaces (containers do this automatically).

MCP_HTTP_MAX_BODY_BYTES

No

No

Maximum accepted POST /mcp request-body size in bytes (default 16777216 = 16 MiB — sized so base64 file uploads within the documented tool limits fit). Oversized requests get a 413 JSON-RPC error before/while reading — closes a memory-exhaustion DoS vector in public deployments. Note: base64 file sources are capped by this limit BEFORE MCP_FILE_MAX_BYTES applies.

MCP_HTTP_PUBLIC

No

No

Set to "true" for public/multi-tenant deployments. Activates Host validation and refuses to start unless (1) MCP_ALLOWED_ORIGINS or MCP_ALLOWED_HOSTS is set AND (2) inbound Bearer introspection is configured (MCP_SVC_INTROSPECT_URL + MCP_SVC_CLIENT_ID/SECRET) or MCP_ALLOW_UNVERIFIED_BEARER=true is set explicitly (fail-closed).

MCP_SVC_CLIENT_ID

Yes

No

OAuth2 client_credentials client ID.

MCP_SVC_CLIENT_SECRET

Yes

Yes

OAuth2 client_credentials client secret. (See https://digitaltrust.gcloudfactory.com for credential acquisition.)

MCP_SVC_INTROSPECT_URL

No

No

RFC 7662 token introspection URL for inbound Bearer verification in HTTP mode. Opt-in, and required when MCP_HTTP_PUBLIC=true. Leave empty for stdio (local) use.

MCP_SVC_SCOPE

No

No

Optional OAuth2 scope for the service-account token request.

MCP_SVC_TOKEN_URL

Yes

No

Token endpoint URL for the OAuth2 client_credentials flow.

PORT

No

No

HTTP port when running in hosted (HTTP) mode; ignored in stdio mode

Variable

Required

Description

MCP_SVC_TOKEN_URL

Required

OAuth2 client_credentials token endpoint URL

MCP_SVC_CLIENT_ID

Required

OAuth2 client ID

MCP_SVC_CLIENT_SECRET

Required

OAuth2 client secret

MCP_SVC_SCOPE

Optional

OAuth2 scope for the token request

MCP_OTEL_ENABLED

Optional

Set to true to enable OpenTelemetry tracing

MCP_API_BASE_URL

Optional

Gateway root URL — each manager's path prefix is appended automatically; use MCP_API_BASE_URL_<MANAGER> for a full per-manager override (used as-is)

Bundled Skills

This package ships Claude Code slash-commands under .claude/commands/. After install, invoke them from Claude Code:

  • /create-internal-evidence — step-by-step workflow guide

  • /create-signature-request — step-by-step workflow guide

  • /create-notification-request — step-by-step workflow guide

See docs/agent-prompts.md for end-to-end prompt examples and the tool sequences they trigger.

Prefer to code against the REST API directly?

You don't have to go through this MCP server. This repo also ships a Claude Code skill — a standalone integration guide (authentication, call ordering, options, enums, gotchas) for programming directly against the REST API:

It is independent of the MCP tools and the n8n node — pick whichever entry point fits your integration.

Available Tools

This server exposes 64 tools:

Tool

Description

evidence_case_file_delete_bulk

Permanently deletes SEVERAL case files in one call. Destructive and not reversible — confirm the caseFileIds first (evidence_case_file_search) and prefer closing a case file via evidence_case_file_status_update when you only need to end work on it.

evidence_case_file_search

Searches case files with optional filters (name, status, dates, pagination). Use to find a caseFileId when you don't have it, or to list what exists before creating a new case file with evidence_case_file_create.

evidence_case_file_create

Creates a new case file — the top-level container for evidence groups, evidence, and reports. Use this first, before any other Evidence-manager tool. No prerequisites. Unlike most create tools, id is CALLER-SUPPLIED (generate a fresh UUID v4 yourself, this API does not assign one) — there is no name field, use title instead. Example: evidence_case_file_create({ id: '', title: 'Q1 2026 audit' }) — use that same id as caseFileId in evidence_group_create.

evidence_case_file_update_bulk

Updates the editable metadata of SEVERAL case files in one call (each entry carries its own caseFileId and changes). Prefer evidence_case_file_update for a single case file. Requires: the caseFileIds of every case file to update (evidence_case_file_search to find them).

evidence_case_file_get

Retrieves a case file's details by id. Use to confirm a case file exists, or to check its status before creating evidence groups or reports under it. Requires: evidence_case_file_create → caseFileId.

evidence_case_file_update

Updates a single case file's editable metadata (e.g. name, description). Requires: evidence_case_file_create or evidence_case_file_search → caseFileId. To change its OPEN/CLOSE lifecycle state use evidence_case_file_status_update instead.

evidence_case_file_relationship_assign

Assigns a relationship on a case file, linking it to an external/related entity reference for traceability. Use after creating the case file when your workflow tracks which matter, client, or system record it belongs to. Requires: evidence_case_file_create → caseFileId.

evidence_case_file_report_preview

Generates an UNSIGNED preview of a case file's evidentiary report so you can check its content before producing the signed version with evidence_case_file_report_generate. Requires: evidence_case_file_create → caseFileId, with sealed evidence groups inside.

evidence_case_file_report_generate

Generates the SIGNED evidentiary report of a case file (the certified document covering its sealed evidence). Returns a reportId — then call evidence_case_file_report_pdf_url_get (PDF) or evidence_case_file_report_zip_url_get (full package) to download. Requires: evidence_case_file_create → caseFileId; preview first with evidence_case_file_report_preview.

evidence_case_file_report_update

Updates a previously generated case-file report's metadata. Requires: evidence_case_file_report_generate → reportId (and the caseFileId it belongs to). Does not re-generate the report content — generate a new report for updated evidence.

evidence_case_file_report_pdf_url_get

Retrieves a download URL for the signed PDF document of a case-file report. Requires: evidence_case_file_report_generate → reportId (plus caseFileId). For the full evidence package (PDF + files + verification data) use evidence_case_file_report_zip_url_get.

evidence_case_file_report_zip_url_get

Retrieves a download URL for the complete ZIP package of a case-file report (signed PDF plus evidence files and verification material). Requires: evidence_case_file_report_generate → reportId (plus caseFileId).

evidence_case_file_status_update

Changes a case file's lifecycle status (OPEN or CLOSE). Use CLOSE when work on the case file is finished and it should no longer accept new evidence groups; reopen with OPEN. Requires: evidence_case_file_create or evidence_case_file_search → caseFileId.

evidence_report_delete

Permanently deletes a generated report by its reportId. Destructive — the signed document and its package stop being downloadable. Requires: evidence_case_file_report_generate → reportId. The underlying case file and its evidence are NOT touched.

evidence_group_evidence_register

Register a new evidence in a group — the first step of a 2-step upload (register, then PUT the file bytes to the returned upload URL). Use for each file you want to add to an OPEN evidence group. Requires: evidence_group_create → evidenceGroupId, evidence_case_file_create → caseFileId, and the file's SHA-256 hash (compute it before calling, or use the evidence_create_sealed composite tool which does this for you). Do not call evidence_group_close until every registered evidence's bytes have been uploaded. Custody type: INTERNAL = EAD Factory stores and custodies the file itself.

evidence_group_evidence_get

Gets one evidence's details (metadata, hash, custody, upload state) inside a specific evidence group. Requires: evidence_case_file_create → caseFileId, evidence_group_create → evidenceGroupId, evidence_group_evidence_register → evidenceId.

evidence_group_evidence_delete

Permanently deletes one evidence from an evidence group. Only makes sense while the group is still OPEN (sealed groups are immutable). Requires: caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId.

evidence_group_evidence_download_url_create

Creates a temporary download URL for an evidence file stored in a group (INTERNAL custody). Use to retrieve the original bytes after upload. Requires: caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId.

evidence_group_evidence_upload_url_create

Creates a fresh presigned upload URL for an ALREADY-REGISTERED evidence in a group — step 2 of the register-then-upload flow (PUT the file bytes to the returned URL). Use when the URL from evidence_group_evidence_register expired or was lost. Requires: caseFileId + evidenceGroupId + evidenceId. evidence_create_sealed does all of this automatically.

evidence_thumbnail_url_get

Retrieves a temporary URL for an image evidence's thumbnail at the requested size — use for quick visual verification without downloading the original file. Requires: caseFileId + evidenceGroupId + evidenceId (image-type evidence only) and a thumbnailSize path value.

evidence_search

Searches evidences across the tenant with optional filters (state, dates, pagination) — not scoped to one group. Use to find an evidenceId or audit what exists; for one group's content use evidence_group_get instead.

generate_evidence

Register a new evidence (legacy top-level name; not scoped to a specific evidence group at creation time, unlike evidence_group_evidence_register). Use for standalone evidence outside the group-based flow, or for continuity with the legacy EAD-Factory-MCP integration. Requires the file's SHA-256 hash. Prefer evidence_create_sealed for a new, complete evidence group + evidence + seal flow. Custody type: INTERNAL = EAD Factory stores and custodies the file itself.

evidence_update_bulk

Updates the editable metadata of SEVERAL evidences in one call (each entry carries its own evidenceId and changes). Prefer evidence_update for a single evidence. Requires: the evidenceIds to update (evidence_search to find them).

get_evidence

Retrieves an evidence record's details and status by id (legacy top-level name). Use to check an evidence's timestamping status (IN_PROCESS / COMPLETED / ERROR) after registration. Requires: generate_evidence or evidence_group_evidence_register → evidenceId.

evidence_delete

Permanently deletes one evidence by evidenceId (no group path needed). Destructive; sealed content should not be deleted — use only for drafts or mis-registered evidence. Requires: evidence_group_evidence_register or generate_evidence → evidenceId.

evidence_update

Updates a single evidence's editable metadata (e.g. name, description) by evidenceId. The file content and hash are immutable — re-register a new evidence for changed files. Requires: evidence_group_evidence_register or generate_evidence → evidenceId.

evidence_download_url_create

Creates a temporary download URL for an evidence's stored file when you only hold the evidenceId (no group path needed — same bytes as evidence_group_evidence_download_url_create). Requires: generate_evidence or evidence_group_evidence_register → evidenceId.

evidence_upload_url_create

Creates a fresh presigned upload URL for an already-registered evidence by evidenceId — step 2 of the register-then-upload flow (PUT the file bytes to the returned URL). Pairs with generate_evidence the way evidence_group_evidence_upload_url_create pairs with evidence_group_evidence_register. Requires: generate_evidence → evidenceId.

evidence_temp_file_upload_url_create

Creates a presigned upload URL for a TEMPORARY file not yet registered as evidence. Use for staging content that another operation will reference; for real evidence prefer the register-then-upload flow (evidence_group_evidence_register) or the evidence_create_sealed composite, which handle registration and upload together.

evidence_multipart_upload_start

Starts a MULTIPART upload session for a large evidence file (returns the upload coordinates for uploading the file in parts). Use when a single presigned PUT is not enough for the file size. Requires: an already-registered evidence (evidence_group_evidence_register or generate_evidence → evidenceId) and the file name.

evidence_group_delete_bulk

Permanently deletes SEVERAL evidence groups of one case file in one call. Destructive — prefer evidence_group_discard for a single group, and never delete sealed groups that back issued reports. Requires: caseFileId + the evidenceGroupIds to delete (evidence_group_search to find them).

evidence_group_create

Creates an evidence group inside a case file — evidence records are always registered inside a group, never standalone (except via the legacy generate_evidence tool). Use when starting a new batch of related evidence (e.g. all files for one incident). Like evidence_case_file_create, id is CALLER-SUPPLIED (generate a fresh UUID v4 yourself). Requires: evidence_case_file_create → caseFileId. Example: evidence_group_create({ id: '', caseFileId, type: 'FILE' }) returns { status: 'OPEN', ... } — use that same id as evidenceGroupId in evidence_group_evidence_register, then evidence_group_close once every evidence in the group has been uploaded.

evidence_group_get

Gets one evidence group's details — status (OPEN/CLOSED), seal information, and its evidences with their upload states. Use to verify every file was uploaded before evidence_group_close, or to check the seal after closing. Requires: caseFileId + evidence_group_create → evidenceGroupId.

evidence_group_discard

Discards (deletes) an OPEN evidence group and its registered evidences — use to abandon a group you no longer intend to seal. Destructive; sealed (CLOSED) groups are immutable evidence and should not be discarded. Requires: caseFileId + evidence_group_create → evidenceGroupId.

evidence_group_update

Updates an evidence group's editable metadata (e.g. name, description). Only meaningful while the group is OPEN — sealed groups are immutable. Requires: caseFileId + evidence_group_create → evidenceGroupId.

evidence_group_close

Seals (closes) an evidence group, triggering qualified timestamping — after this, no more evidence can be added. Use only after every evidence registered in the group has had its file bytes uploaded to the presigned URL from evidence_group_evidence_register. Requires: evidence_group_create → evidenceGroupId, evidence_case_file_create → caseFileId, and the current evidencesCount. ASYNC: the group transitions OPEN → CLOSING → CLOSED; poll evidence_group_get until status is CLOSED before generating a report. Prefer the evidence_create_sealed composite tool for a new group — it registers, uploads, closes, and waits for CLOSED in one call.

evidence_group_search

Searches evidence groups across case files with optional filters (status, dates, pagination). Use to find an evidenceGroupId or list groups pending sealing; for one group's full detail use evidence_group_get.

evidence_group_update_bulk

Updates the editable metadata of SEVERAL evidence groups in one call (each entry carries its own evidenceGroupId and changes). Prefer evidence_group_update for a single group. Requires: the evidenceGroupIds to update (evidence_group_search to find them).

evidence_report_pdf_url_get

Retrieves a download URL for a report's signed PDF when you only hold the reportId (no caseFileId path needed — same document evidence_case_file_report_pdf_url_get returns). Requires: evidence_case_file_report_generate → reportId.

evidence_report_zip_url_get

Retrieves a download URL for a report's complete ZIP package when you only hold the reportId (same package evidence_case_file_report_zip_url_get returns). Requires: evidence_case_file_report_generate → reportId.

create_signature_request

Creates a new signature request — the top-level container for documents and signatories in a signing flow. Use this first, before add_document_to_signature_request. No prerequisites. Example: create_signature_request({ name: 'NDA — Acme Corp', createdBy: 'jane@company.com' }) returns { id, ... } — use the returned id as signatureRequestId in subsequent calls.

add_document_to_signature_request

Adds a document to a signature request — the first step of a 2-step upload (add, then PUT the file bytes to the returned upload URL). Use once per document that needs signing. Requires: create_signature_request → signatureRequestId, and the document's SHA-256 hash (compute it before calling, or use the signature_request_full composite tool). Add signatories with add_signatory_to_document before activating. Signature type: INTERPOSITION = EAD Factory mediates the signing act on the signatory's behalf (e.g. an OTP sent via WhatsApp/SMS) — the signatory needs no software or certificate.

add_signatory_to_document

Adds a signatory (by name + email) to a document within a signature request. Use once per person who needs to sign that specific document. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId. Add all signatories before calling activate_signature_request — signatories cannot be added after activation.

add_validator_to_signatory

Adds a validator to a document's signatory: a person who must approve (validate) that signatory's identity or the document before the signature can proceed. Add validators BEFORE activate_signature_request. Requires: add_document_to_signature_request → documentId, add_signatory_to_document → signatoryId. The signature_request_full composite accepts validators inline.

add_observer_to_document

Adds an observer to a signature request's document: a person who receives read-only visibility of the process and the signed result without signing. Add observers BEFORE activate_signature_request. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId.

activate_signature_request

Activates a signature request, sending signing notifications to every added signatory — after this, no more documents or signatories can be added (use add_validator_to_signatory / add_observer_to_document before activating if you need those roles). Requires: create_signature_request → signatureRequestId, at least one document (add_document_to_signature_request) with its bytes uploaded, and at least one signatory per document (add_signatory_to_document). Prefer signature_request_full for a new request — it creates, adds documents+signatories, and activates in one call.

get_signature_request

Retrieves a signature request's details and status by id (legacy top-level name). Use to check signing progress after activation. Requires: create_signature_request → signatureRequestId.

signature_request_list

List signature requests, optionally filtered by close condition among other criteria. Use to find a request when you don't have its id (e.g. by name or status). Signature-request close condition: ALL_REQUIRED = The request only closes once EVERY signatory has signed.

signature_request_cancel

Cancels an active signature request — no further signing can occur. Use when a request was activated in error or is no longer needed. Requires: create_signature_request → signatureRequestId. Cannot be undone.

signature_certificate_generate

Generates the well-signed appearance certificate document for a signature request. Use once every signatory has signed (check with get_signature_request). Requires: create_signature_request → signatureRequestId. Unlike EAD Enterprise's equivalent tool (a GET that polls an already-generated URL), this triggers generation and returns the result in the same call.

signature_coordinate_set

Sets the on-page (x, y, page) coordinates where a signatory's signature appears on a document. Use after add_signatory_to_document if the signature placement needs to be explicit rather than auto-positioned. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId, add_signatory_to_document → signatoryId.

signature_document_download_url_get

Retrieves the download link for the FINAL, well-signed version of a document — the actual signed file, once every signatory has signed. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId. Use get_signature_request first to confirm signing is complete before calling this. Not to be confused with signature_certificate_generate, which produces a separate appearance certificate document, not the signed document itself.

notification_request_create

Creates a new notification request (draft) — the top-level container for receivers and attachments in a certified-notification flow. Use this first, before any other Notification-manager tool. No prerequisites. Set autosend: true to also send immediately on activation of the first receiver batch, or leave it false to add receivers/documents over several calls before calling notification_request_send yourself. Returns requestId and one notificationId per receiver already on the request (if any were included inline).

notification_request_send

Activates a notification request, triggering delivery to every added receiver across their configured channels. Runs as an MCP Task (bounded-polling until every receiver's notification leaves its in-flight state — EAD Factory's upstream emits no events for this transition). Requires: notification_request_create → requestId, at least one receiver (notification_receiver_add). Use notification_request_status to check progress without waiting for the Task to complete.

notification_request_status

Searches notifications, optionally filtered by requestId and/or delivery state — the closest equivalent to "checking a request's status": a request fans out into one notification per receiver, each with its own state history, so this returns every notification matching the filter with its current state. Omit requestId to search across every request. Requires: notification_request_create → requestId (if filtering to one request).

notification_receiver_add

Adds one or more receivers to a draft notification request — each receiver becomes its own per-channel notification under the shared requestId (there is no separate receiverId; track receivers by the notificationIds this call returns). Use once per batch of receivers before calling notification_request_send. Requires: notification_request_create → requestId. Each receiver's shape depends on its provider (SMTP/SMS/NOTICEMAN/WFB) — see the schema for the fields each variant needs. Notification delivery provider: SMTP = Email delivery.

notification_document_add

Registers one or more document attachments (metadata only — fileName + SHA-256 hash) on a draft notification request. Use once per batch of documents before activating. Requires: notification_request_create → requestId. This only registers metadata; call notification_document_upload_url_create for each registered attachment to get a URL to PUT the actual file bytes to.

notification_document_upload_url_create

Creates a presigned upload URL for a document attachment already registered via notification_document_add — PUT the file bytes to the returned URL. Requires: notification_request_create → requestId, notification_document_add → attachmentId.

notification_document_download_url_create

Creates a presigned download URL for a document attachment on a notification request. Requires: notification_request_create → requestId, notification_document_add → attachmentId.

notification_certificate_generate

Generates a delivery-certificate report for one or more notifications on a request. Use once notification_request_status shows the relevant notifications have left their in-flight state. Requires: notification_request_create → requestId, notification_request_status → notificationIds. Returns a reportId — call notification_certificate_pdf_url_get with it to get the actual download URL (2-step, same shape as Evidence's report tools).

notification_certificate_pdf_url_get

Retrieves the download URL for a previously generated notification delivery certificate. Requires: notification_certificate_generate → reportId.

evidence_create_sealed

Creates (or reuses) an evidence group, registers and uploads one or more files as evidence, then seals (closes) the group — the full flagship evidence flow in one call instead of evidence_group_create + N x (evidence_group_evidence_register + upload) + evidence_group_close. Bounded-polls until the group reaches CLOSED (EAD Factory's upstream emits no events for this transition): task-aware MCP clients get an asynchronous Task; any other client simply receives the final result synchronously. Requires: case_file_create -> caseFileId. Provide evidenceGroupId to add to an existing OPEN group instead of creating one. Each evidence's file uses the shared FileInput contract (local path, base64, https URL, or n8n binary item) — never a bespoke file field. On success returns the group id, its final CLOSED status, and each evidence's id + sha256. Use the atomic evidence_group_create / evidence_group_evidence_register / evidence_group_close tools instead when you need to inspect or react to each intermediate step.

signature_request_full

Creates a signature request, adds one or more documents (each with its own signatories), and activates it — the full flagship signature flow in one call instead of create_signature_request + N x (add_document_to_signature_request + add_signatory_to_document) + activate_signature_request. Each document's file uses the shared FileInput contract (local path, base64, https URL, or n8n binary item) — never a bespoke file field. Set activate: false to leave the request in draft so you can add validators/observers (add_validator_to_signatory, add_observer_to_document) before activating it yourself. On success returns the request id, each document's id, and each signatory's id. Use the atomic tools instead when you need to inspect or react to each intermediate step, or need validators/observers before activation.

ead_factory_help

Returns an overview of EAD Factory's managers (Evidence, Signature, Notification, Chat), their key tools and starting points, and guidance on when to use a composite workflow tool (e.g. evidence_create_sealed) versus the atomic tools. Call this first if you're unsure which tool to use — no credentials needed.

MCP Tasks support

notification_request_send runs as an MCP Task and requires a client with MCP Tasks support — from other clients the call fails; instead, create the request with autosend: true (notification_request_create) and poll notification_request_status yourself.

evidence_create_sealed works from any client: task-aware clients get an asynchronous Task; all others simply receive the final result synchronously.

Coexistence

This MCP server is the current, actively maintained interface for the EAD Factory (Digital Trust) platform.

It coexists safely with any other MCP servers in your setup — it exposes only EAD-Factory-namespaced tools and shares no local state with other servers.

License

MIT — see LICENSE.

Available Tools

64 tools
activate_signature_requestA

Activates a signature request, sending signing notifications to every added signatory — after this, no more documents or signatories can be added (use add_validator_to_signatory / add_observer_to_document before activating if you need those roles). Requires: create_signature_request → signatureRequestId, at least one document (add_document_to_signature_request) with its bytes uploaded, and at least one signatory per document (add_signatory_to_document). Prefer signature_request_full for a new request — it creates, adds documents+signatories, and activates in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
statusNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations are all false/absent, so the description carries the full burden. It discloses that activation sends notifications and permanently prevents adding documents or signatories, which is critical behavioral context beyond the annotations. It also implies the mutation side effects (irreversible lock).

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

Conciseness4/5

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

The description is dense but not bloated; it front-loads the core action and then adds necessary workflow context. Every sentence contributes value, though it could be slightly more concise given the density.

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?

The description covers the full operational context: required prior steps, the effect of activation (notifications sent, lock on additions), and a recommended alternative (signature_request_full). With an output schema present, not explaining return values is acceptable, and the description is complete for an agent to decide and invoke 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?

Schema coverage is 100% for the single parameter (signatureRequestId), and the schema already explains it is a mandatory UUID obtained from create_signature_request. The description repeats this requirement but does not add new parameter-level semantics beyond the schema, so it meets the baseline 3.

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 action ('Activates a signature request, sending signing notifications to every added signatory') and the resource. It distinguishes from siblings by noting the post-activation lock (no more documents or signatories can be added) and by referencing alternative tools for adding roles before activation.

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 provides when-to-use guidance: prerequisites (create_signature_request → signatureRequestId, documents with bytes uploaded, signatories per document) and alternatives (add_validator_to_signatory / add_observer_to_document before activating; prefer signature_request_full for a new request). This clearly differentiates when to use this tool vs siblings.

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

add_document_to_signature_requestA

Adds a document to a signature request — the first step of a 2-step upload (add, then PUT the file bytes to the returned upload URL). Use once per document that needs signing. Requires: create_signature_request → signatureRequestId, and the document's SHA-256 hash (compute it before calling, or use the signature_request_full composite tool). Add signatories with add_signatory_to_document before activating. Signature type: INTERPOSITION = EAD Factory mediates the signing act on the signatory's behalf (e.g. an OTP sent via WhatsApp/SMS) — the signatory needs no software or certificate. | ADVANCED = Advanced electronic signature — the signatory signs directly (signing pad or certificate); a stronger legal tier than INTERPOSITION. | OTHER = A signature type not covered by INTERPOSITION or ADVANCED.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashYes
titleYes
detachedNo
fileSizeNo
filenameYes
metadataNo
providerNo
sequenceNo
evidenceIdNoMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
descriptionNo
convertToPdfNo
signatureTypeYes
certificateFilesNo
signatureDeadlineNo
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
expirationNo

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses the 2-step upload behavior, the need to PUT file bytes to the returned upload URL, the hash prerequisite, and the meaning of each signatureType enum value. Annotations are mostly false booleans, so the description carries the behavioral burden and does so well, though it does not detail side effects beyond the workflow.

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

Conciseness4/5

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

The description is front-loaded with the main purpose and workflow, and every section serves a purpose. The signature type explanations are verbose but valuable for correct enum selection, so the length is justified despite being dense.

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

Completeness3/5

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

The description covers the core workflow, prerequisites, and sibling-tool routing, but the tool has 15 parameters and a complex nested schema. Omitting evidenceId and most optional parameters makes it incomplete for fully correct invocation, even though the output schema likely covers return values.

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 only 13%, so the description must compensate. It adds real meaning for signatureRequestId, hash, and signatureType, but ignores many optional parameters and never mentions evidenceId, which the schema itself labels MANDATORY. It partially compensates but leaves notable gaps.

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 and resource ('Adds a document to a signature request') and clearly frames it as the first step of a 2-step upload workflow. It distinguishes itself from related sibling tools like create_signature_request, add_signatory_to_document, and signature_request_full by naming them in context.

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?

It gives explicit prerequisites (create_signature_request → signatureRequestId, precomputed SHA-256 hash), sequencing (add signatories before activating), and an alternative path (signature_request_full composite tool). It also states 'Use once per document', which is actionable usage guidance.

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

add_observer_to_documentA

Adds an observer to a signature request's document: a person who receives read-only visibility of the process and the signed result without signing. Add observers BEFORE activate_signature_request. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailYes
surnamesNo
documentIdYesMANDATORY. UUID of the document within the signature request. Obtain from add_document_to_signature_request.
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
emailNo
surnamesNo
notificationsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate this is a non-read-only, non-idempotent, non-destructive write operation, and the description's 'Adds' is consistent with that. It adds useful behavioral context beyond the annotations by explaining the observer's read-only visibility, the timing constraint relative to activation, and the required prior calls. There is no contradiction between the description and annotations.

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 tightly packed sentences with no filler. It front-loads the core action and role definition, then gives the critical timing constraint and prerequisites. Every sentence earns its place.

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

Completeness4/5

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

Given the output schema exists, return-value documentation is not needed. The description covers what the tool does, the observer's role, when to call it, and the required prior calls. It is sufficient for an agent to select and invoke the tool correctly, though it could have added more detail about what happens if an observer is added twice or whether an invitation email is sent.

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 only 40%, so the description carries partial burden. It does add meaning for signatureRequestId and documentId by naming the prerequisite calls that produce them, though the schema descriptions already say 'Obtain from create_signature_request' and 'Obtain from add_document_to_signature_request.' It does not meaningfully explain name, email, or surnames beyond the schema, and it does not explicitly map all four required fields to the observer's identity.

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 starts with a specific verb and resource: 'Adds an observer to a signature request's document.' It then defines the observer role as read-only visibility without signing, which clearly distinguishes this from sibling tools like add_signatory_to_document and add_validator_to_signatory. The purpose is unambiguous and scoped.

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 this must happen: 'Add observers BEFORE activate_signature_request.' It also names the required prerequisite chain: create_signature_request → signatureRequestId and add_document_to_signature_request → documentId. It does not explicitly name alternative tools or say 'use this instead of X,' but the 'without signing' phrasing and sequencing provide clear operational context.

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

add_signatory_to_documentA

Adds a signatory (by name + email) to a document within a signature request. Use once per person who needs to sign that specific document. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId. Add all signatories before calling activate_signature_request — signatories cannot be added after activation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailYes
phoneNo
sequenceNo
surnamesNo
documentIdYesMANDATORY. UUID of the document within the signature request. Obtain from add_document_to_signature_request.
coordinatesNo
uniqueValidatorNo
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
emailNo
phoneNo
taxIdNo
metadataNo
roleTypeNo
sequenceNo
surnamesNo
documentIdNo
signaturesNo
validatorsNo
coordinatesNo
registeredAtNo
notificationsNo
participantTypeNo
signatureStatusNo
uniqueValidatorNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already signal a non-read-only, non-idempotent mutation. The description adds valuable lifecycle context beyond annotations: the strict ordering dependency and the irreversible activation boundary. This helps an agent understand the operational impact of calling this tool at the wrong time.

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?

Three dense sentences with no filler. The action is stated first, followed by usage frequency, prerequisites, and the critical activation constraint. Every sentence contributes essential information.

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

Completeness4/5

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

The description covers the core workflow well: what the tool does, how to use it, its prerequisites, and the key lifecycle restriction. Optional parameters are not elaborated, but the presence of an output schema and the focus on the required flow keep this reasonably complete for an agent.

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 only 22%, so the description carries meaningful burden. It clarifies that name and email identify the signatory and that signatureRequestId/documentId come from prior API calls. However, optional parameters like phone, sequence, coordinates, and uniqueValidator are left unexplained, leaving gaps for non-basic usage.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Adds a signatory (by name + email) to a document within a signature request.' It clearly distinguishes this from sibling tools like add_validator_to_signatory and add_observer_to_document by emphasizing the signatory role and the document context.

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?

It gives explicit when-to-use guidance: 'Use once per person who needs to sign that specific document.' It also states prerequisites (create_signature_request and add_document_to_signature_request) and a clear when-not: signatories cannot be added after activation.

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

add_validator_to_signatoryA

Adds a validator to a document's signatory: a person who must approve (validate) that signatory's identity or the document before the signature can proceed. Add validators BEFORE activate_signature_request. Requires: add_document_to_signature_request → documentId, add_signatory_to_document → signatoryId. The signature_request_full composite accepts validators inline.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailYes
phoneNo
surnamesNo
documentIdYesMANDATORY. UUID of the document within the signature request. Obtain from add_document_to_signature_request.
signatoryIdYesMANDATORY. UUID of the signatory. Obtain from add_signatory_to_document.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
emailNo
phoneNo
surnamesNo
documentIdNo
signatoryIdNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already carry readOnly=false, idempotent=false, and destructive=false, so the description only needs to add operational context. It does so by explaining the validator's approval role)Skip and the ordering requirement before activation, plus the inline composite alternative.

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 four terse sentences with the core behavior front-loaded. Each sentence adds distinct information: role, timing, prerequisite chain, and composite alternative. There is no filler or restatement of the schema.

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

Completeness4/5

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

Given that an output schema exists and annotations carry the mutation/idempotency hints, the description provides the essential workflow context: prerequisites, sequencing, and the inline alternative. It does not discuss duplicate-validator behavior or post-activation restrictions, but those are not central to selecting and invoking this 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?

Schema coverage is only 33%, and the description substantially compensates for the two ID parameters by naming their exact source tools. However, name, email, phone, and surnames receive no additional meaning beyond their schema labels, so the description does not fully bridge the coverage gap.

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 opening sentence states a specific verb and resource: 'Adds a validator to a document's signatory' and clearly defines what a validator does. The role definition and the activation sequencing separate it from sibling tools like add_signatory_to_document and add_observer_to_document.

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 explicit timing guidance ('BEFORE activate_signature_request'), a prerequisite chain for obtaining documentId and signatoryId, and notes that signature_request_full accepts validators inline as an alternative. It does not fully explain when to prefer the composite inline path over this tool, but the relevant workflow context is present.

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

create_signature_requestA

Creates a new signature request — the top-level container for documents and signatories in a signing flow. Use this first, before add_document_to_signature_request. No prerequisites. Example: create_signature_request({ name: 'NDA — Acme Corp', createdBy: 'jane@company.com' }) returns { id, ... } — use the returned id as signatureRequestId in subsequent calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
languageNo
providerNo
createdByYes
senderNameNo
closeConfigNo
descriptionNo
webhookUrisNo
notificationsNo
senderAddressNo
uniqueValidatorNo
signatureRequestBodyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
statusNo
languageNo
providerNo
createdByNo
senderNameNo
descriptionNo
webhookUrisNo
notificationsNo
senderAddressNo
uniqueValidatorNo
cancellationReasonNo
signatureRequestBodyNo

TDQS

A4.2/5.0
Behavior4/5

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

The annotations only set readOnlyHint=false, indicating mutation. The description builds on that by clarifying it creates a container, returning an id, and stating there are no prerequisites. It does not conflict with annotations and adds practical behavioral context (the returned id and its reuse). However, it does not disclose any side effects like notifications or whether partial creation is possible, which would have boosted the score further.

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: the first delivers the core purpose and ordering, the second provides a concrete example and the follow-up action. It is front-loaded with the essential information and contains zero filler. Every sentence earns its place, making it easy for an agent to parse quickly.

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

Completeness3/5

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

The description is adequate for the minimal use case: it tells the agent to create with name and createdBy, get an id, and proceed to add documents. However, given the tool has 12 parameters with nested objects and enums, the description does not guide the agent on optional fields that may be critical for specific flows (e.g., webhookUris, closeConfig). Since an output schema is indicated, return values are covered, but the parameter usage beyond the basics remains undocumented, leaving a moderate gap.

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

Parameters2/5

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

With a schema description coverage of 0%, the description was expected to compensate for the 12 parameters. It only illustrates 'name' and 'createdBy' via an example, and does not explain any of the other parameter semantics (e.g., closeConfig, provider, signatureRequestBody). The example implicitly shows the required fields but does not clarify their meaning beyond what the schema names suggest. This is insufficient compensation for parameters that have complex nested structures and enums.

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 clear verb and resource: 'Creates a new signature request' and identifies it as 'the top-level container for documents and signatories in a signing flow.' It explicitly differentiates it from the sibling add_document_to_signature_request by saying 'Use this first, before add_document_to_signature_request,' leaving no ambiguity about what this tool does.

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 provides explicit usage guidance: 'Use this first, before add_document_to_signature_request' and 'No prerequisites.' It also instructs the agent to use the returned id as signatureRequestId in subsequent calls, giving a clear sequencing and onward pointer that is highly actionable.

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

ead_factory_helpA
Read-onlyIdempotent

Returns an overview of EAD Factory's managers (Evidence, Signature, Notification, Chat), their key tools and starting points, and guidance on when to use a composite workflow tool (e.g. evidence_create_sealed) versus the atomic tools. Call this first if you're unsure which tool to use — no credentials needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds that 'no credentials needed' and that it serves as a discovery/guidance tool, which is useful contextual information beyond the structured fields.

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 action ('Returns an overview'), and every phrase earns its place. It covers contents, usage, and access requirements without waste.

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?

With no params and no output schema, the description is the sole source of guidance. It fully explains what the tool returns (managers and key tools), when to use it (first if unsure), the key decision guidance (composite vs. atomic), and access requirements (no credentials). This is complete for a help 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, which is the baseline for a score of 4. The description does not need to explain parameter semantics because the schema has no properties, and the 100% schema coverage means there is nothing to add.

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 'Returns an overview of EAD Factory's managers' with specific verbs and resources, listing the manager types (Evidence, Signature, Notification, Chat) and the guidance it provides. This distinguishes it from the many sibling tools that perform domain actions rather than providing help.

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 advises 'Call this first if you're unsure which tool to use' and mentions guidance on composite vs. atomic tool selection (e.g., evidence_create_sealed). This gives clear when-to-use direction and differentiates its purpose from the operational siblings.

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

evidence_case_file_createA

Creates a new case file — the top-level container for evidence groups, evidence, and reports. Use this first, before any other Evidence-manager tool. No prerequisites. Unlike most create tools, id is CALLER-SUPPLIED (generate a fresh UUID v4 yourself, this API does not assign one) — there is no name field, use title instead. Example: evidence_case_file_create({ id: '', title: 'Q1 2026 audit' }) — use that same id as caseFileId in evidence_group_create.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
codeNo
ownerNo
titleNo
categoryNo
metadataNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.7/5.0
Behavior4/5

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

Beyond annotations (which are all false), the description discloses that the API does not auto-assign an id, requiring the caller to generate a UUID v4, and that 'title' is used instead of 'name.' It also reveals the relationship between the created case file id and subsequent evidence_group_create calls, adding meaningful behavioral context.

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 concise sentences that lead with the core purpose, then provide usage ordering and the unique id rule, ending with a practical example. Every sentence adds value with no 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?

Given the tool's role as the top-level entry point, the description covers the essential context: what it creates, when to use it, its key parameter quirks, and how it connects to the next logical tool (evidence_group_create). The presence of an output schema means return value details are handled elsewhere.

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?

With schema description coverage at 0%, the description compensates by fully explaining the critical 'id' parameter (caller-generated) and the 'title' parameter (replaces name), and provides an example. Other optional parameters (code, owner, category, metadata, description) are not detailed, but their purposes are inferable from their names and the overall context.

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 'Creates a new case file — the top-level container for evidence groups, evidence, and reports,' clearly stating the verb and resource. It also distinguishes this from sibling tools by noting it is the entry point to the Evidence-manager toolset and highlighting the caller-supplied id quirk.

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 instructs 'Use this first, before any other Evidence-manager tool' and states 'No prerequisites.' The description also clarifies when not to expect typical create behavior (id is caller-supplied, no name field) and gives a concrete example that ties into evidence_group_create.

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

evidence_case_file_delete_bulkA
DestructiveIdempotent

Permanently deletes SEVERAL case files in one call. Destructive and not reversible — confirm the caseFileIds first (evidence_case_file_search) and prefer closing a case file via evidence_case_file_status_update when you only need to end work on it.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
requestIdYesMANDATORY. UUID you generate yourself to identify THIS bulk request — it is not obtained from any other tool, and it is NOT a notification request id. The upstream API does not document what it does with the value; send a fresh UUID per batch.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark destructiveHint=true, but the description adds 'not reversible' and a confirmation workflow, reinforcing the severity beyond what annotations convey. No contradiction with idempotentHint or readOnlyHint.

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 the destructive nature and purpose. Every word adds value, and the alternative is mentioned succinctly.

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 bulk delete with only two params and no output schema, the description covers the critical destructive warning, the need to confirm IDs, and the alternative tool. It does not explicitly mention the requestId requirement, but that is fully described in the schema, so nothing essential is missing.

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 50% (only requestId has a description). The tool description mentions 'caseFileIds' but doesn't elaborate on the ids array structure beyond the schema's UUID format, and it never mentions the requestId parameter. The schema already compensates well for requestId, so the description adds little beyond the vague reference to caseFileIds.

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 ('deletes'), resource ('case files'), and scope ('SEVERAL ... in one call'). It also distinguishes itself from the sibling evidence_case_file_status_update by explicitly framing the alternative when only ending work is needed.

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?

It gives clear when-to-use guidance: confirm IDs first via evidence_case_file_search, and prefer status update instead if the goal is merely to end work. This is explicit and actionable.

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

evidence_case_file_getA
Read-onlyIdempotent

Retrieves a case file's details by id. Use to confirm a case file exists, or to check its status before creating evidence groups or reports under it. Requires: evidence_case_file_create → caseFileId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
codeNo
ownerNo
titleNo
groupsNo
statusNo
categoryNo
metadataNo
createdAtNo
updatedAtNo
descriptionNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful context about the dependency on evidence_case_file_create for the caseFileId and the purpose of checking status before subsequent operations, which goes beyond the annotations.

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 action, and every sentence adds value: the first defines the function, the second provides use cases and a prerequisite. No filler or repetition.

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?

With a single parameter, full schema coverage, output schema present, and safety annotations already provided, this description is complete. It explains when to use the tool and the prerequisite relationship, making it sufficient for an agent to invoke 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 covers the single parameter fully with a detailed description including the UUID format and source from evidence_case_file_create. The tool description adds little beyond restating 'by id', so the schema does the heavy lifting, meriting the baseline score of 3.

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 'Retrieves a case file's details by id', specifying the verb, resource, and identifier. This distinguishes it from sibling tools like evidence_case_file_search (searching) and evidence_case_file_create (creation).

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 says to use it 'to confirm a case file exists, or to check its status before creating evidence groups or reports under it', providing clear use cases. It does not explicitly name alternative tools for scenarios like searching without an ID, but the context is sufficient.

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

evidence_case_file_relationship_assignA

Assigns a relationship on a case file, linking it to an external/related entity reference for traceability. Use after creating the case file when your workflow tracks which matter, client, or system record it belongs to. Requires: evidence_case_file_create → caseFileId.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemTypeYes
itemValueYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate this is a write operation (readOnlyHint:false) and non-destructive. The description adds useful context about the dependency on evidence_case_file_create and the traceability purpose. It does not disclose behavior like idempotency, overwrite semantics, or failure modes, but annotations lower the bar for this dimension.

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 concise sentences plus a short prerequisite line. It is front-loaded with the action and resource, then provides usage context, with no filler or redundant information.

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

Completeness3/5

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

There is no output schema and the parameter descriptions are sparse, but the description provides workflow context and a clear prerequisite. It lacks detail on itemType/itemValue semantics and what happens after the relationship is assigned, leaving gaps for a mutation tool with three required parameters.

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

Parameters2/5

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

Schema description coverage is only 33% (caseFileId is described), and the description compensates only partially. It explains where to get caseFileId and hints that itemValue relates to a matter/client/system record, but it does not clarify the itemType enum (CHAT_CONVERSATION) or the expected format of itemValue. With low schema coverage, more parameter guidance is needed.

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 'Assigns a relationship on a case file' and explains it links the case file to an external/related entity reference for traceability. This specific verb+resource+scope distinguishes it from sibling case_file tools like evidence_case_file_update or evidence_case_file_get.

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 explicit usage context: 'Use after creating the case file when your workflow tracks which matter, client, or system record it belongs to.' It also names the prerequisite step (evidence_case_file_create → caseFileId). However, it does not mention when not to use the tool or provide alternatives, so it falls 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.

evidence_case_file_report_generateA

Generates the SIGNED evidentiary report of a case file (the certified document covering its sealed evidence). Returns a reportId — then call evidence_case_file_report_pdf_url_get (PDF) or evidence_case_file_report_zip_url_get (full package) to download. Requires: evidence_case_file_create → caseFileId; preview first with evidence_case_file_report_preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
filenameNo
metadataNo
reportIdYesMANDATORY. UUID of the report.
templateYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
deletionDateNo
languageCodeYes
additionalDataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.2/5.0
Behavior4/5

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

The annotations only indicate the tool is not read-only, not idempotent, and not destructive. The description adds useful behavioral context: it produces a signed/certified document and returns a reportId that must be passed to download endpoints. It does not fully disclose side effects or repeatability, but it adds meaning beyond the annotations.

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 and front-loaded: the action, the output, the follow-up tools, and the prerequisites are all covered in two sentences with no filler. Every sentence earns its place.

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

Completeness3/5

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

The surrounding workflow is well described, including prerequisites and downstream URL-getter tools. However, the description does not explain the meaning of several required inputs or resolve the apparent tension between the required reportId input and the 'Returns a reportId' statement. Given the high parameter count and low schema coverage, this is a clear gap.

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

Parameters2/5

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

Schema description coverage is only 22%, so the description needed to compensate, but it only clarifies caseFileId's origin and the reportId's downstream use. Required parameters like template and languageCode are not explained, and the nested data object is entirely left to the schema. This is a significant gap for a 9-parameter tool.

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

Purpose5/5

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

The description uses a specific verb ('Generates') and clearly identifies the resource as the SIGNED evidentiary report of a case file. It also distinguishes the tool from its download siblings and from the preview tool by stating exactly what this step produces.

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?

It explicitly states the prerequisite chain: evidence_case_file_create must provide caseFileId, and preview must happen first via evidence_case_file_report_preview. It also names the follow-up download tools, so an agent knows exactly when to call this tool and what to do afterward.

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

evidence_case_file_report_pdf_url_getA
Read-onlyIdempotent

Retrieves a download URL for the signed PDF document of a case-file report. Requires: evidence_case_file_report_generate → reportId (plus caseFileId). For the full evidence package (PDF + files + verification data) use evidence_case_file_report_zip_url_get.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
typeNo
expirationNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds useful context beyond annotations: it mentions the signed document nature, the required prior generation step, and the scope of what is returned. No contradiction with annotations.

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 tightly packed sentences: the first states the purpose, the second covers prerequisites and alternative. No redundant words, front-loaded with the key action.

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

Completeness5/5

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

Given the simple nature (2 required params, read-only, output schema present), the description covers all essential context: what it retrieves, the required sequence, and the alternative for broader needs. No gaps for the agent to correctly select 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?

Schema coverage is 100% with descriptions for both parameters. The description adds meaning by specifying that reportId is obtained from the generate step, complementing the schema's existing origin note for caseFileId. This provides the causal chain for parameter values.

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: retrieving a download URL for a signed PDF document of a case-file report. It distinguishes from the sibling tool evidence_case_file_report_zip_url_get by specifying it returns only the signed PDF, not the full evidence package.

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 the prerequisite chain: evidence_case_file_report_generate must be called to obtain the reportId. Also provides a clear alternative (use evidence_case_file_report_zip_url_get for the full package), guiding when not to use this tool.

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

evidence_case_file_report_previewA

Generates an UNSIGNED preview of a case file's evidentiary report so you can check its content before producing the signed version with evidence_case_file_report_generate. Requires: evidence_case_file_create → caseFileId, with sealed evidence groups inside.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
metadataNo
templateYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
languageCodeYes
additionalDataNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=false, idempotentHint=false, destructiveHint=false, but the description adds key behavioral context: the output is UNSIGNED, it's a preview, and it requires sealed evidence groups. It also implies the tool does not produce the final signed report. This adds value beyond annotations, though it doesn't detail side effects or rate limits. No contradiction with annotations.

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-loads the core purpose and the unsigned nature, and includes the prerequisite chain compactly. Every sentence earns its place with no fluff.

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?

The tool has 6 parameters, nested objects, and an output schema. The description explains the tool's role in the workflow (preview before signed generation) and the prerequisite. It doesn't explain the return value, but an output schema exists, so that's not required. It also doesn't detail what 'sealed evidence groups' means, but the schema and sibling names provide context. Overall, it's complete enough for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is only 17%, so the description must compensate. The description mentions caseFileId and the prerequisite chain, and the schema itself documents caseFileId as MANDATORY. However, the description does not explain the meaning of template, languageCode, data, metadata, or additionalData beyond what the schema provides. The schema has detailed structure for data.groups, but the description adds little semantic meaning for the other parameters. Baseline 3 is appropriate because the schema does provide some structure, but the description doesn't fully compensate for the low coverage.

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 generates an UNSIGNED preview of a case file's evidentiary report, with a specific verb ('Generates'), resource ('case file's evidentiary report'), and purpose ('check its content before producing the signed version'). It also explicitly names the sibling tool evidence_case_file_report_generate for the signed version, distinguishing it from alternatives.

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 states when to use this tool: to check content before producing the signed version, and names the alternative (evidence_case_file_report_generate) for the signed version. It also provides a prerequisite chain: evidence_case_file_create → caseFileId, with sealed evidence groups inside. This is clear usage guidance.

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

evidence_case_file_report_updateA

Updates a previously generated case-file report's metadata. Requires: evidence_case_file_report_generate → reportId (and the caseFileId it belongs to). Does not re-generate the report content — generate a new report for updated evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
deletionDateNo

TDQS

A3.5/5.0
Behavior2/5

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

Annotations are minimal (no readOnly, no destructive hint), but they don't contradict. The description clarifies it only updates metadata and does not re-generate content, which is useful. However, it does not disclose potential side effects, idempotency, or what happens to existing metadata fields, leaving behavioral uncertainty for a mutation tool.

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

Conciseness5/5

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

The description is a single, concise paragraph that front-loads the purpose and includes the prerequisite and limitation in one go. No wasted words; every sentence adds value.

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

Completeness3/5

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

For a metadata update tool with 3 parameters, the description covers required inputs and the main limitation. However, it doesn't explain the 'deletionDate' parameter (what it does, how to use it), and the lack of output schema means no guidance on return values. Given the tool's moderate complexity, this is acceptable but not complete.

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 67%, and the schema already documents reportId and caseFileId as MANDATORY. The description adds that these come from generate, but doesn't explain the 'deletionDate' parameter, which is the third parameter. This leaves a gap for the optional parameter.

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

Purpose4/5

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

The description clearly states it updates metadata of an existing case-file report, with a specific verb and resource. It does not explicitly distinguish from sibling tools like evidence_case_file_report_preview or evidence_case_file_report_pdf_url_get, but the update action is unique enough in context.

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

Usage Guidelines4/5

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

It explicitly notes a prerequisite (evidence_case_file_report_generate → reportId and caseFileId) and states when not to use it (does not re-generate content; generate a new report for updated evidence). This provides clear context for using the tool, though it does not mention alternatives in the sibling set.

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

evidence_case_file_report_zip_url_getA
Read-onlyIdempotent

Retrieves a download URL for the complete ZIP package of a case-file report (signed PDF plus evidence files and verification material). Requires: evidence_case_file_report_generate → reportId (plus caseFileId).

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
typeNo
expirationNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is known. The description adds the dependency on prior generation and the packaged contents, providing useful context beyond the annotations.

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 concise sentences: first states the purpose, second states the prerequisite. No redundant or vague wording.

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 read-only URL getter with output schema present, the description covers purpose, prerequisite, and the package contents. Sibling differentiation is clear enough given the tool name and description.

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%, and both parameters already have descriptive text (mandatory UUIDs, source for caseFileId). The description only references the same parameters without adding additional semantics.

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 it retrieves a download URL for a complete ZIP package of a case-file report, specifying the contents (signed PDF plus evidence files and verification material). This distinguishes it from sibling tools like evidence_case_file_report_pdf_url_get.

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?

Explicitly states the prerequisite call (evidence_case_file_report_generate) and required identifiers (reportId, caseFileId). However, it doesn't explicitly contrast with alternatives like pdf_url_get or evidence_report_zip_url_get, though the 'complete ZIP' phrasing implies when to use this tool.

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

evidence_case_file_status_updateA

Changes a case file's lifecycle status (OPEN or CLOSE). Use CLOSE when work on the case file is finished and it should no longer accept new evidence groups; reopen with OPEN. Requires: evidence_case_file_create or evidence_case_file_search → caseFileId.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already indicate a non-read-only mutation. The description adds a key behavioral consequence: CLOSE means no longer accepting new evidence groups. It does not contradict annotations and enriches the state-change semantics.

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 the core action, then usage guidance and prerequisite. Every sentence contributes meaningful information with no 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?

For a simple two-parameter status update with annotations and no output schema, the description covers purpose, usage, key behavioral effect, and parameter provenance. It is fully sufficient for an agent to select and invoke correctly.

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

Parameters4/5

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

Schema documents caseFileId with a description and source, but status is a bare enum. The description explains the meaning of each status value ('CLOSE' vs 'OPEN'), adding semantic value that the schema lacks.

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 ('Changes') and resource ('case file's lifecycle status'), with explicit values (OPEN/CLOSE). This distinguishes it from sibling tools like evidence_case_file_update, which handle general updates.

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?

Provides explicit when-to-use context ('Use CLOSE when work is finished... reopen with OPEN') and a prerequisite chain ('Requires: evidence_case_file_create or evidence_case_file_search → caseFileId'). This clearly guides an agent on invocation and alternatives.

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

evidence_case_file_updateA

Updates a single case file's editable metadata (e.g. name, description). Requires: evidence_case_file_create or evidence_case_file_search → caseFileId. To change its OPEN/CLOSE lifecycle state use evidence_case_file_status_update instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
ownerNo
titleNo
categoryNo
metadataNo
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
descriptionNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds context beyond the neutral annotations by specifying it operates on 'editable metadata' (excluding lifecycle state) and targets a single file. It does not mention partial-update semantics or return values, but the key behavioral boundaries are clear.

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 concise sentences: the first states the core action with examples, the second covers prerequisite and alternative. Every word earns its place, and the most important information is front-loaded.

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

Completeness3/5

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

Given the lack of output schema and presence of a nested metadata object, the description could explain whether omitted fields are preserved and which fields are considered editable. It provides a solid scope but leaves some behavioral details unstated.

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

Parameters2/5

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

Schema description coverage is low (14%), and the description's examples ('name, description') are partially misleading because 'name' is not a property (likely 'title'), and it does not explain the metadata object or other fields. The description adds minimal value over 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 it updates a single case file's editable metadata with examples, and explicitly differentiates from sibling tools like evidence_case_file_update_bulk (single vs bulk) and evidence_case_file_status_update (lifecycle vs metadata).

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?

It explicitly provides a prerequisite (obtain caseFileId from evidence_case_file_create or evidence_case_file_search) and directs the agent to use evidence_case_file_status_update for lifecycle changes, offering a clear alternative and when-not-to-use context.

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

evidence_case_file_update_bulkA

Updates the editable metadata of SEVERAL case files in one call (each entry carries its own caseFileId and changes). Prefer evidence_case_file_update for a single case file. Requires: the caseFileIds of every case file to update (evidence_case_file_search to find them).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
patchNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, destructiveHint=false, and idempotentHint=false. The description adds that it updates 'editable metadata' and operates on multiple files, but does not disclose failure semantics, partial success behavior, or any side effects beyond what annotations imply.

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 short sentences, front-loaded with the primary purpose. Every sentence provides useful information without redundancy, making it easy to parse quickly.

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

Completeness3/5

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

The tool has no output schema and the description gives some usage context, but it lacks explanation of the relationship between ids and patch, and does not address bulk operation caveats like atomicity or partial failures. Given the complexity of a bulk update, the description is incomplete.

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

Parameters2/5

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

The schema has 0% description coverage, and the description does not compensate. It claims 'each entry carries its own caseFileId and changes,' which does not match the actual schema structure of separate 'ids' and 'patch' arrays, potentially misleading the agent about how parameters relate.

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 updates editable metadata of several case files in one call, using a specific verb and resource. It also distinguishes itself from evidence_case_file_update, which is for a single case file, making the purpose unmistakable.

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

Usage Guidelines5/5

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

The description explicitly instructs to prefer evidence_case_file_update for single case files, providing an alternative. It also tells the user they need caseFileIds and points to evidence_case_file_search to find them, giving clear when-to-use and prerequisite guidance.

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

evidence_create_sealedA

Creates (or reuses) an evidence group, registers and uploads one or more files as evidence, then seals (closes) the group — the full flagship evidence flow in one call instead of evidence_group_create + N x (evidence_group_evidence_register + upload) + evidence_group_close. Bounded-polls until the group reaches CLOSED (EAD Factory's upstream emits no events for this transition): task-aware MCP clients get an asynchronous Task; any other client simply receives the final result synchronously. Requires: case_file_create -> caseFileId. Provide evidenceGroupId to add to an existing OPEN group instead of creating one. Each evidence's file uses the shared FileInput contract (local path, base64, https URL, or n8n binary item) — never a bespoke file field. On success returns the group id, its final CLOSED status, and each evidence's id + sha256. Use the atomic evidence_group_create / evidence_group_evidence_register / evidence_group_close tools instead when you need to inspect or react to each intermediate step.

ParametersJSON Schema
NameRequiredDescriptionDefault
evidencesYesOne or more files to register and upload into the group, then seal it.
groupNameNoOnly used when creating a new group (evidenceGroupId omitted).
groupTypeNoOnly used when creating a new group (evidenceGroupId omitted).FILE
caseFileIdYesMANDATORY. UUID of the parent case file.
evidenceGroupIdNoExisting OPEN evidence group to add to. Omit to create a new one.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations present, the description carries the full burden and does so thoroughly. It discloses that the tool bounded-polls until CLOSED, that task-aware MCP clients get an asynchronous Task while others get a synchronous result, and that the upstream emits no transition events, which explains the polling behavior. It also specifies the success return payload: group id, final CLOSED status, and each evidence's id + sha256.

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 every sentence earns its place: overview, behavioral note, prerequisite, alternative-path parameter, file contract, return shape, and explicit alternative-selection guidance. The most important information is front-loaded in the first sentence.

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 complex composite tool with no output schema, the description covers the essential operational context: prerequisites, alternate mode of reuse, async vs sync delivery, return shape, and when to prefer sibling tools. Combined with the fully described input schema, an agent has enough 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.

Parameters4/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, but the description adds meaningful semantic context beyond the schema. It clarifies that groupName and groupType apply only when creating a new group, that evidenceGroupId targets an existing OPEN group, and that the file field follows a shared FileInput contract rather than a bespoke file field.

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 composite verb chain — 'Creates (or reuses) an evidence group, registers and uploads one or more files as evidence, then seals (closes) the group' — and clearly separates this one-call flagship flow from the atomic sibling tools. It also explicitly names evidence_group_create, evidence_group_evidence_register, and evidence_group_close, making the tool's role unambiguous.

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 gives explicit when-to-use guidance: use this tool for the full flow, and use the atomic sibling tools instead when you need to inspect or react to each intermediate step. It also states the prerequisite (case_file_create -> caseFileId) and explains when to supply evidenceGroupId for an existing OPEN group versus omitting it to create a new one.

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

evidence_deleteA
DestructiveIdempotent

Permanently deletes one evidence by evidenceId (no group path needed). Destructive; sealed content should not be deleted — use only for drafts or mis-registered evidence. Requires: evidence_group_evidence_register or generate_evidence → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description reinforces 'Permanently deletes' and 'Destructive.' It adds behavioral context about sealed content and the 'no group path needed' distinction, going beyond annotations.

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 caution and prerequisite. Every sentence earns its place with no wasted words.

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

Completeness5/5

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

For a simple one-parameter delete tool with strong annotations, the description covers purpose, usage constraints, prerequisites, and destructive nature. No output schema exists but none is needed for a delete operation; the description is fully adequate.

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% with a detailed description of the evidenceId parameter, so the baseline is 3. The description repeats how to obtain the ID and adds 'no group path needed' context, but does not add substantial new parameter semantics.

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

Purpose5/5

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

The description uses a specific verb+resource+scope: 'Permanently deletes one evidence by evidenceId (no group path needed).' It distinguishes from siblings like evidence_group_evidence_delete by explicitly noting no group path is required, and from bulk operations by saying 'one evidence.'

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?

Clear when-to-use and when-not-to-use guidance: 'sealed content should not be deleted — use only for drafts or mis-registered evidence.' Also specifies prerequisite: 'Requires: evidence_group_evidence_register or generate_evidence → evidenceId.'

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

evidence_download_url_createA
Read-onlyIdempotent

Creates a temporary download URL for an evidence's stored file when you only hold the evidenceId (no group path needed — same bytes as evidence_group_evidence_download_url_create). Requires: generate_evidence or evidence_group_evidence_register → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description only needs to supplement. It adds the temporary-URL nature and equivalence to the sibling endpoint, which is useful, though it omits expiration details.

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 concise sentences contain the action, scope, prerequisite, and alternative without filler. The sentence structure front-loads the core purpose and places supporting details afterward.

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 single-parameter tool with strong annotations and no output schema, the description covers purpose, prerequisites, and sibling differentiation. A minor gap is the lack of URL expiration or response format, but this is not essential for this simple 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 schema fully documents evidenceId, and the description adds practical context: it is the sole identifier required (no group path) and can be obtained from generate_evidence or evidence_group_evidence_register. This complements the schema rather than repeating it.

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

Purpose5/5

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

The description opens with a specific verb-resource pair: 'Creates a temporary download URL for an evidence's stored file.' It also clearly distinguishes itself from the sibling evidence_group_evidence_download_url_create by noting 'no group path needed' and 'same bytes.'

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?

It explicitly states when to use this tool ('when you only hold the evidenceId'), names the alternative for the group-path case, and provides the prerequisite evidence-generation flow. This gives the agent clear decision boundaries.

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

evidence_group_closeA

Seals (closes) an evidence group, triggering qualified timestamping — after this, no more evidence can be added. Use only after every evidence registered in the group has had its file bytes uploaded to the presigned URL from evidence_group_evidence_register. Requires: evidence_group_create → evidenceGroupId, evidence_case_file_create → caseFileId, and the current evidencesCount. ASYNC: the group transitions OPEN → CLOSING → CLOSED; poll evidence_group_get until status is CLOSED before generating a report. Prefer the evidence_create_sealed composite tool for a new group — it registers, uploads, closes, and waits for CLOSED in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidencesCountYes
collectMetadataNo
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.9/5.0
Behavior5/5

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

The annotation indicates non-read-only (readOnlyHint=false) but no destructive flag. The description goes beyond annotations by revealing the async state machine (OPEN → CLOSING → CLOSED), the need to poll evidence_group_get, and the irreversible consequence ('no more evidence can be added'). This adds valuable behavioral context not present in annotations.

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 information-dense but every sentence earns its place: main action, precondition, required inputs, async behavior, and alternative tool. It is well-structured and front-loaded with the core purpose.

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

Completeness5/5

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

Given the complexity of the tool (state transitions, prerequisites, async polling), the description covers all essential aspects: what happens, when to use, what to do after invocation (poll until CLOSED), and a simpler alternative. The presence of an output schema reduces the need to explain return values, so this is complete.

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 50% (only caseFileId and evidenceGroupId have descriptions). The description adds meaning for evidencesCount as 'the current evidencesCount' and explains the provenance chain for the IDs. However, collectMetadata is not mentioned at all, leaving its semantics unexplained. Overall, the description partially compensates for the schema gaps.

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 action: 'Seals (closes) an evidence group, triggering qualified timestamping — after this, no more evidence can be added.' This is a specific verb+resource and distinguishes from siblings like evidence_group_discard or evidence_group_update by emphasizing the sealing aspect.

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?

Explicit usage conditions are given: 'Use only after every evidence registered in the group has had its file bytes uploaded to the presigned URL from evidence_group_evidence_register.' It also names an alternative ('Prefer the evidence_create_sealed composite tool') and lists required dependencies, providing clear when-to-use and when-to-avoid guidance.

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

evidence_group_createA

Creates an evidence group inside a case file — evidence records are always registered inside a group, never standalone (except via the legacy generate_evidence tool). Use when starting a new batch of related evidence (e.g. all files for one incident). Like evidence_case_file_create, id is CALLER-SUPPLIED (generate a fresh UUID v4 yourself). Requires: evidence_case_file_create → caseFileId. Example: evidence_group_create({ id: '', caseFileId, type: 'FILE' }) returns { status: 'OPEN', ... } — use that same id as evidenceGroupId in evidence_group_evidence_register, then evidence_group_close once every evidence in the group has been uploaded.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
codeNo
nameNo
typeYes
metadataNo
createdByNo
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations carry little weight (all false), so the description must disclose behavior. It does so by noting the caller-supplied id (non-idempotent), the returned status 'OPEN', and the sequencing with other tools. However, it omits details like error conditions or side effects, but the provided operational flow is valuable.

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

Conciseness4/5

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

The description is somewhat long but each sentence adds value, including a concrete example and workflow steps. It is front-loaded with the core purpose and then provides operational details, though it could be slightly more concise without losing meaning.

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

Completeness4/5

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

Given the tool's complexity and the presence of an output schema (not shown but indicated), the description gives sufficient context: creation context, prerequisite, example, and next steps. It doesn't fully explain all return values, but the essential lifecycle is clear.

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 only 13%, and the description compensates by explaining the required parameters: id ('generate a fresh UUID v4 yourself'), caseFileId (from evidence_case_file_create), and type (example 'FILE'). It doesn't explain optional parameters like name or metadata, but the mandatory ones are clarified.

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 'Creates an evidence group inside a case file,' using a specific verb and resource. It distinguishes from siblings by referencing the legacy generate_evidence tool and mentioning evidence_group_evidence_register and evidence_group_close for the workflow.

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 when to use: 'Use when starting a new batch of related evidence (e.g. all files for one incident).' It also gives prerequisites (evidence_case_file_create → caseFileId) and a sequential workflow with evidence_group_evidence_register and evidence_group_close, effectively explaining alternatives and exclusions.

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

evidence_group_delete_bulkA
DestructiveIdempotent

Permanently deletes SEVERAL evidence groups of one case file in one call. Destructive — prefer evidence_group_discard for a single group, and never delete sealed groups that back issued reports. Requires: caseFileId + the evidenceGroupIds to delete (evidence_group_search to find them).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
requestIdYesMANDATORY. UUID you generate yourself to identify THIS bulk request — it is not obtained from any other tool, and it is NOT a notification request id. The upstream API does not document what it does with the value; send a fresh UUID per batch.
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the description builds on that with a specific warning that permanently deleting sealed groups is unsafe due to issued reports. It adds a concrete restriction beyond the annotations though it does not elaborate on idempotency (already hinted) or partial-failure behavior. The warning about sealed reports is a meaningful extra context.

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 purposeful sentences: it states the action, delivers a warning, and lists required inputs with a discovery pointer. It has no filler, front-loads the key distinction, and uses succinct imperative guidance ('never delete sealed groups') without 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?

The description gives sufficient context for a destructive bulk operation: it covers purpose, scoping, warnings, and how to locate inputs. However, it omits the mandatory `requestId` from its explicit required-input list; though the schema defines it, an agent relying on the description could miss a required parameter. The absent output schema is not a problem for a delete operation, but the missing requirement in the prose is a small gap.

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?

With 67% schema description coverage, the description still maps 'evidenceGroupIds' to the `ids` parameter and explicitly references the search tool to find them. It also restates that caseFileId is required, but it fails to mention the required 'requestId' though that is fully defined in the schema. The description adds value for the otherwise undocumented `ids` parameter but doesn't fully cover all required parameters.

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 ('deletes') plus the resource ('SEVERAL evidence groups of one case file') in a single call. It distinguishes itself from the sibling evidence_group_discard (single group) and evidence_group_delete_bulk by explicitly contrasting with the singular alternative, so an agent can select it without opening schemas.

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?

It explicitly says 'prefer evidence_group_discard for a single group' and 'never delete sealed groups that back issued reports,' which provides clear when-to-use and when-not-to-use direction. It also tells the agent to use evidence_group_search to find the group IDs, closing the loop on how to prepare inputs.

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

evidence_group_discardA
DestructiveIdempotent

Discards (deletes) an OPEN evidence group and its registered evidences — use to abandon a group you no longer intend to seal. Destructive; sealed (CLOSED) groups are immutable evidence and should not be discarded. Requires: caseFileId + evidence_group_create → evidenceGroupId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already mark destructiveHint=true, and the description reinforces this with 'Destructive' and 'deletes... registered evidences'. It adds useful context beyond annotations by specifying that only OPEN groups are discardable and that CLOSED/sealed groups are immutable, which helps the agent understand state constraints.

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 action and use-case, followed by a concise destructive warning and prerequisite note. Every sentence contributes necessary information without 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 simple two-parameter destructive tool with full schema descriptions and strong annotations, the description covers the action, state constraints, destructive consequence, and dependency chain. It does not describe return/error behavior, but no output schema exists and delete operations commonly return a simple success status, so this is an acceptable omission.

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% with both parameters fully described, including their UUID format and provenance ('Obtain from evidence_case_file_create' and 'Obtain from evidence_group_create'). The description's 'Requires' line adds a compact dependency hint but does not meaningfully extend the schema's parameter semantics.

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

Purpose5/5

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

The description uses a specific verb ('Discards (deletes)') naming the resource ('OPEN evidence group and its registered evidences') and the intended use ('abandon a group you no longer intend to seal'). It also distinguishes the operation from handling sealed/CLOSED groups, which separates it from related evidence_group actions.

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

Usage Guidelines4/5

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

It clearly states when to use the tool ('use to abandon a group you no longer intend to seal') and when not to ('sealed (CLOSED) groups are immutable evidence and should not be discarded'). It also gives a prerequisite chain ('Requires: caseFileId + evidence_group_create → evidenceGroupId'), but does not explicitly name alternatives like evidence_group_delete_bulk.

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

evidence_group_evidence_deleteA
DestructiveIdempotent

Permanently deletes one evidence from an evidence group. Only makes sense while the group is still OPEN (sealed groups are immutable). Requires: caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds 'Permanently deletes' (reinforcing irreversibility) and the critical constraint that sealed groups are immutable. This goes beyond the structured annotations by explaining the operational precondition (group must be OPEN). It does not contradict any annotations.

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

Conciseness5/5

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

The description is two sentences with no redundant words. The core purpose is front-loaded, the open-group constraint follows logically, and the parameter chain is stated compactly. Every sentence earns its place.

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

Completeness4/5

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

For a delete operation with no output schema, the description covers the action, the prerequisite (open group), and the parameter dependency chain. Combined with 100% schema coverage and strong annotations (destructive, idempotent), it is largely complete. A minor ambiguity remains about whether it deletes the evidence record itself or just the group membership, but the tool naming and sibling context mitigate this.

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%, and each parameter has a description with provenance (e.g., 'Obtain from evidence_group_evidence_register'). The description's 'Requires: caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId' is a concise restatement of the relationships already detailed in the schema, adding no additional semantic meaning beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action: 'Permanently deletes one evidence from an evidence group.' It uses a specific verb ('deletes') and resource ('one evidence from an evidence group'), which distinguishes it from siblings like evidence_group_delete_bulk (deletes entire group) and evidence_delete (deletes evidence globally). The scope is explicit.

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

Usage Guidelines4/5

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

The description provides clear context: 'Only makes sense while the group is still OPEN (sealed groups are immutable).' This tells the agent when to use the tool and when not to. It also mentions the required parameter chain (caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId), which implies the evidence must have been registered via that flow. However, it does not explicitly name alternative tools or contrast with them.

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

evidence_group_evidence_download_url_createA
Read-onlyIdempotent

Creates a temporary download URL for an evidence file stored in a group (INTERNAL custody). Use to retrieve the original bytes after upload. Requires: caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds 'temporary' (expiring URL) and 'after upload' workflow, but does not detail expiration duration or response format. This is useful but not rich behavioral disclosure.

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 action, and every sentence earns its place. The requirement chain is compact and useful without being verbose.

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

Completeness4/5

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

Given the tool's simplicity, 3 UUID parameters, and good annotations, the description is adequate. It states the output (download URL), the use case, and prerequisites. It lacks expiration details or error conditions, but these are not essential for basic invocation with strong schema support.

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% and each parameter includes provenance guidance (e.g., 'Obtain from evidence_case_file_create'). The description restates the required chain but adds no new parameter semantics beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states it creates a temporary download URL for an evidence file in a group, distinguishing it from similar tools like evidence_download_url_create. The verb and resource are specific, and the parenthetical '(INTERNAL custody)' adds differentiation.

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 context: use it to retrieve original bytes after upload, and it lists the required ID chain (caseFileId + evidenceGroupId + evidence_group_evidence_register → evidenceId). It does not explicitly name alternatives or exclusions, but the context implies when to use it versus non-group downloads.

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

evidence_group_evidence_getA
Read-onlyIdempotent

Gets one evidence's details (metadata, hash, custody, upload state) inside a specific evidence group. Requires: evidence_case_file_create → caseFileId, evidence_group_create → evidenceGroupId, evidence_group_evidence_register → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hashNo
titleNo
statusNo
groupIdNo
fileNameNo
fileSizeNo
metadataNo
createdByNo
capturedAtNo
caseFileIdNo
evidenceIdNo
timestampsNo
custodyTypeNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds a general sense of non-mutating behavior (via 'Gets') and lists the fields returned, but does not disclose error conditions, pagination, or other behavioral nuances. This is adequate but not rich.

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 short sentences. The first sentence front-loads the main purpose; the second provides terse, high-value prerequisite guidance. There is no redundant 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?

For a straightforward get tool with three required UUIDs and an output schema present, the description supplies all necessary context: what it returns, the group scope, and how to obtain each ID. The presence of an output schema means return-value details do not need to be in the description. It is complete.

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 covers 100% of parameters, each with a description and a source tool. The description's 'Requires' chain partially echoes the schema, but adds no new semantic meaning about parameter values or format. Baseline of 3 is appropriate given high schema coverage.

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 explicitly states the action ('Gets'), the resource ('one evidence's details'), and the scope ('inside a specific evidence group'). It also lists the specific data returned (metadata, hash, custody, upload state), which clearly distinguishes it from sibling tools like evidence_group_get or get_evidence.

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 a clear prerequisite chain ('Requires: evidence_case_file_create → caseFileId, evidence_group_create → evidenceGroupId, evidence_group_evidence_register → evidenceId'), telling the agent which upstream tools to call to obtain each required parameter. However, it does not explicitly contrast with alternative tools or state when not to use it.

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

evidence_group_evidence_registerA

Register a new evidence in a group — the first step of a 2-step upload (register, then PUT the file bytes to the returned upload URL). Use for each file you want to add to an OPEN evidence group. Requires: evidence_group_create → evidenceGroupId, evidence_case_file_create → caseFileId, and the file's SHA-256 hash (compute it before calling, or use the evidence_create_sealed composite tool which does this for you). Do not call evidence_group_close until every registered evidence's bytes have been uploaded. Custody type: INTERNAL = EAD Factory stores and custodies the file itself. | EXTERNAL = The file lives outside EAD Factory — you attest to its hash only, EAD Factory never stores the bytes. Testimony (qualified proof) provider family: TSP = Trusted Service Provider — eIDAS-qualified electronic timestamp; the legally strongest proof tier. | DLT = Distributed Ledger Technology — blockchain-anchored proof; immutable and independently verifiable.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashYes
typeNo
titleNo
fileNameNo
fileSizeNo
metadataNo
createdByNo
testimonyYes
capturedAtYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
custodyTypeYes
deletionDateNo
deletionTypeNo
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.
requiredTestimonyProvidersYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
expirationNo

TDQS

A4.2/5.0
Behavior5/5

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

Annotations only indicate non-read-only and non-destructive; the description adds substantial behavioral context: the two-step register-then-PUT workflow, the returned upload URL, the close-group constraint, and the custody/testimony semantics. This meaningfully shapes how an agent should sequence and invoke the tool.

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

Conciseness4/5

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

Front-loaded with the core purpose, then prerequisites, then workflow warning, then enum definitions. It is dense and somewhat long, but every sentence carries useful information and the structure is logical.

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

Completeness3/5

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

For a complex 16-param, 8-required, multi-step tool, it covers the workflow, prerequisites, and key domain concepts, and the output schema handles return values. But the 'Requires' list omits evidenceId even though it is mandatory, and the link between requiredTestimonyProviders and the testimony provider families is not made explicit, leaving gaps for a fully correct call.

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 only 19%, so the description must compensate. It explains custodyType (INTERNAL vs EXTERNAL), testimony families (TSP vs DLT), and the hash prerequisite. However, it leaves several mandatory params like evidenceId, capturedAt, and requiredTestimonyProviders largely to inference, so the compensation is only partial.

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?

States a specific verb and resource: 'Register a new evidence in a group', and frames it as the first step of a 2-step upload. It also distinguishes itself from the evidence_create_sealed composite and from later upload/close steps, so an agent can tell it apart from siblings.

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?

Explicitly says 'Use for each file you want to add to an OPEN evidence group', names the evidence_create_sealed alternative, and warns not to call evidence_group_close until bytes are uploaded. It lacks an explicit when-not-to-use list, but the OPEN qualifier and named alternative provide clear routing.

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

evidence_group_evidence_upload_url_createA

Creates a fresh presigned upload URL for an ALREADY-REGISTERED evidence in a group — step 2 of the register-then-upload flow (PUT the file bytes to the returned URL). Use when the URL from evidence_group_evidence_register expired or was lost. Requires: caseFileId + evidenceGroupId + evidenceId. evidence_create_sealed does all of this automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
requestModelNo
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations do not provide meaningful safety hints (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds context beyond annotations by framing this as step 2 of a flow, requiring PUT to the returned URL, and noting the URL may expire ('fresh' URL, 'expired or was lost'). It also discloses that evidence_create_sealed covers this automatically. No contradiction with annotations.

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?

Three sentences, each earning its place: purpose, when-to-use, requirements, and alternative. The information is front-loaded and free of fluff. The description is highly compact while packing flow context, usage guidance, and a cross-reference to an alternative tool.

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?

No output schema exists, but the description implicitly states the return value by saying 'PUT the file bytes to the returned URL.' It also covers the flow context, prerequisites, and alternative. It does not go into URL expiry details or invalidation of previous URLs, but 'fresh' implies this. For a focused URL-generation tool, this is sufficiently complete.

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 75%, with the three UUID parameters having rich descriptions ('Obtain from...'). The description repeats these three as 'Requires: caseFileId + evidenceGroupId + evidenceId' but omits the nested requestModel object and its required fileName. Since the schema itself already documents the UUIDs well, the description adds little new semantic value and leaves the requestModel parameter unexplained.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Creates a fresh presigned upload URL for an ALREADY-REGISTERED evidence in a group'. It clearly differentiates from siblings by specifying step 2 of the register-then-upload flow, noting that evidence_create_sealed automates the whole flow. This leaves no ambiguity about what the tool does.

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?

It explicitly states when to use: 'Use when the URL from evidence_group_evidence_register expired or was lost.' It also mentions an alternative: 'evidence_create_sealed does all of this automatically,' which effectively tells the agent when not to use this tool and choose a higher-level wrapper instead.

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

evidence_group_getA
Read-onlyIdempotent

Gets one evidence group's details — status (OPEN/CLOSED), seal information, and its evidences with their upload states. Use to verify every file was uploaded before evidence_group_close, or to check the seal after closing. Requires: caseFileId + evidence_group_create → evidenceGroupId.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
codeNo
nameNo
typeNo
statusNo
metadataNo
createdAtNo
createdByNo
discardedNo
evidencesNo
caseFileIdNo
descriptionNo
collectionMetadataIdNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable context by enumerating the returned elements (status, seal, upload states) and the dependency chain, which is useful beyond the annotations. It doesn't contradict annotations.

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 concise sentences front-load the primary action and then provide usage guidance and prerequisites. Every word adds value, with no fluff or repetition of schema details.

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 2-parameter read operation with a rich output schema and complete annotations, the description covers the purpose, content, and usage timing. It also gives the lifecycle context (before/after close) and requires dependencies, making it fully self-contained for the tool's complexity.

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% with each parameter already describing its purpose and origin. The description's 'Requires' line is mostly redundant with the schema's 'Obtain from' instructions, providing only marginal added meaning about the relationship between the two parameters.

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 'Gets one evidence group's details' and specifies the exact content (status, seal information, evidences with upload states). The verb 'Gets' plus the resource scope ('one evidence group') clearly distinguishes this from sibling tools like evidence_group_search or evidence_group_evidence_get.

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?

It explicitly provides two concrete use cases: verifying all files uploaded before evidence_group_close, and checking the seal after closing. It also gives a prerequisite chain ('Requires: caseFileId + evidence_group_create → evidenceGroupId') that clarifies the expected workflow.

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

evidence_group_updateA

Updates an evidence group's editable metadata (e.g. name, description). Only meaningful while the group is OPEN — sealed groups are immutable. Requires: caseFileId + evidence_group_create → evidenceGroupId.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
nameNo
metadataNo
createdByNo
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
descriptionNo
evidenceGroupIdYesMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.7/5.0
Behavior4/5

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

The description adds critical behavioral context beyond annotations: the OPEN-only constraint and immutability of sealed groups. It also clarifies the ID acquisition flow. Annotations only provide readOnlyHint=false and destructiveHint=false, which align with the description (updating metadata is non-destructive but write-oriented). No contradiction detected.

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 action and then constraints. Every clause adds value: the action, the OPEN-state caveat, and the prerequisite chain. There is no redundant fluff or repetition of schema information.

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

Completeness3/5

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

For a tool with 7 parameters, a nested object, and an output schema, the description covers the essential purpose and key constraints but leaves ambiguity about which fields are editable and how metadata should be structured. The output schema exists, but since it's not shown, the description should better clarify parameter roles, especially for optional fields like createdBy and metadata. Overall, it's adequate for selection but not for full invocation without additional inference.

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

Parameters2/5

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

Schema description coverage is only 29%, so the description must compensate, but it only mentions 'e.g. name, description' and doesn't explain the semantics of code, metadata, or createdBy. It also fails to clarify whether createdBy is actually editable, given the description says 'editable metadata' while schema lists createdBy as a property. The required IDs are described in the schema, but the description adds little beyond a dependency hint.

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

Purpose4/5

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

The description clearly states the action: 'Updates an evidence group's editable metadata' with specific examples (name, description). It identifies the resource (evidence group) and scope (editable metadata), distinguishing it from sealing or discarding operations, though it doesn't explicitly differentiate from the bulk update sibling.

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

Usage Guidelines4/5

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

It provides a clear when-to-use condition: 'Only meaningful while the group is OPEN — sealed groups are immutable,' which also serves as a when-not-to-use. It also gives a prerequisite chain: 'Requires: caseFileId + evidence_group_create → evidenceGroupId,' helping the agent understand dependencies, but it does not mention alternative tools like evidence_group_update_bulk.

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

evidence_group_update_bulkB

Updates the editable metadata of SEVERAL evidence groups in one call (each entry carries its own evidenceGroupId and changes). Prefer evidence_group_update for a single group. Requires: the evidenceGroupIds to update (evidence_group_search to find them).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
patchNo

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the agent knows it's a non-read-only, non-destructive write. However, the description does not disclose bulk operation behavior such as atomicity, partial failure handling, or error semantics. The statement 'each entry carries its own evidenceGroupId and changes' conflicts with the actual schema (flat ids array), adding confusion rather than clarity.

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

Conciseness4/5

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

The description is short and front-loaded with the core action and scope. However, the sentence 'each entry carries its own evidenceGroupId and changes' is misleading and inaccurate given the schema, occupying space that could be better used for clarifying the request structure.

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

Completeness2/5

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

For a bulk update tool with patch semantics and no output schema, the description is incomplete. It omits how to structure the patch array, the relationship between ids and patch, error handling, and partial-failure behavior. The mismatch between the described 'per entry' model and the actual schema further undermines completeness.

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

Parameters1/5

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

Schema description coverage is 0%, so the description must fully explain parameters, but it barely does. It mentions 'evidenceGroupIds' and 'changes' without mapping to the actual schema properties 'ids' and 'patch'. It never explains the patch operations (REPLACE, REMOVE), path/value structure, or how patch applies to the multiple ids, and the 'each entry' phrasing actively misleads.

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 updates editable metadata of several evidence groups in one call, using a specific verb and resource. It also explicitly differentiates from the sibling tool evidence_group_update by advising to prefer that for a single group.

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?

It provides explicit usage guidance: 'Prefer evidence_group_update for a single group' and notes the prerequisite to find evidenceGroupIds via evidence_group_search. This clearly indicates when to use the bulk tool versus the single-update alternative.

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

evidence_multipart_upload_startA

Starts a MULTIPART upload session for a large evidence file (returns the upload coordinates for uploading the file in parts). Use when a single presigned PUT is not enough for the file size. Requires: an already-registered evidence (evidence_group_evidence_register or generate_evidence → evidenceId) and the file name.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
fileNameYes
metadataNo
createdByYes
testimonyYes
capturedAtYes
caseFileIdNoMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
evidenceGroupIdNoMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.
requiredTestimonyProvidersNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds useful behavioral context: the operation starts a session rather than performing the upload itself, and returns coordinates for subsequent partial uploads. However, it does not disclose session lifecycle details, completion/abort requirements, or expiry behavior, which would be valuable for a multipart flow.

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

Conciseness4/5

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

The description is compact and front-loaded: the core purpose is in the first sentence, followed by the usage condition and prerequisite in the second. Every sentence adds information. It is slightly dense and the phrase 'upload coordinates' is imprecise, but overall it is efficient.

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

Completeness2/5

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

This is a complex tool with 10 parameters, 6 required fields, nested objects, no output schema, and nontrivial session semantics. The description mentions that upload coordinates are returned but does not describe required fields, the response shape, or the expected follow-up steps for completing the multipart upload. It is not complete enough for an agent to invoke this correctly without additional guidance.

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

Parameters2/5

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

Schema description coverage is only 30%, and the description compensates only for evidenceId and fileName, mentioning that evidenceId comes from evidence_group_evidence_register or generate_evidence. The schema also contains confusing 'MANDATORY' labels on optional UUID fields, and the description does not clarify the required createdBy, title, capturedAt, and testimony parameters. This leaves a substantial parameter-semantics gap.

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 action ('Starts a MULTIPART upload session') on a specific resource ('a large evidence file') and explains what it returns ('upload coordinates for uploading the file in parts'). It also distinguishes itself from the single-presigned-PUT flow by noting this is for cases where a single PUT is not enough, which separates it from siblings like evidence_upload_url_create.

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 when-to-use guidance: 'Use when a single presigned PUT is not enough for the file size.' It also provides the prerequisite that the evidence must already be registered and references the precise tools used to obtain the required evidenceId. It does not explicitly name alternative tools or state when not to use it, 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.

evidence_report_deleteA
DestructiveIdempotent

Permanently deletes a generated report by its reportId. Destructive — the signed document and its package stop being downloadable. Requires: evidence_case_file_report_generate → reportId. The underlying case file and its evidence are NOT touched.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds substantial context: the deletion is permanent, the signed document and package stop being downloadable, and the underlying case file/evidence are unaffected. This goes far beyond the structured safety hints and sets proper expectations.

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?

Four short sentences, each earning their place: purpose, destruction consequence, prerequisite, and scope boundary. No filler or redundancy; critical information is front-loaded and clearly 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 delete tool with one parameter, the description covers all essential context: what is deleted (report), what becomes unavailable (downloadable document and package), what is required (prior generation), and what is not affected (case file and evidence). Combined with the annotations (destructive, idempotent), the agent has full situational awareness.

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 already provides 100% coverage with reportId described as 'MANDATORY. UUID of the report.' The description adds provenance by linking reportId to evidence_case_file_report_generate, telling the agent where to obtain a valid ID. This is a meaningful addition 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 opens with a specific verb and resource: 'Permanently deletes a generated report by its reportId.' This clearly distinguishes it from sibling report tools like pdf_url_get or zip_url_get, and from case-file deletion tools.

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 states the prerequisite: 'Requires: evidence_case_file_report_generate → reportId.' It also declares a clear boundary: 'The underlying case file and its evidence are NOT touched.' This tells the agent when to use the tool and what it will not do, effectively guiding against misuse.

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

evidence_report_pdf_url_getA
Read-onlyIdempotent

Retrieves a download URL for a report's signed PDF when you only hold the reportId (no caseFileId path needed — same document evidence_case_file_report_pdf_url_get returns). Requires: evidence_case_file_report_generate → reportId.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
typeNo
expirationNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds useful context: the resource is a signed PDF, the returned URL is the same as the sibling tool's, and prior generation is required. This goes beyond annotations without contradicting them.

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 do exactly what is needed: front-load the purpose, then provide conditions, sibling distinction, and prerequisite. No filler or redundant phrasing; every clause earns its place.

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?

With a single parameter, full annotations, and an output schema, the description fully covers purpose, usage, and prerequisite. The tool is simple enough that no additional behavioral or return-value details are required.

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?

Input schema fully covers the parameter (reportId as required UUID). The description adds semantic meaning by clarifying that only reportId is needed and linking it to the generate step, which enriches understanding beyond the schema's format and description.

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 retrieves a download URL for a report's signed PDF using only reportId, and explicitly distinguishes it from the sibling evidence_case_file_report_pdf_url_get by noting that no caseFileId is needed and that it returns the same document. This 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.

Usage Guidelines5/5

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

It provides explicit usage conditions: use when holding only reportId, with no caseFileId required. It names the alternative sibling and states the prerequisite chain evidence_case_file_report_generate → reportId, giving clear when-to-use and 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.

evidence_report_zip_url_getA
Read-onlyIdempotent

Retrieves a download URL for a report's complete ZIP package when you only hold the reportId (same package evidence_case_file_report_zip_url_get returns). Requires: evidence_case_file_report_generate → reportId.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
typeNo
expirationNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. Description adds that it retrieves a download URL for the complete ZIP package and mentions the prerequisite, but no additional behavioral traits such as rate limits or response details. No contradiction with annotations.

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?

Description is two sentences. First sentence states purpose and differentiator. Second sentence provides prerequisite. Both are essential with no redundancy or fluff.

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?

With an output schema present and annotations covering read-only behavior, the description is sufficient for a 1-parameter tool. It specifies the package returned, the precondition, and the input source. No major gaps identified.

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% with reportId described as 'MANDATORY. UUID of the report.' The description adds context by explaining that the reportId is obtained from evidence_case_file_report_generate, which is useful workflow information. However, since the schema already fully documents the parameter, the description's added value is modest.

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

Purpose5/5

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

Description uses specific verb 'Retrieves' and clearly identifies the resource: 'a report's complete ZIP package' with access condition 'when you only hold the reportId'. It explicitly references sibling tool evidence_case_file_report_zip_url_get, clarifying it returns the same package, which distinguishes it from other evidence/report tools.

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

Usage Guidelines4/5

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

The phrase 'when you only hold the reportId' provides a clear usage context, implying this tool is for reportId-based access rather than case-file-based access. It also states the prerequisite 'Requires: evidence_case_file_report_generate → reportId', which tells the user the required prior step. However, it doesn't explicitly list alternative tools to use in other situations.

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

evidence_temp_file_upload_url_createA

Creates a presigned upload URL for a TEMPORARY file not yet registered as evidence. Use for staging content that another operation will reference; for real evidence prefer the register-then-upload flow (evidence_group_evidence_register) or the evidence_create_sealed composite, which handle registration and upload together.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
fileNameYes
metadataNo
createdByYes
testimonyYes
capturedAtYes
caseFileIdNoMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
evidenceGroupIdNoMANDATORY. UUID of the evidence group. Obtain from evidence_group_create.
requiredTestimonyProvidersNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations provide no positive safety hints (all false), so the description carries the burden. It usefully discloses that the operation only creates a URL and does not register the file, and it frames the temporary staging lifecycle. However, it omits details such as URL expiration, upload method, side effects, or what happens if the staged file is never referenced.

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 with no filler. The core action is front-loaded, the staging use case is stated, and alternatives are named compactly in the second sentence.

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

Completeness2/5

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

This is a 10-parameter tool with nested objects, no output schema, and no useful annotations, yet the description only covers purpose and high-level usage. It does not explain the returned URL, required ID relationships, or upload semantics, so an agent lacks critical information needed to invoke it correctly.

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

Parameters2/5

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

Schema description coverage is only 30%, and the description adds no parameter-level guidance. It never explains required fields like evidenceId, createdBy, title, capturedAt, fileName, or testimony. The schema also self-contradicts by labeling caseFileId 'MANDATORY' while not listing it in the required array, and the description does nothing to resolve 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 uses a specific verb+resource combination: 'Creates a presigned upload URL for a TEMPORARY file not yet registered as evidence.' It clearly distinguishes this tool from sibling upload/registration flows by emphasizing the temporary, unregistered nature and by naming the alternatives it is not.

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 states when to use the tool ('Use for staging content that another operation will reference') and when not to ('for real evidence prefer the register-then-upload flow' and 'evidence_create_sealed composite'). It names concrete sibling alternatives, leaving no ambiguity.

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

evidence_thumbnail_url_getA
Read-onlyIdempotent

Retrieves a temporary URL for an image evidence's thumbnail at the requested size — use for quick visual verification without downloading the original file. Requires: caseFileId + evidenceGroupId + evidenceId (image-type evidence only) and a thumbnailSize path value.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdYes
caseFileIdYesMANDATORY. UUID of the parent case file. Obtain from evidence_case_file_create.
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
thumbnailSizeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
urlNo
typeNo
expirationNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already indicate readOnly and nondestructive behavior; the description adds meaningful behavioral context: the URL is temporary, it is for thumbnails only, and it avoids downloading the original. This goes beyond the structured safety hints without contradicting them.

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

Conciseness4/5

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

The description is brief and front-loaded with the core purpose in the first sentence, followed by requirements. However, the naming error ('evidenceGroupId' vs 'groupId') slightly undermines its otherwise efficient structure.

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

Completeness2/5

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

While a simple read tool with output schema and safety annotations, the description is not fully complete: the parameter naming inconsistency could cause invocation errors, and thumbnailSize semantics are unexplained. These are material gaps for correct usage.

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

Parameters2/5

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

Schema coverage is only 50%, and the description must compensate but fails to do so adequately. It lists 'caseFileId + evidenceGroupId + evidenceId', but the actual schema parameter is 'groupId', creating a naming mismatch. It adds no meaningful detail for 'thumbnailSize' (e.g., accepted values), leaving two parameters under-described.

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 retrieves a temporary thumbnail URL for image evidence, specifying the exact verb and resource. It distinguishes itself from sibling download URL tools by emphasizing 'thumbnail' and 'without downloading the original file', making 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.

Usage Guidelines4/5

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

Explicitly says 'use for quick visual verification without downloading the original file', providing clear context. It also notes 'image-type evidence only', which sets a boundary, though it does not name alternative tools for other use cases.

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

evidence_updateA

Updates a single evidence's editable metadata (e.g. name, description) by evidenceId. The file content and hash are immutable — re-register a new evidence for changed files. Requires: evidence_group_evidence_register or generate_evidence → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
custodyNo
metadataNo
createdByNo
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
deletionDateNo
deletionTypeNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only indicate a non-read-only, non-idempotent operation, so the description carries most of the burden. It adds meaningful behavioral context: file content and hash are immutable, changed files require re-registration, and evidenceId is mandatory and must come from two named tools. This exceeds simple annotations and clarifies update boundaries without contradicting destructiveHint=false.

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

Conciseness4/5

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

The description is two sentences with zero waste: the first sentence gives the main action and scope, the second adds the critical immutability constraint and prerequisite. It is front-loaded and easy to scan. It could have been slightly more explicit about which metadata fields are editable, but overall it is concise and readable.

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

Completeness2/5

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

The tool has 7 parameters, nested objects, and no output schema, yet the description covers only the general purpose and identity requirement. It omits field-level semantics (e.g., how custody, deletionDate, and deletionType are used) and whether unprovided fields are ignored or reset. An agent assembling a correct call would still have to inspect the schema heavily to understand editing behavior.

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

Parameters2/5

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

Schema description coverage is only 14%, with only evidenceId described in the schema, so the description needs to compensate. It only gives examples ('name, description') and says the target is editable metadata, but does not explain custody, metadata, createdBy, deletionDate, deletionType, or whether updates are partial vs full. Most parameters remain ambiguous from both schema and description.

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 and resource ('Updates a single evidence's editable metadata by evidenceId') and explicitly scopes the tool to one evidence, distinguishing it from sibling evidence_update_bulk. The mention of immutability for content/hash prevents confusion with file-modifying tools. An agent can immediately tell what this tool is for.

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 a clear when-to-use context and a strong when-not: if the file content or hash changes, the agent should re-register a new evidence instead of using this tool. It also states the prerequisite chain (evidence_group_evidence_register or generate_evidence → evidenceId), which routes the agent to correct predecessor tools. It does not explicitly name evidence_update_bulk as the alternative for multiple records, but the 'single' wording conveys that.

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

evidence_update_bulkA

Updates the editable metadata of SEVERAL evidences in one call (each entry carries its own evidenceId and changes). Prefer evidence_update for a single evidence. Requires: the evidenceIds to update (evidence_search to find them).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes
patchNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=false and destructiveHint=false, so the mutation is already known. The description adds context by specifying 'editable metadata' and that each entry carries its own evidenceId and changes, giving behavioral insight beyond the schema. No contradiction with annotations.

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 concise sentences with no fluff. It front-loads the verb and scope, includes usage alternatives, and provides a prerequisite—all relevant information without unnecessary detail.

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

Completeness3/5

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

While the description covers purpose, alternatives, and prerequisite, it fails to explain the critical relationship between the 'ids' array and the 'patch' array, and does not mention return values or error behavior. Given no output schema and a bulk mutation tool, this gap leaves the description minimally viable but incomplete.

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

Parameters2/5

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 vaguely mentions 'each entry carries its own evidenceId and changes' but does not explain the structure of the 'patch' array (operation/path/value) or how 'ids' relates to 'patch'. This leaves significant ambiguity for correctly invoking the tool.

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 updates editable metadata of several evidences in one call, using a specific verb and resource. It also distinguishes itself from the sibling tool evidence_update for single evidence, making its purpose and scope unambiguous.

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 instructs to prefer evidence_update for a single evidence and requires evidence_search to find the evidenceIds. This provides clear when-to-use and alternative tool guidance, exceeding basic usage context.

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

evidence_upload_url_createA

Creates a fresh presigned upload URL for an already-registered evidence by evidenceId — step 2 of the register-then-upload flow (PUT the file bytes to the returned URL). Pairs with generate_evidence the way evidence_group_evidence_upload_url_create pairs with evidence_group_evidence_register. Requires: generate_evidence → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNameYes
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.

TDQS

A4/5.0
Behavior4/5

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

Annotations are all false/default and offer no meaningful safety or mutation hints. The description carries the burden and reveals a key trait: the tool only creates a pre-signed URL, it does not upload the file; the caller must PUT bytes to that URL. It does not mention expiration or auth requirements, but the essential non-obvious behavior is disclosed.

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 the primary purpose, followed by concise flow and pairing context. No filler or redundant details; every sentence earns its place.

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

Completeness3/5

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

The flow, prerequisite, and PUT action are well explained, and the description adds useful pairing context. However, with no output schema and sparse annotations, it still leaves gaps: no return format, no URL expiry, no explanation of how fileName is used, and no distinction from analogous upload-URL siblings.

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

Parameters2/5

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

The input schema describes evidenceId, but fileName has only a minLength and no semantic description. The description completely omits fileName, even though it is a required parameter, and only contextualizes evidenceId via the flow. With 50% schema coverage, the description fails to compensate for the missing parameter meaning.

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

Purpose5/5

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

Description names a specific action: 'Creates a fresh presigned upload URL for an already-registered evidence by evidenceId', and clearly positions it as step 2 of a flow. It distinguishes from generate_evidence and similar sibling tools by specifying the register-then-upload order and referencing evidenceId rather than creating the evidence itself.

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 clear context: requires generate_evidence → evidenceId, instructs the agent to PUT file bytes to the returned URL, and names a parallel pairing. It does not explicitly exclude alternatives like evidence_temp_file_upload_url_create or evidence_multipart_upload_start, so it stops short of a full when-to-use vs 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.

generate_evidenceA

Register a new evidence (legacy top-level name; not scoped to a specific evidence group at creation time, unlike evidence_group_evidence_register). Use for standalone evidence outside the group-based flow, or for continuity with the legacy EAD-Factory-MCP integration. Requires the file's SHA-256 hash. Prefer evidence_create_sealed for a new, complete evidence group + evidence + seal flow. Custody type: INTERNAL = EAD Factory stores and custodies the file itself. | EXTERNAL = The file lives outside EAD Factory — you attest to its hash only, EAD Factory never stores the bytes. Testimony (qualified proof) provider family: TSP = Trusted Service Provider — eIDAS-qualified electronic timestamp; the legally strongest proof tier. | DLT = Distributed Ledger Technology — blockchain-anchored proof; immutable and independently verifiable.

ParametersJSON Schema
NameRequiredDescriptionDefault
hashYes
typeNo
titleNo
fileNameNo
fileSizeNo
metadataNo
createdByNo
testimonyYes
capturedAtYes
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.
custodyTypeYes
deletionDateNo
deletionTypeNo
requiredTestimonyProvidersYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
expirationNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only convey readOnly/idempotent/destructive hints; the description goes further by explaining custody behavior (INTERNAL stores/custodies the file, EXTERNAL never stores bytes) and the legal weight of TSP vs DLT testimony. It also discloses the legacy/group-scoping constraint. Minor gaps remain, such as how file bytes are supplied for INTERNAL custody, but the description adds substantive behavioral context beyond annotations.

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

Conciseness4/5

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

The description is long but front-loaded with purpose and usage, then uses compact labeled blocks for custody and testimony. The pipe-separated definitions are dense but each earns its place given the semantic complexity; it could be tightened slightly but is not bloated.

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 14-parameter registration tool with only 7% schema description coverage, the description covers the two hardest decision areas: when to use it vs evidence_create_sealed, and what custody/testimony values mean. The output schema covers the return shape. It is not fully complete, since capturedAt and requiredTestimonyProviders are not addressed in prose, but the remaining gaps are partially bridged by schema names and formats.

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 only 7%, so the description must compensate. It adds real meaning for hash (SHA-256), custodyType (INTERNAL vs EXTERNAL semantics), and testimony provider families (TSP/DLT). However, it never explains required params like capturedAt or requiredTestimonyProviders, and optional fields such as metadata, deletionDate, deletionType, and fileSize are left entirely to their names and 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 opens with a specific verb-resource pair ('Register a new evidence') and immediately clarifies it is the legacy top-level registration, not group-scoped, explicitly distinguishing it from evidence_group_evidence_register. This makes the tool's role unambiguous against a large sibling list.

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?

It names the exact conditions for using this tool ('standalone evidence outside the group-based flow' or 'continuity with legacy EAD-Factory-MCP integration') and explicitly tells the agent to prefer evidence_create_sealed for a complete group+evidence+seal flow. This is explicit routing with a named alternative, not just implied context.

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

get_evidenceA
Read-onlyIdempotent

Retrieves an evidence record's details and status by id (legacy top-level name). Use to check an evidence's timestamping status (IN_PROCESS / COMPLETED / ERROR) after registration. Requires: generate_evidence or evidence_group_evidence_register → evidenceId.

ParametersJSON Schema
NameRequiredDescriptionDefault
evidenceIdYesMANDATORY. UUID of the evidence record. Obtain from evidence_group_evidence_register or generate_evidence.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hashNo
titleNo
statusNo
groupIdNo
fileNameNo
fileSizeNo
metadataNo
createdByNo
capturedAtNo
caseFileIdNo
evidenceIdNo
timestampsNo
custodyTypeNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds value by specifying the exact status values (IN_PROCESS, COMPLETED, ERROR) and the registration prerequisite, which enriches the behavioral context without contradicting annotations.

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 concise sentences, front-loaded with the core action and followed by use case and requirement. Every sentence earns its place with no redundancy, making it highly efficient.

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

Completeness4/5

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

Given the tool's simplicity (one parameter, read-only, output schema present), the description is nearly complete. It covers purpose, usage context, and prerequisites. The only slight gap is not explicitly stating 'top-level evidence only' or contrasting with group-level alternatives, but the 'legacy top-level name' hint mitigates this.

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

Parameters3/5

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

The input schema already provides a description for evidenceId (MANDATORY, UUID, obtain from evidence_group_evidence_register or generate_evidence), and coverage is 100%. The description repeats this requirement but does not add new semantic detail beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool retrieves an evidence record's details and status by ID, with the specific use of checking timestamping status. The phrase 'legacy top-level name' distinguishes this from group-level evidence tools like evidence_group_evidence_get, making 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.

Usage Guidelines4/5

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

The description provides explicit context on when to use: after registration, to check status (IN_PROCESS / COMPLETED / ERROR). It also specifies the prerequisite chain (generate_evidence or evidence_group_evidence_register → evidenceId). It lacks explicit alternatives or when-not-to-use guidance, but the context is clear.

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

get_signature_requestA
Read-onlyIdempotent

Retrieves a signature request's details and status by id (legacy top-level name). Use to check signing progress after activation. Requires: create_signature_request → signatureRequestId.

ParametersJSON Schema
NameRequiredDescriptionDefault
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
nameNo
statusNo
languageNo
providerNo
createdAtNo
createdByNo
documentsNo
senderNameNo
closeConfigNo
descriptionNo
webhookUrisNo
notificationsNo
senderAddressNo
statusHistoryNo
uniqueValidatorNo
cancellationReasonNo
signatureRequestBodyNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the dependency on create_signature_request and the 'legacy top-level name' note, which are useful behavioral cues. No contradictions with annotations.

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

Conciseness5/5

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

The description is two sentences long, front-loaded with the main action. Both sentences carry essential information: what it does and when to use it with a prerequisite. No redundant or filler content.

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

Completeness4/5

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

For a simple read-only tool with one parameter, a well-documented schema, and an output schema present, the description adequately covers the purpose, usage context, and prerequisite. It could mention potential errors or return format details, but those are standard for such tools and are largely inferred from the output schema.

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

Parameters3/5

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

The input schema already provides a detailed description for signatureRequestId, including that it is a mandatory UUID and where to obtain it. The description repeats this dependency without adding new syntax or format details. With 100% schema coverage, the baseline is 3, and the description does not exceed that.

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 action: "Retrieves a signature request's details and status by id." It specifies the resource and the identifier method, and the note "legacy top-level name" helps distinguish it from potential newer variants. This is specific and unambiguous.

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

Usage Guidelines4/5

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

It provides usage context: "Use to check signing progress after activation." It also states a prerequisite: "Requires: create_signature_request → signatureRequestId." However, it does not explicitly mention when not to use it or name alternative tools like signature_request_list or signature_request_full, so it falls short of full 5.

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

notification_certificate_generateA

Generates a delivery-certificate report for one or more notifications on a request. Use once notification_request_status shows the relevant notifications have left their in-flight state. Requires: notification_request_create → requestId, notification_request_status → notificationIds. Returns a reportId — call notification_certificate_pdf_url_get with it to get the actual download URL (2-step, same shape as Evidence's report tools).

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdNoMANDATORY. UUID of the report.
templateYes
requestIdYesUUID of the notification request. Obtain from notification_request_create.
languageCodeYes
additionalDataNo
notificationIdsYes
embedAttachmentsEnabledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportIdNo
templateYes
requestIdNo
languageCodeYes
additionalDataNo
notificationIdsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only provide readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the description carries the burden of explaining behavior. It discloses the 2-step nature of the report flow, the prerequisite state of notifications, and that the tool returns a reportId. This is useful behavioral context, though it does not mention side effects like duplicate report creation or whether generation is asynchronous.

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 and information-dense. Each sentence contributes meaning: what it does, when to use it, what prerequisites are needed, and what to do with the result. No filler or redundant content is present.

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

Completeness4/5

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

Given the tool's complexity, the description covers purpose, prerequisites, parameter provenance, and the follow-up step, while an output schema exists for return values. It is not fully complete because some parameters and edge behaviors are unaddressed, but it provides enough context for an agent to invoke the tool correctly in the intended workflow.

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 only 29%, so the description must compensate. It explains the source and purpose of requestId and notificationIds, and notes that notificationIds can be one or more. However, it does not clarify template, languageCode, additionalData, or embedAttachmentsEnabled, which remain unexplained despite being required or optional parameters.

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 'generates a delivery-certificate report for one or more notifications on a request', identifying the specific verb, resource, and scope. It also distinguishes itself from the sibling notification_certificate_pdf_url_get by framing the output as a reportId used for a later URL retrieval step.

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 gives explicit usage timing ('Use once notification_request_status shows the relevant notifications have left their in-flight state') and names the prerequisite tools. It also directs the agent to the next step (call notification_certificate_pdf_url_get with the returned reportId), providing clear workflow guidance versus alternative tools.

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

notification_certificate_pdf_url_getA
Read-onlyIdempotent

Retrieves the download URL for a previously generated notification delivery certificate. Requires: notification_certificate_generate → reportId.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesMANDATORY. UUID of the report.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety and idempotency profile. The description adds the prerequisite context about needing a previously generated certificateID, which is useful. However, it doesn't disclose details like whether the URL expires or requires authentication, but with annotations covering the main traits, a 3 is appropriate.

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 extremely concise: one sentence for purpose and one for the prerequisite. It front-loads the verb and resource, and every word adds value. The prerequisite is clearly signaled with a pipe and arrow.

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 one-parameter getter with a well-documented schema and comprehensive annotations, the description covers the essential prerequisite and purpose. The output schema and annotations handle the rest, so nothing critical is missing.

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

Parameters3/5

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

The schema provides full coverage (100%) with a detailed description for reportId, including format and mandatory status. The description only mentions reportId in the prerequisite context, not adding new semantics beyond what the schema already states. Thus, baseline 3 is correct.

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

Purpose5/5

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

The description clearly states the tool retrieves a download URL for a notification delivery certificate, specifying the exact resource and action. It distinguishes itself from siblings like notification_certificate_generate by focusing on retrieval of an already-generated certificate.

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?

It explicitly states the prerequisite: 'Requires: notification_certificate_generate → reportId.' This tells the agent when to use this tool (after generation) and implies not to use it before that step. It also contrasts with sibling tools like evidence_download_url_create that generate URLs for other resources.

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

notification_document_addA

Registers one or more document attachments (metadata only — fileName + SHA-256 hash) on a draft notification request. Use once per batch of documents before activating. Requires: notification_request_create → requestId. This only registers metadata; call notification_document_upload_url_create for each registered attachment to get a URL to PUT the actual file bytes to.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestIdYesUUID of the notification request. Obtain from notification_request_create.
attachmentsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
requestIdNo
uploadLinksNo
notificationIdsNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations are all false, so the description carries the burden. It discloses key behavioral traits: this tool only registers metadata, not the file bytes, and should be used before activating. It also reveals the two-step sequence (register then get upload URL). However, it does not discuss error handling, whether registrations are additive, or idempotency behavior (consistent with the false idempotentHint).

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?

Three concise sentences, each with a distinct purpose: first defines the operation, second states when to use it, third clarifies what it does not do and directs to the complementary tool. No redundancy or filler.

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

Completeness4/5

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

Given the tool's moderate complexity, the description covers the what, when, and sequencing. The output schema likely covers return values (not shown). It lacks explicit mention that the request must be in draft state, though 'before activating' suggests it. Overall, an agent can correctly select and invoke the tool with this description.

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 50% (only requestId has a description). The description adds meaning by specifying that requestId comes from notification_request_create and identifies the hash as SHA-256. It also frames attachments as 'fileName + hash'. It does not explain optional fields like fileId or fileSize, but the schema provides their types and constraints.

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

Purpose5/5

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

The description uses the specific verb 'registers' and identifies the resource as 'document attachments (metadata only — fileName + SHA-256 hash) on a draft notification request'. It clearly distinguishes itself from the upload tool by stating 'metadata only' and referencing notification_document_upload_url_create for actual byte uploads.

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?

Provides explicit timing ('Use once per batch of documents before activating'), a prerequisite ('Requires: notification_request_create → requestId'), and an alternative/exclusion ('call notification_document_upload_url_create for each registered attachment to get a URL to PUT the actual file bytes to').

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

notification_document_download_url_createA

Creates a presigned download URL for a document attachment on a notification request. Requires: notification_request_create → requestId, notification_document_add → attachmentId.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestIdYesUUID of the notification request. Obtain from notification_request_create.
attachmentIdYesMANDATORY. UUID of the attachment. Obtain from notification_document_add.

TDQS

A4/5.0
Behavior3/5

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

All annotations are false, so the description carries the full burden. It adds the useful trait that the URL is presigned and specifies dependencies, but it doesn't disclose expiration behavior, authentication requirements, or whether the operation has side effects. This is a moderate gap for a tool that creates a time-limited resource.

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, no filler. The main purpose is front-loaded and the prerequisite chain is compressed into a clear arrow notation. Every word earns its place.

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

Completeness4/5

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

For a two-parameter tool with full schema coverage and no output schema, the description adequately covers the tool's purpose and usage context. It omits the return format and expiration details, but the tool's simplicity makes the description sufficient for selection and basic invocation.

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% and each parameter already explains its origin ('Obtain from notification_request_create' and 'Obtain from notification_document_add'). The description's 'Requires' line essentially repeats this, adding no new semantic value beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Creates') and resource ('presigned download URL for a document attachment on a notification request'), making the tool's function immediately clear. It also distinguishes itself from the sibling upload tool by emphasizing 'download'.

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 clearly states the required prior calls ('notification_request_create → requestId, notification_document_add → attachmentId'), giving actionable workflow context. It doesn't explicitly exclude alternatives, but the prerequisite chain and download-specific wording are sufficient for typical usage.

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

notification_document_upload_url_createA

Creates a presigned upload URL for a document attachment already registered via notification_document_add — PUT the file bytes to the returned URL. Requires: notification_request_create → requestId, notification_document_add → attachmentId.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileSizeNo
requestIdYesUUID of the notification request. Obtain from notification_request_create.
attachmentIdYesMANDATORY. UUID of the attachment. Obtain from notification_document_add.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
expirationNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=false, but the description adds valuable behavioral context: the tool only generates a URL and does not upload the file, and the caller must 'PUT the file bytes to the returned URL'. This goes beyond the annotations by explaining the subsequent action. No contradiction with annotations.

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 the action and the PUT instruction. The dependency chain is compactly expressed with arrows. Every phrase serves a purpose, with no filler.

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?

The output schema exists, so no return-value explanation is needed. The description covers the workflow context (what must happen before and after calling this). It does not mention the optional fileSize, but this is a minor gap given the tool's simplicity and the provided workflow.

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

Parameters3/5

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

The schema already describes requestId and attachmentId with 'Obtain from' guidance, and the description repeats this. The optional fileSize parameter lacks a schema description, and the description does not explain its meaning or relevance. Schema coverage is 67%, so the description adds marginal value over the schema but does not fully compensate for fileSize.

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 action: 'Creates a presigned upload URL for a document attachment already registered via notification_document_add'. It distinguishes itself from sibling tools like notification_document_download_url_create by specifying upload and using the verb 'creates' with a specific resource.

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 provides the required prior steps: 'Requires: notification_request_create → requestId, notification_document_add → attachmentId'. It implies when to use the tool (after registering a document, before uploading bytes) and even explains how to use the result (PUT to the URL). However, it does not explicitly state when not to use it or mention alternatives beyond the implied workflow.

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

notification_receiver_addA

Adds one or more receivers to a draft notification request — each receiver becomes its own per-channel notification under the shared requestId (there is no separate receiverId; track receivers by the notificationIds this call returns). Use once per batch of receivers before calling notification_request_send. Requires: notification_request_create → requestId. Each receiver's shape depends on its provider (SMTP/SMS/NOTICEMAN/WFB) — see the schema for the fields each variant needs. Notification delivery provider: SMTP = Email delivery. | SMS = SMS text message delivery. | NOTICEMAN = EAD Factory's own certified notification channel (qualified electronic delivery). | NOTICEMAN_AND_WHATSAPP = Certified channel plus a WhatsApp copy. | NOTICEMAN_AND_WHATSAPP_AND_RCS = Certified channel plus WhatsApp and RCS copies. | NOTICEMAN_AND_RCS = Certified channel plus an RCS (Rich Communication Services) copy. | WFB = WhatsApp Business messaging, uncertified (no Noticeman qualified channel). | RCS = RCS (Rich Communication Services) messaging only, uncertified.

ParametersJSON Schema
NameRequiredDescriptionDefault
receiversYes
requestIdYesUUID of the notification request. Obtain from notification_request_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
requestIdNo
notificationIdsNo

TDQS

A3.7/5.0
Behavior4/5

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

The description discloses meaningful behavioral traits beyond the minimal annotations: there is no separate receiverId, receivers must be tracked by the notificationIds returned, and each receiver becomes its own per-channel notification. This adds real operational context that annotations do not provide, and there is no contradiction.

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

Conciseness2/5

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

The core workflow guidance is front-loaded and useful, but the description becomes verbose with a long provider enumeration that is partially redundant with the schema and partially contradictory. The extra provider variants not present in the schema make the description longer without adding correct value.

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

Completeness3/5

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

The description covers the workflow, batching, and return tracking semantics, and the schema itself documents the receiver variants in detail. However, it is incomplete regarding the actual provider const values expected by the schema, and it introduces confusion by listing invalid provider options. Overall adequate but with a significant gap.

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

Parameters2/5

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

The description adds some meaning by defining provider types like SMTP, SMS, NOTICEMAN, and WFB, but it also lists providers such as NOTICEMAN_AND_WHATSAPP and RCS that do not appear anywhere in the schema's oneOf consts. It also fails to map the human-readable provider names to the actual schema const values like Notification_AddReceiverEmailNotificationRequestModel, which can mislead an agent into constructing invalid requests.

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 action and object: 'Adds one or more receivers to a draft notification request.' It also clarifies the unique behavior that each receiver becomes its own per-channel notification under a shared requestId, which clearly distinguishes it from sibling tools like notification_request_create and notification_request_send.

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 explicit sequencing: it requires notification_request_create → requestId and instructs to use once per batch before calling notification_request_send. It does not explicitly list when-not-to-use alternatives, but the workflow context is clear enough for an agent to select it appropriately.

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

notification_request_createA

Creates a new notification request (draft) — the top-level container for receivers and attachments in a certified-notification flow. Use this first, before any other Notification-manager tool. No prerequisites. Set autosend: true to also send immediately on activation of the first receiver batch, or leave it false to add receivers/documents over several calls before calling notification_request_send yourself. Returns requestId and one notificationId per receiver already on the request (if any were included inline).

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNo
contentNo
autosendNo
languageYes
metadataNo
requestIdNoOPTIONAL. Supply a UUID here only if you want to choose the new request's id yourself; omit it and the API assigns one. Either way this call RETURNS the requestId that every other Notification tool then requires — do not try to obtain it beforehand.

Output Schema

ParametersJSON Schema
NameRequiredDescription
requestIdNo
uploadLinksNo
notificationIdsNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only indicate readOnlyHint=false, idempotentHint=false, and destructiveHint=false. The description adds meaningful behavior context: it creates a draft, may auto-send on activation if autosend is true, and returns requestId plus notificationIds. There is no contradiction with the annotations.

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?

Three sentences, front-loaded with purpose and sequencing, then key parameter behavior and return values. No filler or redundancy; every sentence earns its place.

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

Completeness4/5

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

For a complex tool with a very rich schema, the description covers the essential lifecycle context, the autosend decision point, and the return contract. It does not enumerate provider-specific fields, but the schema supplies those structural details, so the description is largely sufficient for selecting and initially invoking the tool.

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

Parameters2/5

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

Schema description coverage is only 17%, so the description must compensate, but it only meaningfully explains autosend and requestId. It does not clarify the large `data` object, provider-specific configuration, required `language`, `content`, or `metadata`, leaving the agent under-informed for a complex payload.

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 action ('Creates a new notification request (draft)'), identifies the resource (top-level container for receivers and attachments), and immediately distinguishes it from siblings like notification_request_send, notification_receiver_add, and notification_document_add by saying 'Use this first'.

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 says when to use it ('before any other Notification-manager tool'), states there are no prerequisites, and contrasts autosend behavior with manually calling notification_request_send later. This gives an agent clear routing and sequencing guidance.

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

notification_request_sendA

Activates a notification request, triggering delivery to every added receiver across their configured channels (email/SMS/Noticeman/WhatsApp/RCS). Runs as an MCP Task (bounded-polling until every receiver's notification leaves its in-flight state — EAD Factory's upstream emits no events for this transition). Requires: notification_request_create -> requestId, at least one receiver added via notification_receiver_add. On completion, returns each notification's id and final delivery state (per-receiver failures are reported in the result, not treated as a Task failure). REQUIRES an MCP client with Tasks support — from a client without it this call fails; in that case create the request with autosend: true (notification_request_create) and poll notification_request_status yourself. Use notification_request_status to check progress without waiting.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestIdYesMANDATORY. UUID of the notification request. Obtain from notification_request_create.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations are all false (readOnly, idempotent, etc.), so the description carries the disclosure burden. It explains the bounded-polling task behavior, the lack of upstream events, per-receiver failure reporting, and the requirement for MCP Tasks support—far beyond basic annotation info. No contradiction.

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?

Though long, every sentence earns its place: main action, task mechanics, prerequisites, completion behavior, client requirement, alternatives, cross-reference. It's dense and well-structured with no fluff, front-loading the core purpose.

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

Completeness5/5

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

Given the tool's complexity (MCP task, failure handling, client constraints), this description covers all necessary context: what triggers, what it requires, what happens on completion, what to do without Tasks support, and which sibling to use for status. With no output schema, it even describes the return value.

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%: requestId is fully described with format and provenance. The description reinforces it ('Requires: notification_request_create -> requestId') but adds no new semantic meaning beyond the schema. Baseline 3 is appropriate.

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

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 and resource: 'Activates a notification request, triggering delivery to every added receiver.' It clearly distinguishes from siblings like notification_request_create (creates), notification_request_status (checks status), and notification_receiver_add (adds receivers).

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?

Explicit prerequisites are given (notification_request_create for requestId, notification_receiver_add for receivers). It also provides alternatives for clients without Tasks support (use autosend:true and poll status), and points to notification_request_status for progress checking. This is model usage guidance.

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

notification_request_statusA
Read-onlyIdempotent

Searches notifications, optionally filtered by requestId and/or delivery state — the closest equivalent to "checking a request's status": a request fans out into one notification per receiver, each with its own state history, so this returns every notification matching the filter with its current state. Omit requestId to search across every request. Requires: notification_request_create → requestId (if filtering to one request).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo
pageNo
sizeNo
sortNo
statesNo
filtersNo
requestIdNoUUID of the notification request. Obtain from notification_request_create.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/non-destructive behavior, so the description's job is to add context, which it does: result granularity (one notification per receiver), state history, and that only the current state is returned. The caveat that a request fans out into multiple notifications is important behavioral context beyond the schema.

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

Conciseness4/5

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

The description is three sentences and front-loads the search purpose before the fan-out explanation and prerequisite. The style is slightly dense, but every clause earns its place and no filler is present.

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

Completeness3/5

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

Given an output schema exists, the description needn't restate return values, and it covers the core fan-out model and requestId dependency. However, the descriptions of multiple parameters (ids, filters, pagination/sort) are left to inference, which is a real gap for a 7-parameter tool with a nested filters object.

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

Parameters2/5

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

Only requestId carries schema documentation, and schema coverage is 14%, so the description must compensate. It explains requestId and delivery state (states) but leaves the other five parameters (ids, page, size, sort, filters) semantically unexplained, including the ambiguous filters object and the distinction between ids and requestId.

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 and resource, 'Searches notifications,' then adds the unique fan-out semantics: one notification per receiver, each with its own state history. It explicitly frames that result as the closest equivalent to checking a request's status, which distinguishes it from sibling actions like notification_request_create or notification_request_send.

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

Usage Guidelines4/5

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

It states the intended use case ('checking a request's status') and gives a conditional: omit requestId to search across every request. It also names the prerequisite dependency (notification_request_create → requestId) when filtering to one request, though it does not explicitly name tools to avoid.

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

signature_certificate_generateA

Generates the well-signed appearance certificate document for a signature request. Use once every signatory has signed (check with get_signature_request). Requires: create_signature_request → signatureRequestId. Unlike EAD Enterprise's equivalent tool (a GET that polls an already-generated URL), this triggers generation and returns the result in the same call.

ParametersJSON Schema
NameRequiredDescriptionDefault
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYes

TDQS

A4.4/5.0
Behavior4/5

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

The description discloses that this 'triggers generation and returns the result in the same call,' which is a key synchronous behavior beyond the annotations. However, it doesn't detail side effects like whether repeated calls create duplicates or if any state is marked, though annotations already indicate non-idempotent and non-read-only.

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?

Three concise sentences: purpose, usage timing/prerequisite, and differentiation from an alternative. Each sentence earns its place, no fluff, with the key information front-loaded.

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

Completeness4/5

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

Given the simple 1-param schema with an output schema and all-false annotations, the description covers the essential context: when to use it, what it returns, and how it differs from another approach. It doesn't explain domain-specific 'well-signed' or failure modes, but that's minor for the tool's complexity.

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 single parameter signatureRequestId is 100% covered by the schema description ('MANDATORY. UUID... Obtain from create_signature_request'). The tool description repeats the prerequisite but adds no new semantic detail, so baseline 3 is appropriate.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Generates the well-signed appearance certificate document for a signature request.' It clearly identifies the action and object, and the final sentence contrasts this tool with EAD Enterprise's GET-based equivalent, distinguishing it from related generation/polling tools.

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 when to use: 'Use once every signatory has signed (check with get_signature_request).' It names the prerequisite chain 'create_signature_request → signatureRequestId' and provides an alternative comparison, giving clear context for when this tool is appropriate.

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

signature_coordinate_setA

Sets the on-page (x, y, page) coordinates where a signatory's signature appears on a document. Use after add_signatory_to_document if the signature placement needs to be explicit rather than auto-positioned. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId, add_signatory_to_document → signatoryId.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesMANDATORY. UUID of the document within the signature request. Obtain from add_document_to_signature_request.
coordinatesNo
signatoryIdYesMANDATORY. UUID of the signatory. Obtain from add_signatory_to_document.
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=false, so the agent knows this is a mutating operation. The description adds the context that this is for explicit placement versus auto-positioning and the required preceding steps. However, it does not disclose whether repeated calls overwrite prior coordinates, the coordinate system/units, or what the response contains. This is adequate but not richly 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 three sentences: the first gives the core function, the second gives the usage condition, and the third lists prerequisites in a compact arrow format. Every sentence carries necessary information, with no fluff or repetition.

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

Completeness2/5

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

There is no output schema, so the description should convey what the tool returns or accomplishes beyond the mutation. It does not mention whether coordinates is required (schema marks it optional, which is confusing given the tool's purpose), how the coordinate array is structured, or whether the operation returns a success indicator. This ambiguity could lead an agent to invoke the tool incorrectly.

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 75%: the three ID parameters each have descriptions in the schema, and the description restates their source tools in the prerequisites. For the coordinates parameter, the schema only provides its array/object structure; the description says 'on-page (x, y, page) coordinates' but does not explain units, origin, or pagination semantics. With high schema coverage, the baseline is 3, and the slight added context for coordinates does not elevate it.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Sets the on-page (x, y, page) coordinates where a signatory's signature appears on a document.' It uses a specific verb ('sets'), names the resource (coordinates for a signatory's signature), and distinguishes itself from sibling tools like add_signatory_to_document by focusing on explicit placement rather than adding a signatory.

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 gives explicit when-to-use guidance: 'Use after add_signatory_to_document if the signature placement needs to be explicit rather than auto-positioned.' It also lists the exact prerequisite chain (create_signature_request → signatureRequestId, add_document_to_signature_request → documentId, add_signatory_to_document → signatoryId), which helps the agent sequence the call correctly.

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

signature_document_download_url_getA
Read-onlyIdempotent

Retrieves the download link for the FINAL, well-signed version of a document — the actual signed file, once every signatory has signed. Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId. Use get_signature_request first to confirm signing is complete before calling this. Not to be confused with signature_certificate_generate, which produces a separate appearance certificate document, not the signed document itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
documentIdYesMANDATORY. UUID of the document within the signature request. Obtain from add_document_to_signature_request.
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
expirationNo

TDQS

A4.7/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds valuable behavioral context: it only returns the link 'once every signatory has signed' and requires confirmation of signing completion, which is a state precondition. This goes beyond the basic safety profile and clarifies the operation's dependency on signatory completion.

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, each with a distinct purpose: purpose, prerequisites, and disambiguation. It is front-loaded with the core action and contains no fluff or redundant information, maximizing information density.

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

Completeness5/5

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

Given the tool's simplicity and that an output schema exists, the description sufficiently covers purpose, usage, preconditions, and differentiation from similar tools. It does not need to explain return values because the output schema handles that, and the provided context is complete for a download-link retrieval 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?

Schema coverage is 100% with descriptions for both parameters. The description adds further meaning by mapping each parameter to its source: 'create_signature_request → signatureRequestId, add_document_to_signature_request → documentId'. This explains provenance and prerequisite, 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: 'Retrieves the download link for the FINAL, well-signed version of a document'. It uses a specific verb ('Retrieves') and resource ('download link'), and distinguishes it from the sibling 'signature_certificate_generate' by explicitly noting the certificate is not the signed document.

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?

Provides explicit sequencing: 'Requires: create_signature_request → signatureRequestId, add_document_to_signature_request → documentId' and instructs to 'Use get_signature_request first to confirm signing is complete before calling this'. It also clarifies when not to use it by contrasting with signature_certificate_generate, giving clear usage versus alternatives.

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

signature_request_cancelA

Cancels an active signature request — no further signing can occur. Use when a request was activated in error or is no longer needed. Requires: create_signature_request → signatureRequestId. Cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
signatureRequestIdYesMANDATORY. UUID of the signature request. Obtain from create_signature_request.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNo
statusNo

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses irreversibility ('Cannot be undone') and the 'active' state restriction, which are not fully captured by annotations. The annotations state readOnlyHint=false and destructiveHint=false, which are consistent with the description. The added context about no further signing and irreversibility goes beyond the structured data without contradiction.

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 four short sentences, each delivering distinct information: action, consequence, use case, prerequisite, and irreversibility. There is no redundancy or filler; every sentence earns its place and the front-loaded action makes it immediately scannable.

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 tool with one parameter, an output schema, and annotations, the description is complete. It covers purpose, usage context, prerequisite, and irreversibility, which is sufficient for an agent to select and invoke the tool correctly without needing further context.

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

Parameters3/5

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

The schema already provides complete parameter documentation with 100% coverage: the signatureRequestId is described as 'MANDATORY. UUID of the signature request. Obtain from create_signature_request.' The tool description's 'Requires: create_signature_request → signatureRequestId' merely echoes the schema description, adding no new semantic detail. This aligns with the baseline score of 3 for high schema coverage.

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 'Cancels an active signature request' with the consequence 'no further signing can occur.' This distinguishes it from sibling tools like activate_signature_request and get_signature_request, and the verb 'cancel' + resource 'signature request' is specific and unambiguous.

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

Usage Guidelines4/5

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

It explicitly provides the use case: 'Use when a request was activated in error or is no longer needed.' It also gives a prerequisite chain ('Requires: create_signature_request → signatureRequestId'). However, it does not mention alternatives or when not to use, so it misses the full 'when/when-not/alternatives' bar for a 5.

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

signature_request_fullA

Creates a signature request, adds one or more documents (each with its own signatories), and activates it — the full flagship signature flow in one call instead of create_signature_request + N x (add_document_to_signature_request + add_signatory_to_document) + activate_signature_request. Each document's file uses the shared FileInput contract (local path, base64, https URL, or n8n binary item) — never a bespoke file field. Set activate: false to leave the request in draft so you can add validators/observers (add_validator_to_signatory, add_observer_to_document) before activating it yourself. On success returns the request id, each document's id, and each signatory's id. Use the atomic tools instead when you need to inspect or react to each intermediate step, or need validators/observers before activation.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesMANDATORY. Signature request name.
activateNoActivate the request immediately after adding all documents/signatories.
createdByYesMANDATORY. Identifier of the requester.
documentsYesOne or more documents, each with its own signatories, added to the request.
descriptionNo

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 and largely delivers: it discloses activation behavior, the draft-mode path via activate: false, follow-up validator/observer tools, and the returned IDs on success. It could mention side effects of activation (e.g., notifications to signatories), but the disclosed behavior is solid for a complex write 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 dense but well-organized: a front-loaded summary of the composite flow, then targeted guidance on the file contract, activate behavior, return values, and when to choose alternatives. Every sentence carries distinctive information; no filler or repetition of schema fields.

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 complex composite tool with no output schema, the description covers invocation shape, file input variants, draft behavior, follow-up pathways, alternatives, and return values. This is sufficient for an agent to select and call the tool correctly without external documentation.

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 80%, so the baseline is 3. The description adds real value on top: it explains the shared FileInput contract (local path, base64, https URL, or n8n binary item), clarifies the activate flag's drafting behavior, and calls out that coordinates mirror signature_coordinate_set to avoid follow-up calls. These are meaningful clarifications beyond the bare 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 opens with a specific verb-resource pair: 'Creates a signature request, adds one or more documents, and activates it.' It names the exact composite flow and contrasts it with atomic siblings, making the tool's unique role unmistakable among similar signature tools.

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 when to use this tool versus the atomic alternative: use it as the full flagship flow, and use atomic tools when you need to inspect or react to each intermediate step or need validators/observers before activation. It also names sibling tools for those follow-ups, leaving no ambiguity.

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

signature_request_listA
Read-onlyIdempotent

List signature requests, optionally filtered by close condition among other criteria. Use to find a request when you don't have its id (e.g. by name or status). Signature-request close condition: ALL_REQUIRED = The request only closes once EVERY signatory has signed. | PARTIAL_ALLOWED = The request can close once the minimum required signatories have signed, even if others haven't yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNo
pageNo
sizeNo
sortNo
namesNo
dateToNo
hashesNo
creatorsNo
dateFromNo
statusesNo
closeAtToNo
providersNo
closeAtFromNo
closeConditionNo
emailObserversNo
signatureTypesNo
emailSignatoriesNo
cancellationReasonsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
recordsNo
_metadataNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the description doesn't need to restate these. It adds value by explaining the closeCondition enum values (ALL_REQUIRED vs PARTIAL_ALLOWED), which is behavioral context for filtering. It doesn't contradict annotations and provides meaningful extra detail.

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: two sentences that front-load the primary action ('List signature requests') and immediately give the key usage distinction. The close condition explanation is embedded efficiently without redundancy.

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

Completeness2/5

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

Despite having an output schema, this is a high-complexity tool with 18 optional filters. The description covers only a few (closeCondition, name, status) and omits pagination, sorting, date ranges, creators, providers, and more. This is incomplete guidance for an agent to effectively use the tool's full filtering capability.

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

Parameters2/5

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

With 0% schema description coverage, the description must compensate. It only explains closeCondition in detail and mentions 'name or status' (likely mapping to names/statuses parameters). The other 15+ parameters (ids, page, size, sort, dateFrom, dateTo, creators, providers, etc.) are left entirely unexplained, so the description provides minimal help for most parameters.

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 purpose: 'List signature requests' – a specific verb and resource. It also differentiates from siblings by noting it's for finding a request when you don't have its id (e.g., by name or status), which contrasts with get_signature_request.

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 an explicit usage scenario: 'Use to find a request when you don't have its id' – this implies when you do have the id, you'd use the get tool. However, it doesn't explicitly name alternatives like signature_request_full or signature_request_cancel, so it's clear but not exhaustive.

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. 25 tool updatesv1.4.0
    • Changedadd_document_to_signature_request1 field changed
      • changedInput schema / properties / signatureDeadline / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedadd_observer_to_document1 field changed
      • changedInput schema / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedadd_signatory_to_document1 field changed
      • changedInput schema / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedadd_validator_to_signatory1 field changed
      • changedInput schema / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedcreate_signature_request5 fields changed
      • changedInput schema / properties / closeConfig / properties / date / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / senderAddress / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • removedOutput schema / properties / signatureRequestBody / items / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "createdAt": {
        -        "type": "string"
        -      },
        -      "updatedAt": {
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "additionalText": {
        -        "type": "string"
        -      },
        -      "body": {
        -        "type": "string"
        -      },
        -      "participantRole": {
        -        "type": "string"
        -      },
        -      "signatureRequestId": {
        -        "type": "string"
        -      },
        -      "status": {
        -        "type": "string"
        -      },
        -      "subject": {
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / signatureRequestBody / items / properties
        Added value: +{
        +  "additionalText": {
        +    "type": "string"
        +  },
        +  "body": {
        +    "type": "string"
        +  },
        +  "createdAt": {
        +    "type": "string"
        +  },
        +  "participantRole": {
        +    "type": "string"
        +  },
        +  "signatureRequestId": {
        +    "type": "string"
        +  },
        +  "status": {
        +    "type": "string"
        +  },
        +  "subject": {
        +    "type": "string"
        +  },
        +  "updatedAt": {
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / signatureRequestBody / items / type
        Added value: +"object"
    • Changedevidence_case_file_delete_bulk1 field changed
      • changedInput schema / properties / requestId / description
        Previous value: -"UUID of the notification request. Obtain from notification_request_create."New value: +"MANDATORY. UUID you generate yourself to identify THIS bulk request — it is not obtained from any other tool, and it is NOT a notification request id. The upstream API does not document what it does with the value; send a fresh UUID per batch."
    • Changedevidence_case_file_report_generate3 fields changed
      • changedInput schema / properties / data / properties / groups / items / properties / capturedFrom / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / data / properties / groups / items / properties / capturedUntil / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / deletionDate / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedevidence_case_file_report_preview2 fields changed
      • changedInput schema / properties / data / properties / groups / items / properties / capturedFrom / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / data / properties / groups / items / properties / capturedUntil / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedevidence_case_file_report_update1 field changed
      • changedInput schema / properties / deletionDate / anyOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "provided": {
        -        "type": "boolean"
        -      },
        -      "value": {
        -        "format": "date-time",
        -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "provided": {
        +        "type": "boolean"
        +      },
        +      "value": {
        +        "format": "date-time",
        +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedevidence_case_file_search9 fields changed
      • removedInput schema / properties / filter / properties / code / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / code / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / filter / properties / createdFrom / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / filter / properties / createdUntil / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / filter / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / title / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "_metadata": {
        -        "additionalProperties": {},
        -        "properties": {
        -          "currentPage": {
        -            "type": "number"
        -          },
        -          "pageSize": {
        -            "type": "number"
        -          },
        -          "totalPages": {
        -            "type": "number"
        -          },
        -          "totalRecords": {
        -            "type": "number"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "category": {
        -              "type": "string"
        -            },
        -            "code": {
        -              "type": "string"
        -            },
        -            "createdAt": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "allOf": [
        -                {
        -                  "additionalProperties": {
        -                    "type": "string"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                {}
        -              ]
        -            },
        -            "owner": {
        -              "type": "string"
        -            },
        -            "status": {
        -              "allOf": [
        -                {
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "string"
        -                }
        -              ]
        -            },
        -            "title": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "category": {
        -              "type": "string"
        -            },
        -            "code": {
        -              "type": "string"
        -            },
        -            "createdAt": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "allOf": [
        -                {
        -                  "additionalProperties": {
        -                    "type": "string"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                {}
        -              ]
        -            },
        -            "owner": {
        -              "type": "string"
        -            },
        -            "status": {
        -              "allOf": [
        -                {
        -                  "type": "string"
        -                },
        -                {
        -                  "type": "string"
        -                }
        -              ]
        -            },
        -            "title": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / data / properties
        Added value: +{
        +  "_metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "currentPage": {
        +        "type": "number"
        +      },
        +      "pageSize": {
        +        "type": "number"
        +      },
        +      "totalPages": {
        +        "type": "number"
        +      },
        +      "totalRecords": {
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "records": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "category": {
        +          "type": "string"
        +        },
        +        "code": {
        +          "type": "string"
        +        },
        +        "createdAt": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "allOf": [
        +            {
        +              "additionalProperties": {
        +                "type": "string"
        +              },
        +              "propertyNames": {
        +                "type": "string"
        +              },
        +              "type": "object"
        +            },
        +            {}
        +          ]
        +        },
        +        "owner": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "allOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "string"
        +            }
        +          ]
        +        },
        +        "title": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / data / type
        Added value: +"object"
    • Changedevidence_create_sealed1 field changed
      • changedInput schema / properties / evidences / items / properties / capturedAt / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedevidence_group_delete_bulk1 field changed
      • changedInput schema / properties / requestId / description
        Previous value: -"UUID of the notification request. Obtain from notification_request_create."New value: +"MANDATORY. UUID you generate yourself to identify THIS bulk request — it is not obtained from any other tool, and it is NOT a notification request id. The upstream API does not document what it does with the value; send a fresh UUID per batch."
    • Changedevidence_group_evidence_register2 fields changed
      • changedInput schema / properties / capturedAt / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / deletionDate / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedevidence_group_search11 fields changed
      • removedInput schema / properties / filter / properties / code / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / code / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / filter / properties / createdBy / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / createdBy / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / filter / properties / createdFrom / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / filter / properties / createdUntil / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / filter / properties / name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "_metadata": {
        -        "additionalProperties": {},
        -        "properties": {
        -          "currentPage": {
        -            "type": "number"
        -          },
        -          "pageSize": {
        -            "type": "number"
        -          },
        -          "totalPages": {
        -            "type": "number"
        -          },
        -          "totalRecords": {
        -            "type": "number"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "caseFileId": {
        -              "type": "string"
        -            },
        -            "code": {
        -              "type": "string"
        -            },
        -            "collectionMetadataId": {
        -              "type": "string"
        -            },
        -            "createdAt": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "discarded": {
        -              "type": "boolean"
        -            },
        -            "evidences": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "completed": {
        -                  "type": "number"
        -                },
        -                "failed": {
        -                  "type": "number"
        -                },
        -                "inProcess": {
        -                  "type": "number"
        -                },
        -                "total": {
        -                  "type": "number"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "groupId": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "additionalProperties": {
        -                "type": "string"
        -              },
        -              "propertyNames": {
        -                "type": "string"
        -              },
        -              "type": "object"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "status": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "caseFileId": {
        -              "type": "string"
        -            },
        -            "code": {
        -              "type": "string"
        -            },
        -            "collectionMetadataId": {
        -              "type": "string"
        -            },
        -            "createdAt": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "discarded": {
        -              "type": "boolean"
        -            },
        -            "evidences": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "completed": {
        -                  "type": "number"
        -                },
        -                "failed": {
        -                  "type": "number"
        -                },
        -                "inProcess": {
        -                  "type": "number"
        -                },
        -                "total": {
        -                  "type": "number"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "groupId": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "additionalProperties": {
        -                "type": "string"
        -              },
        -              "propertyNames": {
        -                "type": "string"
        -              },
        -              "type": "object"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "status": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / data / properties
        Added value: +{
        +  "_metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "currentPage": {
        +        "type": "number"
        +      },
        +      "pageSize": {
        +        "type": "number"
        +      },
        +      "totalPages": {
        +        "type": "number"
        +      },
        +      "totalRecords": {
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "records": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "caseFileId": {
        +          "type": "string"
        +        },
        +        "code": {
        +          "type": "string"
        +        },
        +        "collectionMetadataId": {
        +          "type": "string"
        +        },
        +        "createdAt": {
        +          "type": "string"
        +        },
        +        "createdBy": {
        +          "type": "string"
        +        },
        +        "discarded": {
        +          "type": "boolean"
        +        },
        +        "evidences": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "completed": {
        +              "type": "number"
        +            },
        +            "failed": {
        +              "type": "number"
        +            },
        +            "inProcess": {
        +              "type": "number"
        +            },
        +            "total": {
        +              "type": "number"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "groupId": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "propertyNames": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / data / type
        Added value: +"object"
    • Changedevidence_multipart_upload_start1 field changed
      • changedInput schema / properties / capturedAt / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedevidence_search13 fields changed
      • changedInput schema / properties / filter / properties / capturedFrom / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / filter / properties / capturedUntil / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / filter / properties / collectionMetadata / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / collectionMetadata / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
      • removedInput schema / properties / filter / properties / fileName / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / fileName / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / filter / properties / hash / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / hash / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / filter / properties / title / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / filter / properties / title / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / data / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "_metadata": {
        -        "additionalProperties": {},
        -        "properties": {
        -          "currentPage": {
        -            "type": "number"
        -          },
        -          "pageSize": {
        -            "type": "number"
        -          },
        -          "totalPages": {
        -            "type": "number"
        -          },
        -          "totalRecords": {
        -            "type": "number"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "capturedAt": {
        -              "type": "string"
        -            },
        -            "caseFileId": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "custodyType": {
        -              "type": "string"
        -            },
        -            "fileName": {
        -              "type": "string"
        -            },
        -            "fileSize": {
        -              "type": "number"
        -            },
        -            "group": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "code": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "type": "string"
        -                },
        -                "name": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "hash": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "allOf": [
        -                {
        -                  "additionalProperties": {
        -                    "type": "string"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                {}
        -              ]
        -            },
        -            "status": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "dltTimestamp": {
        -                  "allOf": [
        -                    {
        -                      "additionalProperties": {
        -                        "type": "string"
        -                      },
        -                      "propertyNames": {
        -                        "type": "string"
        -                      },
        -                      "type": "object"
        -                    },
        -                    {}
        -                  ]
        -                },
        -                "file": {
        -                  "type": "string"
        -                },
        -                "status": {
        -                  "type": "string"
        -                },
        -                "tspTimestamp": {
        -                  "allOf": [
        -                    {
        -                      "additionalProperties": {
        -                        "type": "string"
        -                      },
        -                      "propertyNames": {
        -                        "type": "string"
        -                      },
        -                      "type": "object"
        -                    },
        -                    {}
        -                  ]
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "timestamps": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "dltTimestamps": {
        -                  "additionalProperties": {
        -                    "additionalProperties": {},
        -                    "properties": {
        -                      "blockExplorerLink": {
        -                        "type": "string"
        -                      },
        -                      "blockHash": {
        -                        "type": "string"
        -                      },
        -                      "network": {
        -                        "type": "string"
        -                      },
        -                      "timestampedAt": {
        -                        "type": "string"
        -                      },
        -                      "transactionHash": {
        -                        "type": "string"
        -                      }
        -                    },
        -                    "type": "object"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                "tspTimestamps": {
        -                  "additionalProperties": {
        -                    "additionalProperties": {},
        -                    "properties": {
        -                      "timestampedAt": {
        -                        "type": "string"
        -                      },
        -                      "token": {
        -                        "type": "string"
        -                      }
        -                    },
        -                    "type": "object"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "title": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "capturedAt": {
        -              "type": "string"
        -            },
        -            "caseFileId": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "custodyType": {
        -              "type": "string"
        -            },
        -            "fileName": {
        -              "type": "string"
        -            },
        -            "fileSize": {
        -              "type": "number"
        -            },
        -            "group": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "code": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "type": "string"
        -                },
        -                "name": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "hash": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "metadata": {
        -              "allOf": [
        -                {
        -                  "additionalProperties": {
        -                    "type": "string"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                {}
        -              ]
        -            },
        -            "status": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "dltTimestamp": {
        -                  "allOf": [
        -                    {
        -                      "additionalProperties": {
        -                        "type": "string"
        -                      },
        -                      "propertyNames": {
        -                        "type": "string"
        -                      },
        -                      "type": "object"
        -                    },
        -                    {}
        -                  ]
        -                },
        -                "file": {
        -                  "type": "string"
        -                },
        -                "status": {
        -                  "type": "string"
        -                },
        -                "tspTimestamp": {
        -                  "allOf": [
        -                    {
        -                      "additionalProperties": {
        -                        "type": "string"
        -                      },
        -                      "propertyNames": {
        -                        "type": "string"
        -                      },
        -                      "type": "object"
        -                    },
        -                    {}
        -                  ]
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "timestamps": {
        -              "additionalProperties": {},
        -              "properties": {
        -                "dltTimestamps": {
        -                  "additionalProperties": {
        -                    "additionalProperties": {},
        -                    "properties": {
        -                      "blockExplorerLink": {
        -                        "type": "string"
        -                      },
        -                      "blockHash": {
        -                        "type": "string"
        -                      },
        -                      "network": {
        -                        "type": "string"
        -                      },
        -                      "timestampedAt": {
        -                        "type": "string"
        -                      },
        -                      "transactionHash": {
        -                        "type": "string"
        -                      }
        -                    },
        -                    "type": "object"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                "tspTimestamps": {
        -                  "additionalProperties": {
        -                    "additionalProperties": {},
        -                    "properties": {
        -                      "timestampedAt": {
        -                        "type": "string"
        -                      },
        -                      "token": {
        -                        "type": "string"
        -                      }
        -                    },
        -                    "type": "object"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "title": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / data / properties
        Added value: +{
        +  "_metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "currentPage": {
        +        "type": "number"
        +      },
        +      "pageSize": {
        +        "type": "number"
        +      },
        +      "totalPages": {
        +        "type": "number"
        +      },
        +      "totalRecords": {
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "records": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "capturedAt": {
        +          "type": "string"
        +        },
        +        "caseFileId": {
        +          "type": "string"
        +        },
        +        "createdBy": {
        +          "type": "string"
        +        },
        +        "custodyType": {
        +          "type": "string"
        +        },
        +        "fileName": {
        +          "type": "string"
        +        },
        +        "fileSize": {
        +          "type": "number"
        +        },
        +        "group": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "code": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "name": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "hash": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "allOf": [
        +            {
        +              "additionalProperties": {
        +                "type": "string"
        +              },
        +              "propertyNames": {
        +                "type": "string"
        +              },
        +              "type": "object"
        +            },
        +            {}
        +          ]
        +        },
        +        "status": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "dltTimestamp": {
        +              "allOf": [
        +                {
        +                  "additionalProperties": {
        +                    "type": "string"
        +                  },
        +                  "propertyNames": {
        +                    "type": "string"
        +                  },
        +                  "type": "object"
        +                },
        +                {}
        +              ]
        +            },
        +            "file": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "tspTimestamp": {
        +              "allOf": [
        +                {
        +                  "additionalProperties": {
        +                    "type": "string"
        +                  },
        +                  "propertyNames": {
        +                    "type": "string"
        +                  },
        +                  "type": "object"
        +                },
        +                {}
        +              ]
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "timestamps": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "dltTimestamps": {
        +              "additionalProperties": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "blockExplorerLink": {
        +                    "type": "string"
        +                  },
        +                  "blockHash": {
        +                    "type": "string"
        +                  },
        +                  "network": {
        +                    "type": "string"
        +                  },
        +                  "timestampedAt": {
        +                    "type": "string"
        +                  },
        +                  "transactionHash": {
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "propertyNames": {
        +                "type": "string"
        +              },
        +              "type": "object"
        +            },
        +            "tspTimestamps": {
        +              "additionalProperties": {
        +                "additionalProperties": {},
        +                "properties": {
        +                  "timestampedAt": {
        +                    "type": "string"
        +                  },
        +                  "token": {
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "propertyNames": {
        +                "type": "string"
        +              },
        +              "type": "object"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "title": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / data / type
        Added value: +"object"
    • Changedevidence_temp_file_upload_url_create1 field changed
      • changedInput schema / properties / capturedAt / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • Changedevidence_update1 field changed
      • changedInput schema / properties / deletionDate / anyOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "provided": {
        -        "type": "boolean"
        -      },
        -      "value": {
        -        "format": "date-time",
        -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "provided": {
        +        "type": "boolean"
        +      },
        +      "value": {
        +        "format": "date-time",
        +        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedgenerate_evidence2 fields changed
      • changedInput schema / properties / capturedAt / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • changedInput schema / properties / deletionDate / anyOf
        Previous value: -[
        -  {
        -    "format": "date-time",
        -    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changednotification_certificate_pdf_url_get3 fields changed
      • removedOutput schema / properties / data / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "empty": {
        -        "type": "boolean"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "empty": {
        -        "type": "boolean"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "empty": {
        -        "type": "boolean"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "empty": {
        -        "type": "boolean"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / data / properties
        Added value: +{
        +  "empty": {
        +    "type": "boolean"
        +  }
        +}
      • addedOutput schema / properties / data / type
        Added value: +"object"
    • Changednotification_receiver_add1 field changed
      • changedInput schema / properties / receivers / items / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "address": {
        -        "format": "email",
        -        "minLength": 1,
        -        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -        "type": "string"
        -      },
        -      "metadata": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "propertyNames": {
        -          "type": "string"
        -        },
        -        "type": "object"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "provider": {
        -        "const": "Notification_AddReceiverEmailNotificationRequestModel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "provider",
        -      "address"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "address": {
        -        "format": "email",
        -        "minLength": 1,
        -        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -        "type": "string"
        -      },
        -      "metadata": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "propertyNames": {
        -          "type": "string"
        -        },
        -        "type": "object"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "phone": {
        -        "type": "string"
        -      },
        -      "provider": {
        -        "const": "Notification_AddReceiverNoticemanNotificationRequestModel",
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "TO",
        -          "CC",
        -          "BCC"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "provider",
        -      "type",
        -      "address"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "address": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "provider": {
        -        "const": "Notification_AddReceiverSmsNotificationRequestModel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "provider",
        -      "address"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "address": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "provider": {
        -        "const": "Notification_AddReceiverWfbNotificationRequestModel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "provider",
        -      "address"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "address": {
        +        "format": "email",
        +        "minLength": 1,
        +        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +        "type": "string"
        +      },
        +      "metadata": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "provider": {
        +        "const": "Notification_AddReceiverEmailNotificationRequestModel",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "provider",
        +      "address"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "address": {
        +        "format": "email",
        +        "minLength": 1,
        +        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +        "type": "string"
        +      },
        +      "metadata": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "phone": {
        +        "type": "string"
        +      },
        +      "provider": {
        +        "const": "Notification_AddReceiverNoticemanNotificationRequestModel",
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "TO",
        +          "CC",
        +          "BCC"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "provider",
        +      "type",
        +      "address"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "address": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "provider": {
        +        "const": "Notification_AddReceiverSmsNotificationRequestModel",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "provider",
        +      "address"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "address": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "provider": {
        +        "const": "Notification_AddReceiverWfbNotificationRequestModel",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "provider",
        +      "address"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changednotification_request_create11 fields changed
      • removedInput schema / properties / data / properties / noticeman / allOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "attachments": {
        -        "items": {
        -          "properties": {
        -            "fileSize": {
        -              "maximum": 9007199254740991,
        -              "minimum": 1,
        -              "type": "integer"
        -            },
        -            "filename": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "hash": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "filename",
        -            "hash"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "externalAttachments": {
        -        "items": {
        -          "properties": {
        -            "filename": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "hash": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "type": {
        -              "minLength": 1,
        -              "pattern": "EVIDENCE|REPORT|REPORT_PACKAGE",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type",
        -            "filename"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "parameters": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "propertyNames": {
        -          "type": "string"
        -        },
        -        "type": "object"
        -      },
        -      "receiver": {
        -        "items": {
        -          "allOf": [
        -            {
        -              "properties": {
        -                "address": {
        -                  "format": "email",
        -                  "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -                  "type": "string"
        -                },
        -                "addressReplyTo": {
        -                  "format": "email",
        -                  "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -                  "type": "string"
        -                },
        -                "name": {
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "metadata": {
        -                  "additionalProperties": {
        -                    "type": "string"
        -                  },
        -                  "propertyNames": {
        -                    "type": "string"
        -                  },
        -                  "type": "object"
        -                },
        -                "phone": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "enum": [
        -                    "TO",
        -                    "CC",
        -                    "BCC"
        -                  ],
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "sender": {
        -        "properties": {
        -          "address": {
        -            "format": "email",
        -            "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -            "type": "string"
        -          },
        -          "addressReplyTo": {
        -            "format": "email",
        -            "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "subject": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "template": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "receiver",
        -      "subject"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "limitResponse": {
        -        "maximum": 720,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "notificationType": {
        -        "enum": [
        -          "ACCEPTED_OR_NOT",
        -          "RECEIVED_AGREE",
        -          "LONG_RESPONSE",
        -          "NO_RESPONSE"
        -        ],
        -        "type": "string"
        -      },
        -      "reminder": {
        -        "maximum": 720,
        -        "minimum": 24,
        -        "type": "integer"
        -      },
        -      "scheduledAt": {
        -        "format": "date-time",
        -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "notificationType"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties / data / properties / noticeman / properties
        Added value: +{
        +  "attachments": {
        +    "items": {
        +      "properties": {
        +        "fileSize": {
        +          "maximum": 9007199254740991,
        +          "minimum": 1,
        +          "type": "integer"
        +        },
        +        "filename": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "hash": {
        +          "minLength": 1,
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "filename",
        +        "hash"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "externalAttachments": {
        +    "items": {
        +      "properties": {
        +        "filename": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "hash": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "type": {
        +          "minLength": 1,
        +          "pattern": "EVIDENCE|REPORT|REPORT_PACKAGE",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "type",
        +        "filename"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "limitResponse": {
        +    "maximum": 720,
        +    "minimum": 0,
        +    "type": "integer"
        +  },
        +  "notificationType": {
        +    "enum": [
        +      "ACCEPTED_OR_NOT",
        +      "RECEIVED_AGREE",
        +      "LONG_RESPONSE",
        +      "NO_RESPONSE"
        +    ],
        +    "type": "string"
        +  },
        +  "parameters": {
        +    "additionalProperties": {
        +      "type": "string"
        +    },
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "receiver": {
        +    "items": {
        +      "properties": {
        +        "address": {
        +          "format": "email",
        +          "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +          "type": "string"
        +        },
        +        "addressReplyTo": {
        +          "format": "email",
        +          "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +          "type": "string"
        +        },
        +        "metadata": {
        +          "additionalProperties": {
        +            "type": "string"
        +          },
        +          "propertyNames": {
        +            "type": "string"
        +          },
        +          "type": "object"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "phone": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "enum": [
        +            "TO",
        +            "CC",
        +            "BCC"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "reminder": {
        +    "maximum": 720,
        +    "minimum": 24,
        +    "type": "integer"
        +  },
        +  "scheduledAt": {
        +    "format": "date-time",
        +    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
        +    "type": "string"
        +  },
        +  "sender": {
        +    "properties": {
        +      "address": {
        +        "format": "email",
        +        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +        "type": "string"
        +      },
        +      "addressReplyTo": {
        +        "format": "email",
        +        "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "subject": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "template": {
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / data / properties / noticeman / required
        Added value: +[
        +  "receiver",
        +  "subject",
        +  "notificationType"
        +]
      • addedInput schema / properties / data / properties / noticeman / type
        Added value: +"object"
      • changedInput schema / properties / data / properties / rcs / properties / scheduleDate / pattern
        Previous value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"New value: +"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
      • removedInput schema / properties / data / properties / smtp / properties / receiver / items / allOf
        Removed value: -[
        -  {
        -    "properties": {
        -      "address": {
        -        "format": "email",
        -        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -        "type": "string"
        -      },
        -      "addressReplyTo": {
        -        "format": "email",
        -        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        -        "type": "string"
        -      },
        -      "name": {
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "metadata": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "propertyNames": {
        -          "type": "string"
        -        },
        -        "type": "object"
        -      },
        -      "phone": {
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "TO",
        -          "CC",
        -          "BCC"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties / data / properties / smtp / properties / receiver / items / properties
        Added value: +{
        +  "address": {
        +    "format": "email",
        +    "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +    "type": "string"
        +  },
        +  "addressReplyTo": {
        +    "format": "email",
        +    "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
        +    "type": "string"
        +  },
        +  "metadata": {
        +    "additionalProperties": {
        +      "type": "string"
        +    },
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "name": {
        +    "type": "string"
        +  },
        +  "phone": {
        +    "type": "string"
        +  },
        +  "type": {
        +    "enum": [
        +      "TO",
        +      "CC",
        +      "BCC"
        +    ],
        +    "type": "string"
        +  }
        +}
      • addedInput schema / properties / data / properties / smtp / properties / receiver / items / type
        Added value: +"object"
      • changedInput schema / properties / data / properties / smtp / properties / sender / properties / address / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • changedInput schema / properties / data / properties / smtp / properties / sender / properties / addressReplyTo / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      • changedInput schema / properties / requestId / description
        Previous value: -"UUID of the notification request. Obtain from notification_request_create."New value: +"OPTIONAL. Supply a UUID here only if you want to choose the new request's id yourself; omit it and the API assigns one. Either way this call RETURNS the requestId that every other Notification tool then requires — do not try to obtain it beforehand."
    • Changednotification_request_status4 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "common": {
        -        "anyOf": [
        -          {
        -            "properties": {
        -              "recipients": {
        -                "anyOf": [
        -                  {
        -                    "items": {
        -                      "type": "string"
        -                    },
        -                    "type": "array"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ]
        -              }
        -            },
        -            "type": "object"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "email": {
        -        "anyOf": [
        -          {
        -            "properties": {
        -              "noticeman": {
        -                "anyOf": [
        -                  {
        -                    "properties": {
        -                      "type": {
        -                        "anyOf": [
        -                          {
        -                            "items": {
        -                              "enum": [
        -                                "NO_RESPONSE",
        -                                "ACCEPTED_OR_NOT",
        -                                "RECEIVED_AGREE",
        -                                "LONG_RESPONSE"
        -                              ],
        -                              "type": "string"
        -                            },
        -                            "type": "array"
        -                          },
        -                          {
        -                            "type": "null"
        -                          }
        -                        ]
        -                      }
        -                    },
        -                    "type": "object"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ]
        -              },
        -              "sender": {
        -                "anyOf": [
        -                  {
        -                    "items": {
        -                      "type": "string"
        -                    },
        -                    "type": "array"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ]
        -              },
        -              "subject": {
        -                "anyOf": [
        -                  {
        -                    "type": "string"
        -                  },
        -                  {
        -                    "type": "null"
        -                  }
        -                ]
        -              }
        -            },
        -            "type": "object"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "common": {
        +        "anyOf": [
        +          {
        +            "properties": {
        +              "recipients": {
        +                "anyOf": [
        +                  {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "email": {
        +        "anyOf": [
        +          {
        +            "properties": {
        +              "noticeman": {
        +                "anyOf": [
        +                  {
        +                    "properties": {
        +                      "type": {
        +                        "anyOf": [
        +                          {
        +                            "items": {
        +                              "enum": [
        +                                "NO_RESPONSE",
        +                                "ACCEPTED_OR_NOT",
        +                                "RECEIVED_AGREE",
        +                                "LONG_RESPONSE"
        +                              ],
        +                              "type": "string"
        +                            },
        +                            "type": "array"
        +                          },
        +                          {
        +                            "type": "null"
        +                          }
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "sender": {
        +                "anyOf": [
        +                  {
        +                    "items": {
        +                      "type": "string"
        +                    },
        +                    "type": "array"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "subject": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / data / allOf
        Removed value: -[
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "_metadata": {
        -        "additionalProperties": {},
        -        "properties": {
        -          "currentPage": {
        -            "type": "number"
        -          },
        -          "pageSize": {
        -            "type": "number"
        -          },
        -          "totalPages": {
        -            "type": "number"
        -          },
        -          "totalRecords": {
        -            "type": "number"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "additionalText": {
        -              "type": "string"
        -            },
        -            "autosend": {
        -              "type": "boolean"
        -            },
        -            "content": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "language": {
        -              "type": "string"
        -            },
        -            "limitResponse": {
        -              "type": "number"
        -            },
        -            "notificationAttachments": {
        -              "items": {
        -                "additionalProperties": {},
        -                "properties": {
        -                  "attachmentStatus": {
        -                    "type": "string"
        -                  },
        -                  "fileId": {
        -                    "type": "string"
        -                  },
        -                  "fileSize": {
        -                    "type": "number"
        -                  },
        -                  "fileType": {
        -                    "type": "string"
        -                  },
        -                  "filename": {
        -                    "type": "string"
        -                  },
        -                  "hash": {
        -                    "type": "string"
        -                  },
        -                  "mimeType": {
        -                    "type": "string"
        -                  },
        -                  "reviewedAt": {
        -                    "type": "string"
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            "phone": {
        -              "type": "string"
        -            },
        -            "provider": {
        -              "type": "string"
        -            },
        -            "recipientAddress": {
        -              "type": "string"
        -            },
        -            "recipientName": {
        -              "type": "string"
        -            },
        -            "reminderHours": {
        -              "type": "number"
        -            },
        -            "requestId": {
        -              "type": "string"
        -            },
        -            "scheduledAt": {
        -              "type": "string"
        -            },
        -            "senderAddress": {
        -              "type": "string"
        -            },
        -            "senderAddressReplyTo": {
        -              "type": "string"
        -            },
        -            "senderName": {
        -              "type": "string"
        -            },
        -            "states": {
        -              "items": {
        -                "additionalProperties": {},
        -                "properties": {
        -                  "notificationId": {
        -                    "type": "string"
        -                  },
        -                  "provider": {
        -                    "type": "string"
        -                  },
        -                  "registeredAt": {
        -                    "type": "string"
        -                  },
        -                  "state": {
        -                    "type": "string"
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            "subject": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": {},
        -    "properties": {
        -      "records": {
        -        "items": {
        -          "additionalProperties": {},
        -          "properties": {
        -            "additionalText": {
        -              "type": "string"
        -            },
        -            "autosend": {
        -              "type": "boolean"
        -            },
        -            "content": {
        -              "type": "string"
        -            },
        -            "createdBy": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "language": {
        -              "type": "string"
        -            },
        -            "limitResponse": {
        -              "type": "number"
        -            },
        -            "notificationAttachments": {
        -              "items": {
        -                "additionalProperties": {},
        -                "properties": {
        -                  "attachmentStatus": {
        -                    "type": "string"
        -                  },
        -                  "fileId": {
        -                    "type": "string"
        -                  },
        -                  "fileSize": {
        -                    "type": "number"
        -                  },
        -                  "fileType": {
        -                    "type": "string"
        -                  },
        -                  "filename": {
        -                    "type": "string"
        -                  },
        -                  "hash": {
        -                    "type": "string"
        -                  },
        -                  "mimeType": {
        -                    "type": "string"
        -                  },
        -                  "reviewedAt": {
        -                    "type": "string"
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            "phone": {
        -              "type": "string"
        -            },
        -            "provider": {
        -              "type": "string"
        -            },
        -            "recipientAddress": {
        -              "type": "string"
        -            },
        -            "recipientName": {
        -              "type": "string"
        -            },
        -            "reminderHours": {
        -              "type": "number"
        -            },
        -            "requestId": {
        -              "type": "string"
        -            },
        -            "scheduledAt": {
        -              "type": "string"
        -            },
        -            "senderAddress": {
        -              "type": "string"
        -            },
        -            "senderAddressReplyTo": {
        -              "type": "string"
        -            },
        -            "senderName": {
        -              "type": "string"
        -            },
        -            "states": {
        -              "items": {
        -                "additionalProperties": {},
        -                "properties": {
        -                  "notificationId": {
        -                    "type": "string"
        -                  },
        -                  "provider": {
        -                    "type": "string"
        -                  },
        -                  "registeredAt": {
        -                    "type": "string"
        -                  },
        -                  "state": {
        -                    "type": "string"
        -                  }
        -                },
        -                "type": "object"
        -              },
        -              "type": "array"
        -            },
        -            "subject": {
        -              "type": "string"
        -            },
        -            "type": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    },
        -    "type": "object"
        -  }
        -]
      • addedOutput schema / properties / data / properties
        Added value: +{
        +  "_metadata": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "currentPage": {
        +        "type": "number"
        +      },
        +      "pageSize": {
        +        "type": "number"
        +      },
        +      "totalPages": {
        +        "type": "number"
        +      },
        +      "totalRecords": {
        +        "type": "number"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "records": {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "additionalText": {
        +          "type": "string"
        +        },
        +        "autosend": {
        +          "type": "boolean"
        +        },
        +        "content": {
        +          "type": "string"
        +        },
        +        "createdBy": {
        +          "type": "string"
        +        },
        +        "id": {
        +          "type": "string"
        +        },
        +        "language": {
        +          "type": "string"
        +        },
        +        "limitResponse": {
        +          "type": "number"
        +        },
        +        "notificationAttachments": {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "attachmentStatus": {
        +                "type": "string"
        +              },
        +              "fileId": {
        +                "type": "string"
        +              },
        +              "fileSize": {
        +                "type": "number"
        +              },
        +              "fileType": {
        +                "type": "string"
        +              },
        +              "filename": {
        +                "type": "string"
        +              },
        +              "hash": {
        +                "type": "string"
        +              },
        +              "mimeType": {
        +                "type": "string"
        +              },
        +              "reviewedAt": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "phone": {
        +          "type": "string"
        +        },
        +        "provider": {
        +          "type": "string"
        +        },
        +        "recipientAddress": {
        +          "type": "string"
        +        },
        +        "recipientName": {
        +          "type": "string"
        +        },
        +        "reminderHours": {
        +          "type": "number"
        +        },
        +        "requestId": {
        +          "type": "string"
        +        },
        +        "scheduledAt": {
        +          "type": "string"
        +        },
        +        "senderAddress": {
        +          "type": "string"
        +        },
        +        "senderAddressReplyTo": {
        +          "type": "string"
        +        },
        +        "senderName": {
        +          "type": "string"
        +        },
        +        "states": {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "notificationId": {
        +                "type": "string"
        +              },
        +              "provider": {
        +                "type": "string"
        +              },
        +              "registeredAt": {
        +                "type": "string"
        +              },
        +              "state": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "subject": {
        +          "type": "string"
        +        },
        +        "type": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  }
        +}
      • addedOutput schema / properties / data / type
        Added value: +"object"
    • Changedsignature_request_full1 field changed
      • changedInput schema / properties / documents / items / properties / signatories / items / properties / email / pattern
        Previous value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
    • Changedsignature_request_list8 fields changed
      • removedInput schema / properties / closeAtFrom / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / closeAtFrom / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / closeAtTo / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / closeAtTo / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / dateFrom / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / dateFrom / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / dateTo / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / dateTo / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  2. 64 tool updatesv1.3.1
    • First observedactivate_signature_request
    • First observedadd_document_to_signature_request
    • First observedadd_observer_to_document
    • First observedadd_signatory_to_document
    • First observedadd_validator_to_signatory
    • First observedcreate_signature_request
    • First observedead_factory_help
    • First observedevidence_case_file_create
    • First observedevidence_case_file_delete_bulk
    • First observedevidence_case_file_get
    • First observedevidence_case_file_relationship_assign
    • First observedevidence_case_file_report_generate
    • First observedevidence_case_file_report_pdf_url_get
    • First observedevidence_case_file_report_preview
    • First observedevidence_case_file_report_update
    • First observedevidence_case_file_report_zip_url_get
    • First observedevidence_case_file_search
    • First observedevidence_case_file_status_update
    • First observedevidence_case_file_update
    • First observedevidence_case_file_update_bulk
    • First observedevidence_create_sealed
    • First observedevidence_delete
    • First observedevidence_download_url_create
    • First observedevidence_group_close
    • First observedevidence_group_create
    • First observedevidence_group_delete_bulk
    • First observedevidence_group_discard
    • First observedevidence_group_evidence_delete
    • First observedevidence_group_evidence_download_url_create
    • First observedevidence_group_evidence_get
    • First observedevidence_group_evidence_register
    • First observedevidence_group_evidence_upload_url_create
    • First observedevidence_group_get
    • First observedevidence_group_search
    • First observedevidence_group_update
    • First observedevidence_group_update_bulk
    • First observedevidence_multipart_upload_start
    • First observedevidence_report_delete
    • First observedevidence_report_pdf_url_get
    • First observedevidence_report_zip_url_get
    • First observedevidence_search
    • First observedevidence_temp_file_upload_url_create
    • First observedevidence_thumbnail_url_get
    • First observedevidence_update
    • First observedevidence_update_bulk
    • First observedevidence_upload_url_create
    • First observedgenerate_evidence
    • First observedget_evidence
    • First observedget_signature_request
    • First observednotification_certificate_generate
    • First observednotification_certificate_pdf_url_get
    • First observednotification_document_add
    • First observednotification_document_download_url_create
    • First observednotification_document_upload_url_create
    • First observednotification_receiver_add
    • First observednotification_request_create
    • First observednotification_request_send
    • First observednotification_request_status
    • First observedsignature_certificate_generate
    • First observedsignature_coordinate_set
    • First observedsignature_document_download_url_get
    • First observedsignature_request_cancel
    • First observedsignature_request_full
    • First observedsignature_request_list

TDQS

A3.5/5.0

Scored across 64 tools

Disambiguation3/5

The tool set spans four distinct managers (Evidence, Signature, Notification, Chat) with mostly clear boundaries, but within Evidence there is significant overlap: evidence_download_url_create vs evidence_group_evidence_download_url_create, evidence_upload_url_create vs evidence_group_evidence_upload_url_create, and legacy tools (generate_evidence, get_evidence) that duplicate group-scoped equivalents. An agent could easily pick the wrong variant.

Naming Consistency2/5

Naming is highly inconsistent: evidence tools use a mix of noun_verb (evidence_case_file_create), verb_noun (generate_evidence, get_evidence), and composite patterns (evidence_create_sealed), while signature and notification tools use bare verb_noun (create_signature_request, activate_signature_request, notification_receiver_add). Legacy top-level names (generate_evidence, get_evidence) break the evidence_* prefix convention, and there are near-duplicate names differing only by scope (evidence_download_url_create vs evidence_group_evidence_download_url_create).

Tool Count2/5

64 tools is far beyond the typical well-scoped MCP server range. While the server covers four distinct domains, the count is inflated by redundant legacy tools, bulk variants, and multiple URL-creation tools that could be consolidated. The sheer number makes it hard for an agent to discover and choose the right tool.

Completeness4/5

The Evidence manager covers the full lifecycle (create case file, groups, register/upload evidence, close/seal, generate reports, delete), and Signature/Notification have create, update, activate, status, and certificate flows. Minor gaps exist: there is no evidence_case_file_delete for a single case file (only bulk), no signature request update tool, and no chat tools are actually present despite the help text mentioning a Chat manager.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers