Skip to main content
Glama
chad-hohn-radai

spotdraft-mcp

SpotDraft MCP Server

Give Claude direct, safety-gated access to your SpotDraft contracts.

This is a locally-hosted MCP (Model Context Protocol) server that wraps the SpotDraft Public API so you can query and drive your SpotDraft workspace -- contracts, templates, counterparties, obligations, analytics -- conversationally from Claude, instead of clicking through the UI or writing one-off scripts.

It ships as two separate servers built from one codebase:

  • spotdraft-read -- every read-only operation. Safe to blanket-allow; nothing here has side effects.

  • spotdraft-write -- every mutating operation (create/send/void/invite/etc.). Every single tool requires your explicit approval on every call -- it cannot be pre-approved or run unattended.

That split exists so you can tell your MCP client "always allow reads, always ask before writes" in one line each, instead of trusting a single server's internal judgment about what's safe.


What can you do with this?

Once connected, ask Claude things like:

  • "List all contracts pending signature from Acme Corp"

  • "What's the status of contract T-4821?"

  • "Show me the obligations tracked on H-102"

  • "Draft a new NDA from the Standard NDA template for this counterparty" (write -- will prompt for approval)

  • "Void contract T-991, it was created by mistake" (write + destructive -- will prompt for approval)

  • "Run an analytics query for all contracts executed last quarter by contract type"

Claude figures out which SpotDraft API call(s) to make; you approve anything that changes data.


Related MCP server: local-document-rag-agent

Coverage

This server covers the v2.1 SpotDraft API family (the current/latest version) plus the small set of v1-only endpoints that have no v2.1 successor (legal intake, native integrations, obligation types, view-email, webhook-sample) -- 114 operations total. Superseded v2 and old-v1 endpoints with a v2.1 replacement are intentionally excluded.

Coverage is delivered two ways:

  1. Curated tools (~15 read + ~13 write) for the most common contract-lifecycle workflows -- listing/searching contracts, checking status, downloading, creating from a template, sending to counterparties, voiding, managing counterparties and users, etc. Tight, well-described input schemas.

  2. A search + execute fallback, so nothing is out of reach even if it doesn't have a curated tool:

    • search_actions(intent, access?) -- keyword-search the full 114-operation catalog.

    • execute_read_request(operationId, ...) -- call any read-classified operation by ID.

    • execute_write_request(operationId, ...) -- call any write-classified operation by ID (write server only; force-gated like every other write tool).

Re-vendoring a newer OpenAPI spec and re-running npm run gen:catalog keeps this catalog current without hand-editing generated code.


Quick start

What you'll need

  1. Node.js 20+ and git.

  2. A SpotDraft API credential (Client ID + Client Secret): in SpotDraft, go to Settings -> Developer Settings -> Generate API Credential. If you don't have access to that page, ask whoever administers your SpotDraft workspace to generate one for you.

  3. An MCP-capable client (e.g. Claude Code).

1. Clone and build

git clone <this-repo-url> spotdraft-mcp
cd spotdraft-mcp
npm install
npm run build

This produces dist/index.js, which both server modes run.

2. Configure your MCP client

Add two server entries -- one per mode -- pointing at the same built file, with SPOTDRAFT_MODE as the only thing that differs:

{
  "mcpServers": {
    "spotdraft-read": {
      "command": "node",
      "args": ["/absolute/path/to/spotdraft-mcp/dist/index.js"],
      "env": {
        "SPOTDRAFT_MODE": "read",
        "SPOTDRAFT_CLIENT_ID": "your-client-id",
        "SPOTDRAFT_CLIENT_SECRET": "your-client-secret",
        "SPOTDRAFT_REGION": "us"
      }
    },
    "spotdraft-write": {
      "command": "node",
      "args": ["/absolute/path/to/spotdraft-mcp/dist/index.js"],
      "env": {
        "SPOTDRAFT_MODE": "write",
        "SPOTDRAFT_CLIENT_ID": "your-client-id",
        "SPOTDRAFT_CLIENT_SECRET": "your-client-secret",
        "SPOTDRAFT_REGION": "us"
      }
    }
  }
}

On Windows, double the backslashes in the path (C:\\Users\\you\\...).

If you only ever need read access, register just spotdraft-read.

3. Set your approval rules

In your MCP client's permission settings, add:

{
  "permissions": {
    "allow": ["mcp__spotdraft-read__*"],
    "ask": ["mcp__spotdraft-write__*"]
  }
}

This blanket-allows every read tool and requires per-call approval for every write tool. Every write tool also sets _meta["anthropic/requiresUserInteraction"] = true, which forces approval on supporting clients even if a broader "don't ask again" rule is in effect.

4. Verify

