spotdraft-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@spotdraft-mcpList all contracts pending signature from Acme Corp"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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:
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.
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
Node.js 20+ and git.
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.
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 buildThis 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 |
| yes |
|
| yes | SpotDraft API |
| yes | SpotDraft API |
| no (default |
|
| no | Optional |
| 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 |
| Paginated contract search/list with common filters. |
| Display status + name for one contract by composite ID. |
| The contract's text (as plain text, structured segments, or HTML). |
| A temporary signed download URL (PDF/DOCX) -- not the file bytes. |
| Notes/comments on a contract's activity log. |
| Obligations (renewal, payment, deliverable reminders) tracked on a contract. |
| Structured metadata fields recorded on a contract. |
| Contract templates available in the workspace. |
| A template's field definitions (for building |
| Configured contract types and their IDs. |
| Counterparty organizations/individuals, paginated. |
| Full detail for one counterparty. |
| Workspace users (also the recommended connectivity self-test). |
| Tables/columns available to |
| Runs a read-only GoogleSQL query against SpotDraft's analytics tables. |
| Keyword-search the full 114-op catalog (on both servers). |
| Call any read-classified operation by ID (full-coverage fallback). |
Write (spotdraft-write) -- every call requires approval
Tool | What it does |
| Creates a contract from a template + contract_data + counterparties. |
| Emails a contract to its counterparties. |
| Uploads an existing document as a new contract headed for signature. |
| Uploads an existing document as a new contract headed for review/redlining. |
| Advances a contract to the execution/signature stage. |
| Destructive. Permanently voids a contract. |
| Invites a role/user/new-email to a contract with a specific permission level. |
| Adds a note/comment to a contract's activity log. |
| Creates/updates structured metadata fields on a contract, in bulk. |
| Creates a new counterparty (organization or individual). |
| Adds a contact person to an existing counterparty. |
| Registers a webhook subscription for contract/counterparty activity. |
| Invites a new user to the workspace. |
| 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"] = trueandreadOnlyHint: false;void_contractadditionally setsdestructiveHint: true. Read tools setreadOnlyHint: trueand 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 throughexecute_read_request/execute_write_requestis checked against the same catalogaccessflag 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
POSTendpoints 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 aGETis write.Credentials never leave your machine and are never logged.
SPOTDRAFT_CLIENT_SECRET/SPOTDRAFT_CLIENT_IDare 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 workspaceBoth 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 toolsexecute_read_requestExecute a SpotDraft read operationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | JSON request body for operations that take one. Omit for GET-style operations. | |
| query | No | Query-string parameters, e.g. { page: 1, limit: 25 }. | |
| operationId | Yes | The exact operationId from search_actions, e.g. 'v2.1_public_contracts_retrieve'. | |
| path_params | No | Values for any {placeholder} segments in the operation's path, e.g. { composite_id: 'T-123' }. |
TDQS
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.
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.
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.
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.
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.
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 IDARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| external_metadata_id | Yes | The external record ID to search by, e.g. a HubSpot deal ID like '7762724431'. |
TDQS
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.
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.
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.
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.
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.
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 catalogARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 contentARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Content format. Defaults to the API's own default ('text') if omitted. | |
| composite_id | Yes | Composite contract ID, e.g. 'T-123' or 'H-45'. |
TDQS
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.
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.
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.
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.
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.
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_download_linkGet contract download linkARead-only
Generates a temporary, signed download URL for a contract's file (PDF or DOCX). Returns the link -- does NOT stream the file's bytes into the conversation. This is a POST endpoint with no persisted side effect (it only mints a short-lived URL), so it is classified as a read operation.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | File format for the generated link. Defaults to PDF if omitted. | |
| composite_id | Yes | Composite contract ID, e.g. 'T-123' or 'H-45'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the 'readOnlyHint' annotation, the description explains why it's a read operation despite being a POST, and notes the URL is temporary and signed. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no waste. Front-loaded with purpose and includes key behavioral distinctions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 2 parameters and no output schema, the description covers the essential details: it generates a link, temporary, signed, and clarifies the read-only nature. Minor missing details like link expiration are acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add additional meaning beyond what the schema provides for the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it generates a temporary signed download URL for a contract file (PDF/DOCX). It distinguishes from sibling tools like 'get_contract_content' by noting it returns a link, not the file bytes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implicitly guides usage by contrasting with streaming bytes, but does not explicitly name alternatives or specify when not to use. Still provides clear context.
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 metadataARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| contract_id | Yes | Composite contract ID, e.g. 'T-123' or 'H-45'. |
TDQS
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.
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.
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.
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.
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.
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 pointersARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| composite_id | Yes | Composite contract ID, e.g. 'T-123' or 'H-45'. |
TDQS
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.
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.
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.
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.
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.
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 obligationsARead-only
Lists the obligations (e.g. renewal, payment, deliverable reminders) tracked against a contract.
| Name | Required | Description | Default |
|---|---|---|---|
| contract_id | Yes | Contract ID (composite form, e.g. 'T-123'). |
TDQS
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.
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.
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.
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.
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.
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 statusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| composite_id | Yes | Composite contract ID, e.g. 'T-123' or 'H-45'. |
TDQS
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.
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.
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.
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.
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.
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 counterpartyARead-only
Returns full details for a single counterparty by ID, including addresses and contacts summary.
| Name | Required | Description | Default |
|---|---|---|---|
| counterparty_id | Yes | Counterparty ID, as returned by list_counterparties. |
TDQS
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.
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.
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.
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.
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.
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 metadataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | Template ID, as returned by list_templates. |
TDQS
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.
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.
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.
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.
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.
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 notesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| contract_id | Yes | Contract ID (composite form, e.g. 'T-123'). |
TDQS
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.
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.
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.
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.
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.
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 contractsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1. | |
| limit | No | Results per page (max 100). | |
| query | No | Free-text search across contract name, entity name, and party names. | |
| extra_filters | No | Escape 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_status | No | Exact-match filter on display status, e.g. 'EXECUTED', 'DRAFT', 'PENDING_SIGNATURE'. | |
| contract_type_id | No | Exact-match filter on numeric contract type id (see list_contract_types). |
TDQS
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.
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.
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.
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.
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.
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 typesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 counterpartiesARead-only
Lists counterparty organizations/individuals in the workspace, paginated, with optional email and status filters.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1. | |
| limit | No | Results per page (max 100). | |
| status | No | Filter by one or more counterparty statuses (repeatable in the underlying API). | |
| client_email_address | No | Exact-match filter on the counterparty's contact email address. |
TDQS
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.
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.
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.
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.
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.
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 templatesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Only include templates matching at least one of these tags. | |
| include_archived | No | Include archived templates in the results. | |
| exclude_multi_party | No | Exclude templates that support multiple counterparties. |
TDQS
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.
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.
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.
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.
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.
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 usersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, starting at 1. | |
| limit | No | Results per page (max 100). | |
| user_name | No | Filter to users whose full name starts with this value (case-insensitive). | |
| user_email | No | Filter to a specific user's email address. |
TDQS
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.
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.
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.
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.
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.
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 queryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | A single GoogleSQL SELECT statement (optionally WITH / UNION). Max 10,000 characters. | |
| user_scoped | No | When 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
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.
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.
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.
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.
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.
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 actionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| access | No | Optional filter: only return operations with this access level. | |
| intent | Yes | Free-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
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.
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.
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.
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.
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.
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.
19 tool updates
v0.1.0- First observed
execute_read_request - First observed
find_contracts_by_external_metadata - First observed
get_analytics_catalog - First observed
get_contract_content - First observed
get_contract_download_link - First observed
get_contract_external_metadata - First observed
get_contract_key_pointers - First observed
get_contract_obligations - First observed
get_contract_status - First observed
get_counterparty - First observed
get_template_metadata - First observed
list_contract_notes - First observed
list_contract_types - First observed
list_contracts - First observed
list_counterparties - First observed
list_templates - First observed
list_users - First observed
run_analytics_query - First observed
search_actions
TDQS
Scored across 19 tools
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.
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.
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.
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
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for The Chancery Lane Project's climate-aligned contract clause knowledge graph.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
The Ramp MCP server enables users to securely connect Ramp with AI assistants like ChatGPT and Claude to query financial data and take actions using natural language. It transforms Ramp's developer API into a SQL interface that LLMs can query, allowing admins to analyze spend trends, identify cost savings, and run complex SQL analyses on comprehensive datasets (transactions, purchase orders, vendors, users), while all users can manage cards, view transactions, request reimbursements, and get expense policy answers.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP 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.41MIT
- FlicenseNot gradedqualityCmaintenanceMCP server enabling Claude Desktop to answer questions from local Word and PDF documents by searching a vector index built from their contents.-
- FlicenseAqualityBmaintenanceA 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-
- FlicenseNot gradedqualityCmaintenanceMCP server for first-pass legal contract review. It loads txt/docx/pdf contracts, detects standard clauses, flags heuristic risks, summarizes, and compares agreements.-