Ask Claude to "list SpotDraft users" (calls list_users, a good connectivity check) and confirm it returns your workspace roster without any approval prompt. Then ask it to do something mutating (e.g. draft a contract note) and confirm it does prompt for approval.


Configuration reference

Env var

Required

Purpose

SPOTDRAFT_MODE

yes

read or write. Selects which tool set this server instance registers.

SPOTDRAFT_CLIENT_ID

yes

SpotDraft API client-id.

SPOTDRAFT_CLIENT_SECRET

yes

SpotDraft API client-secret. Treat like a password -- never logged, never echoed in tool output.

SPOTDRAFT_REGION

no (default us)

us, eu, in, or me -- selects the regional API host.

SPOTDRAFT_USER_EMAIL

no

Optional user-email header for per-user attribution.

SPOTDRAFT_BASE_URL

no

Escape hatch to override the computed base URL entirely.

Region -> base URL mapping: us -> api.us.spotdraft.com, eu -> api.eu.spotdraft.com, in -> api.in.spotdraft.com, me -> api.me.spotdraft.com.


Curated tools

Read (spotdraft-read) -- always safe, never prompts

Tool

What it does

list_contracts

Paginated contract search/list with common filters.

get_contract_status

Display status + name for one contract by composite ID.

get_contract_content

The contract's text (as plain text, structured segments, or HTML).

get_contract_download_link

A temporary signed download URL (PDF/DOCX) -- not the file bytes.

list_contract_notes

Notes/comments on a contract's activity log.

get_contract_obligations

Obligations (renewal, payment, deliverable reminders) tracked on a contract.

get_contract_key_pointers

Structured metadata fields recorded on a contract.

list_templates

Contract templates available in the workspace.

get_template_metadata

A template's field definitions (for building create_contract payloads).

list_contract_types

Configured contract types and their IDs.

list_counterparties

Counterparty organizations/individuals, paginated.

get_counterparty

Full detail for one counterparty.

list_users

Workspace users (also the recommended connectivity self-test).

get_analytics_catalog

Tables/columns available to run_analytics_query.

run_analytics_query

Runs a read-only GoogleSQL query against SpotDraft's analytics tables.

search_actions

Keyword-search the full 114-op catalog (on both servers).

execute_read_request

Call any read-classified operation by ID (full-coverage fallback).

Write (spotdraft-write) -- every call requires approval

Tool

What it does

create_contract

Creates a contract from a template + contract_data + counterparties.

send_contract_to_counterparties

Emails a contract to its counterparties.

upload_contract_for_signing

Uploads an existing document as a new contract headed for signature.

upload_contract_for_review

Uploads an existing document as a new contract headed for review/redlining.

mark_contract_for_execution

Advances a contract to the execution/signature stage.

void_contract

Destructive. Permanently voids a contract.

invite_user_to_contract

Invites a role/user/new-email to a contract with a specific permission level.

create_contract_note

Adds a note/comment to a contract's activity log.

set_contract_key_pointers

Creates/updates structured metadata fields on a contract, in bulk.

create_counterparty

Creates a new counterparty (organization or individual).

add_counterparty_contact

Adds a contact person to an existing counterparty.

create_webhook

Registers a webhook subscription for contract/counterparty activity.

create_user

Invites a new user to the workspace.

execute_write_request

Call any write-classified operation by ID (full-coverage fallback).


Security model

  • Two servers, not one with internal flags. Approval tooling in MCP clients keys off the tool name mcp__<server-name>__<tool-name>, so splitting read/write into two server names is what makes "always allow reads, always ask on writes" expressible as two simple rules.

  • Every write tool force-gates. In addition to the two-server split, every write tool sets _meta["anthropic/requiresUserInteraction"] = true and readOnlyHint: false; void_contract additionally sets destructiveHint: true. Read tools set readOnlyHint: true and never force-gate. This is belt-and-suspenders: the server split is the primary control, the tool annotations are a second, client-enforced layer that can't be bypassed by a broad allow rule. Any operation reachable through execute_read_request / execute_write_request is checked against the same catalog access flag server-side, so the fallback path can't be used to sneak a write through the read server or vice versa.

  • Semantic, not just HTTP-method-based, classification. A handful of POST endpoints with no side effects (analytics query, contract preview, sidebar query, clickwrap agreement preview, contract-download-link generation) are classified as read. Everything else that isn't a GET is write.

  • Credentials never leave your machine and are never logged. SPOTDRAFT_CLIENT_SECRET / SPOTDRAFT_CLIENT_ID are read from environment variables supplied by your MCP client, and are redacted from any error message or log line before it can be printed or returned to the model.

  • Composite IDs are never mutated. SpotDraft composite contract IDs (T-123, H-45) are sent to the API exactly as given -- never re-prefixed, re-cased, or reformatted.


How it works

You -> Claude -> spotdraft-read / spotdraft-write (this server, on your machine) -> SpotDraft API -> Your workspace

Both server modes are built from the same dist/index.js; SPOTDRAFT_MODE decides which tool set gets registered at startup (see src/server.ts). The operation catalog (src/generated/catalog.ts) is generated from a vendored copy of SpotDraft's own OpenAPI spec (openapi/spotdraft-openapi.json) by scripts/gen-catalog.ts -- re-run npm run gen:catalog after re-vendoring a newer spec to pick up new operations.


Project structure

spotdraft-mcp/
├── package.json               # bin: spotdraft-mcp-read / spotdraft-mcp-write; scripts: build/dev/gen:catalog/test
├── tsconfig.json
├── openapi/
│   ├── spotdraft-openapi.json # vendored OpenAPI spec (source of truth for coverage)
│   └── FETCHED.md             # provenance / fetch date for the vendored spec
├── scripts/
│   ├── gen-catalog.ts         # parses the vendored spec -> src/generated/catalog.ts
│   └── run-tests.mjs          # cross-shell test runner (see "Development" below)
├── src/
│   ├── index.ts                # entry point for both bin commands
│   ├── server.ts                # builds the McpServer per SPOTDRAFT_MODE
│   ├── config.ts                # env parsing, region resolution, validation
│   ├── http.ts                   # SpotDraft HTTP client: auth, retries, redaction
│   ├── generated/catalog.ts      # generated operation catalog (do not hand-edit)
│   ├── tools/
│   │   ├── read/                 # curated read tool modules
│   │   ├── write/                 # curated write tool modules
│   │   ├── shared.ts               # registration helper (annotations, error handling, pagination)
│   │   └── fallback.ts            # search_actions + execute_read_request + execute_write_request
│   └── util/ (ids.ts, format.ts, errors.ts)
└── test/                        # unit tests (node:test)

Development

npm install          # install dependencies
npm run gen:catalog   # regenerate src/generated/catalog.ts from openapi/spotdraft-openapi.json
npm run build          # compile TypeScript -> dist/
npm test                # run the unit test suite
npm run dev              # run src/index.ts directly via tsx (no build step)

npm test runs scripts/run-tests.mjs, which enumerates test/*.test.ts and passes them explicitly to Node's built-in test runner -- letting the test runner glob-scan the test/ directory itself conflicts with the tsx ESM loader hook on some Node versions.


License

MIT.

Available Tools

19 tools
execute_read_requestExecute a SpotDraft read operationA
Read-only

Calls any SpotDraft catalog operation classified as 'read' (GET endpoints, plus the handful of side-effect-free POST endpoints like analytics query, contract preview, and download-link generation) by operationId. Look up the operationId and its parameter shape with search_actions first. Refuses to run any operation whose catalog access is 'write' -- use execute_write_request (on the spotdraft-write server) for those instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body for operations that take one. Omit for GET-style operations.
queryNoQuery-string parameters, e.g. { page: 1, limit: 25 }.
operationIdYesThe exact operationId from search_actions, e.g. 'v2.1_public_contracts_retrieve'.
path_paramsNoValues for any {placeholder} segments in the operation's path, e.g. { composite_id: 'T-123' }.

TDQS

A4.9/5.0
Behavior5/5

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

The description adds significant behavioral context beyond the readOnlyHint annotation: it details what constitutes a 'read' operation, explains that it refuses write operations, and clarifies the allowed POST endpoints. 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 well-structured sentences, no fluff, front-loaded with the core purpose. Every sentence 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?

For a complex tool with 4 parameters and many siblings, the description is complete: it covers prerequisite steps, distinguishes from sibling tools, and explains parameter usage. No output schema needed given context.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining when 'body' should be omitted (GET-style operations) and that operationId must come from search_actions, providing practical usage context beyond schema fields.

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 executes SpotDraft read operations (GET endpoints and side-effect-free POSTs) by operationId, and distinguishes itself from the sibling write tool. The verb 'execute' is specific and appropriate.

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 look up operationId and parameter shape with search_actions first, and refers to execute_write_request for write operations. Provides 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.

find_contracts_by_external_metadataFind contracts by external record IDA
Read-only

Reverse lookup: given an external record ID (for Rad AI, a HubSpot deal ID), returns the SpotDraft contracts linked to it (up to 50). Use to answer 'which SpotDraft contracts are linked to deal X'. Pairs with get_contract_external_metadata (forward lookup by contract).

ParametersJSON Schema
NameRequiredDescriptionDefault
external_metadata_idYesThe external record ID to search by, e.g. a HubSpot deal ID like '7762724431'.

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, so description adds value by specifying result limit (up to 50) and the forward/backward pairing. 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?

Two succinct sentences: first states purpose and behavior, second gives usage guidance. No wasted words; front-loaded with 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?

With 1 parameter, high schema coverage, and no output schema, the description adequately covers behavior (reverse lookup, result count) and usage context. Nothing missing for this 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 has 1 param with 100% coverage. Description adds example (HubSpot deal ID '7762724431') and explains the purpose of the external metadata ID, going beyond the schema's minimal 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?

Clear verb+resource: 'returns the SpotDraft contracts linked to it (up to 50)'. Explicitly distinguishes from sibling get_contract_external_metadata by stating 'Reverse lookup' and 'Pairs with...' for forward lookup.

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 usage context: 'Use to answer which SpotDraft contracts are linked to deal X' and mentions pairing with forward lookup. Does not explicitly state when NOT to use, but the context is clear enough.

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

get_analytics_catalogGet analytics catalogA
Read-only

Returns the catalog of tables/views/columns available to query via run_analytics_query. Call this first if you don't already know the schema.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint=true; description adds no new behavioral traits beyond stating it returns a catalog, which is consistent.

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 and usage advice; no wasted words.

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

Completeness4/5

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

Complete for a zero-param, read-only catalog tool; could mention response format but not essential given low complexity.

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?

No parameters; schema coverage 100%; description adds no param info, but baseline 4 applies for zero-param tools.

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

Purpose5/5

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

Clearly states it returns the catalog of tables/views/columns and links it to run_analytics_query, distinguishing 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 advises to call this first if schema unknown, implying when to use; lacks explicit when not to, but sufficient for a simple tool.

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

get_contract_contentGet contract contentA
Read-only

Retrieves the text content of a contract in the requested format ('text' for a single string, 'segments' for a structured breakdown, or 'html'). Use this to read what a contract actually says. Does NOT return a downloadable file -- use get_contract_download_link for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoContent format. Defaults to the API's own default ('text') if omitted.
composite_idYesComposite contract ID, e.g. 'T-123' or 'H-45'.

TDQS

A4.5/5.0
Behavior4/5

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

Matches readOnlyHint annotation and adds that it does not return a file. No contradictions; provides relevant 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?

Two sentences, each essential: first defines action, second adds usage context and exclusion. 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?

Simple tool with two params; description fully covers purpose, formats, and exclusion. No missing information given complexity.

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%, and description adds format interpretations and default behavior beyond 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 the tool retrieves text content of a contract in specified formats, differentiating it from the download tool.

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 indicates when to use (read content) and when not (with explicit sibling alternative for download). Lacks broader exclusions.

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

get_contract_external_metadataGet contract external metadataA
Read-only

Reads the external-system link recorded on a contract -- for Rad AI this is the linked HubSpot deal (id, integration_name, record_type). Returns an empty/null shape if the contract isn't linked. Pairs with set_contract_external_metadata (write) and find_contracts_by_external_metadata (reverse lookup).

ParametersJSON Schema
NameRequiredDescriptionDefault
contract_idYesComposite contract ID, e.g. 'T-123' or 'H-45'.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses read-only nature (consistent with readOnlyHint annotation), describes return shape and empty/null case, and specifies the integration (Rad AI -> HubSpot). Adds context beyond annotations 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?

Two sentences with no wasted words: first states action and return fields, second covers empty case and sibling tools. Front-loaded and optimally sized.

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 read-only tool with one parameter and no output schema, the description fully covers return shape (including fields), empty-case behavior, and paired tools. No gaps.

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 clear description and pattern for contract_id. The description adds no extra parameter meaning 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?

Clearly states it reads the external-system link on a contract, listing specific fields (id, integration_name, record_type) and the empty/null behavior. Distinguishes from siblings by naming the paired write and reverse-lookup 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 tells when to use (read external link), describes the null return when no link exists, and names alternatives: set_contract_external_metadata for write, find_contracts_by_external_metadata for reverse lookup.

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

get_contract_key_pointersGet contract key pointersA
Read-only

Lists the key pointers (extracted/structured metadata fields, e.g. effective date, term length, renewal terms) recorded against a contract. Pairs with set_contract_key_pointers (write).

ParametersJSON Schema
NameRequiredDescriptionDefault
composite_idYesComposite contract ID, e.g. 'T-123' or 'H-45'.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true. The description adds valuable context by specifying what data is returned (extracted/structured metadata fields like effective date) and that pairs with a write tool. This goes beyond the annotation 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?

Two sentences with zero waste. The first sentence front-loads the purpose and includes examples. The second sentence efficiently adds pairing information. Every word adds value.

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

Completeness5/5

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

For a simple read-only tool with one parameter and no output schema, the description is complete. It explains what the tool returns (key pointers with examples), its read-only nature, and its relationship to a sibling tool. No gaps or missing information.

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?

With 100% schema description coverage, the input schema already fully documents the composite_id parameter. The description does not add any further semantics or examples for the parameter, so it meets the baseline but does not exceed 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 lists key pointers (structured metadata fields) for a contract, with specific examples like effective date and term length. It explicitly pairs with set_contract_key_pointers, which distinguishes it from other read siblings like get_contract_content or get_contract_external_metadata.

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 (reading structured metadata) and mentions the paired write tool, implying this is for reading. However, it does not explicitly state when not to use it or compare with other sibling tools, leaving some ambiguity for the agent.

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

get_contract_obligationsGet contract obligationsA
Read-only

Lists the obligations (e.g. renewal, payment, deliverable reminders) tracked against a contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
contract_idYesContract ID (composite form, e.g. 'T-123').

TDQS

A3.6/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, and the description confirms a listing operation, so no contradiction. However, the description does not disclose additional behavioral traits such as pagination, ordering, or rate limiting, which would enhance transparency 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?

Single sentence, front-loaded with verb and examples, no unnecessary words. Highly concise and well-structured.

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

Completeness4/5

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

For a simple list tool with one required parameter and no output schema, the description covers the purpose and gives examples. It slightly lacks mention of return format or whether results are paginated, but overall is sufficient for an AI agent to understand the basic function.

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 contract_id clearly documented. The description does not add parameter-level detail beyond the schema, so baseline score of 3 is appropriate.

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

Purpose5/5

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

Description clearly states the tool lists obligations (renewal, payment, deliverable reminders) tracked against a contract. It distinguishes from sibling tools like get_contract_content or get_contract_status by specifying the kind of data returned.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool vs alternatives. With 18 sibling tools, the description does not mention when to choose this over similar list tools or when not to use it (e.g., for specific contract types).

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

get_contract_statusGet contract statusA
Read-only

Returns the display status and contract name for one contract, looked up by composite ID. This is the same lookup the Rad AI HubSpot integration uses. Does NOT return full contract details -- use get_contract_content or list_contracts for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
composite_idYesComposite contract ID, e.g. 'T-123' or 'H-45'.

TDQS

A4.5/5.0
Behavior4/5

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

The annotation readOnlyHint=true already indicates read-only behavior. The description adds value by stating exactly what is returned (display status and contract name) and what is not returned, providing clear boundaries beyond the annotation.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and every sentence serves a purpose: describing the function, noting the HubSpot integration, and clarifying exclusions.

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, readOnlyHint annotation, and no output schema, the description provides sufficient context: what it returns, how it is looked up, and where to go for more details. It is fully adequate for correct tool selection and 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% for the single parameter composite_id, which is well-described with pattern and meaning. The description adds no additional parameter details beyond confirming the lookup mechanism, 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 returns display status and contract name for one contract by composite ID, and explicitly distinguishes from sibling tools like get_contract_content and list_contracts by noting what it does NOT return.

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

Usage Guidelines5/5

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

The description explicitly says when to use (to get display status and name by composite ID) and when not to use (for full details, use get_contract_content or list_contracts). It also adds context about being the same lookup used by HubSpot integration.

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

get_counterpartyGet counterpartyA
Read-only

Returns full details for a single counterparty by ID, including addresses and contacts summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
counterparty_idYesCounterparty ID, as returned by list_counterparties.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate read-only access (readOnlyHint=true). The description adds that the response includes addresses and contacts summary, providing additional 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.

Conciseness5/5

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

A single, front-loaded sentence with no fluff. Every word earns its place.

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

Completeness4/5

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

For a simple read operation with no output schema, the description adequately covers the purpose and return structure. Minor improvement could include error handling or output format.

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 for parameters is 100%, and the parameter description already specifies the source of the ID (list_counterparties). The tool description does not add further meaning to the parameter beyond what 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 verb 'Returns full details' and the resource 'single counterparty by ID', distinguishing it from the sibling tool list_counterparties which returns a list.

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?

Implies usage when a specific ID is known and full details are needed, referencing list_counterparties for obtaining the ID. However, it does not explicitly state 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.

get_template_metadataGet template metadataA
Read-only

Returns the field definitions (contract_data keys, types, and options) for a specific contract template. Use this before calling create_contract to know which contract_data keys the template expects.

ParametersJSON Schema
NameRequiredDescriptionDefault
template_idYesTemplate ID, as returned by list_templates.

TDQS

A4.3/5.0
Behavior4/5

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

Description elaborates on the return type beyond readOnlyHint annotation, but does not disclose potential rate limits or other behavioral traits. 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, no redundancy, front-loaded with main purpose. Every word adds value.

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

Completeness5/5

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

Given single parameter, no output schema, and annotation coverage, the description fully covers tool behavior and usage 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?

Schema coverage is 100% (template_id described). Description adds context linking parameter to output (contract_data keys), meeting baseline for 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?

Clearly states that it returns field definitions (contract_data keys, types, options) for a specific template, distinguishing it from siblings like list_templates and other get_contract_* 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?

Explicitly advises using this before create_contract to know required contract_data keys, providing clear context. Does not explicitly mention when not to use, but purpose is well-defined.

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

list_contract_notesList contract notesA
Read-only

Lists the comments/notes left on a contract's activity log, in SpotDraft's UI these appear as 'notes'. Pairs with create_contract_note (write) for adding a new one.

ParametersJSON Schema
NameRequiredDescriptionDefault
contract_idYesContract ID (composite form, e.g. 'T-123').

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the agent knows it's a safe read. The description adds that notes come from a contract's activity log and UI appearance, but does not disclose pagination, ordering, or any limits. With annotations covering safety, the description provides moderate additional 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?

Two succinct sentences: the first states what the tool does, the second provides pairing context. No unnecessary words, front-loaded with core purpose.

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 low complexity (one required param, simple list operation) and high schema coverage, the description is largely complete. It could mention whether the list is comprehensive or paginated, but the pairing hint and UI reference add useful context. Overall adequate for an agent to use the tool effectively.

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 clear description of contract_id. The tool description adds no additional meaning beyond the schema. Baseline 3 is appropriate since the schema already documents the parameter fully.

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 lists comments/notes on a contract's activity log. Clarifies UI terminology ('in SpotDraft's UI these appear as 'notes''). Distinguishes from its write counterpart create_contract_note. Verb 'Lists' plus specific resource 'contract notes' leaves no ambiguity.

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 pairs this tool with create_contract_note for writing, indicating read vs write roles. However, it does not explicitly state when not to use this tool or mention alternatives. Since it's the only list-notes tool among siblings, the context is clear enough for an agent to decide.

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

list_contractsList contractsA
Read-only

Lists contracts in the SpotDraft workspace, paginated. Supports free-text search and a small set of common filters. Returns each contract's id, name, display status, contract type, and key dates. For filters not exposed here (there are dozens of filter__[$op] variants in the full API), use search_actions to find v2.1_public_contracts_retrieve and call it via execute_read_request.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoResults per page (max 100).
queryNoFree-text search across contract name, entity name, and party names.
extra_filtersNoEscape hatch for any other 'filter__<field>' or 'filter__<field>[$op]' query param supported by the underlying API (e.g. { 'filter__client_name': 'Acme' }). Keys are passed through verbatim.
display_statusNoExact-match filter on display status, e.g. 'EXECUTED', 'DRAFT', 'PENDING_SIGNATURE'.
contract_type_idNoExact-match filter on numeric contract type id (see list_contract_types).

TDQS

A5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, and the description adds that the tool is paginated, returns specific fields, supports free-text search, and the extra_filters parameter is a verbatim pass-through. No contradictions, and adds 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.

Conciseness5/5

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

The description is two sentences with no wasted words. The first sentence states the core purpose, the second provides usage guidance. It is front-loaded and every sentence 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?

Despite no output schema, the description lists the returned fields. It covers pagination, search, common filters, and the escape hatch. Given 6 parameters and complexity (nested object in extra_filters), the description is complete enough for an agent to use the tool effectively.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds meaning by explaining the pagination parameters, free-text query, display_status and contract_type_id filters, and crucially describes extra_filters as an 'escape hatch' with an example, which goes beyond the schema's 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 it lists contracts in the SpotDraft workspace, paginated, and specifies the returned fields. It distinguishes from siblings like search_actions and execute_read_request by mentioning the 'common filters' and the escape hatch for advanced filters.

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 that for filters not exposed here, the agent should use search_actions to find the v2.1 API endpoint and call it via execute_read_request. This provides 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.

list_contract_typesList contract typesA
Read-only

Lists all contract types configured in the workspace (e.g. NDA, MSA, SOW), with their numeric IDs. Use the returned ids with list_contracts' contract_type_id filter or upload_contract_for_signing's contract_type_id field.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true; description adds that it 'lists all... with numeric IDs' but no further behavioral details (e.g., pagination, performance).

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 zero waste; purpose is front-loaded and every sentence adds value.

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

Completeness5/5

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

For a zero-parameter, no-output-schema tool, the description fully explains what it does and how to use the output.

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?

No parameters exist, so description adds no parameter info; baseline for 0 parameters with 100% schema coverage is 4.

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 specific verb 'lists' and resource 'contract types', includes examples (NDA, MSA, SOW), and states it returns numeric IDs, clearly differentiating from sibling tools like list_contracts.

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 tells when to use the returned IDs (with list_contracts' contract_type_id filter or upload_contract_for_signing's contract_type_id field), but does not mention when not to use the tool itself.

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

list_counterpartiesList counterpartiesA
Read-only

Lists counterparty organizations/individuals in the workspace, paginated, with optional email and status filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoResults per page (max 100).
statusNoFilter by one or more counterparty statuses (repeatable in the underlying API).
client_email_addressNoExact-match filter on the counterparty's contact email address.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true. Description adds pagination and filtering context but does not disclose other behaviors (e.g., performance, error scenarios). Adds moderate value 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?

Single sentence that is front-loaded with key information. No redundant phrasing; every word contributes to understanding the tool's function.

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 paginated list tool with 4 optional parameters and no output schema, the description sufficiently covers purpose, pagination, and filters. No critical details are missing, though it could mention sorting or total count.

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

Parameters3/5

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

Schema coverage is 100%, so parameters are already well-documented. Description only reiterates 'email and status filters' without adding detail beyond the schema. Baseline 3 applies.

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 specifies verb 'lists', resource 'counterparty organizations/individuals', scope 'in the workspace', and key features (paginated, email/status filters). This clearly distinguishes from sibling tools like list_contracts or list_users.

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

Usage Guidelines3/5

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

No explicit guidance on when to use this tool over alternatives. Context is implied by the description, but no 'when-to-use' or 'when-not-to-use' statements are provided.

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

list_templatesList templatesA
Read-only

Lists contract templates available in the workspace, with optional filters by counterparty type and tags. Use get_template_metadata for a specific template's field definitions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOnly include templates matching at least one of these tags.
include_archivedNoInclude archived templates in the results.
exclude_multi_partyNoExclude templates that support multiple counterparties.

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. The description adds context about optional filters but doesn't cover all behavioral details like pagination. Still adequate.

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

Conciseness5/5

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

Two concise sentences with no fluff; front-loaded with purpose and filters; effectively uses second sentence for sibling guidance.

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 read-only annotations and no output schema, the description sufficiently describes the tool's function, filters, and links to the more specific tool. No gaps.

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?

Input schema has 100% description coverage, so description adds little beyond schema. Mentions 'counterparty type' filter which doesn't match schema parameters, slightly reducing clarity.

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

Purpose5/5

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

The description clearly states it lists contract templates with optional filters, distinguishing it from get_template_metadata for specific template field definitions.

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 directs to use get_template_metadata for specific template field definitions, providing a clear when-to-use alternative.

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

list_usersList workspace usersA
Read-only

Lists users in the SpotDraft workspace, with optional filters by email or name prefix. This is also the recommended connectivity self-test for this server -- if it returns a roster, credentials and region are configured correctly.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number, starting at 1.
limitNoResults per page (max 100).
user_nameNoFilter to users whose full name starts with this value (case-insensitive).
user_emailNoFilter to a specific user's email address.

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, so the tool is clearly a safe read operation. The description adds valuable behavioral context by noting that a successful roster return confirms credential and region configuration. This goes beyond the annotation without contradicting it.

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, each earning its place: the first states the primary action and filters, the second adds a practical secondary utility. No extraneous words. Front-loaded with the core purpose.

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

Completeness4/5

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

For a simple list tool with 4 optional parameters and high schema coverage, the description covers the main use case and adds a self-test context. It does not mention pagination behavior or response structure, but the schema details pagination parameters, and no output schema exists. Slightly lacking but still 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?

Input schema coverage is 100% with each parameter having a description. The description only mentions 'optional filters by email or name prefix', which adds little beyond the schema. With high coverage, baseline 3 is appropriate; no significant additional parameter insight is provided.

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 clear verb+resource ('Lists users...') and specifies the scope ('in the SpotDraft workspace'). The secondary connectivity self-test mention does not detract from the primary purpose. Among sibling tools, there is no other user-list tool, so it is well-distinguished.

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 recommends this tool as a connectivity self-test, providing a specific use case. It also states optional filters for searching. However, it does not provide explicit when-not-to-use guidance or mention sibling alternatives, though no sibling covers the same functionality.

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

run_analytics_queryRun analytics queryA
Read-only

Runs a single read-only GoogleSQL SELECT query (optionally with WITH/UNION) against SpotDraft's analytics tables, returning result rows. Max query length 10,000 characters. This is a POST endpoint with no side effects (a query, not a mutation), so it is classified as a read operation. Use get_analytics_catalog first to see available tables/columns.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesA single GoogleSQL SELECT statement (optionally WITH / UNION). Max 10,000 characters.
user_scopedNoWhen set, overrides the default user-scoping: true restricts to contracts this user can access (the default when unset); false requests workspace-wide access, which only Admin-role callers can use.

TDQS

A4.4/5.0
Behavior4/5

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

The description reinforces the read-only nature already indicated by the readOnlyHint annotation, adding details like 'no side effects' and 'classified as a read operation'. It also discloses the max query length and that it's a POST endpoint, providing useful behavioral context beyond the annotation.

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-loading the core purpose in the first sentence. The second sentence adds essential usage guidance (use catalog first). Every sentence is valuable without redundancy, making it highly concise and well-structured.

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 tool with 2 parameters, 100% schema coverage, and readOnlyHint annotation, the description covers purpose, parameter details, and prerequisites. It lacks explicit mention of the result format (e.g., array of rows), but given no output schema, this is a minor gap. Overall, it is sufficiently complete for most use cases.

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 100% schema coverage, the baseline is 3. The description adds meaningful context for the 'user_scoped' parameter by explaining the default behavior and admin permission requirement, which goes beyond the schema description. For 'query', it reinforces but does not significantly extend 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 clearly states the tool's action (runs a read-only GoogleSQL SELECT query), the target resource (SpotDraft's analytics tables), and the output (returning result rows). It distinguishes itself from sibling tools by mentioning get_analytics_catalog as a prerequisite and specifying constraints like max query length.

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 advises to use get_analytics_catalog first to understand available tables/columns, providing clear context for when to use this tool. However, it does not explicitly state when not to use it or compare with alternatives like execute_read_request, though the read-only analytics focus is clear.

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

search_actionsSearch SpotDraft actionsA
Read-only

Searches the full SpotDraft API catalog (114 in-scope operations across v2.1 + v1-orphan endpoints) by keyword or tag. Returns matching operations with operationId, method, path, access level ('read' or 'write'), summary, and parameter shape (path/query/body). Use this to find the right operationId before calling execute_read_request or execute_write_request. This tool does NOT call the SpotDraft API itself -- it only searches the local catalog.

ParametersJSON Schema
NameRequiredDescriptionDefault
accessNoOptional filter: only return operations with this access level.
intentYesFree-text description of what you want to do, e.g. 'void a contract' or 'list counterparties'. Keyword-matched against operation names, summaries, tags, and paths.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true, consistent with the description's non-mutating behavior. The description adds critical context that the tool only searches a local catalog and does not call the SpotDraft API, 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?

Three efficient sentences: purpose, return content, usage guidance. No redundant information, well-structured for quick comprehension.

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 search tool without output schema, the description covers purpose, input parameters, return fields, and workflow integration. It is complete and sufficient for an agent to use 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 description coverage is 100%, so baseline is 3. The description adds value by explaining that 'intent' is keyword-matched against multiple fields and that 'access' is an optional filter, providing meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the tool searches the SpotDraft API catalog by keyword or tag, distinguishes from sibling tools (execute_read_request, execute_write_request) by explicitly stating it does not call the API, and details what it returns.

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 use this tool before calling execute_read_request or execute_write_request to find the correct operationId, and clarifies that it does not perform API calls, providing clear usage context.

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. 19 tool updatesv0.1.0
    • First observedexecute_read_request
    • First observedfind_contracts_by_external_metadata
    • First observedget_analytics_catalog
    • First observedget_contract_content
    • First observedget_contract_download_link
    • First observedget_contract_external_metadata
    • First observedget_contract_key_pointers
    • First observedget_contract_obligations
    • First observedget_contract_status
    • First observedget_counterparty
    • First observedget_template_metadata
    • First observedlist_contract_notes
    • First observedlist_contract_types
    • First observedlist_contracts
    • First observedlist_counterparties
    • First observedlist_templates
    • First observedlist_users
    • First observedrun_analytics_query
    • First observedsearch_actions

TDQS

A4.3/5.0

Scored across 19 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, with detailed descriptions that minimize ambiguity. For example, get_contract_content and get_contract_download_link are explicitly differentiated by output format and use case.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern with underscores (e.g., list_contracts, get_contract_content, run_analytics_query). No mixing of conventions, making it easy for an agent to predict naming.

Tool Count4/5

With 19 tools, the server is slightly over the typical well-scoped range of 3-15, but each tool serves a distinct read operation for a comprehensive API. The count is justified by the breadth of the domain.

Completeness5/5

The tool surface covers a wide range of read operations including contracts, counterparties, templates, analytics, and API catalog search. There are no obvious gaps for the stated read-only scope, and the inclusion of search_actions allows agents to discover additional endpoints.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server that connects Clio Manage to Claude via OAuth, enabling law firm management tasks like matter lookup, time tracking, billing, calendar, and document retrieval through natural language.
    41
    MIT
  • F
    license
    A
    quality
    B
    maintenance
    A production-quality MCP server that exposes the official eCFR API as structured tools for AI-driven contract compliance, enabling retrieval of relevant Code of Federal Regulations by clauses extracted from contracts.
    8
    -